目錄 摘要.....................................................................3 Abstract.................................................................4 第一章 緒論 ...........................................................5 1.1 設(shè)計背景與意義......................................................5 1.2 設(shè)計目的及應(yīng)用......................................................5 1.3 設(shè)計內(nèi)容及要求 .....................................................5 第二章 系統(tǒng)方案論證與選擇 ..............................................6 2.1 系統(tǒng)總體方案描述 ..................................................6 2.2 系統(tǒng)總體框圖........................................................6 2.3 系統(tǒng)硬件構(gòu)成........................................................6 第三章 系統(tǒng)硬件主要單元設(shè)計.............................................7 3.1 主控制模塊..........................................................7 3.2 數(shù)據(jù)顯示模塊........................................................9 3.3 信號采集模塊 ........................................................9 3.4 無線收發(fā)模塊.......................................................10 第四章 系統(tǒng)軟件設(shè)計....................................................11 4.1 程序設(shè)計思路.......................................................11 4.2 程序設(shè)計框圖.......................................................12 第五章 系統(tǒng)硬件調(diào)試結(jié)果圖.........................,,,,,,,,.............15 5.1 系統(tǒng)仿真............................................................15 5.2 系統(tǒng)硬件調(diào)試.......................................................15 5.3 調(diào)試結(jié)果............................................................16 第六章 心得體會及總結(jié)..................................................16 參考文獻(xiàn)................................................................17 附錄一:原理圖 ..........................................................17 附錄:源程序代碼.........................................................18 摘 要 隨著時代的進(jìn)步和發(fā)展,單片機和傳感器技術(shù)已經(jīng)普及到我們生活,工作等各個領(lǐng)域。新型DS18B20溫度傳感器擺脫了傳統(tǒng)的以熱敏電阻為傳感器的溫度測量方法,而改為一種全新的,以數(shù)字溫度傳感器作感溫元件的數(shù)字式溫度計,解決了傳統(tǒng)的溫度檢測可靠性差,測量溫度準(zhǔn)確率低的缺點,它以單總線的連接方式,使電路大大的簡化。DS18B20傳感器利用單片機進(jìn)行控制,簡單而且易于智能化控制。設(shè)計中還加入了nRF905無線收發(fā)模塊,可以實現(xiàn)一定距離的溫度數(shù)據(jù)傳輸,使得設(shè)計模塊可以進(jìn)行遠(yuǎn)距離的檢測和控制。 此次設(shè)計根據(jù)具體實驗制作,給出了系統(tǒng)實現(xiàn)的硬件原理圖及軟件流程圖。該設(shè)計模塊測量精度高、擴展方便,具有一定的參考價值。設(shè)計布線簡單,結(jié)構(gòu)緊湊,體積小,擴展方便,可在一定距離進(jìn)行無線檢測,在大型倉庫,工廠,智能化建筑等領(lǐng)域的溫度檢測中有廣闊的應(yīng)用前景。 關(guān)鍵詞:DS18B20 STC89C52 nRF905無線收發(fā)模塊 Abstract With the progress of The Times and development, SCM and sensortechnology has spread to we live, work, and other fields. New temperaturesensor DS18B20 from the traditional to thermal resistor sensor for temperaturemeasurement, and instead of a completely new kind of to digital temperaturesensors for temperature of components of the digital thermometer, solve thetraditional temperature detection poor reliability, low temperature measurementaccuracy of weakness, it with single bus connections, the circuit greatlysimplified. The sensor DS18B20 using single chip computer control, simple andeasy to intelligent control. Design also joined the nRF905 wireless transceivermodule, can achieve certain distance of the temperature data transmission, makedesign module can be for long in the detection and control. This design according to the specific experimental production, gives theprinciple diagram of the system hardware and software flow chart. This designmodule measurement precision, expansion easier, to have the certain referencevalue. Design wiring simple, compact structure, small volume, convenientexpansion in a certain distance wireless detection, in a large warehouse,factory, intelligent building and other areas of temperature in detecting havebroad application prospects. Keywords: DS18B20 STC89C52nRF905 wireless transceiver module 第一章 緒論1.1研究背景與意義隨著社會的發(fā)展、科技的進(jìn)步以及人們生活水平的逐步提高,現(xiàn)如今自動化、信息化程度越來越高,單片機和傳感器的應(yīng)用領(lǐng)域越來越廣。各種方便于生活的自動控制系統(tǒng)進(jìn)入了人們的生活。單片機和傳感器在自動控制中的應(yīng)用越來越廣泛,它實用性強,使用方便,技術(shù)先進(jìn),它們的廣泛應(yīng)用是科技進(jìn)步的標(biāo)志。 現(xiàn)實中溫度控制不適當(dāng)導(dǎo)致的發(fā)霉,腐爛問題是倉庫日常工作急需解決的問題,是衡量倉庫管理質(zhì)量的重要指標(biāo)。它直接影響到儲備物資的使用壽命和工作可靠性。為保持日常工作的順利進(jìn)行,首要任務(wù)是加強倉庫的溫度檢測。同時專門的安排人員去定期去倉庫測量溫度也非常麻煩,因此設(shè)計一種自動檢測和顯示溫度,并且能夠進(jìn)行較遠(yuǎn)距離的無限傳輸?shù)臏囟瓤刂圃O(shè)備很有必要。 1.2 研究目的及應(yīng)用溫度的檢測與控制是工業(yè)生產(chǎn)過程中應(yīng)用比較廣泛的課題,隨著傳感器在生產(chǎn)和生活中更加廣泛的應(yīng)用,利用新型單總線式數(shù)字溫度傳感器實現(xiàn)對溫度的單點和多點的測試與控制得到很快開發(fā)。但就目前情況看,很少有人對倉庫進(jìn)行自動化檢測和管理,大多數(shù)的倉庫在管理過程中依然是使用傳統(tǒng)的工作方法,利用溫度計等簡單檢測工具人工檢測倉庫溫濕度。這種方法不僅費時、費力,而且效率低下。市場需要普及一種簡單、實用、易操作并且可以進(jìn)行無線傳輸?shù)臏囟葯z測設(shè)備。 1.3 設(shè)計內(nèi)容及要求本文著重闡述以單片機控制,溫度傳感器DS18B20對溫度的數(shù)據(jù)采集和處理,NRF905無線發(fā)送和接收模塊的應(yīng)用,4位共陽極數(shù)碼管對溫度傳感器處理后的溫度進(jìn)行顯示,實現(xiàn)一定距離上的定點溫度自動檢測和發(fā)送接收。 第二章 系統(tǒng)方案論證與選擇2.1 系統(tǒng)總體方案描述系統(tǒng)設(shè)計分為2個部分,第一個部分實現(xiàn)溫度的檢測、顯示和發(fā)送,第二個部分為數(shù)據(jù)的接收和顯示。第一個設(shè)計模塊中,利用單片機STC89C52控制溫度傳感器DS18B20定點檢測和處理溫度數(shù)據(jù),單片機將采集的溫度數(shù)據(jù)發(fā)送給單片機,再通過單片機控制,對接收到的溫度數(shù)據(jù)進(jìn)行一定的轉(zhuǎn)換和處理,然后存放在寄存器中,等待下一步處理,再經(jīng)過無線發(fā)送模塊nRF905將顯示的數(shù)據(jù)打包發(fā)送給第二個模塊。第二個設(shè)計模塊中,同樣利用STC89C52單片機作為控制主體,先控制nRF905無線接收模塊接收第一個模塊發(fā)送的數(shù)據(jù),然后控制4位共陽極數(shù)碼管顯示接收到的數(shù)據(jù)。則完成整個設(shè)計流程。 2.2 系統(tǒng)總體框圖系統(tǒng)的設(shè)計框圖如圖1所示:
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image001.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png |
第一模塊
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png |
溫度采集 溫度顯示 發(fā)送溫度數(shù)據(jù) file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
接收溫度數(shù)據(jù) file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png 第二模塊
| | | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png | | | | |
顯示溫度數(shù)據(jù) file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png圖1 系統(tǒng)框圖 2.3 系統(tǒng)硬件構(gòu)成系統(tǒng)硬件方面主要由單片機最小系統(tǒng),溫度傳感器DS18B20,4位共陽極數(shù)碼管,還有nRF905無線收發(fā)模塊組成,目的在于實現(xiàn)溫度的準(zhǔn)確檢測和無線收發(fā)所檢測的溫度數(shù)據(jù)。 第三章 系統(tǒng)硬件電路設(shè)計3.1 單片機最小系統(tǒng)設(shè)計單片機最小系統(tǒng)的設(shè)計主要有五個部分組成,電源電路,復(fù)位電路,晶振電路,串口電路和控制主體的STC89C52單片機。 電源電路由一個六腳的按鍵開關(guān),一個1K的電阻,一個10uF的極性電容和一個顯示電路供電狀態(tài)的發(fā)光二極管組成。開關(guān)為了適應(yīng)各種情況下能夠方便供電,開關(guān)外接有一個USB接口和一個DC-5V的標(biāo)準(zhǔn)電源接口作為供電設(shè)備使用。除此之外還設(shè)計了一個外接電源接口。電源電路如圖2所示。 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 圖2電源電路 復(fù)位電路組成很簡單,僅僅有4個小器件構(gòu)成,一個是作為復(fù)位控制的四腳按鍵,一個10uF的極性電容,還有兩個電阻,阻值分別為1K和10K。電路與單片機的RST端口連接,電路上電后,按下按鍵控制系統(tǒng)復(fù)位。具體電路如圖3所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 圖3復(fù)位電路 晶振電路更為簡單,只有3個器件,一個11.0592Hz的晶振外加二個30PF的普通電容組成,晶振兩端分別與單片機的XTAL1和XTAL2口相接。電路如圖4所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 圖4 晶振電路 串口電路主要利用MAX232來實現(xiàn),MAX232是美信公司設(shè)計的一款單電源電平轉(zhuǎn)換芯片,在本次設(shè)計中的使用的方法是在MAX232的1和3管腳之間,4和5管腳之間,2和16管腳之間,6和15管腳之間,還有16和16管腳之間全部加上一個0.1uF的電容,7和8管腳作為串口輸入端,外接一個標(biāo)準(zhǔn)9孔串口母頭,9和10管腳作為輸出,分別與單片機的P3.0和P3.1連接。這樣就構(gòu)成了與單片機連接,可以進(jìn)行串口通信的串口電路。具體電路圖5所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg 圖5 串口電路 單片機最小系統(tǒng)的主體部分使用的是STC89C52單片機,它是美國ATMEL公司生產(chǎn)的低電壓,高性能的CMOS 8位單片機,片內(nèi)寄存器可反復(fù)擦洗,含有32個可編程雙向I/O口,3個16位定時/計數(shù)器,共8個中斷源。需要指出且注意的是,單片機在系統(tǒng)設(shè)計時,管腳EA要始終接高電平。因為EA接高電平時,單片機讀取內(nèi)部程序存儲器。當(dāng)擴展有外部ROM時,讀取完內(nèi)部ROM后自動讀取外部ROM,EA接低電平時,單片機直接讀取外部ROM。 而設(shè)計中使用的STC89C52是有內(nèi)部ROM的,所以此引腳始終接高電平。一般在設(shè)計單片機最小系統(tǒng)時,大多會加上流水燈和獨立鍵盤的設(shè)計,但是在我的畢業(yè)設(shè)計中把這些部分作了改進(jìn)?紤]到流水燈和獨立鍵盤這些設(shè)計如果完整的加入就會造成一定的浪費,而且由于學(xué)校實驗室的條件有限,PCB板的刻錄存在很多問題,因此這些設(shè)備會大大增加硬件調(diào)試過程的難度,費時費力。同時,在設(shè)計單片機最小系統(tǒng)時,考慮到不加入這些設(shè)備的話,以后又有可能需要用到。所以中和上面各種因素,在最小系統(tǒng)的設(shè)計部分最后只是增加了二個獨立鍵盤和二個LED發(fā)光二極管作為調(diào)試或需要時使用,同時,考慮到以后可能還會外接其它設(shè)備的介入,為了方便,特意留有兩排20腳的單排插針外接端口,這樣,設(shè)計的最小系統(tǒng)模塊在需要時也可以控制其它外接裝置。使得設(shè)計模塊更加靈活多用,不僅僅局限在本次畢業(yè)設(shè)計中使用,還可以留作以后的開發(fā)板學(xué)習(xí)。 最小系統(tǒng)的主體STC89C52如圖6所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png 圖6 STC89C52管腳接線圖 3.2 數(shù)據(jù)顯示模塊設(shè)計數(shù)據(jù)顯示電路使用的是SMA410364型號的4位共陽極數(shù)碼管,其內(nèi)部結(jié)構(gòu)圖如下面圖7所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg
圖7 數(shù)碼管內(nèi)部結(jié)構(gòu)圖 該數(shù)碼管共有12個管腳,其中11,7,4,2,1,10,5,3管腳分別對應(yīng)數(shù)碼管的A,B,C,D,E,F,G,DP段選位,與單片機的P0口連接,對應(yīng)單片機的P0.0-P0.7口,用來控制數(shù)碼管顯示數(shù)值大小,6,8,9,12管腳控制數(shù)碼管的位選,分別與單片機的P2.0-P2.4口連接,通過單片機指令選擇需要顯示數(shù)據(jù)的數(shù)碼管位。 我們知道,在單片機的端口上電后會一直存在高電平,而數(shù)碼管的位選正好是高電平有效,所以會導(dǎo)致在不需要使用數(shù)碼管的時候,數(shù)碼管依然會保持打開狀態(tài)。通常情況下會在單片機最小系統(tǒng)中使用鎖存器與數(shù)碼管連接,但是在這次設(shè)計中沒有使用鎖存器,而是改用在數(shù)碼管與單片機端口連接之間加一個PNP三極管的方法,讓三極管發(fā)射極接電源,基集與單片機端口連接,集電極與數(shù)碼管連接,這樣的設(shè)計就會導(dǎo)致單片機端口給低電平時才會選通數(shù)碼管,不僅方便控制,而且電路設(shè)計簡單。 設(shè)計原理圖如圖8所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image021.png 圖8 數(shù)碼管電路 3.3 信號采集模塊設(shè)計信號采集部分主要由溫度傳感器DS18B20進(jìn)行 1.DS1820溫度傳感器外觀圖和引腳圖如圖9所示,三個管腳定義如下:[10] file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image024.png① 引腳1接地; ② 引腳2數(shù)字信號輸入/輸出; ③ 引腳3接高電平5V高電平。 2.DS18B20溫度采集模塊設(shè)計[10] 此模塊的設(shè)計中STC89C52單片機作為控制主體,溫度傳感器DS18B20采集溫度, 溫度傳感器DS18B20是一種單線接口傳感器,所以連接電路很簡單,只要將其管腳DQ接單片機的一個端口進(jìn)行溫度采集,VDD接高電平,GND接地即可。設(shè)計中的DQ端被設(shè)計成連接單片機的P1.3端口。 根據(jù)DS18B20的工作原理、內(nèi)部結(jié)構(gòu)圖、時序圖,還有DS18B20的ROM指令操作碼,編寫DS18B20的操作代碼,采集溫度樣本,將采集的樣本數(shù)據(jù)存放在寄存器中等待下一步處理。 3.4無線收發(fā)模塊設(shè)計 無線收發(fā)模塊的功能實現(xiàn)主要是用nRF905無線收發(fā)模塊實現(xiàn)的 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg1.nRF905接口電路和管腳說明[9] 圖11 nRF905管腳圖 (1)VCC為電源接入端,一般接入的電壓在3.3V-3.6V之間,不能超過3.6V,不然很容易將模塊燒壞,建議使用3.3V (2)TX_EN為數(shù)字輸入端口,當(dāng)TX-_EN置1時為TX輸入模式,當(dāng)TX-_EN置0時為RX輸入模式 (3)TRX_CE也是數(shù)字輸入端,它控制使能芯片的發(fā)射和接收 (4)PWR_UP是給芯片上電的數(shù)字輸入端口 (5)uCLK為時鐘輸出端口,此管腳在使用過程中一般廢棄不用 (6)CD數(shù)字輸出端進(jìn)行載波檢測 (7)AM數(shù)字輸出端進(jìn)行地址匹配 (8)DR數(shù)字輸出端,接收和發(fā)送數(shù)據(jù)完成 (9)MISO和MOSI分別為SPI輸出輸入端口 (10)SCK和CSN分別為SPI的時鐘和使能端口 (11)13和14管腳為相同的二個接地端口. 2.nRF905無線收發(fā)模塊設(shè)計 該模塊的設(shè)計中使用到了AMS1117芯片,目的是將上電端口輸入的5V電壓轉(zhuǎn)換成適合nRF905模塊使用的3.3V工作電壓,轉(zhuǎn)換電路中由于使用的是AMS1117芯片,所以設(shè)計簡單許多,只需要在芯片的輸入端和接地端之間,輸出端和接地端之間分別并聯(lián)上一個普通電容和一個極性電容即可,電路設(shè)計如圖12所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg 圖12 AMS1117變壓電路 芯片AMS1117輸出的電壓與無線收發(fā)模塊的VCC口連接,PWR_UP,TX-_EN,TRX_CE,MISO,MOSI,SCK,CSN分別對應(yīng)單片機的P1.0,P1.1,P1.2,P1.4,P1.5,P1.6,P1.7端口,AM,DR,CD分別對應(yīng)單片機的P3.2,P3.3,P3.4端口,uCLK端口廢棄不用,最后的兩個GND端口全部接地,這樣就組成了nRF905的無線控制模塊。可以進(jìn)行程序的調(diào)控使用了。 nRF905模塊的無線發(fā)射接收電路主要利用nRF905與外圍器件構(gòu)成的電路組成,設(shè)計中使用的是購買的成品模塊,其內(nèi)部電路結(jié)構(gòu)沒有詳細(xì)研究,其主要部分是天線。他利用特定的形狀可以將電流轉(zhuǎn)化為射頻能量并以電波形式發(fā)射出去.或?qū)o線電波接收進(jìn)來。 第四章 系統(tǒng)軟件設(shè)計4.1 程序設(shè)計思路程序設(shè)計使用的軟件是是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng)KeilC51。與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。 程序設(shè)計過程中,首要的是會熟練使用各種數(shù)碼管,即要了解數(shù)碼管的構(gòu)造,也要了解其工作原理,并且能夠編寫各種數(shù)碼管的顯示程序,當(dāng)能夠做到這一步,然后還要了解溫度傳感器的內(nèi)部結(jié)構(gòu)和工作原理,還有寄存器的工作方式和讀寫時序圖,然后根據(jù)它的ROM和RAM指令編寫工作代碼,通過單片機讀取后控制數(shù)碼管顯示。 編寫DS18B20的操作代碼時,先初始化傳感器,然后分別讀它的位和比特,然后是寫比特,然后開始主要的轉(zhuǎn)換過程程序設(shè)計,轉(zhuǎn)換時要判斷正負(fù),如果為負(fù)值,則取其值的反碼后加1,得到正值,然后在前面顯示“-”號,最后設(shè)計單片機控制讀取DS18B20的寄存器數(shù)據(jù),通過數(shù)碼管顯示。 設(shè)計了溫度顯示程序后開始設(shè)計無線發(fā)送程序,同樣的需要了解nRF905的結(jié)構(gòu),工作原理寄存器和時序圖,還有SPI口的設(shè)置。設(shè)計程序時,一般先給寄存器配置參數(shù),通過SPI口想配置寄存器讀寫配置信息。然后編寫它的寫操作和讀操作代碼,主機通過SPI接口向配置寄存器寫入信息,最后是它的發(fā)送指令代碼。 在編寫接收代碼程序時,和發(fā)送的代碼過程相似,參考后面的程序附錄。 4.2 程序流程圖溫度采集模塊的程序設(shè)計要特別注意溫度傳感器DS18B20的代碼編寫,在充分了解很清楚DS18B20的基礎(chǔ)上根據(jù)其指令碼,寄存器等編寫其讀寫指令,以及溫度處理轉(zhuǎn)換代碼,然后編寫數(shù)碼管的顯示程序,然后合并,構(gòu)成總的程序流程。Keil C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。其中uVision與Ishell分別是C51為Windows和Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個開發(fā)流程。使用簡單方便。 設(shè)計的數(shù)據(jù)采集模塊具體流程圖15所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image029.png
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image030.png
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image031.png |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image032.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image033.png 負(fù)值
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image034.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png 正值 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image035.png
圖15 數(shù)據(jù)采集流程圖 溫度采集時是,首先將DS18B20進(jìn)行初始化設(shè)置,然后才能進(jìn)行后面的操作。這也是使用各種傳感器設(shè)備的最基本步驟,然后是根據(jù)先前編寫的溫度傳感器代碼讀取傳感器采集的溫度數(shù)據(jù),存儲在其寄存器中,然后進(jìn)行控制轉(zhuǎn)換程序。如果采集的溫度是正值,那么就控制單片機直接讀取經(jīng)NRF905發(fā)送。如果溫度數(shù)據(jù)是負(fù)值,那么要進(jìn)行取反加一后變成正值數(shù)據(jù)再通過無線設(shè)備發(fā)送出去。 無線發(fā)送流程圖如圖16所示:
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image036.png |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image037.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image038.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image039.png N file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image040.png file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image041.png
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image042.png N
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image043.png |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image044.png N
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image045.png file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image046.png 圖16 無線發(fā)送流程圖 初始化nRF905,將接收點的地址和要發(fā)送的有效數(shù)據(jù)將通過SPI接口傳送給nRF905。將TRX-CE和TX-EN全部置為高電平來激活nRF905的ShockBurst的發(fā)送模式。通過nRF905的ShockBurst可使射頻寄存器自動開啟,并完成數(shù)據(jù)包的發(fā)送,DR置高。 然后判斷TRX-CE電平,如果置低將返回初始不進(jìn)行后面的操作,如果置高,那么將AUTO-RETRAN也設(shè)置為高電平,從而使nRF905將連續(xù)不斷地重復(fù)發(fā)送數(shù)據(jù)包,直到TRX-CE被設(shè)置為低電平為止;而當(dāng)TRX-CE被設(shè)置為低電平時,DR=0,nRF905則結(jié)束數(shù)據(jù)傳輸,并將自己設(shè)置為空閑模式。 在ShockBurst模式下,只要開始發(fā)送數(shù)據(jù),TRX-CE和TX-EN的引腳無論是高電平還是低電平,發(fā)送過程都會被保證處理完畢。 無線接收流程圖如圖17所示:
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image047.png |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image048.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image049.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image050.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image051.png file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image051.png
| | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image052.png |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image053.png N file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image054.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image055.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image056.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image051.png
| | | | | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image057.png | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image058.png | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image059.png | | |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image060.png file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image061.png N
| | | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image062.png | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image063.png | |
file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image064.png N file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image065.pngfile:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image051.png | | | | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image066.png | | | file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image051.png |
圖17 無線接收流程圖 首先,將TRX-CE置為高,TX-EN置為低,nRF905進(jìn)入接收模式,然后不斷監(jiān)測有無信號,等待接收;當(dāng)nRF905檢測到有和接收頻率相同的載波時,其載波檢測引腳CD置為高電平;此后,當(dāng)nRF905接收到相匹配的地址時,地址匹配引腳AM置為高電平;在這之后,當(dāng)nRF905接收完畢一個有效的數(shù)據(jù)包(CRC校驗正確)時,nRF905將去掉前導(dǎo)碼、地址和CRC位,同時將數(shù)據(jù)準(zhǔn)備就緒引腳DR置為高電平,并用單片機將TRX-CN引腳設(shè)置為低電平,以進(jìn)入空閑模式,從而使單片機能夠通過SPI接口讀出有效的數(shù)據(jù);當(dāng)所有的數(shù)據(jù)讀出后,nRF905將AM和DR設(shè)置為低電平,以便使nRF905準(zhǔn)備進(jìn)入其它工作模式。 第五章 系統(tǒng)仿真與硬件調(diào)試5.1系統(tǒng)仿真系統(tǒng)的仿真過程是使用proteus仿真軟件進(jìn)行,由于在proteus軟件中找不到NRF905的仿真模塊,所以仿真過程中沒有實現(xiàn)無線收發(fā)的仿真電路,只是進(jìn)行了溫度檢測和顯示過程的仿真操作。仿真圖如圖18所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image069.png
圖18 溫度采集仿真圖 5.2 系統(tǒng)硬件調(diào)試系統(tǒng)硬件的制作過程全部在學(xué)校實驗室完成,在制作條件上受到一定的限制。在制作PCB電路板的過程中,由于打孔機上的打孔針只有一種直徑的,所以導(dǎo)致過孔和焊接點的孔徑大小一樣,焊接時要特別注意分清。因為制作的過孔之間是沒有伏銅,連接過孔的兩層導(dǎo)線是不相通的,需要手工進(jìn)行焊接,千萬不可漏焊。所以在硬件的調(diào)試過程要注意過孔的問題。另外,在制作電路電路板時,使用的是腐蝕刻線,很容易出現(xiàn)斷線現(xiàn)象,所以在焊接器件之前最好將斷線全部焊接好,避免斷線導(dǎo)致調(diào)試過程的不正,F(xiàn)象,因為焊接后電路板上的斷線不容易補焊。 在電路板的設(shè)計過程中要盡量在底層布線,同樣是因為孔內(nèi)沒有加銅的原因,如果是頂層走線,就需要在頂層焊接,而頂層焊接時遇到像數(shù)碼管之類的器件的管腳很難在正面焊接,即使焊接也很容易出現(xiàn)虛焊現(xiàn)象,導(dǎo)致接觸不良。 在調(diào)試過程中,我的電路板出現(xiàn)了正面布線焊接時出現(xiàn)短路和斷路現(xiàn)象,導(dǎo)致串口無法使用,模塊供電不正常等現(xiàn)象,最后經(jīng)過使用萬用表仔細(xì)的檢測后才找出原因,過程繁瑣異常。 調(diào)試過程主要就是一個檢測過程,一定要有耐心,夠仔細(xì),不然很難找出問題的根本原因。所以在電路PCB板的設(shè)計過程中,腐蝕刻線過程中,焊接電路板時都需要認(rèn)真仔細(xì)對待,盡量減少因為硬件導(dǎo)致模塊功能不正常的問題出現(xiàn),但同時,電路板出現(xiàn)問題的調(diào)試過程也是一個很好學(xué)習(xí)和經(jīng)驗積累過程,一定要認(rèn)真對待,自己找原因,不要總是讓別人代勞。 5.3 調(diào)試結(jié)果經(jīng)過不斷認(rèn)真的調(diào)試過程,且電路的設(shè)計也沒有任何問題,最后電路板終于能夠完全實現(xiàn)預(yù)先設(shè)計的所有功能。 第六章 心得與體會經(jīng)過一個星期的現(xiàn)代檢測技術(shù)課程設(shè)計,我們小組成功地完成了無線溫度檢測系統(tǒng)的設(shè)計。雖然整個設(shè)計中我們遇到了很多問題,但通過我們自己九個人的分工,查找資料,調(diào)試、仿真,不斷地調(diào)整設(shè)計思路,最終成功地完成了設(shè)計目標(biāo)。這次課程設(shè)計讓我自己對于學(xué)習(xí)現(xiàn)代檢測技術(shù)有了更深一步地了解,通過實際地操作,發(fā)現(xiàn)書上的理論知識與在實際運用中的還是有一定的出入的。經(jīng)過自己不斷地摸索,改進(jìn),從中學(xué)到了很多實際知識。 整個設(shè)計制作中也培養(yǎng)了我的實際操作能力和團隊合作能力,不僅加強了自己獨立工作地能力,而且還充分地體會到了設(shè)計創(chuàng)作地艱辛,看到制作完成時也體會到了成功地喜悅,收獲了不少課外知識。還有要感謝李老師以及楊老師在我們遇到困難時,給予我們的建議與鼓勵。 設(shè)計過程中感受最深的就是編寫程序后的調(diào)試過程,確實是一個漫長而痛苦的過程。我們根據(jù)顯示的結(jié)果不斷尋找錯誤點,各個擊破。雖然很累(每天都熬夜),但是當(dāng)程序跳出來之后,心中的喜悅是不言而喻的,不管之前多么的痛苦都是值得的! 通過此次課程設(shè)計,我總結(jié)了幾點: ①每一個系統(tǒng)的生成,都是經(jīng)過層層周密的思考與測試而得到的,這需要團隊的合作以及個人優(yōu)秀的素質(zhì)。 ②寫程序過程中,切記戒驕戒躁,踏踏實實,一步一個腳印。學(xué)會模塊化編程,會讓你少走很多彎路。 ③當(dāng)程序很多很復(fù)雜時,應(yīng)該寫一個模塊就調(diào)試一個,這樣下來會輕松的解決各個問題,而不像你一次性全寫完,錯了之后再來調(diào)就很復(fù)雜了。 ④硬件電路的調(diào)試,也是需要極大的耐性,以及擁有良好的電子基礎(chǔ),這個需要多加練習(xí)。 再次感謝我們的李老師.,老師嚴(yán)謹(jǐn)細(xì)致、一絲不茍的作風(fēng)一直是我工作、學(xué)習(xí)中的榜樣;老師循循善誘的教導(dǎo)和不拘一格的思路給予我無盡的啟迪;這次課程設(shè)計中離不開老師您的細(xì)心指導(dǎo)。而您開朗的個性和寬容的態(tài)度,幫助我能夠很順利的完成了這次課程設(shè)計。 同時感謝對我?guī)椭^的同學(xué)們,謝謝你們對我的幫助和支持,讓我感受到同學(xué)的友誼。 參考文獻(xiàn)[1] 丁元杰. 單片微機原理及應(yīng)用[M]. 北京:機械工業(yè)出版社,2005. [2] 郭天祥. 51單片機C語言教程[M]. 北京:電子工業(yè)出版社,2009. [3] 陳杰,黃鴻. 傳感器與檢測技術(shù)[M]. 北京:高等教育出版社,2010. [4] 李華. 51系列單片機實用接口技術(shù)[M]. 北京:北京航空航天大學(xué)出版社,2002. [5] 譚浩強.C程序設(shè)計(第四版)[M].北京:清華大學(xué)出版社,2012. [6] nRF905無線收發(fā)模塊開發(fā)指南(V3.2)[CD]. 杭州飛拓電子科技有線公司. [7]溫度傳感器DS18B20資料. 附錄一:原理圖 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image071.jpg 上位機Labview數(shù)據(jù)顯示程序 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image073.jpg 前面板 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image075.jpg 后面板labview程序 附錄二:源程序代碼
//*************此程序為nRF905的發(fā)送程序*********** #include<reg52.h> #include<intrins.h> #defineuchar unsigned char #defineuint unsigned int //*******************定義命令字********************** #defineWC 0x00 // Write configuration registercommand #defineRC 0x10 // Read configuration registercommand #defineWTP 0x20 // Write TX Payload command #defineRTP 0x21 // Read TXPayload command #defineWTA 0x22 // Write TX Address command #defineRTA 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; sbitDQ=P1^3; //ucharTxbuf[4]; uchardisplay[5]={0x00,0x00,0x00,0x00,0x00}; //前面4字節(jié)是要發(fā)送的內(nèi)容 //從前往后是溫度數(shù)據(jù)低位到高位 // 溫度小數(shù)部分查表 ucharcode ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uint h; ucharflag; //rf905控制信息 ucharRfconfig[10]={0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58}; uchardata temp_data[2]={0x00,0x00}; voiddelay(uint x) { uint i; for(i=0;i<x;i++) { _nop_(); } } //18b20相關(guān)函數(shù) /***********18B20復(fù)位函數(shù)**********/ voidow_reset(void) { charpresence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_(); DQ=0; // delay(50);// 550us DQ=1; // delay(6);// 66us presence=DQ;// presence=0繼續(xù)下一步 } delay(45); //延時500us presence= ~DQ; } DQ=1; } /**********18B20寫命令函數(shù)*********/ //向 1-WIRE 總線上寫一個字節(jié) voidwrite_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個字節(jié)函數(shù)********/ //從總線上讀取一個字節(jié) ucharread_byte(void) { uchar i; ucharvalue = 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); } /***********讀出溫度函數(shù)**********/ voidread_temp() { ow_reset(); //總線復(fù)位 write_byte(0xCC);// 發(fā)Skip ROM命令 write_byte(0xBE);// 發(fā)讀命令 temp_data[0]=read_byte();//溫度低8位 temp_data[1]=read_byte();//溫度高8位 ow_reset(); write_byte(0xCC);// Skip ROM write_byte(0x44);// 發(fā)轉(zhuǎn)換命令 } /***********溫度數(shù)據(jù)處理函數(shù)**********/ voidwork_temp() { ucharn=0; uchar doth,dotl; ucharflag3=1,flag2=1; //數(shù)字顯示修正標(biāo)記 if((temp_data[1]&0xf8)!=0x00) { temp_data[1]=~(temp_data[1]); temp_data[0]=~(temp_data[0])+1; n=1; flag=1; }//負(fù)溫度求補碼 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;//負(fù)溫度時最高位顯示"-" flag3=0; } } //905相關(guān)函數(shù) voidSpiwrite(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; } voidTxpacket(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; } voidini_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); } CSN=1; } voidsetmode() { PWR=1; // PWR_UP TRX_CE TXEN MODE TRX_CE=1; // 1 1 1 SHOCKBURST TX TXEN=1; delay(1000); //time must be >=650us } voidnRF905Init(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 } voidmain() { ow_reset(); // 開機先轉(zhuǎn)換一次 write_byte(0xCC);// Skip ROM write_byte(0x44);// 發(fā)轉(zhuǎn)換命令 nRF905Init(); ini_system(); while(1) { read_temp(); //讀出18B20溫度數(shù)據(jù) work_temp(); //處理溫度數(shù)據(jù) setmode(); delay(100); Txpacket(); delay(1000); } } 接收部分程序: /*****接收時用數(shù)碼管顯示接收到的數(shù)據(jù)**********/ #include<reg52.h> #include<intrins.h> #defineuchar unsigned char #defineuint unsigned int #definedisdate P0 //段碼輸出口 #definediscan P2 //掃描口 //############################################ //數(shù)碼管顯示部分 uchardis_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""不亮" "-" uchardis_can[4]={0xfe,0xfd,0xfb,0xf7};//列選代碼 #defineWC 0x00 #defineRC 0x10 #defineWTP 0x20 #defineRTP 0x21 #defineWTA 0x22 #defineRTA 0x23 #defineRRP 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; sbitDP=P0^7; unsignedchar Rxbuf[4]={0x00,0x00,0x00,0x00}; unsignedchar Rfconfig[10]= {0x4c,0x0c,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0x58}; voiddelay110(uint z) { uchar x; uint y; for(x=0;x<=110;x++) for(y=0;y<=z;y++); } voiddelay(uint x) { uint i; for(i=0;i<x;i++) { _nop_(); } } voidSpiwrite(uchar dat) {uchari=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; } unsignedchar 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; } voidRxpacket(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 } voidini_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); } CSN=1; } voidsetmode() { PWR=1; // PWR_UP TRX_CE TXEN MODE TRX_CE=1; // 1 1 0 SHOCKBURST RX TXEN=0; delay(500); //time must be >=650us } /***********顯示掃描函數(shù)**********/ voidscan() { 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; } } voidnRF905Init(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 } unsignedchar CheckDR(void) //檢查是否有新數(shù)據(jù)傳入 Data Ready { if(DR==1&&TRX_CE==1&&TXEN==0) { // Delay(50) ; return1; } else { return0; } } uchar m; uint n; voidmain() { 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();
|