版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
廣東藥學(xué)院課程設(shè)計(jì)論文報(bào)告設(shè)計(jì)項(xiàng)目:無線網(wǎng)絡(luò)控制的溫度監(jiān)測器班級:組員:指導(dǎo)老師:2015/1/8目錄一、設(shè)計(jì)要求二、設(shè)計(jì)原理及方案三、系統(tǒng)硬件設(shè)計(jì)1、設(shè)計(jì)主要器件1.1、AT89C52單片機(jī)1.2、溫度傳感器DS18B201.3、NRF24L01無線收發(fā)器2、硬件電路設(shè)計(jì)2.1、發(fā)射端2.1.1、溫度采集模塊2.1.2、控制單元STC89C52單片機(jī)2.1.3、無線收發(fā)模塊NRF24L012.1.4、電源模塊2.1.5、時(shí)鐘振蕩電路設(shè)計(jì)2.1.6、復(fù)位電路設(shè)計(jì)2.2、接收端2.2.1、蜂鳴器報(bào)警模塊2.2.2、鍵盤電路模塊2.2.3、液晶顯示模塊系統(tǒng)軟件設(shè)計(jì)1、程序流程圖1.1、數(shù)據(jù)采集流程圖1.2、無線發(fā)送流程圖1.3、無線接收流程圖2、源程序代碼2.1、發(fā)射板2.1.1、DS18B20.h2.1.2、DS18B20.c2.1.3、NRF24L01.h2.1.4、NRF24L01.c2.1.5、main.h2.1.6、main.c2.2、接收板2.2.1、LCD1602.h2.2.2、LCD1602.c2.2.3、NRF24L01.h2.2.4、NRF24L01.c2.2.5、main.h2.2.6、mian.c五、總結(jié)與心得正文基于無線網(wǎng)絡(luò)的溫度監(jiān)控系統(tǒng)摘要:無線溫度監(jiān)控器是一種用于倉庫和蔬菜大棚等具有溫度檢測、無線傳輸、溫度顯示和超限報(bào)警功能的儀器。系統(tǒng)由發(fā)送端和接收端兩部分組成。發(fā)送端將溫度傳感器檢測到的溫度值經(jīng)單片機(jī)進(jìn)行數(shù)據(jù)處理后,通過無線收發(fā)模塊無線發(fā)送,接收端將接收到的數(shù)據(jù)信息顯示在液晶屏上,并附加溫度限設(shè)置和超限報(bào)警功能。本設(shè)計(jì)利用軟件Keil進(jìn)行系統(tǒng)程序設(shè)計(jì),利用單片機(jī)學(xué)習(xí)板進(jìn)行硬件仿真,待仿真成功后進(jìn)行了實(shí)物制作和調(diào)試,最終成功設(shè)計(jì)出了無線溫度檢測器。文中詳細(xì)介紹了溫度采集模塊、無線傳輸模塊、顯示模塊、溫度限設(shè)置模塊和報(bào)警電路的設(shè)計(jì)方法和過程。當(dāng)采樣點(diǎn)的溫度值超出規(guī)定值時(shí),系統(tǒng)通過報(bào)警電路提醒監(jiān)測人員。同時(shí),檢測人員可以通過鍵盤對具體報(bào)警點(diǎn)的溫度值進(jìn)行設(shè)置。另外,該系統(tǒng)溫度檢測具有較高的精度,無線數(shù)據(jù)傳輸穩(wěn)定,而且傳輸距離較遠(yuǎn)。關(guān)鍵詞:溫度檢測;單片機(jī);無線傳輸一、【設(shè)計(jì)要求】設(shè)計(jì)并制作一款基于無線網(wǎng)絡(luò)的溫度監(jiān)測器。分主機(jī)和從機(jī),從機(jī)采集溫度數(shù)據(jù)并通過無線網(wǎng)絡(luò)發(fā)送。主機(jī)通過無線網(wǎng)絡(luò)接收從機(jī)數(shù)據(jù),通過液晶屏顯示溫度,當(dāng)溫度到達(dá)規(guī)定值時(shí),主機(jī)通過蜂鳴器報(bào)警。二、【設(shè)計(jì)原理及方案】采用單片集成電路AT89C52結(jié)合數(shù)字型溫度傳感器DS18B20設(shè)計(jì)實(shí)現(xiàn)。無線數(shù)據(jù)傳輸部分通過無線收發(fā)模塊NRF24L01傳輸。其中AT89C52及其外圍電路實(shí)現(xiàn)數(shù)據(jù)的處理及輸出的控制,溫度傳感器DS18B20采集溫度參數(shù)并通過無線傳輸模塊發(fā)送到主機(jī),主機(jī)通過LCD1602液晶顯示溫度值。三、【系統(tǒng)硬件設(shè)計(jì)】系統(tǒng)主要由主從機(jī)兩部分組成,從機(jī)主要完成溫度的采集及無線發(fā)送;主機(jī)完成無線信號的接收、顯示及報(bào)警功能。溫度采集部分采用數(shù)字化溫度傳感器DS18B20,單片機(jī)實(shí)現(xiàn)溫度傳感器采集到的數(shù)據(jù)進(jìn)行處理,然后通過NRF24L01無線收發(fā)器將數(shù)據(jù)發(fā)送出去;數(shù)據(jù)顯示及報(bào)警模塊由無線收發(fā)器將接收到的信號傳送給控制器,通過液晶顯示模塊將溫度值顯示出來,并能通過蜂鳴器和LCD進(jìn)行報(bào)警。1、設(shè)計(jì)主要器件AT89C52單片機(jī),溫度傳感器DS18B20,NRF24L01無線收發(fā)器,LCD1602液晶顯示器。1.1、AT89C52單片機(jī)目前使用最為廣泛的是51系列單片機(jī),其中STC89C52系列單片機(jī)是宏晶科技推出的新一代超強(qiáng)抗干擾/高速/低功耗的單片機(jī),是一款增強(qiáng)型51單片機(jī),完全兼容8051單片機(jī),增加了新的功能,新增兩級中斷優(yōu)先級,多一個(gè)外中斷,內(nèi)置EEPROM,看門狗,具有掉電模式,512B內(nèi)存,支持ISP在線編程,不用編程器,程序可擦寫10萬次,管腳完全兼容,性能更好,驅(qū)動(dòng)能力更強(qiáng),超強(qiáng)抗干擾能力,價(jià)格也比傳統(tǒng)的89系列低??紤]到快速開發(fā)以及本系統(tǒng)的應(yīng)用要求,最后采用了最常用的STC89C52單片機(jī)。STC89C52單片機(jī)主要性能:(1)高速:1個(gè)時(shí)鐘/機(jī)器周期,增強(qiáng)型8051內(nèi)核,速度比普通8051快8到12倍。(2)寬電壓:5.5—4.IV/3.7V,3.6V—2.4V/2.lV。(3)低功耗設(shè)計(jì):空閑模式(可由任意一個(gè)中斷喚醒)和掉電模式(可由任意一個(gè)外部中斷喚醒,可支持下降沿/低電遠(yuǎn)程喚醒)。(4)工作頻率:0—35MHz,普通8051:0—420MHz。(5)時(shí)鐘:外部晶體或內(nèi)部RC振蕩器可選,在ISP下載編程用戶程序時(shí)設(shè)置。(6)芯片內(nèi)EEPROM功能,擦寫次數(shù)10萬以上。(7)ISP/IAP,在系統(tǒng)可編程/在應(yīng)用可編程,無需編程器/仿真器。(8)2個(gè)16位定時(shí)器,兼容普通8051的定時(shí)器T0/T1。(9)硬件看門狗(WDT)。(10)全雙工異步串行口(UART),兼容普通8051,可當(dāng)2個(gè)串口使用。(11)先進(jìn)的指令集結(jié)構(gòu),兼容普通8051指令集,有硬件乘法/除法指令。1.2、溫度傳感器DS18B20DSl8B20是美國Dallas半導(dǎo)體公司繼DSl820之后最新推出的一種改進(jìn)型智能溫度傳感器。與傳統(tǒng)的熱敏電阻相比,它能夠直接讀出被測溫度并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式??梢苑謩e在93.75ms和750ms內(nèi)完成9位和12位的數(shù)字量讀取。它采用獨(dú)特的單總線接口方式,即允許在一條信號線上掛接數(shù)十甚至上百個(gè)數(shù)字式傳感器,從而使測溫裝置與各傳感器的接口變得十分簡單,克服了模擬式傳感器與微機(jī)接口時(shí)需要的A/D轉(zhuǎn)換器及其它復(fù)雜外圍電路的缺點(diǎn),而且,可以通過總線供電,溫度變換功率來源于數(shù)據(jù)總線,總線本身也可以向所掛接的DSl8B20供電,而無需額外電源,由它組成的溫度測控系統(tǒng)非常方便,而且成本低、體積小、可靠性高。DSl8B20的測溫范圍-55℃~+125℃,最高分辨率可達(dá)0.0625℃,由于每一個(gè)DSl8B20出廠時(shí)都刻有唯一的一個(gè)序列號并存入其ROM中,因此CPU可用簡單的通信協(xié)議就可以識別,從而節(jié)省了大量的引線和邏輯電路。由于DSl8B20具有獨(dú)特的單總線接口方式在測溫時(shí)有明顯的優(yōu)勢,占用單片機(jī)的I/O引腳資源少,和單片機(jī)的通信協(xié)議比較簡單,成本較低,而且具有負(fù)壓特性(電源極性接反時(shí),溫度計(jì)不會因發(fā)熱而燒毀,只是不能正常工作),和其他數(shù)字溫度傳感器相比,它更適合本系統(tǒng)。所以,選用DSl8B20作為溫度測量的傳感器。1.3、NRF24L01無線收發(fā)器NRF24L01是NORDIC公司最近生產(chǎn)的一款無線通信芯片,采用FSK調(diào)制,內(nèi)部集成NORDIC自己的EnhancedShortBurst協(xié)議。可以實(shí)現(xiàn)點(diǎn)對點(diǎn)或是1對6的無線通信。無線通信速度可以達(dá)到2Mbps。NORDIC公司提供通信模塊的GERBER文件,可以直接加工生產(chǎn)。嵌入式工程師或是單片機(jī)愛好者只需要為單片機(jī)系統(tǒng)預(yù)留5個(gè)GPIO,1個(gè)中斷輸入引腳,就可以很容易實(shí)現(xiàn)無線通信的功能,非常適合用來為MCU系統(tǒng)構(gòu)建無線通信功能。2、硬件電路設(shè)計(jì)2.1、發(fā)射端無線溫度檢測器的溫度采集端由電源模塊、STC89C52單片機(jī)、溫度采集電路、無線發(fā)送模塊NRF24L01、時(shí)鐘電路及復(fù)位電路組成。溫度采集端硬件框圖如圖2.1所示。圖2.1溫度采集端硬件框圖2.1.1、溫度采集模塊1.DSl8B20內(nèi)部結(jié)構(gòu)DSl8B20芯片的內(nèi)部結(jié)構(gòu)如圖2.2所示。圖2.2DS18B20內(nèi)部結(jié)構(gòu)圖2.DSl8B20有4個(gè)主要的數(shù)據(jù)部件:(1)64位激光ROM。64位激光ROM從高位到低位依次為8位CRC、48位序列號和8位家族代碼(28H)。(2)溫度靈敏元件。(3)非易失性溫度報(bào)警觸發(fā)器TH和TL??赏ㄟ^軟件寫入用戶報(bào)警上下限值。(4)配置寄存器。配置寄存器為高速暫存存儲器中的第五個(gè)字節(jié)。DSl8B20在工作時(shí)按此寄存器中的分辨率將溫度轉(zhuǎn)換成相應(yīng)精度的數(shù)值,其各位定義如表2.1所示。表2.1DS18B20配置寄存器模式設(shè)置表TMR1R011111其中,TM:測試模式標(biāo)志位,出廠時(shí)被寫入0,不能改變;R0、Rl:溫度計(jì)分辨率設(shè)置位,其對應(yīng)四種分辨率表3.2所列,出廠時(shí)R0、Rl置為缺省值:R0=1,R1=1(即12位分辨率),用戶可根據(jù)需要改寫配置寄存器以獲得合適的分辨率。配置寄存器與分辨率關(guān)系如表2.2所示。表2.2配置寄存器與分辨率關(guān)系表R0R1溫度計(jì)分辨率/bit最大轉(zhuǎn)換時(shí)間/us00993.750110187.5101137511127503.高速暫存存儲器高速暫存存儲器由9個(gè)字節(jié)組成,其分配如表2.3所示。當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高速暫存存儲器的第1和第2個(gè)字節(jié)。單片機(jī)可通過單線接口讀到該數(shù)據(jù),讀取時(shí)低位在前,高位在后,數(shù)據(jù)格式如表3.3所示。對應(yīng)的溫度計(jì)算:當(dāng)符號位S=0時(shí),直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)S=1時(shí),先將補(bǔ)碼變?yōu)樵a,再計(jì)算十進(jìn)制值。表2.3DS18B20存儲器映像表溫度低位溫度高位THTL配置保留保留保留8位CRC4.對DSl8B20的設(shè)計(jì),需要注意以下問題:(1)對硬件結(jié)構(gòu)簡單的單線數(shù)字溫度傳感器DSl8B20進(jìn)行操作,需要用較為復(fù)雜的程序完成。編制程序時(shí)必須嚴(yán)格按芯片數(shù)據(jù)手冊提供的有關(guān)操作順序進(jìn)行,讀、寫程序要嚴(yán)格按要求編寫。尤其在使用DSl8B20的高測溫分辨力時(shí),對時(shí)序及電氣特性參數(shù)要求更高。(2)測溫電纜線建議采用屏蔽4芯雙絞線,其中一對線接地線與信號線,另一組接VCC和地線,屏蔽層在源端單點(diǎn)接地。DSl8B20在三線制應(yīng)用時(shí),應(yīng)將其三線焊接牢固;在兩線應(yīng)用時(shí),應(yīng)將VCC與GND接在一起,焊接牢固。若VCC脫開未接,傳感器只送85.0℃的溫度值。2.1.2、控制單元STC89C52單片機(jī)1.STC89C52單片機(jī)的特點(diǎn)單片機(jī)是在一塊硅片上集成了各種部件的微型機(jī),這些部件包括中央處理器CPU、數(shù)據(jù)存儲器RAM、程序存儲器ROM、定時(shí)器/計(jì)數(shù)器和多種I/O接口電路。STC89C52單片機(jī)的基本結(jié)構(gòu)如圖2.3所示。圖2.3STC89C52單片機(jī)的基本結(jié)構(gòu)2.STC89C52單片機(jī)的引腳及功能STC89C52單片機(jī)的管腳分布如圖2.4所示。圖2.4STC89C52單片機(jī)的管腳圖STC89C52的I/O端口:P0口:P0口是一個(gè)8位漏極開路的雙向I/O口。作為輸出口,每位能驅(qū)動(dòng)8個(gè)TTL邏輯電平。對P0端口寫“1”時(shí),引腳用作高阻抗輸入。當(dāng)訪問外部程序和數(shù)據(jù)存儲器時(shí),P0口也被作為低8位地址/數(shù)據(jù)復(fù)用。在這種模式下,P0具有內(nèi)部上拉電阻。在flash編程時(shí),P0口也用來接收指令字節(jié);在程序校驗(yàn)時(shí),輸出指令字節(jié)。程序校驗(yàn)時(shí),需要外部上拉電阻。P1口:P1口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,P1輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對P1端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.2分別作定時(shí)器/計(jì)數(shù)器2的外部計(jì)數(shù)輸入(P1.0/T2)和定時(shí)器/計(jì)數(shù)器2的觸發(fā)輸入(P1.1/T2EX)。在flash編程和校驗(yàn)時(shí),P1口接收低8位地址字節(jié)。引腳第二功能P1.0/T2(定時(shí)器/計(jì)數(shù)器T2的外部計(jì)數(shù)輸入)P1.1/T2EX(定時(shí)器/計(jì)數(shù)器T2的捕捉/重載觸發(fā)信號和方向控制)P1.5/MOSI(在系統(tǒng)編程用)P1.6/MISO(在系統(tǒng)編程用)P1.7/SCK(在系統(tǒng)編程用)P2口:P2口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對P2端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器時(shí),P2口送出高8位地址。在這種應(yīng)用中,P2口使用很強(qiáng)的內(nèi)部上拉發(fā)送1。在使用8位地址訪問外部數(shù)據(jù)存儲器時(shí),P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗(yàn)時(shí),P2口也接收高8位地址字節(jié)和一些控制信號。P3口:P3口是一個(gè)具有內(nèi)部上拉電阻的8位雙向I/O口,P3輸出緩沖器能驅(qū)動(dòng)4個(gè)TTL邏輯電平。對P3端口寫“1”時(shí),內(nèi)部上拉電阻把端口拉高,此時(shí)可以作為輸入口使用。作為輸入使用時(shí),被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。P3口亦作為STC89C52特殊功能(第二功能)使用。在flash編程和校驗(yàn)時(shí),P3口也接收一些控制信號。引腳第二功能P3.0/RXD(串行輸入口)P3.1/TXD(串行輸出口)P3.2/INT0(外中斷0)P3.3/INT1(外中斷1)P3.4/T0(定時(shí)/計(jì)數(shù)器0)P3.5/T1(定時(shí)/計(jì)數(shù)器1)P3.6/WR(外部數(shù)據(jù)存儲器寫選通)P3.7/RD(外部數(shù)據(jù)存儲器讀選通)此外,P3口還接收一些用于flash閃存編程和程序校驗(yàn)的控制信號。RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位。ALE/PROG:當(dāng)訪問外部程存儲器或數(shù)據(jù)存儲器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時(shí)鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時(shí)鐘或用于定時(shí)目的。要注意每當(dāng)訪問外部數(shù)據(jù)存儲器時(shí)將跳過一個(gè)ALE脈沖。對flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE禁止位無效。PSEN:程序儲存允許PSEN輸出是外部程序存儲器的讀選通信號,當(dāng)STC89C52由外部程序存儲器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN有效,即輸出兩個(gè)脈沖,在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。EA/VP:外部訪問允許欲使CPU僅訪問外部程序存儲器,EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會鎖存EA端狀態(tài)。2.1.3、無線收發(fā)模塊NRF24L01無線收發(fā)模塊NRF24L01的各引腳與單片機(jī)的P1口相連,電路連接圖如圖2.4,圖2.5所示。圖2.5NRF24L01引腳示意圖圖2.6無線收發(fā)模塊NRF24L01與單片機(jī)的電路連接圖無線收發(fā)模塊NRF24L01引腳功能:CSN(P1.6):芯片的片選線,CSN為低電平芯片工作。SCK(P3.4):芯片控制的時(shí)鐘線(SPI時(shí)鐘)。MISO(P3.3):芯片控制數(shù)據(jù)線(Masterinputslaveoutput)。MOSI(P1.7):芯片控制數(shù)據(jù)線(Masteroutputslaveinput)。IRQ(P3.2):中斷信號。無線通信過程中MCU主要是通過IRQ與NRF24L01進(jìn)行通信。CE(P3.5):芯片的模式控制線。在CSN為低的情況下,CE協(xié)同NRF24L01的CONFIG寄存器共同決定NRF24L01的狀態(tài)。2.1.4、電源模塊本次設(shè)計(jì)電源采用usb口將220v交流電源轉(zhuǎn)換為5v直流電源后再通過AMS1117-3.3變壓器轉(zhuǎn)換為3.3v直流電源輸入。電源模塊中加裝了LED燈,指示電源通斷。電源模塊設(shè)計(jì)如圖2.7,圖2.8所示。圖2.7USB接口電路圖2.8電源轉(zhuǎn)換電路2.1.5、時(shí)鐘振蕩電路設(shè)計(jì)XTAL1是片內(nèi)振蕩器的反相放大器輸入端,XTAL2則是輸出端,使用外部振蕩器時(shí),外部振蕩信號應(yīng)直接加到XTAL1,而XTAL2懸空。內(nèi)部方式時(shí),時(shí)鐘發(fā)生器對振蕩脈沖二分頻,如晶振為12MHz,時(shí)鐘頻率就為6MHz。晶振的頻率可以在1MHz-24MHz內(nèi)選擇。電容取30pf左右。STC89C52單片機(jī)內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端。這個(gè)放大器與作為反饋元件的片外晶體諧振器一起構(gòu)成一個(gè)自激振蕩器。外接晶體諧振器以及電容C1和C2構(gòu)成并聯(lián)諧振電路,接在放大器的反饋回路中。對外接電容的值雖然沒有嚴(yán)格的要求,但電容的大小會影響震蕩器頻率的高低、震蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性。因此,在焊接電路板時(shí),晶體振蕩器和電容應(yīng)盡可能安裝得與單片機(jī)芯片靠近,以減少寄生電容,更好地保證震蕩器穩(wěn)定和可靠地工作。本次時(shí)鐘電路設(shè)計(jì)采用內(nèi)部方式,即利用芯片內(nèi)部的振蕩電路,晶體振蕩器選用12MHz,電容選用33pf。時(shí)鐘振蕩電路如圖2.9所示。圖2.9時(shí)鐘振蕩電路連接圖2.1.6、復(fù)位電路設(shè)計(jì)在振蕩器運(yùn)行時(shí),有兩個(gè)機(jī)器周期(24個(gè)振蕩周期)以上的高電平出現(xiàn)在此引腳時(shí),將使單片機(jī)復(fù)位,只要這個(gè)腳保持高電平,單片機(jī)便循環(huán)復(fù)位。復(fù)位后P0-P3口均在引腳表現(xiàn)為高電平,程序計(jì)數(shù)器和特殊功能寄存器全部清零。當(dāng)復(fù)位腳由高電平變?yōu)榈碗娖綍r(shí),芯片從ROM的00H處重新開始執(zhí)行程序。復(fù)位電路通常采用上電自動(dòng)復(fù)位和按鈕復(fù)位兩種方式,本設(shè)計(jì)采用按鈕復(fù)位電路。復(fù)位電路圖如圖2.10所示。圖2.10復(fù)位電路連接圖2.2、接收端無線溫度測量器的溫度接收端由電源模塊、STC89C52單片機(jī)、液晶顯示電路、無線收發(fā)模塊NRF24L01、鍵盤電路、報(bào)警電路、時(shí)鐘電路及復(fù)位電路組成。其中電源模塊、STC89C52單片機(jī)、無線收發(fā)模塊NRF24L01、時(shí)鐘電路和復(fù)位電路與發(fā)射端相同。溫度接收端硬件框圖如圖2.11所示。圖2.11溫度接收端硬件框圖2.2.1、蜂鳴器報(bào)警模塊報(bào)警電路由兩部分組成。第一部分由三極管和蜂鳴器組成,第二部分由兩個(gè)LED燈和1k電阻組成。當(dāng)實(shí)時(shí)溫度大于溫度上限設(shè)定值時(shí)蜂鳴器發(fā)出聲響,同時(shí)LED1燈亮,當(dāng)實(shí)時(shí)溫度大于溫度下限設(shè)定值時(shí)蜂鳴器發(fā)出聲響,同時(shí)LED2燈亮,而當(dāng)實(shí)時(shí)溫度回到溫度設(shè)定值時(shí),蜂鳴器和紅色LED燈自動(dòng)停止。蜂鳴器報(bào)警模塊如圖2.12所示,LED燈連接如圖2.13所示,蜂鳴器及LED燈引腳圖如圖2.14所示。圖2.12蜂鳴器報(bào)警模塊圖2.13LED燈報(bào)警模塊圖2.14蜂鳴器及LED燈連接圖2.2.2、鍵盤電路本系統(tǒng)選擇使用獨(dú)立式按鍵。鍵盤電路由四個(gè)按鍵與單片機(jī)P3口相連構(gòu)成,實(shí)現(xiàn)溫度限的設(shè)置功能。通電后,液晶屏顯示設(shè)定溫度為LST:+99℃L:00℃。按下Key1鍵,LS切換,開關(guān)燈及蜂鳴器報(bào)警,按下Key2鍵,切換上限溫度和下限溫度調(diào)節(jié),Key3和Key4則分別是加減溫度設(shè)定值。鍵盤電路圖如圖2.15所示。圖2.15鍵盤電路圖2.2.3、液晶顯示模塊1.LCD1602主要管腳介紹顯示模塊用于顯示實(shí)時(shí)溫度和設(shè)定溫度。這里采用1602液晶顯示屏,其主要參數(shù)為:顯示容量(16*2個(gè)字符)、芯片工作電壓(4.5-5.5V)和工作電流(2.0mA)。LCD1602共有16個(gè)引腳,各管腳的功能如表2.4所示。表2.4LCD1602管腳功能介紹表引腳符號狀態(tài)功能1VSS輸入電源地2Vdd輸入電源+5V3V0輸入對比度控制端4RS輸入寄存器選擇5R/W輸入讀、寫操作6E輸入使能信號7DB0三態(tài)數(shù)據(jù)總線(LSB)8DB1三態(tài)數(shù)據(jù)總線9DB2三態(tài)數(shù)據(jù)總線10DB3三態(tài)數(shù)據(jù)總線11DB4三態(tài)數(shù)據(jù)總線12DB5三態(tài)數(shù)據(jù)總線13DB6三態(tài)數(shù)據(jù)總線14DB7三態(tài)數(shù)據(jù)總線(MSB)15LEDA輸入背光+5V16LEDK輸入背光地說明:V0:液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地電源時(shí)對比度最高,使用時(shí)可以通過一個(gè)10k的電位器調(diào)整對比度。RS:寄存器選擇,高電平時(shí)選擇數(shù)據(jù)存儲器,低電平時(shí)選擇指令寄存器。R/W:讀寫信號線,高電平時(shí)進(jìn)行讀操作,低電平進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址;當(dāng)RS為高電平,R/W為低電平時(shí)可以寫入數(shù)據(jù)。E:使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。2.LCD1602控制指令LCD1602控制指令介紹表如表2.5所示。表2.5LCD1602控制指令介紹表格式功能RSR/WDB7DB6DB5DB4DB3DB2DB1DB0清屏指令0000000001顯示開關(guān)控制0000001DCB光標(biāo)、畫面移動(dòng)000000S/CR/L**功能設(shè)置00001DLNF**說明:(1)清屏指令清屏指令的主要功能有:清除液晶顯示器的內(nèi)容,即DDRAM的內(nèi)容全部填入“空白”的ASCII碼20H;光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方;將地址計(jì)數(shù)器(AC)的值設(shè)為0。(2)顯示開關(guān)控制顯示開關(guān)控制的功能是設(shè)置顯示、光標(biāo)及閃爍的開、關(guān)等。其中:D表示顯示:1為開,0為關(guān);C表示光標(biāo):1為開,0為關(guān);B表示閃爍:1為開,0為關(guān)。(3)光標(biāo)及畫面移動(dòng)光標(biāo)及畫面移動(dòng)的功能是控制光標(biāo)、畫面的移動(dòng),不影響DDRAM。其中:S/C=1,畫面平移一個(gè)字符位;S/C=0,光標(biāo)平移一個(gè)字符位;R/L=1:右移;R/L=0:左移。(4)功能設(shè)置功能設(shè)置主要是對LCD1602的工作方式進(jìn)行設(shè)置。其中:DL=1,8位數(shù)據(jù)接口;DL=0,4位數(shù)據(jù)接口;N=1,兩行顯示;N=0,一行顯示;F=1,5×10點(diǎn)陣字符;F=0,5×7點(diǎn)陣字符。3.LCD1602與單片機(jī)連接圖液晶顯示模塊設(shè)計(jì)如圖2.15所示。數(shù)據(jù)線DB0-DB7連接單片機(jī)的P0口;RS、R/W、E這3條控制線分別接單片機(jī)的P1.3、P1.4和P1.5口。圖2.15液晶顯示模塊LCD1602四、系統(tǒng)軟件設(shè)計(jì)1、程序流程圖1.1、數(shù)據(jù)采集流程圖初始化初始化跳過ROM跳過ROM進(jìn)行數(shù)據(jù)轉(zhuǎn)換進(jìn)行數(shù)據(jù)轉(zhuǎn)換發(fā)送存儲器命令發(fā)送存儲器命令讀取溫度值讀取溫度值判斷正負(fù)判斷正負(fù)取反加一負(fù)值取反加一正值結(jié)束結(jié)束數(shù)據(jù)采集流程圖1.2、無線發(fā)送流程圖開始開始TRX_CE,TXEN全部置高TRX_CE,TXEN全部置高射頻寄存器開啟,數(shù)據(jù)打包發(fā)送,DR=1射頻寄存器開啟,數(shù)據(jù)打包發(fā)送,DR=1TRX-CE=1?NTRX-CE=1?AUTO-RET=1AUTO-RET=1N前導(dǎo)碼完成后置DR=0N前導(dǎo)碼完成后置DR=0結(jié)束結(jié)束無線發(fā)送流程圖1.3、無線接收流程圖開始開始TRX_CE=1,TXEN=0TRX_CE=1,TXEN=0接收部分檢測載波,CD置高接收部分檢測載波,CD置高ADDR正確?ADDR正確?NDR和AM置低AM為低AM置高DR和AM置低AM為低AM置高移去字頭地址CRC?移去字頭地址CRC?N從SPI接收數(shù)據(jù)從SPI接收數(shù)據(jù)DR置高DR置高TRX-CE=0?TRX-CE=0?N進(jìn)入空閑狀態(tài)進(jìn)入空閑狀態(tài)結(jié)束結(jié)束無線接收流程圖2、源程序代碼2.1接收板2.1.1、DS18B20.hifndef__DS18B20_H__#define__DS18B20_H__#include<reg52.h>sbitDS18B20_DQ=P1^0;externvoidDS18B20_Delay(unsignedintn);externvoidDS18B20_Write_Byte(unsignedchardat);externunsignedcharDS18B20_Read_Byte();externbitDS18B20_Init();externunsignedintGet_temp(void);externunsignedcharflag_temper;#endif2.1.2、DS18B20.c#include"DS18B20.h"#include<intrins.h>unsignedcharflag_temper=0;voidDS18B20_Delay(unsignedintn){ unsignedinti; for(i=0;i<n;i++);}voidDS18B20_Write_Byte(unsignedchardat){ unsignedchari; for(i=0;i<8;i++) { DS18B20_DQ=0; _nop_(); _nop_(); DS18B20_DQ=dat&0x01; dat>>=1; DS18B20_Delay(6); DS18B20_DQ=1; _nop_(); _nop_(); } }unsignedcharDS18B20_Read_Byte(){ unsignedchardat,i; for(i=0;i<8;i++) { DS18B20_DQ=0; _nop_(); _nop_(); DS18B20_DQ=1; _nop_(); _nop_(); dat>>=1; if(DS18B20_DQ==1) { dat|=0X80; } else { dat&=0x7f; } DS18B20_Delay(6); } returndat; }bitDS18B20_Init(){ bitFlag_exist=1; DS18B20_DQ=1; _nop_(); _nop_(); DS18B20_DQ=0; DS18B20_Delay(50); DS18B20_DQ=1; DS18B20_Delay(3); Flag_exist=DS18B20_DQ; DS18B20_Delay(10); DS18B20_DQ=1; returnFlag_exist; }unsignedintGet_temp(void){ floattt; unsignedchara,b; unsignedinttemp; if(DS18B20_Init()==0) { DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0x44); // _delay_ms(750); if(DS18B20_Init()==0) { DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0xbe); a=DS18B20_Read_Byte(); b=DS18B20_Read_Byte(); temp=b; temp<<=8; temp=temp|a; if(temp>0xfff) { flag_temper=1; temp=(~temp)+1; } else { flag_temper=0; } tt=temp*0.0625; temp=tt*10+0.5; } } returntemp;}2.1.3、NRF24L01.h#ifndef__NRF24L01__H__#define__NRF24L01__H__#include<reg52.h>sbitNRF24L01_CSN=P1^6;sbitNRF24L01_CE=P3^5;sbitNRF24L01_MOSI=P1^7;sbitNRF24L01_SCK=P3^4;sbitNRF24L01_MISO=P3^3;sbitNRF24L01_IRQ=P3^2;#defineNRF24L01_READ_REG0x00 #defineNRF24L01_WRITE_REG0x20 #defineNRF24L01_RD_RX_PLOAD0x61 #defineNRF24L01_WR_TX_PLOAD0xA0 #defineNRF24L01_FLUSH_TX0xE1 #defineNRF24L01_FLUSH_RX0xE2 #defineNRF24L01_REUSE_TX_PL0xE3 #defineNRF24L01_NOP0xFF #defineNRF24L01_CONFIG0x00#defineNRF24L01_EN_AA0x01#defineNRF24L01_EN_RXADDR0x02#defineNRF24L01_SETUP_AW0x03#defineNRF24L01_SETUP_RETR0x04#defineNRF24L01_RF_CH0x05#defineNRF24L01_RF_SETUP0x06#defineNRF24L01_STATUS0x07#defineNRF24L01_OBSERVE_TX0x08#defineNRF24L01_CD0x09#defineNRF24L01_RX_ADDR_P00x0A#defineNRF24L01_RX_ADDR_P10x0B#defineNRF24L01_RX_ADDR_P20x0C#defineNRF24L01_RX_ADDR_P30x0D#defineNRF24L01_RX_ADDR_P40x0E#defineNRF24L01_RX_ADDR_P50x0F#defineNRF24L01_TX_ADDR0x10#defineNRF24L01_RX_PW_P00x11#defineNRF24L01_RX_PW_P10x12#defineNRF24L01_RX_PW_P20x13#defineNRF24L01_RX_PW_P30x14#defineNRF24L01_RX_PW_P40x15#defineNRF24L01_RX_PW_P50x16#defineNRF24L01_FIFO_STATUS0x17#defineNRF24L01_TX_ADR_WIDTH5 #defineNRF24L01_RX_ADR_WIDTH5 #defineNRF24L01_TX_PLOAD_WIDTH20 #defineNRF24L01_RX_PLOAD_WIDTH20 externunsignedcharNRF24L01_SPI_RW(unsignedcharbyte);externunsignedcharNRF24L01_SPI_Read(unsignedcharreg);externunsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue);externunsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externunsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externvoidSetRX_Mode();//externunsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf);externvoidNRF24L01_TxPacket(unsignedchar*tx_buf);externvoidNRF24L01_Init();externunsignedcharNRF24L01_TX_Buffer[3];externunsignedcharNRF24L01_RX_Buffer[3];externunsignedcharbdataSTA;#endif2.1.4、NRF24L01.c#include"NRF24L01.h"#include<intrins.h>unsignedcharNRF24L01_TX_Buffer[3];unsignedcharNRF24L01_RX_Buffer[3];unsignedcharconstNRF24L01_TX_ADDRESS[NRF24L01_TX_ADR_WIDTH]={0x37,0x43,0x10,0x10,0xFF};unsignedcharconstNRF24L01_RX_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0xCF,0xCF,0xCF,0xCF,0xCF}; unsignedcharbdataSTA;sbitSTAbits_RX_DR =STA^6;sbitSTAbits_TX_DS =STA^5;sbitSTAbits_MAX_RT =STA^4;unsignedcharNRF24L01_SPI_RW(unsignedcharbyte){ unsignedchari; for(i=0;i<8;i++) { NRF24L01_MOSI=(byte&0x80); _nop_(); byte<<=1; NRF24L01_SCK=1; _nop_(); byte|=NRF24L01_MISO; _nop_(); NRF24L01_SCK=0; _nop_(); }return(byte); }unsignedcharNRF24L01_SPI_Read(unsignedcharreg){ unsignedcharreg_val; NRF24L01_CSN=0; _nop_(); NRF24L01_SPI_RW(reg); reg_val=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(reg_val); }unsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue){ unsignedcharstatus; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); NRF24L01_SPI_RW(value); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) NRF24L01_SPI_RW(*pBuf++); NRF24L01_CSN=1; _nop_(); return(status);}voidNRF24L01_TxPacket(unsignedchar*tx_buf){ unsignedchari=0; NRF24L01_CE=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WR_TX_PLOAD,tx_buf,NRF24L01_TX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_CONFIG,0x0e); NRF24L01_CE=1; i=10; while(i--); }voidNRF24L01_Init(){unsignedinti=45000; NRF24L01_CE=0; while(i--); NRF24L01_CSN=1; NRF24L01_SCK=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_TX_ADDR,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_AA,0x01); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_RXADDR,0x01); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_CH,0);NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P0,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_SETUP,0x07); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_SETUP_RETR,0x0f); }2.1.5、main.h#ifndef__MAIN_H__#define__MAIN_H__#include<reg52.h>sbitLED1=P1^1;#defineLED_ON0#defineLED_OFF1externvoidDelay_ms(unsignedintn);#endif2.1.6、main.c#include"main.h"#include"DS18B20.h"#include"NRF24L01.h"unsignedintTemp_Buffer=0;voidmain(){ Temp_Buffer=Get_temp(); Delay_ms(1000); NRF24L01_Init(); while(1) { Temp_Buffer=Get_temp(); NRF24L01_TX_Buffer[0]=flag_temper; NRF24L01_TX_Buffer[1]=(Temp_Buffer>>8)&0x00ff; NRF24L01_TX_Buffer[2]=Temp_Buffer&0x00ff; NRF24L01_TxPacket(NRF24L01_TX_Buffer); while(NRF24L01_IRQ==1); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,0x7e);LED1=~LED1; Delay_ms(1000); }}voidDelay_ms(unsignedintn){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<123;j++);}2.2、接收板2.2.1、LCD1602.h#ifndef__LCD1602_H__#define__LCD1602_H__#include<reg52.h>#defineLCD1602_PORTP0sbitLCD1602_RS=P1^3;sbitLCD1602_RW=P1^4;sbitLCD1602_EN=P1^5;externvoidLCD1602_delay_ms(unsignedintn);externvoidLCD1602_write_com(unsignedcharcom);externvoidLCD1602_write_data(unsignedchardat);externvoidLCD1602_write_word(unsignedchar*s);externvoidLCD1602_Init();#endif2.2.2、LCD1602.c#include"LCD1602.h"voidLCD1602_delay_ms(unsignedintn){ unsignedinti,j; for(i=0;i<n;i++) for(j=0;j<123;j++);}voidLCD1602_write_com(unsignedcharcom){ LCD1602_RS=0; LCD1602_delay_ms(1); LCD1602_EN=1; LCD1602_PORT=com; LCD1602_delay_ms(1); LCD1602_EN=0;}voidLCD1602_write_data(unsignedchardat){ LCD1602_RS=1; LCD1602_delay_ms(1); LCD1602_PORT=dat; LCD1602_EN=1; LCD1602_delay_ms(1); LCD1602_EN=0;}voidLCD1602_write_word(unsignedchar*s){ while(*s>0) { LCD1602_write_data(*s); s++; }}voidLCD1602_Init(){ LCD1602_EN=0; LCD1602_RW=0; LCD1602_write_com(0x38); LCD1602_write_com(0x0c); LCD1602_write_com(0x06); LCD1602_write_com(0x01); }2.2.3、NRF24L01.c#ifndef__NRF24L01__H__#define__NRF24L01__H__#include<reg52.h>sbitNRF24L01_CSN=P1^6;sbitNRF24L01_CE=P3^5;sbitNRF24L01_MOSI=P1^7;sbitNRF24L01_SCK=P3^4;sbitNRF24L01_MISO=P3^3;sbitNRF24L01_IRQ=P3^2;#defineNRF24L01_READ_REG0x00 #defineNRF24L01_WRITE_REG0x20 #defineNRF24L01_RD_RX_PLOAD0x61 #defineNRF24L01_WR_TX_PLOAD0xA0 #defineNRF24L01_FLUSH_TX0xE1 #defineNRF24L01_FLUSH_RX0xE2 #defineNRF24L01_REUSE_TX_PL0xE3 #defineNRF24L01_NOP0xFF #defineNRF24L01_CONFIG0x00#defineNRF24L01_EN_AA0x01#defineNRF24L01_EN_RXADDR0x02#defineNRF24L01_SETUP_AW0x03#defineNRF24L01_SETUP_RETR0x04#defineNRF24L01_RF_CH0x05#defineNRF24L01_RF_SETUP0x06#defineNRF24L01_STATUS0x07#defineNRF24L01_OBSERVE_TX0x08#defineNRF24L01_CD0x09#defineNRF24L01_RX_ADDR_P00x0A#defineNRF24L01_RX_ADDR_P10x0B#defineNRF24L01_RX_ADDR_P20x0C#defineNRF24L01_RX_ADDR_P30x0D#defineNRF24L01_RX_ADDR_P40x0E#defineNRF24L01_RX_ADDR_P50x0F#defineNRF24L01_TX_ADDR0x10#defineNRF24L01_RX_PW_P00x11#defineNRF24L01_RX_PW_P10x12#defineNRF24L01_RX_PW_P20x13#defineNRF24L01_RX_PW_P30x14#defineNRF24L01_RX_PW_P40x15#defineNRF24L01_RX_PW_P50x16#defineNRF24L01_FIFO_STATUS0x17#defineNRF24L01_TX_ADR_WIDTH5 #defineNRF24L01_RX_ADR_WIDTH5 #defineNRF24L01_TX_PLOAD_WIDTH20 #defineNRF24L01_RX_PLOAD_WIDTH20 externunsignedcharNRF24L01_SPI_RW(unsignedcharbyte);externunsignedcharNRF24L01_SPI_Read(unsignedcharreg);externunsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue);externunsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externunsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars);//externvoidSetRX_Mode();//externunsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf);externvoidNRF24L01_TxPacket(unsignedchar*tx_buf);externvoidNRF24L01_Init();externunsignedcharNRF24L01_TX_Buffer[3];externunsignedcharNRF24L01_RX_Buffer[3];externunsignedcharbdataSTA;#endif2.2.4、NRF24L01.c#include"NRF24L01.h"#include<intrins.h>unsignedcharNRF24L01_TX_Buffer[32];unsignedcharNRF24L01_RX_Buffer[32];unsignedcharconstNRF24L01_TX_ADDRESS[NRF24L01_TX_ADR_WIDTH]={0xCF,0xCF,0xCF,0xCF,0xCF};unsignedcharconstNRF24L01_RX_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0x37,0x43,0x10,0x10,0xFF}; unsignedcharconstNRF24L01_RX1_ADDRESS[NRF24L01_RX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03};unsignedcharconstNRF24L01_RX2_ADDRESS[1]={0x36};unsignedcharconstNRF24L01_RX3_ADDRESS[1]={0x34};unsignedcharconstNRF24L01_RX4_ADDRESS[1]={0x38};unsignedcharconstNRF24L01_RX5_ADDRESS[1]={0x39};unsignedcharbdataSTA;sbitSTAbits_RX_DR =STA^6;sbitSTAbits_TX_DS =STA^5;sbitSTAbits_MAX_RT =STA^4;unsignedcharNRF24L01_SPI_RW(unsignedcharbyte){ unsignedchari; for(i=0;i<8;i++) { NRF24L01_MOSI=(byte&0x80); _nop_(); byte<<=1; NRF24L01_SCK=1; _nop_(); byte|=NRF24L01_MISO; //capturecurrentMISObit _nop_(); NRF24L01_SCK=0; _nop_(); }return(byte); }unsignedcharNRF24L01_SPI_Read(unsignedcharreg){ unsignedcharreg_val; NRF24L01_CSN=0; _nop_(); NRF24L01_SPI_RW(reg); reg_val=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(reg_val); }unsignedcharNRF24L01_SPI_RW_Reg(unsignedcharreg,unsignedcharvalue){ unsignedcharstatus; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); NRF24L01_SPI_RW(value); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Read_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) pBuf[i]=NRF24L01_SPI_RW(0); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_SPI_Write_Buf(unsignedcharreg,unsignedchar*pBuf,unsignedcharuchars){ unsignedcharstatus,i; NRF24L01_CSN=0; _nop_(); status=NRF24L01_SPI_RW(reg); for(i=0;i<uchars;i++) NRF24L01_SPI_RW(*pBuf++); NRF24L01_CSN=1; _nop_(); return(status);}unsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf){ unsignedcharrevale=0,i=130; NRF24L01_CE=0; _nop_(); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_CONFIG,0x0f); NRF24L01_CE=1; while(i--); STA=NRF24L01_SPI_Read(NRF24L01_STATUS); if(STAbits_RX_DR) { NRF24L01_CE=0; NRF24L01_SPI_Read_Buf(NRF24L01_RD_RX_PLOAD,rx_buf,NRF24L01_RX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer revale=1; } NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_STATUS,STA); returnrevale;} voidNRF24L01_Init(){unsignedchari=100; while(i--); NRF24L01_CE=0; NRF24L01_CSN=1; NRF24L01_SCK=0; NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_TX_ADDR,NRF24L01_TX_ADDRESS,NRF24L01_TX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P0,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P1,NRF24L01_RX_ADDRESS,NRF24L01_RX_ADR_WIDTH); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P2,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P3,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P4,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_Write_Buf(NRF24L01_WRITE_REG+NRF24L01_RX_ADDR_P5,NRF24L01_RX_ADDRESS,1); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_AA,0x3f); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_EN_RXADDR,0x3f); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_CH,0); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P0,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P1,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P2,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P3,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P4,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RX_PW_P5,NRF24L01_RX_PLOAD_WIDTH); NRF24L01_SPI_RW_Reg(NRF24L01_WRITE_REG+NRF24L01_RF_SETUP,0x07); NRF24L01_CE=1;}2.2.5、main.h#ifndef__MAIN_H__#define__MAIN_H__#include<reg52.h>sbitLED1=P1^0;sbitLED2=P1^1;#defineLED_ON0#defineLED_OFF1sbitKEY1=P3^4;sbitKEY2=P3^5;sbitKEY3=P3^6;sbitKEY4=P3^7;sbitBuzzer=P1^2;externvoidDelay_ms(unsignedintn);externvoidScan_Key();externvoidBuzzer_Di();#endif2.2.6、main.c#include"main.h"#include"LCD1602.h"#include"NRF24L01.h"intTemp_Buffer=0;unsignedcharflag_temper=0;unsignedcharKEY_NUM=0;uns
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度租賃合同終止與租賃物處理及收益分配協(xié)議3篇
- 二零二五年度城市綜合體衛(wèi)生間清潔及品牌形象塑造協(xié)議2篇
- 西安理工大學(xué)高科學(xué)院《影視音樂基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024汽車烤漆房租賃合同及環(huán)保設(shè)施租賃與維護(hù)協(xié)議3篇
- 2025年度智慧城市基礎(chǔ)設(shè)施建設(shè)合同6篇
- 2024版新能源發(fā)電項(xiàng)目投資與建設(shè)合同
- 二零二五年度板材研發(fā)與生產(chǎn)技術(shù)轉(zhuǎn)移合同2篇
- 二零二五年度大理石礦山開采與環(huán)保治理綜合服務(wù)合同3篇
- 二零二五年物聯(lián)網(wǎng)設(shè)備集成技術(shù)服務(wù)協(xié)議
- 天津外國語大學(xué)濱海外事學(xué)院《物理化學(xué)實(shí)驗(yàn)Ⅱ》2023-2024學(xué)年第一學(xué)期期末試卷
- 新教材人教版高中物理選擇性必修第二冊全冊各章節(jié)課時(shí)練習(xí)題及章末測驗(yàn)含答案解析(安培力洛倫茲力電磁感應(yīng)交變電流等)
- 初級養(yǎng)老護(hù)理員培訓(xùn)全套
- 集中供熱管網(wǎng)系統(tǒng)一次網(wǎng)的調(diào)節(jié)方法
- GB/T 41095-2021機(jī)械振動(dòng)選擇適當(dāng)?shù)臋C(jī)器振動(dòng)標(biāo)準(zhǔn)的方法
- MRP、MPS計(jì)劃文檔教材
- 甲狀腺疾病護(hù)理查房課件
- 安全安全帶檢查記錄表
- GB∕T 26520-2021 工業(yè)氯化鈣-行業(yè)標(biāo)準(zhǔn)
- 2022年浙江省紹興市中考數(shù)學(xué)試題及參考答案
- Listen-to-this-3-英語高級聽力-(整理版)
- 生活垃圾焚燒處理建設(shè)項(xiàng)目評價(jià)導(dǎo)則(2022)
評論
0/150
提交評論