新型DS18B20溫度傳感器擺脫了傳統的以熱敏電阻為傳感器的溫度測量方法,而改為一種全新的,以數字溫度傳感器作感溫元件的數字式溫度計,解決了傳統的溫度檢測可靠性差,測量溫度準確率低的缺點,它以單總線的連接方式,使電路大大的簡化。DS18B20傳感器利用單片機進行控制,簡單而且易于智能化控制。設計中還加入了nRF905無線收發模塊,可以實現一定距離的溫度數據傳輸,使得設計模塊可以進行遠距離的檢測和控制。
此次設計根據具體實驗制作,給出了系統實現的硬件原理圖及軟件流程圖。該設計模塊測量精度高、擴展方便,具有一定的參考價值。設計布線簡單,結構緊湊,體積小,擴展方便,可在一定距離進行無線檢測,在大型倉庫,工廠,智能化建筑等領域的溫度檢測中有廣闊的應用前景。
目錄
摘要 3
Abstract 4
緒論 5
11 設計背景與意義 5
12 設計目的及應用 5
13 設計內容及要求 5
第二章 系統方案論證與選擇 6
21 系統總體方案描述 6
22 系統總體框圖 6
23 系統硬件構成 6
系統硬件主要單元設計 7
31 主控制模塊 7
32 數據顯示模塊 9
33 信號采集模塊 9
34 無線收發模塊 10
系統軟件設計 11
41 程序設計思路 11
42 程序設計框圖 12
系統硬件調試結果圖15
51 系統仿真15
52 系統硬件調試 15
53 調試結果16
心得體會及總結 16
參考文獻 17
附錄一:原理圖 17
附錄:源程序代碼18
第一章 緒論
1.1研究背景與意義隨著社會的發展、科技的進步以及人們生活水平的逐步提高,現如今自動化、信息化程度越來越高,單片機和傳感器的應用領域越來越廣。各種方便于生活的自動控制系統進入了人們的生活。單片機和傳感器在自動控制中的應用越來越廣泛,它實用性強,使用方便,技術先進,它們的廣泛應用是科技進步的標志。 現實中溫度控制不適當導致的發霉,腐爛問題是倉庫日常工作急需解決的問題,是衡量倉庫管理質量的重要指標。它直接影響到儲備物資的使用壽命和工作可靠性。為保持日常工作的順利進行,首要任務是加強倉庫的溫度檢測。同時專門的安排人員去定期去倉庫測量溫度也非常麻煩,因此設計一種自動檢測和顯示溫度,并且能夠進行較遠距離的無限傳輸的溫度控制設備很有必要。 1.2 研究目的及應用溫度的檢測與控制是工業生產過程中應用比較廣泛的課題,隨著傳感器在生產和生活中更加廣泛的應用,利用新型單總線式數字溫度傳感器實現對溫度的單點和多點的測試與控制得到很快開發。但就目前情況看,很少有人對倉庫進行自動化檢測和管理,大多數的倉庫在管理過程中依然是使用傳統的工作方法,利用溫度計等簡單檢測工具人工檢測倉庫溫濕度。這種方法不僅費時、費力,而且效率低下。市場需要普及一種簡單、實用、易操作并且可以進行無線傳輸的溫度檢測設備。 1.3 設計內容及要求本文著重闡述以單片機控制,溫度傳感器DS18B20對溫度的數據采集和處理,NRF905無線發送和接收模塊的應用,4位共陽極數碼管對溫度傳感器處理后的溫度進行顯示,實現一定距離上的定點溫度自動檢測和發送接收。
第二章 系統方案論證與選擇
2.1 系統總體方案描述系統設計分為2個部分,第一個部分實現溫度的檢測、顯示和發送,第二個部分為數據的接收和顯示。第一個設計模塊中,利用單片機STC89C52控制溫度傳感器DS18B20定點檢測和處理溫度數據,單片機將采集的溫度數據發送給單片機,再通過單片機控制,對接收到的溫度數據進行一定的轉換和處理,然后存放在寄存器中,等待下一步處理,再經過無線發送模塊nRF905將顯示的數據打包發送給第二個模塊。第二個設計模塊中,同樣利用STC89C52單片機作為控制主體,先控制nRF905無線接收模塊接收第一個模塊發送的數據,然后控制4位共陽極數碼管顯示接收到的數據。則完成整個設計流程。 2.2 系統總體框圖系統的設計框圖如圖1所示:
2.3 系統硬件構成系統硬件方面主要由單片機最小系統,溫度傳感器DS18B20,4位共陽極數碼管,還有nRF905無線收發模塊組成,目的在于實現溫度的準確檢測和無線收發所檢測的溫度數據。 第三章 系統硬件電路設計3.1 單片機最小系統設計單片機最小系統的設計主要有五個部分組成,電源電路,復位電路,晶振電路,串口電路和控制主體的STC89C52單片機。 電源電路由一個六腳的按鍵開關,一個1K的電阻,一個10uF的極性電容和一個顯示電路供電狀態的發光二極管組成。開關為了適應各種情況下能夠方便供電,開關外接有一個USB接口和一個DC-5V的標準電源接口作為供電設備使用。除此之外還設計了一個外接電源接口。電源電路如圖2所示。 圖2 電源電路 復位電路組成很簡單,僅僅有4個小器件構成,一個是作為復位控制的四腳按鍵,一個10uF的極性電容,還有兩個電阻,阻值分別為1K和10K。電路與單片機的RST端口連接,電路上電后,按下按鍵控制系統復位。具體電路如圖3所示: 圖3 復位電路 晶振電路更為簡單,只有3個器件,一個11.0592Hz的晶振外加二個30PF的普通電容組成,晶振兩端分別與單片機的XTAL1和XTAL2口相接。電路如圖4所示: 圖4 晶振電路 串口電路主要利用MAX232來實現,MAX232是美信公司設計的一款單電源電平轉換芯片,在本次設計中的使用的方法是在MAX232的1和3管腳之間,4和5管腳之間,2和16管腳之間,6和15管腳之間,還有16和16管腳之間全部加上一個0.1uF的電容,7和8管腳作為串口輸入端,外接一個標準9孔串口母頭,9和10管腳作為輸出,分別與單片機的P3.0和P3.1連接。這樣就構成了與單片機連接,可以進行串口通信的串口電路。具體電路圖5所示: 圖5 串口電路 單片機最小系統的主體部分使用的是STC89C52單片機,它是美國ATMEL公司生產的低電壓,高性能的CMOS 8位單片機,片內寄存器可反復擦洗,含有32個可編程雙向I/O口,3個16位定時/計數器,共8個中斷源。需要指出且注意的是,單片機在系統設計時,管腳EA要始終接高電平。因為EA接高電平時,單片機讀取內部程序存儲器。當擴展有外部ROM時,讀取完內部ROM后自動讀取外部ROM,EA接低電平時,單片機直接讀取外部ROM。 而設計中使用的STC89C52是有內部ROM的,所以此引腳始終接高電平。一般在設計單片機最小系統時,大多會加上流水燈和獨立鍵盤的設計,但是在我的畢業設計中把這些部分作了改進。考慮到流水燈和獨立鍵盤這些設計如果完整的加入就會造成一定的浪費,而且由于學校實驗室的條件有限,PCB板的刻錄存在很多問題,因此這些設備會大大增加硬件調試過程的難度,費時費力。同時,在設計單片機最小系統時,考慮到不加入這些設備的話,以后又有可能需要用到。所以中和上面各種因素,在最小系統的設計部分最后只是增加了二個獨立鍵盤和二個LED發光二極管作為調試或需要時使用,同時,考慮到以后可能還會外接其它設備的介入,為了方便,特意留有兩排20腳的單排插針外接端口,這樣,設計的最小系統模塊在需要時也可以控制其它外接裝置。使得設計模塊更加靈活多用,不僅僅局限在本次畢業設計中使用,還可以留作以后的開發板學習。 最小系統的主體STC89C52如圖6所示: 圖6 STC89C52管腳接線圖 3.2 數據顯示模塊設計數據顯示電路使用的是SMA410364型號的4位共陽極數碼管,其內部結構圖如下面圖7所示:
圖7 數碼管內部結構圖 該數碼管共有12個管腳,其中11,7,4,2,1,10,5,3管腳分別對應數碼管的A,B,C,D,E,F,G,DP段選位,與單片機的P0口連接,對應單片機的P0.0-P0.7口,用來控制數碼管顯示數值大小,6,8,9,12管腳控制數碼管的位選,分別與單片機的P2.0-P2.4口連接,通過單片機指令選擇需要顯示數據的數碼管位。 我們知道,在單片機的端口上電后會一直存在高電平,而數碼管的位選正好是高電平有效,所以會導致在不需要使用數碼管的時候,數碼管依然會保持打開狀態。通常情況下會在單片機最小系統中使用鎖存器與數碼管連接,但是在這次設計中沒有使用鎖存器,而是改用在數碼管與單片機端口連接之間加一個PNP三極管的方法,讓三極管發射極接電源,基集與單片機端口連接,集電極與數碼管連接,這樣的設計就會導致單片機端口給低電平時才會選通數碼管,不僅方便控制,而且電路設計簡單。 設計原理圖如圖8所示: 圖8 數碼管電路 3.3 信號采集模塊設計信號采集部分主要由溫度傳感器DS18B20進行 1.DS1820溫度傳感器外觀圖和引腳圖如圖9所示,三個管腳定義如下:[10]  ① 引腳1接地; ② 引腳2數字信號輸入/輸出; ③ 引腳3接高電平5V高電平。 2.DS18B20溫度采集模塊設計[10] 此模塊的設計中STC89C52單片機作為控制主體,溫度傳感器DS18B20采集溫度, 溫度傳感器DS18B20是一種單線接口傳感器,所以連接電路很簡單,只要將其管腳DQ接單片機的一個端口進行溫度采集,VDD接高電平,GND接地即可。設計中的DQ端被設計成連接單片機的P1.3端口。 根據DS18B20的工作原理、內部結構圖、時序圖,還有DS18B20的ROM指令操作碼,編寫DS18B20的操作代碼,采集溫度樣本,將采集的樣本數據存放在寄存器中等待下一步處理。
3.4無線收發模塊設計無線收發模塊的功能實現主要是用nRF905無線收發模塊實現的  1.nRF905接口電路和管腳說明[9]
圖11 nRF905管腳圖
(1)VCC為電源接入端,一般接入的電壓在3.3V-3.6V之間,不能超過3.6V,不然很容易將模塊燒壞,建議使用3.3V (2)TX_EN為數字輸入端口,當TX-_EN置1時為TX輸入模式,當TX-_EN置0時為RX輸入模式 (3)TRX_CE也是數字輸入端,它控制使能芯片的發射和接收 (4)PWR_UP是給芯片上電的數字輸入端口 (5)uCLK為時鐘輸出端口,此管腳在使用過程中一般廢棄不用 (6)CD數字輸出端進行載波檢測 (7)AM數字輸出端進行地址匹配 (8)DR數字輸出端,接收和發送數據完成 (9)MISO和MOSI分別為SPI輸出輸入端口 (10)SCK和CSN分別為SPI的時鐘和使能端口 (11)13和14管腳為相同的二個接地端口. 2.nRF905無線收發模塊設計 該模塊的設計中使用到了AMS1117芯片,目的是將上電端口輸入的5V電壓轉換成適合nRF905模塊使用的3.3V工作電壓,轉換電路中由于使用的是AMS1117芯片,所以設計簡單許多,只需要在芯片的輸入端和接地端之間,輸出端和接地端之間分別并聯上一個普通電容和一個極性電容即可,電路設計如圖12所示: 圖12 AMS1117變壓電路 芯片AMS1117輸出的電壓與無線收發模塊的VCC口連接,PWR_UP,TX-_EN,TRX_CE,MISO,MOSI,SCK,CSN分別對應單片機的P1.0,P1.1,P1.2,P1.4,P1.5,P1.6,P1.7端口,AM,DR,CD分別對應單片機的P3.2,P3.3,P3.4端口,uCLK端口廢棄不用,最后的兩個GND端口全部接地,這樣就組成了nRF905的無線控制模塊。可以進行程序的調控使用了。 nRF905模塊的無線發射接收電路主要利用nRF905與外圍器件構成的電路組成,設計中使用的是購買的成品模塊,其內部電路結構沒有詳細研究,其主要部分是天線。他利用特定的形狀可以將電流轉化為射頻能量并以電波形式發射出去.或將無線電波接收進來。 第四章 系統軟件設計4.1 程序設計思路程序設計使用的軟件是是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統Keil C51。與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。 程序設計過程中,首要的是會熟練使用各種數碼管,即要了解數碼管的構造,也要了解其工作原理,并且能夠編寫各種數碼管的顯示程序,當能夠做到這一步,然后還要了解溫度傳感器的內部結構和工作原理,還有寄存器的工作方式和讀寫時序圖,然后根據它的ROM和RAM指令編寫工作代碼,通過單片機讀取后控制數碼管顯示。 編寫DS18B20的操作代碼時,先初始化傳感器,然后分別讀它的位和比特,然后是寫比特,然后開始主要的轉換過程程序設計,轉換時要判斷正負,如果為負值,則取其值的反碼后加1,得到正值,然后在前面顯示“-”號,最后設計單片機控制讀取DS18B20的寄存器數據,通過數碼管顯示。 設計了溫度顯示程序后開始設計無線發送程序,同樣的需要了解nRF905的結構,工作原理寄存器和時序圖,還有SPI口的設置。設計程序時,一般先給寄存器配置參數,通過SPI口想配置寄存器讀寫配置信息。然后編寫它的寫操作和讀操作代碼,主機通過SPI接口向配置寄存器寫入信息,最后是它的發送指令代碼。 在編寫接收代碼程序時,和發送的代碼過程相似,參考后面的程序附錄。 4.2 程序流程圖溫度采集模塊的程序設計要特別注意溫度傳感器DS18B20的代碼編寫,在充分了解很清楚DS18B20的基礎上根據其指令碼,寄存器等編寫其讀寫指令,以及溫度處理轉換代碼,然后編寫數碼管的顯示程序,然后合并,構成總的程序流程。Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。其中uVision與Ishell分別是C51為Windows和Dos的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。使用簡單方便。 設計的數據采集模塊具體流程圖15所示:
圖15 數據采集流程圖
溫度采集時是,首先將DS18B20進行初始化設置,然后才能進行后面的操作。這也是使用各種傳感器設備的最基本步驟,然后是根據先前編寫的溫度傳感器代碼讀取傳感器采集的溫度數據,存儲在其寄存器中,然后進行控制轉換程序。如果采集的溫度是正值,那么就控制單片機直接讀取經NRF905發送。如果溫度數據是負值,那么要進行取反加一后變成正值數據再通過無線設備發送出去。 無線發送流程圖如圖16所示:
圖16 無線發送流程圖
初始化nRF905,將接收點的地址和要發送的有效數據將通過SPI接口傳送給nRF905。將TRX-CE和TX-EN全部置為高電平來激活nRF905的ShockBurst的發送模式。通過nRF905的ShockBurst可使射頻寄存器自動開啟,并完成數據包的發送,DR置高。 然后判斷TRX-CE電平,如果置低將返回初始不進行后面的操作,如果置高,那么將AUTO-RETRAN也設置為高電平,從而使nRF905將連續不斷地重復發送數據包,直到TRX-CE被設置為低電平為止;而當TRX-CE被設置為低電平時,DR=0,nRF905則結束數據傳輸,并將自己設置為空閑模式。 在ShockBurst模式下,只要開始發送數據,TRX-CE和TX-EN的引腳無論是高電平還是低電平,發送過程都會被保證處理完畢。
無線接收流程圖如圖17所示:
圖17 無線接收流程圖 首先,將TRX-CE置為高,TX-EN置為低,nRF905進入接收模式,然后不斷監測有無信號,等待接收;當nRF905檢測到有和接收頻率相同的載波時,其載波檢測引腳CD置為高電平;此后,當nRF905接收到相匹配的地址時,地址匹配引腳AM置為高電平;在這之后,當nRF905接收完畢一個有效的數據包(CRC校驗正確)時,nRF905將去掉前導碼、地址和CRC位,同時將數據準備就緒引腳DR置為高電平,并用單片機將TRX-CN引腳設置為低電平,以進入空閑模式,從而使單片機能夠通過SPI接口讀出有效的數據;當所有的數據讀出后,nRF905將AM和DR設置為低電平,以便使nRF905準備進入其它工作模式。 第五章 系統仿真與硬件調試5.1系統仿真系統的仿真過程是使用proteus仿真軟件進行,由于在proteus軟件中找不到NRF905的仿真模塊,所以仿真過程中沒有實現無線收發的仿真電路,只是進行了溫度檢測和顯示過程的仿真操作。仿真圖如圖18所示: 

