目錄 摘要.....................................................................3 Abstract.................................................................4 第一章 緒論 ...........................................................5 1.1 設計背景與意義......................................................5 1.2 設計目的及應用......................................................5 1.3 設計內容及要求 .....................................................5 第二章 系統(tǒng)方案論證與選擇 ..............................................6 2.1 系統(tǒng)總體方案描述 ..................................................6 2.2 系統(tǒng)總體框圖........................................................6 2.3 系統(tǒng)硬件構成........................................................6 第三章 系統(tǒng)硬件主要單元設計.............................................7 3.1 主控制模塊..........................................................7 3.2 數(shù)據(jù)顯示模塊........................................................9 3.3 信號采集模塊 ........................................................9 3.4 無線收發(fā)模塊.......................................................10 第四章 系統(tǒng)軟件設計....................................................11 4.1 程序設計思路.......................................................11 4.2 程序設計框圖.......................................................12 第五章 系統(tǒng)硬件調試結果圖.........................,,,,,,,,.............15 5.1 系統(tǒng)仿真............................................................15 5.2 系統(tǒng)硬件調試.......................................................15 5.3 調試結果............................................................16 第六章 心得體會及總結..................................................16 參考文獻................................................................17 附錄一:原理圖 ..........................................................17 附錄:源程序代碼.........................................................18 摘 要 隨著時代的進步和發(fā)展,單片機和傳感器技術已經(jīng)普及到我們生活,工作等各個領域。新型DS18B20溫度傳感器擺脫了傳統(tǒng)的以熱敏電阻為傳感器的溫度測量方法,而改為一種全新的,以數(shù)字溫度傳感器作感溫元件的數(shù)字式溫度計,解決了傳統(tǒng)的溫度檢測可靠性差,測量溫度準確率低的缺點,它以單總線的連接方式,使電路大大的簡化。DS18B20傳感器利用單片機進行控制,簡單而且易于智能化控制。設計中還加入了nRF905無線收發(fā)模塊,可以實現(xiàn)一定距離的溫度數(shù)據(jù)傳輸,使得設計模塊可以進行遠距離的檢測和控制。 此次設計根據(jù)具體實驗制作,給出了系統(tǒng)實現(xià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ā)展、科技的進步以及人們生活水平的逐步提高,現(xiàn)如今自動化、信息化程度越來越高,單片機和傳感器的應用領域越來越廣。各種方便于生活的自動控制系統(tǒng)進入了人們的生活。單片機和傳感器在自動控制中的應用越來越廣泛,它實用性強,使用方便,技術先進,它們的廣泛應用是科技進步的標志。 現(xiàn)實中溫度控制不適當導致的發(fā)霉,腐爛問題是倉庫日常工作急需解決的問題,是衡量倉庫管理質量的重要指標。它直接影響到儲備物資的使用壽命和工作可靠性。為保持日常工作的順利進行,首要任務是加強倉庫的溫度檢測。同時專門的安排人員去定期去倉庫測量溫度也非常麻煩,因此設計一種自動檢測和顯示溫度,并且能夠進行較遠距離的無限傳輸?shù)臏囟瓤刂圃O備很有必要。 1.2 研究目的及應用溫度的檢測與控制是工業(yè)生產過程中應用比較廣泛的課題,隨著傳感器在生產和生活中更加廣泛的應用,利用新型單總線式數(shù)字溫度傳感器實現(xiàn)對溫度的單點和多點的測試與控制得到很快開發(fā)。但就目前情況看,很少有人對倉庫進行自動化檢測和管理,大多數(shù)的倉庫在管理過程中依然是使用傳統(tǒng)的工作方法,利用溫度計等簡單檢測工具人工檢測倉庫溫濕度。這種方法不僅費時、費力,而且效率低下。市場需要普及一種簡單、實用、易操作并且可以進行無線傳輸?shù)臏囟葯z測設備。 1.3 設計內容及要求本文著重闡述以單片機控制,溫度傳感器DS18B20對溫度的數(shù)據(jù)采集和處理,NRF905無線發(fā)送和接收模塊的應用,4位共陽極數(shù)碼管對溫度傳感器處理后的溫度進行顯示,實現(xiàn)一定距離上的定點溫度自動檢測和發(fā)送接收。 第二章 系統(tǒng)方案論證與選擇2.1 系統(tǒng)總體方案描述系統(tǒng)設計分為2個部分,第一個部分實現(xiàn)溫度的檢測、顯示和發(fā)送,第二個部分為數(shù)據(jù)的接收和顯示。第一個設計模塊中,利用單片機STC89C52控制溫度傳感器DS18B20定點檢測和處理溫度數(shù)據(jù),單片機將采集的溫度數(shù)據(jù)發(fā)送給單片機,再通過單片機控制,對接收到的溫度數(shù)據(jù)進行一定的轉換和處理,然后存放在寄存器中,等待下一步處理,再經(jīng)過無線發(fā)送模塊nRF905將顯示的數(shù)據(jù)打包發(fā)送給第二個模塊。第二個設計模塊中,同樣利用STC89C52單片機作為控制主體,先控制nRF905無線接收模塊接收第一個模塊發(fā)送的數(shù)據(jù),然后控制4位共陽極數(shù)碼管顯示接收到的數(shù)據(jù)。則完成整個設計流程。 2.2 系統(tǒng)總體框圖系統(tǒng)的設計框圖如圖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)硬件構成系統(tǒng)硬件方面主要由單片機最小系統(tǒng),溫度傳感器DS18B20,4位共陽極數(shù)碼管,還有nRF905無線收發(fā)模塊組成,目的在于實現(xiàn)溫度的準確檢測和無線收發(fā)所檢測的溫度數(shù)據(jù)。 第三章 系統(tǒng)硬件電路設計3.1 單片機最小系統(tǒng)設計單片機最小系統(tǒng)的設計主要有五個部分組成,電源電路,復位電路,晶振電路,串口電路和控制主體的STC89C52單片機。 電源電路由一個六腳的按鍵開關,一個1K的電阻,一個10uF的極性電容和一個顯示電路供電狀態(tài)的發(fā)光二極管組成。開關為了適應各種情況下能夠方便供電,開關外接有一個USB接口和一個DC-5V的標準電源接口作為供電設備使用。除此之外還設計了一個外接電源接口。電源電路如圖2所示。 file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg 圖2電源電路 復位電路組成很簡單,僅僅有4個小器件構成,一個是作為復位控制的四腳按鍵,一個10uF的極性電容,還有兩個電阻,阻值分別為1K和10K。電路與單片機的RST端口連接,電路上電后,按下按鍵控制系統(tǒng)復位。具體電路如圖3所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image011.jpg 圖3復位電路 晶振電路更為簡單,只有3個器件,一個11.0592Hz的晶振外加二個30PF的普通電容組成,晶振兩端分別與單片機的XTAL1和XTAL2口相接。電路如圖4所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 圖4 晶振電路 串口電路主要利用MAX232來實現(xiàn),MAX232是美信公司設計的一款單電源電平轉換芯片,在本次設計中的使用的方法是在MAX232的1和3管腳之間,4和5管腳之間,2和16管腳之間,6和15管腳之間,還有16和16管腳之間全部加上一個0.1uF的電容,7和8管腳作為串口輸入端,外接一個標準9孔串口母頭,9和10管腳作為輸出,分別與單片機的P3.0和P3.1連接。這樣就構成了與單片機連接,可以進行串口通信的串口電路。具體電路圖5所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg 圖5 串口電路 單片機最小系統(tǒng)的主體部分使用的是STC89C52單片機,它是美國ATMEL公司生產的低電壓,高性能的CMOS 8位單片機,片內寄存器可反復擦洗,含有32個可編程雙向I/O口,3個16位定時/計數(shù)器,共8個中斷源。需要指出且注意的是,單片機在系統(tǒng)設計時,管腳EA要始終接高電平。因為EA接高電平時,單片機讀取內部程序存儲器。當擴展有外部ROM時,讀取完內部ROM后自動讀取外部ROM,EA接低電平時,單片機直接讀取外部ROM。 而設計中使用的STC89C52是有內部ROM的,所以此引腳始終接高電平。一般在設計單片機最小系統(tǒng)時,大多會加上流水燈和獨立鍵盤的設計,但是在我的畢業(yè)設計中把這些部分作了改進。考慮到流水燈和獨立鍵盤這些設計如果完整的加入就會造成一定的浪費,而且由于學校實驗室的條件有限,PCB板的刻錄存在很多問題,因此這些設備會大大增加硬件調試過程的難度,費時費力。同時,在設計單片機最小系統(tǒng)時,考慮到不加入這些設備的話,以后又有可能需要用到。所以中和上面各種因素,在最小系統(tǒng)的設計部分最后只是增加了二個獨立鍵盤和二個LED發(fā)光二極管作為調試或需要時使用,同時,考慮到以后可能還會外接其它設備的介入,為了方便,特意留有兩排20腳的單排插針外接端口,這樣,設計的最小系統(tǒng)模塊在需要時也可以控制其它外接裝置。使得設計模塊更加靈活多用,不僅僅局限在本次畢業(yè)設計中使用,還可以留作以后的開發(fā)板學習。 最小系統(tǒng)的主體STC89C52如圖6所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png 圖6 STC89C52管腳接線圖 3.2 數(shù)據(jù)顯示模塊設計數(shù)據(jù)顯示電路使用的是SMA410364型號的4位共陽極數(shù)碼管,其內部結構圖如下面圖7所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg
圖7 數(shù)碼管內部結構圖 該數(shù)碼管共有12個管腳,其中11,7,4,2,1,10,5,3管腳分別對應數(shù)碼管的A,B,C,D,E,F,G,DP段選位,與單片機的P0口連接,對應單片機的P0.0-P0.7口,用來控制數(shù)碼管顯示數(shù)值大小,6,8,9,12管腳控制數(shù)碼管的位選,分別與單片機的P2.0-P2.4口連接,通過單片機指令選擇需要顯示數(shù)據(jù)的數(shù)碼管位。 我們知道,在單片機的端口上電后會一直存在高電平,而數(shù)碼管的位選正好是高電平有效,所以會導致在不需要使用數(shù)碼管的時候,數(shù)碼管依然會保持打開狀態(tài)。通常情況下會在單片機最小系統(tǒng)中使用鎖存器與數(shù)碼管連接,但是在這次設計中沒有使用鎖存器,而是改用在數(shù)碼管與單片機端口連接之間加一個PNP三極管的方法,讓三極管發(fā)射極接電源,基集與單片機端口連接,集電極與數(shù)碼管連接,這樣的設計就會導致單片機端口給低電平時才會選通數(shù)碼管,不僅方便控制,而且電路設計簡單。 設計原理圖如圖8所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image021.png 圖8 數(shù)碼管電路 3.3 信號采集模塊設計信號采集部分主要由溫度傳感器DS18B20進行 1.DS1820溫度傳感器外觀圖和引腳圖如圖9所示,三個管腳定義如下:[10] file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image024.png① 引腳1接地; ② 引腳2數(shù)字信號輸入/輸出; ③ 引腳3接高電平5V高電平。 2.DS18B20溫度采集模塊設計[10] 此模塊的設計中STC89C52單片機作為控制主體,溫度傳感器DS18B20采集溫度, 溫度傳感器DS18B20是一種單線接口傳感器,所以連接電路很簡單,只要將其管腳DQ接單片機的一個端口進行溫度采集,VDD接高電平,GND接地即可。設計中的DQ端被設計成連接單片機的P1.3端口。 根據(jù)DS18B20的工作原理、內部結構圖、時序圖,還有DS18B20的ROM指令操作碼,編寫DS18B20的操作代碼,采集溫度樣本,將采集的樣本數(shù)據(jù)存放在寄存器中等待下一步處理。 3.4無線收發(fā)模塊設計 無線收發(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ù)字輸入端口,當TX-_EN置1時為TX輸入模式,當TX-_EN置0時為RX輸入模式 (3)TRX_CE也是數(shù)字輸入端,它控制使能芯片的發(fā)射和接收 (4)PWR_UP是給芯片上電的數(shù)字輸入端口 (5)uCLK為時鐘輸出端口,此管腳在使用過程中一般廢棄不用 (6)CD數(shù)字輸出端進行載波檢測 (7)AM數(shù)字輸出端進行地址匹配 (8)DR數(shù)字輸出端,接收和發(fā)送數(shù)據(jù)完成 (9)MISO和MOSI分別為SPI輸出輸入端口 (10)SCK和CSN分別為SPI的時鐘和使能端口 (11)13和14管腳為相同的二個接地端口. 2.nRF905無線收發(fā)模塊設計 該模塊的設計中使用到了AMS1117芯片,目的是將上電端口輸入的5V電壓轉換成適合nRF905模塊使用的3.3V工作電壓,轉換電路中由于使用的是AMS1117芯片,所以設計簡單許多,只需要在芯片的輸入端和接地端之間,輸出端和接地端之間分別并聯(lián)上一個普通電容和一個極性電容即可,電路設計如圖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分別對應單片機的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模塊的無線發(fā)射接收電路主要利用nRF905與外圍器件構成的電路組成,設計中使用的是購買的成品模塊,其內部電路結構沒有詳細研究,其主要部分是天線。他利用特定的形狀可以將電流轉化為射頻能量并以電波形式發(fā)射出去.或將無線電波接收進來。 第四章 系統(tǒng)軟件設計4.1 程序設計思路程序設計使用的軟件是是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng)KeilC51。與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用。 程序設計過程中,首要的是會熟練使用各種數(shù)碼管,即要了解數(shù)碼管的構造,也要了解其工作原理,并且能夠編寫各種數(shù)碼管的顯示程序,當能夠做到這一步,然后還要了解溫度傳感器的內部結構和工作原理,還有寄存器的工作方式和讀寫時序圖,然后根據(jù)它的ROM和RAM指令編寫工作代碼,通過單片機讀取后控制數(shù)碼管顯示。 編寫DS18B20的操作代碼時,先初始化傳感器,然后分別讀它的位和比特,然后是寫比特,然后開始主要的轉換過程程序設計,轉換時要判斷正負,如果為負值,則取其值的反碼后加1,得到正值,然后在前面顯示“-”號,最后設計單片機控制讀取DS18B20的寄存器數(shù)據(jù),通過數(shù)碼管顯示。 設計了溫度顯示程序后開始設計無線發(fā)送程序,同樣的需要了解nRF905的結構,工作原理寄存器和時序圖,還有SPI口的設置。設計程序時,一般先給寄存器配置參數(shù),通過SPI口想配置寄存器讀寫配置信息。然后編寫它的寫操作和讀操作代碼,主機通過SPI接口向配置寄存器寫入信息,最后是它的發(fā)送指令代碼。 在編寫接收代碼程序時,和發(fā)送的代碼過程相似,參考后面的程序附錄。 4.2 程序流程圖溫度采集模塊的程序設計要特別注意溫度傳感器DS18B20的代碼編寫,在充分了解很清楚DS18B20的基礎上根據(jù)其指令碼,寄存器等編寫其讀寫指令,以及溫度處理轉換代碼,然后編寫數(shù)碼管的顯示程序,然后合并,構成總的程序流程。Keil C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調試工具,全Windows界面。其中uVision與Ishell分別是C51為Windows和Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發(fā)流程。使用簡單方便。 設計的數(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 負值
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ù)先前編寫的溫度傳感器代碼讀取傳感器采集的溫度數(shù)據(jù),存儲在其寄存器中,然后進行控制轉換程序。如果采集的溫度是正值,那么就控制單片機直接讀取經(jīng)NRF905發(fā)送。如果溫度數(shù)據(jù)是負值,那么要進行取反加一后變成正值數(shù)據(jù)再通過無線設備發(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電平,如果置低將返回初始不進行后面的操作,如果置高,那么將AUTO-RETRAN也設置為高電平,從而使nRF905將連續(xù)不斷地重復發(fā)送數(shù)據(jù)包,直到TRX-CE被設置為低電平為止;而當TRX-CE被設置為低電平時,DR=0,nRF905則結束數(shù)據(jù)傳輸,并將自己設置為空閑模式。 在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進入接收模式,然后不斷監(jiān)測有無信號,等待接收;當nRF905檢測到有和接收頻率相同的載波時,其載波檢測引腳CD置為高電平;此后,當nRF905接收到相匹配的地址時,地址匹配引腳AM置為高電平;在這之后,當nRF905接收完畢一個有效的數(shù)據(jù)包(CRC校驗正確)時,nRF905將去掉前導碼、地址和CRC位,同時將數(shù)據(jù)準備就緒引腳DR置為高電平,并用單片機將TRX-CN引腳設置為低電平,以進入空閑模式,從而使單片機能夠通過SPI接口讀出有效的數(shù)據(jù);當所有的數(shù)據(jù)讀出后,nRF905將AM和DR設置為低電平,以便使nRF905準備進入其它工作模式。 第五章 系統(tǒng)仿真與硬件調試5.1系統(tǒng)仿真系統(tǒng)的仿真過程是使用proteus仿真軟件進行,由于在proteus軟件中找不到NRF905的仿真模塊,所以仿真過程中沒有實現(xiàn)無線收發(fā)的仿真電路,只是進行了溫度檢測和顯示過程的仿真操作。仿真圖如圖18所示: file:///C:/Users/wcliu/AppData/Local/Temp/msohtmlclip1/01/clip_image069.png
圖18 溫度采集仿真圖 5.2 系統(tǒng)硬件調試系統(tǒng)硬件的制作過程全部在學校實驗室完成,在制作條件上受到一定的限制。在制作PCB電路板的過程中,由于打孔機上的打孔針只有一種直徑的,所以導致過孔和焊接點的孔徑大小一樣,焊接時要特別注意分清。因為制作的過孔之間是沒有伏銅,連接過孔的兩層導線是不相通的,需要手工進行焊接,千萬不可漏焊。所以在硬件的調試過程要注意過孔的問題。另外,在制作電路電路板時,使用的是腐蝕刻線,很容易出現(xiàn)斷線現(xiàn)象,所以在焊接器件之前最好將斷線全部焊接好,避免斷線導致調試過程的不正常現(xiàn)象,因為焊接后電路板上的斷線不容易補焊。 在電路板的設計過程中要盡量在底層布線,同樣是因為孔內沒有加銅的原因,如果是頂層走線,就需要在頂層焊接,而頂層焊接時遇到像數(shù)碼管之類的器件的管腳很難在正面焊接,即使焊接也很容易出現(xiàn)虛焊現(xiàn)象,導致接觸不良。 在調試過程中,我的電路板出現(xiàn)了正面布線焊接時出現(xiàn)短路和斷路現(xiàn)象,導致串口無法使用,模塊供電不正常等現(xiàn)象,最后經(jīng)過使用萬用表仔細的檢測后才找出原因,過程繁瑣異常。 調試過程主要就是一個檢測過程,一定要有耐心,夠仔細,不然很難找出問題的根本原因。所以在電路PCB板的設計過程中,腐蝕刻線過程中,焊接電路板時都需要認真仔細對待,盡量減少因為硬件導致模塊功能不正常的問題出現(xiàn),但同時,電路板出現(xiàn)問題的調試過程也是一個很好學習和經(jīng)驗積累過程,一定要認真對待,自己找原因,不要總是讓別人代勞。 5.3 調試結果經(jīng)過不斷認真的調試過程,且電路的設計也沒有任何問題,最后電路板終于能夠完全實現(xiàn)預先設計的所有功能。 第六章 心得與體會經(jīng)過一個星期的現(xiàn)代檢測技術課程設計,我們小組成功地完成了無線溫度檢測系統(tǒng)的設計。雖然整個設計中我們遇到了很多問題,但通過我們自己九個人的分工,查找資料,調試、仿真,不斷地調整設計思路,最終成功地完成了設計目標。這次課程設計讓我自己對于學習現(xiàn)代檢測技術有了更深一步地了解,通過實際地操作,發(fā)現(xiàn)書上的理論知識與在實際運用中的還是有一定的出入的。經(jīng)過自己不斷地摸索,改進,從中學到了很多實際知識。 整個設計制作中也培養(yǎng)了我的實際操作能力和團隊合作能力,不僅加強了自己獨立工作地能力,而且還充分地體會到了設計創(chuàng)作地艱辛,看到制作完成時也體會到了成功地喜悅,收獲了不少課外知識。還有要感謝李老師以及楊老師在我們遇到困難時,給予我們的建議與鼓勵。 設計過程中感受最深的就是編寫程序后的調試過程,確實是一個漫長而痛苦的過程。我們根據(jù)顯示的結果不斷尋找錯誤點,各個擊破。雖然很累(每天都熬夜),但是當程序跳出來之后,心中的喜悅是不言而喻的,不管之前多么的痛苦都是值得的! 通過此次課程設計,我總結了幾點: ①每一個系統(tǒng)的生成,都是經(jīng)過層層周密的思考與測試而得到的,這需要團隊的合作以及個人優(yōu)秀的素質。 ②寫程序過程中,切記戒驕戒躁,踏踏實實,一步一個腳印。學會模塊化編程,會讓你少走很多彎路。 ③當程序很多很復雜時,應該寫一個模塊就調試一個,這樣下來會輕松的解決各個問題,而不像你一次性全寫完,錯了之后再來調就很復雜了。 ④硬件電路的調試,也是需要極大的耐性,以及擁有良好的電子基礎,這個需要多加練習。 再次感謝我們的李老師.,老師嚴謹細致、一絲不茍的作風一直是我工作、學習中的榜樣;老師循循善誘的教導和不拘一格的思路給予我無盡的啟迪;這次課程設計中離不開老師您的細心指導。而您開朗的個性和寬容的態(tài)度,幫助我能夠很順利的完成了這次課程設計。 同時感謝對我?guī)椭^的同學們,謝謝你們對我的幫助和支持,讓我感受到同學的友誼。 參考文獻[1] 丁元杰. 單片微機原理及應用[M]. 北京:機械工業(yè)出版社,2005. [2] 郭天祥. 51單片機C語言教程[M]. 北京:電子工業(yè)出版社,2009. [3] 陳杰,黃鴻. 傳感器與檢測技術[M]. 北京:高等教育出版社,2010. [4] 李華. 51系列單片機實用接口技術[M]. 北京:北京航空航天大學出版社,2002. [5] 譚浩強.C程序設計(第四版)[M].北京:清華大學出版社,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ā)送的內容 //從前往后是溫度數(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相關函數(shù) /***********18B20復位函數(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(); //總線復位 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ā)轉換命令 } /***********溫度數(shù)據(jù)處理函數(shù)**********/ voidwork_temp() { ucharn=0; uchar doth,dotl; ucharflag3=1,flag2=1; //數(shù)字顯示修正標記 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相關函數(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(); // 開機先轉換一次 write_byte(0xCC);// Skip ROM write_byte(0x44);// 發(fā)轉換命令 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();
|