圖18 溫度采集仿真圖 5.2 系統硬件調試系統硬件的制作過程全部在學校實驗室完成,在制作條件上受到一定的限制。在制作PCB電路板的過程中,由于打孔機上的打孔針只有一種直徑的,所以導致過孔和焊接點的孔徑大小一樣,焊接時要特別注意分清。因為制作的過孔之間是沒有伏銅,連接過孔的兩層導線是不相通的,需要手工進行焊接,千萬不可漏焊。所以在硬件的調試過程要注意過孔的問題。另外,在制作電路電路板時,使用的是腐蝕刻線,很容易出現斷線現象,所以在焊接器件之前最好將斷線全部焊接好,避免斷線導致調試過程的不正常現象,因為焊接后電路板上的斷線不容易補焊。 在電路板的設計過程中要盡量在底層布線,同樣是因為孔內沒有加銅的原因,如果是頂層走線,就需要在頂層焊接,而頂層焊接時遇到像數碼管之類的器件的管腳很難在正面焊接,即使焊接也很容易出現虛焊現象,導致接觸不良。 在調試過程中,我的電路板出現了正面布線焊接時出現短路和斷路現象,導致串口無法使用,模塊供電不正常等現象,最后經過使用萬用表仔細的檢測后才找出原因,過程繁瑣異常。 調試過程主要就是一個檢測過程,一定要有耐心,夠仔細,不然很難找出問題的根本原因。所以在電路PCB板的設計過程中,腐蝕刻線過程中,焊接電路板時都需要認真仔細對待,盡量減少因為硬件導致模塊功能不正常的問題出現,但同時,電路板出現問題的調試過程也是一個很好學習和經驗積累過程,一定要認真對待,自己找原因,不要總是讓別人代勞。 5.3 調試結果經過不斷認真的調試過程,且電路的設計也沒有任何問題,最后電路板終于能夠完全實現預先設計的所有功能。 第六章 心得與體會經過一個星期的現代檢測技術課程設計,我們小組成功地完成了無線溫度檢測系統的設計。雖然整個設計中我們遇到了很多問題,但通過我們自己九個人的分工,查找資料,調試、仿真,不斷地調整設計思路,最終成功地完成了設計目標。這次課程設計讓我自己對于學習現代檢測技術有了更深一步地了解,通過實際地操作,發現書上的理論知識與在實際運用中的還是有一定的出入的。經過自己不斷地摸索,改進,從中學到了很多實際知識。 整個設計制作中也培養了我的實際操作能力和團隊合作能力,不僅加強了自己獨立工作地能力,而且還充分地體會到了設計創作地艱辛,看到制作完成時也體會到了成功地喜悅,收獲了不少課外知識。還有要感謝李老師以及楊老師在我們遇到困難時,給予我們的建議與鼓勵。 設計過程中感受最深的就是編寫程序后的調試過程,確實是一個漫長而痛苦的過程。我們根據顯示的結果不斷尋找錯誤點,各個擊破。雖然很累(每天都熬夜),但是當程序跳出來之后,心中的喜悅是不言而喻的,不管之前多么的痛苦都是值得的! 通過此次課程設計,我總結了幾點: ①每一個系統的生成,都是經過層層周密的思考與測試而得到的,這需要團隊的合作以及個人優秀的素質。 ②寫程序過程中,切記戒驕戒躁,踏踏實實,一步一個腳印。學會模塊化編程,會讓你少走很多彎路。 ③當程序很多很復雜時,應該寫一個模塊就調試一個,這樣下來會輕松的解決各個問題,而不像你一次性全寫完,錯了之后再來調就很復雜了。 ④硬件電路的調試,也是需要極大的耐性,以及擁有良好的電子基礎,這個需要多加練習。 再次感謝我們的李老師.,老師嚴謹細致、一絲不茍的作風一直是我工作、學習中的榜樣;老師循循善誘的教導和不拘一格的思路給予我無盡的啟迪;這次課程設計中離不開老師您的細心指導。而您開朗的個性和寬容的態度,幫助我能夠很順利的完成了這次課程設計。 同時感謝對我幫助過的同學們,謝謝你們對我的幫助和支持,讓我感受到同學的友誼。
附錄一:原理圖 
上位機Labview數據顯示程序 前面板 后面板labview程序
- //*************此程序為nRF905的發送程序***********
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- //*******************定義命令字**********************
- #define WC 0x00 // Write configuration register command
- #define RC 0x10 // Read configuration register command
- #define WTP 0x20 // Write TX Payload command
- #define RTP 0x21 // Read TXPayload command
- #define WTA 0x22 // Write TX Address command
- #define RTA 0x23
-
- //*******************管腳配置*********
- sbit TXEN=P1^0;
- sbit TRX_CE=P1^1;
- sbit PWR=P1^2;
- sbit MISO=P1^4;
- sbit MOSI=P1^5;
- sbit SCK=P1^6;
- sbit CSN=P1^7;
- /////////////////////////////////////////////////////
- sbit AM=P3^3;
- sbit DR=P3^4;
- sbit CD=P3^2;
- sbit DQ=P1^3;
- //uchar Txbuf[4];
- uchar display[5]={0x00,0x00,0x00,0x00,0x00}; //前面4字節是要發送的內容
- //從前往后是溫度數據低位到高位
- // 溫度小數部分查表
- uchar code ditab[16]=
- {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
- uint h;
- uchar flag;
- //rf905控制信息
- uchar Rfconfig[10]={0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
- uchar data temp_data[2]={0x00,0x00};
-
- void delay(uint x)
- {
- uint i;
- for(i=0;i<x;i++)
- {
- _nop_();
- }
- }
-
- //18b20相關函數
- /***********18B20復位函數**********/
- void ow_reset(void)
- {
- char presence=1;
- while(presence)
- {
- while(presence)
- {
- DQ=1;_nop_();_nop_();
- DQ=0; //
- delay(50); // 550us
- DQ=1; //
- delay(6); // 66us
- presence=DQ; // presence=0繼續下一步
- }
- delay(45); //延時500us
- presence = ~DQ;
- }
- DQ=1;
- }
-
- /**********18B20寫命令函數*********/
- //向 1-WIRE 總線上寫一個字節
- void write_byte(uchar val)
- {
- uchar i;
- for (i=8; i>0; i--) //
- {
- DQ=1;_nop_();_nop_();
- DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
- DQ = val&0x01; //最低位移出
- delay(6); //66us
- val=val/2; //右移一位
- }
- DQ = 1;
- delay(1);
- }
-
- /*********18B20讀1個字節函數********/
- //從總線上讀取一個字節
- uchar read_byte(void)
- {
- uchar i;
- uchar value = 0;
- for (i=8;i>0;i--)
- {
- DQ=1;_nop_();_nop_();
- value>>=1;
- DQ = 0; //
- _nop_();_nop_();_nop_();_nop_(); //4us
- DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us
- if(DQ)value|=0x80;
- delay(6); //66us
- }
- DQ=1;
- return(value);
- }
-
- /***********讀出溫度函數**********/
- void read_temp()
- {
- ow_reset(); //總線復位
- write_byte(0xCC); // 發Skip ROM命令
- write_byte(0xBE); // 發讀命令
- temp_data[0]=read_byte(); //溫度低8位
- temp_data[1]=read_byte(); //溫度高8位
- ow_reset();
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發轉換命令
- }
-
- /***********溫度數據處理函數**********/
- void work_temp()
- {
- uchar n=0;
- uchar doth,dotl;
- uchar flag3=1,flag2=1; //數字顯示修正標記
- if((temp_data[1]&0xf8)!=0x00)
- {
- temp_data[1]=~(temp_data[1]);
- temp_data[0]=~(temp_data[0])+1;
- n=1;
- flag=1;
- }//負溫度求補碼
- if(temp_data[0]>255)
- {
- temp_data[1]++;
- }
- display[4]=temp_data[0]&0x0f;
- display[0]=ditab[display[4]];
- doth=display[0]/10;
- dotl=display[0]%10;
- display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
- display[3]=display[4]/100;
- display[2]=display[4]/10%10;
- display[1]=display[4]%10;
- if(!display[3])
- {
- display[3]=0x0a;
- flag3=0;
- if(!display[2])
- {
- display[2]=0x0a;
- flag2=0;
- }
- }//最高位為0時都不顯示
- if(n)
- {
- display[3]=0x0b;//負溫度時最高位顯示"-"
- flag3=0;
- }
- }
- //905相關函數
- void Spiwrite(uchar dat)
- {
- uchar i=8;
- while(i--)
- {
- delay(10);
- SCK=0;
- MOSI=(bit)(dat&0x80);
- dat<<=1;
- delay(10);
- SCK=1;
- delay(10);
- SCK=0;
- }
- SCK=0;
- }
-
- void Txpacket(void)
- {
- TXEN=1;
- CSN=0;
- Spiwrite(0x22);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- Spiwrite(0xe7);
- CSN=1;
- _nop_();_nop_();
- CSN=0;
- Spiwrite(0x20);
- Spiwrite(display[0]);
- Spiwrite(display[1]);
- Spiwrite(display[2]);
- Spiwrite(display[3]);
- CSN=1;
- _nop_();_nop_();
- TRX_CE=1;
- delay(50);
- while(!DR);
- TRX_CE=0;
- }
-
- void ini_system(void)
- {
- uchar i;
- CSN=1;
- SCK=0;
- PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
- TRX_CE=0; // 1 | 0 | 0 | SPI Programming
- TXEN=0;
- _nop_();
- CSN=0;
- Spiwrite(0x00);
- for(i=0;i<10;i++)
- {
- Spiwrite(Rfconfig[i]);
- }
- CSN=1;
- }
- void setmode()
- {
- PWR=1; // PWR_UP TRX_CE TXEN MODE
- TRX_CE=1; // 1 1 1 SHOCKBURST TX
- TXEN=1;
- delay(1000); //time must be >=650us
- }
-
- void nRF905Init(void)
- {
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init low
- DR=1; // Init DR for input
- AM=1; // Init AM for input
- CD=1; // Init CD for input
- PWR=1; // nRF905 power on
- TRX_CE=0; // Set nRF905 in standby mode
- TXEN=0; // set radio in Rx mode
- }
- void main()
- {
- ow_reset(); // 開機先轉換一次
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 發轉換命令
- nRF905Init();
- ini_system();
- while(1)
- {
- read_temp(); //讀出18B20溫度數據
- work_temp(); //處理溫度數據
- setmode();
- delay(100);
- Txpacket();
- delay(1000);
- }
- }
-
- 接收部分程序:
- /*****接收時用數碼管顯示接收到的數據**********/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define disdate P0 //段碼輸出口
- #define discan P2 //掃描口
-
- //############################################
- //數碼管顯示部分
- uchar dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
- //共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
- uchar dis_can[4]={0xfe,0xfd,0xfb,0xf7};//列選代碼
- #define WC 0x00
- #define RC 0x10
- #define WTP 0x20
- #define RTP 0x21
- #define WTA 0x22
- #define RTA 0x23
- #define RRP 0x24
- sbit TXEN=P1^0;
- sbit TRX_CE=P1^1;
- sbit PWR=P1^2;
- sbit MISO=P1^4;
- sbit MOSI=P1^5;
- sbit SCK=P1^6;
- sbit CSN=P1^7;
- /////////////////////////////////////////////////////
- sbit AM=P3^3;
- sbit DR=P3^4;
- sbit CD=P3^2;
-
- sbit DP=P0^7;
- unsigned char Rxbuf[4]={0x00,0x00,0x00,0x00};
- unsigned char Rfconfig[10]=
- {0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58};
- void delay110(uint z)
- { uchar x;
- uint y;
- for(x=0;x<=110;x++)
- for(y=0;y<=z;y++);
- }
- void delay(uint x)
- { uint i;
- for(i=0;i<x;i++)
- {
- _nop_();
- }
- }
-
- void Spiwrite(uchar dat)
- {uchar i=8;
- for(i=0;i<8;i++)
- {
- delay(10);
- SCK=0;
- MOSI=(bit)(dat&0x80);
- dat<<=1;
- delay(10);
- SCK=1;
- delay(10);
- SCK=0;
- }
- SCK=0;
- }
-
- unsigned char Spiread(void)
- {
- uchar i=8;
- uchar ddat;
- for(i=0;i<8;i++)
- {
- ddat<<=1;
- SCK=0;
- _nop_();
- _nop_();
- ddat|=MISO;
- SCK=1;
- _nop_();_nop_();
- }
- SCK=0;
- return ddat;
- }
- void Rxpacket(void)
- {
- unsigned char j=0;
- delay110(50);
- TRX_CE=0;
- PWR=1;
- CSN=0;
- delay(1);
- Spiwrite(RRP);
- for(j=0;j<4;j++)
- {
- Rxbuf[j]=Spiread();
- }
- CSN=1;
- delay110(5);
- // TRX_CE=1; // Set TRX_CE high,start Tx data transmission
- }
-
- void ini_system(void)
- {
- uchar i;
- CSN=1;
- SCK=0;
- PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
- TRX_CE=0; // 1 | 0 | 0 | SPI Programming
- TXEN=0;
- _nop_();
- CSN=0;
- Spiwrite(WC);
- for(i=0;i<10;i++)
- {
- Spiwrite(Rfconfig[i]);
- }
- CSN=1;
- }
- void setmode()
- {
- PWR=1; // PWR_UP TRX_CE TXEN MODE
- TRX_CE=1; // 1 1 0 SHOCKBURST RX
- TXEN=0;
- delay(500); //time must be >=650us
- }
-
- /***********顯示掃描函數**********/
- void scan()
- {
- char k;
- for(k=0;k<4;k++) //四位LED掃描控制
- {
- disdate=0xff;
- disdate=dis_7[Rxbuf[k]];
- if(k==1){DP=0;}
- discan=dis_can[3-k];delay(90);
- discan=0xff;
- }
- }
-
- void nRF905Init(void)
- {
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init low
- DR=1; // Init DR for input
- AM=1; // Init AM for input
- CD=1; // Init CD for input
- PWR=1; // nRF905 power on
- TRX_CE=0; // Set nRF905 in standby mode
- TXEN=0; // set radio in Rx mode
- }
-
- unsigned char CheckDR(void) //檢查是否有新數據傳入 Data Ready
- {
- if (DR==1&&TRX_CE==1&&TXEN==0)
- {
- // Delay(50) ;
- return 1;
- }
- else
- {
- return 0;
- }
- }
- uchar m;
- uint n;
-
- void main()
- {
- nRF905Init();
- ini_system();
- while(1)
- {
- setmode();
- while (CheckDR()==0);
- // delay(10);
- Rxpacket();
- // delay(1);
- while(DR==1)
- {
- for(m=0;m<=1;m++)
- {
- scan();
- }
- }
- //delay110(2);
- for(m=0;m<=100;m++)
- {
- scan();
- }
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機系統的溫度檢測與無線收發設計.doc
(1.23 MB, 下載次數: 26)
2018-12-9 13:35 上傳
點擊文件名下載附件
|