基于AT89C2051單片機和InRF401+DSl8B20數(shù)字溫度傳感器的無線監(jiān)測系統(tǒng)設(shè)計方案


原標(biāo)題:基于AT89C2051和InRF401的無線監(jiān)測系統(tǒng)設(shè)計方案
基于AT89C2051與InRF401+DS18B20的無線溫度監(jiān)測系統(tǒng)設(shè)計方案
在現(xiàn)代工業(yè)、農(nóng)業(yè)、倉儲管理、環(huán)境監(jiān)測乃至于智能家居等諸多領(lǐng)域,對環(huán)境溫度的實時、精確監(jiān)測與無線傳輸需求日益迫切。傳統(tǒng)的有線溫度監(jiān)測系統(tǒng)在部署靈活性、布線成本以及復(fù)雜環(huán)境下可靠性方面存在諸多限制。無線溫度監(jiān)測系統(tǒng)以其非接觸式、易于安裝、維護成本低等顯著優(yōu)勢,成為解決上述問題的理想方案。本設(shè)計方案旨在構(gòu)建一個基于經(jīng)典的AT89C2051單片機與高集成度無線收發(fā)模塊InRF401,并配合高性能數(shù)字溫度傳感器DS18B20的無線溫度監(jiān)測系統(tǒng)。該系統(tǒng)將實現(xiàn)對目標(biāo)區(qū)域溫度數(shù)據(jù)的精確采集、無線傳輸、以及數(shù)據(jù)接收與顯示,為相關(guān)應(yīng)用提供穩(wěn)定可靠的溫度監(jiān)測解決方案。
1. 系統(tǒng)概述與總體架構(gòu)
本無線溫度監(jiān)測系統(tǒng)主要由兩個核心部分組成:溫度數(shù)據(jù)采集與無線發(fā)射模塊,以及無線數(shù)據(jù)接收與顯示模塊。
溫度數(shù)據(jù)采集與無線發(fā)射模塊: 該模塊負(fù)責(zé)感應(yīng)環(huán)境溫度,將模擬信號轉(zhuǎn)換為數(shù)字信號,通過單片機進行處理,并將處理后的溫度數(shù)據(jù)通過無線方式發(fā)送出去。其核心組成包括:DS18B20數(shù)字溫度傳感器、AT89C2051單片機、InRF401無線收發(fā)模塊、電源模塊及必要的接口電路。
無線數(shù)據(jù)接收與顯示模塊: 該模塊負(fù)責(zé)接收無線發(fā)射模塊發(fā)送的溫度數(shù)據(jù),對數(shù)據(jù)進行解析,并通過顯示單元將溫度值直觀地呈現(xiàn)給用戶。其核心組成包括:InRF401無線收發(fā)模塊、AT89C2051單片機、LCD液晶顯示屏(或數(shù)碼管)、電源模塊及必要的接口電路。
整個系統(tǒng)的工作流程可以概括為:DS18B20采集溫度數(shù)據(jù),并將數(shù)字信號發(fā)送給AT89C2051單片機;單片機對數(shù)據(jù)進行處理和封裝;InRF401模塊將數(shù)據(jù)通過無線方式發(fā)送;接收端的InRF401模塊接收數(shù)據(jù)并發(fā)送給接收端的AT89C2051單片機;接收單片機解析數(shù)據(jù)并通過LCD或數(shù)碼管顯示出來。
2. 核心元器件選型與分析
2.1 單片機:AT89C2051
元器件型號: AT89C2051
器件作用: AT89C2051作為整個系統(tǒng)的核心控制器,負(fù)責(zé)管理和協(xié)調(diào)各個模塊的工作。在發(fā)射端,它負(fù)責(zé)讀取DS18B20的溫度數(shù)據(jù)、對數(shù)據(jù)進行格式化處理、控制InRF401無線模塊的數(shù)據(jù)發(fā)送;在接收端,它負(fù)責(zé)接收InRF401模塊解調(diào)后的數(shù)據(jù)、對數(shù)據(jù)進行解析、控制顯示模塊顯示溫度值。
為什么選擇這顆元器件:
成本效益高: AT89C2051是一款經(jīng)典的8位CMOS微控制器,其價格低廉,非常適合成本敏感型的應(yīng)用。
資源豐富且易于開發(fā): 盡管引腳數(shù)量較少(20引腳),但內(nèi)部集成了2KB的Flash可編程存儲器、128字節(jié)RAM、兩個16位定時器/計數(shù)器、一個全雙工串行口以及可編程I/O端口。對于本溫度監(jiān)測系統(tǒng)所需的串口通信(與DS18B20的單總線通信模擬實現(xiàn),或與InRF401的SPI/UART通信)和基本的控制任務(wù)而言,其資源完全足夠。
功耗相對較低: CMOS技術(shù)使得其在正常工作和空閑模式下功耗相對較低,有利于延長電池供電系統(tǒng)的使用壽命。
開發(fā)資料豐富,學(xué)習(xí)曲線平緩: 作為51系列單片機的衍生型號,AT89C2051擁有大量的開發(fā)資料、成熟的開發(fā)工具鏈(如Keil C51)以及廣泛的社區(qū)支持,對于開發(fā)者而言,入門和調(diào)試都相對容易。
集成度高,外圍電路簡單: 相較于需要大量外圍芯片才能實現(xiàn)類似功能的方案,AT89C2051內(nèi)部集成了許多功能模塊,減少了外部元件的數(shù)量,從而簡化了電路設(shè)計,降低了PCB的復(fù)雜度。
元器件功能:
中央處理器(CPU): 執(zhí)行程序指令,控制所有內(nèi)部和外部操作。
閃存(Flash Memory): 2KB的片內(nèi)可編程Flash存儲器,用于存儲用戶程序代碼和固定數(shù)據(jù)。
隨機存取存儲器(RAM): 128字節(jié)的片內(nèi)RAM,用于存儲臨時數(shù)據(jù)、堆棧和寄存器。
I/O端口: 15個可編程I/O引腳,可配置為輸入或輸出,用于與DS18B20、InRF401以及顯示模塊進行數(shù)據(jù)和控制信號的交互。
定時器/計數(shù)器: 兩個16位定時器/計數(shù)器(T0和T1),可用于產(chǎn)生延時、計時、計數(shù)事件等,例如精確控制DS18B20的單總線時序。
串行通信接口(UART): 全雙工串行口,雖然AT89C2051的UART引腳可能被復(fù)用,但在本設(shè)計中,與DS18B20的通信是基于其單總線協(xié)議,通過GPIO口模擬實現(xiàn);與InRF401的通信則取決于InRF401的具體接口,如果是SPI或模擬UART,則需要通過GPIO口模擬。
中斷系統(tǒng): 兩個外部中斷源和定時器中斷源,用于響應(yīng)外部事件(如InRF401的數(shù)據(jù)接收中斷)或定時事件。
2.2 數(shù)字溫度傳感器:DS18B20
元器件型號: DS18B20
器件作用: DS18B20是本系統(tǒng)的核心傳感元件,負(fù)責(zé)將環(huán)境溫度轉(zhuǎn)換為數(shù)字信號,供單片機讀取。
為什么選擇這顆元器件:
單總線接口: DS18B20采用獨特的單總線(1-Wire)通信協(xié)議,僅需一根信號線即可與單片機進行通信,極大地簡化了硬件連接,節(jié)省了單片機的I/O口資源。這對于引腳資源有限的AT89C2051尤為重要。
寬溫度測量范圍與高精度: 測量范圍覆蓋-55°C至+125°C,在此范圍內(nèi),精度在-10°C至+85°C時可達到±0.5°C,足以滿足大多數(shù)環(huán)境溫度監(jiān)測需求。其高分辨率(可配置為9~12位,對應(yīng)0.5°C~0.0625°C)確保了測量的精確性。
數(shù)字輸出: DS18B20直接輸出數(shù)字溫度值,省去了傳統(tǒng)模擬溫度傳感器所需的A/D轉(zhuǎn)換電路,簡化了系統(tǒng)設(shè)計,提高了抗干擾能力,并減少了誤差源。
寄生電源模式: DS18B20支持寄生電源模式,即只需兩根線(數(shù)據(jù)線和地線)即可工作,電源由數(shù)據(jù)線提供。這對于需要節(jié)省布線或空間的應(yīng)用非常有益,雖然通常為了穩(wěn)定性,仍會建議獨立供電。
唯一序列號: 每個DS18B20都帶有一個唯一的64位序列號,允許多個DS18B20并聯(lián)在同一條單總線上進行識別和尋址,實現(xiàn)多點溫度監(jiān)測。這為系統(tǒng)的擴展性提供了可能。
元器件功能:
溫度感應(yīng)元件: 內(nèi)部集成有高精度半導(dǎo)體溫度傳感器。
A/D轉(zhuǎn)換器: 將感應(yīng)到的模擬溫度信號轉(zhuǎn)換為數(shù)字信號。
單總線接口: 實現(xiàn)與單片機的串行通信,支持?jǐn)?shù)據(jù)讀寫和功能控制。
存儲器: 包括一個用于存儲溫度值和配置參數(shù)的暫存器(Scratchpad)以及一個用于存儲高低溫報警閾值的EEPROM。
報警功能: 可編程的高低溫報警功能,當(dāng)溫度超出設(shè)定范圍時,DS18B20可以發(fā)出報警信號。
2.3 無線收發(fā)模塊:InRF401 (或NRF24L01+等類似模塊)
元器件型號: InRF401(這里假設(shè)InRF401是一個低成本、易于集成的RF收發(fā)模塊。若無此具體型號,通常會選擇NRF24L01+或Si4432等)。鑒于InRF401信息相對較少,這里以NRF24L01+作為示例進行詳細闡述,因為它在低功耗無線通信領(lǐng)域應(yīng)用極為廣泛且性能優(yōu)異,是InRF401的常見替代品或同類型產(chǎn)品。
器件作用: InRF401(或NRF24L01+)是本系統(tǒng)實現(xiàn)無線數(shù)據(jù)傳輸?shù)年P(guān)鍵組件。它負(fù)責(zé)將單片機處理后的數(shù)字溫度數(shù)據(jù)調(diào)制成無線電波發(fā)射出去,并在接收端接收無線電波并解調(diào)出數(shù)字?jǐn)?shù)據(jù),從而實現(xiàn)兩點間的無線通信。
為什么選擇NRF24L01+(作為InRF401的代表):
工作頻率與抗干擾: 工作在2.4GHz ISM(工業(yè)、科學(xué)、醫(yī)療)頻段,這是全球通用且免費的頻段,具有較好的抗干擾能力。
高數(shù)據(jù)傳輸速率: 支持1Mbps或2Mbps的空中數(shù)據(jù)傳輸速率,可以快速傳輸少量溫度數(shù)據(jù),滿足實時性要求。
低功耗設(shè)計: 具有多種省電模式(如掉電模式、空閑模式),在發(fā)射和接收模式下電流消耗也相對較低,非常適合電池供電的無線設(shè)備,有助于延長發(fā)射模塊的續(xù)航時間。
自動應(yīng)答與自動重發(fā): 內(nèi)部集成了自動應(yīng)答和自動重發(fā)機制,大大簡化了軟件層的錯誤檢測和糾正,提高了通信的可靠性。
多點通信能力: 具有6路數(shù)據(jù)接收管道(Data Pipes),理論上可以支持一點對多點或多點對一點的通信網(wǎng)絡(luò),為系統(tǒng)擴展性提供了可能。
硬件接口簡單: 采用SPI(串行外設(shè)接口)與單片機進行通信,SPI接口速度快,且只需四根線(CSN, SCK, MOSI, MISO)即可完成通信,對于AT89C2051這樣的單片機來說,通過軟件模擬SPI或利用其IO口進行位操作即可實現(xiàn)通信。
集成度高: 內(nèi)部集成了射頻前端、基帶處理器等,外圍元件極少,通常只需幾顆電容即可工作,降低了硬件設(shè)計復(fù)雜度。
模塊化易于使用: 市面上存在大量基于NRF24L01+的模塊,通常帶有天線接口,直接引出SPI引腳和電源引腳,方便用戶集成到自己的電路板上。
元器件功能(以NRF24L01+為例):
射頻收發(fā)器: 完成射頻信號的調(diào)制、解調(diào)、發(fā)射和接收。
基帶處理器: 處理數(shù)字基帶信號,包括數(shù)據(jù)打包、解包、CRC校驗、自動應(yīng)答和自動重發(fā)等功能。
增強型ShockBurst?: 一種高效的硬件數(shù)據(jù)包處理協(xié)議,包括數(shù)據(jù)包格式、自動數(shù)據(jù)包組裝、自動應(yīng)答和自動重發(fā)等。
多通道: 支持125個頻道,可以方便地進行跳頻,進一步提高抗干擾能力。
SPI接口: 與微控制器進行高速數(shù)據(jù)交換和配置的接口。
低功耗管理: 通過各種模式(如掉電模式、待機模式、RX模式、TX模式)實現(xiàn)功耗優(yōu)化。
2.4 顯示模塊:1602 LCD液晶顯示屏 (或LED數(shù)碼管)
元器件型號: 1602 LCD液晶顯示屏(或其他兼容型號,如2004 LCD)或共陽/共陰LED數(shù)碼管(如FMD5461AS)
器件作用: 顯示模塊用于接收端,將單片機解析出的溫度數(shù)據(jù)顯示出來,方便用戶直觀地查看。
為什么選擇1602 LCD:
顯示內(nèi)容豐富: 1602 LCD可以顯示兩行,每行16個字符,除了溫度值,還可以顯示單位、狀態(tài)信息等,比數(shù)碼管能提供更多信息。
功耗相對較低: 相較于點陣式LCD,段式LCD(如1602)的功耗更低,適合長時間運行的設(shè)備。
接口簡單: 1602 LCD采用并口(8位或4位)與單片機通信,雖然占用AT89C2051的I/O口較多,但在接收端,AT89C2051的I/O口資源相對充足。如果I/O口緊張,也可以選擇IIC接口的1602 LCD,但需要額外的IIC驅(qū)動芯片或軟件模擬IIC。
成本低廉: 1602 LCD是市場上非常普及且價格低廉的顯示器件。
編程控制相對簡單: 有成熟的驅(qū)動庫和例程可供參考,便于開發(fā)。
元器件功能(1602 LCD):
顯示控制器: HD44780(或兼容)控制器,負(fù)責(zé)接收指令和數(shù)據(jù),并驅(qū)動液晶顯示。
字符發(fā)生器: 內(nèi)置ROM和RAM,用于存儲字符點陣數(shù)據(jù),可以顯示英文字母、數(shù)字和一些特殊符號。
數(shù)據(jù)/指令接口: D0-D7數(shù)據(jù)線(或D4-D7用于4位模式)、RS(寄存器選擇)、RW(讀寫選擇)、EN(使能)等控制線。
背光: 大部分1602 LCD帶有LED背光,提供在光線不足條件下的可視性,但會增加功耗。
為什么選擇LED數(shù)碼管(作為替代):
簡單直觀: 對于僅僅顯示數(shù)字溫度值而言,數(shù)碼管顯示效果直觀,易于識別。
驅(qū)動簡單: 可以通過74HC595等串行移位寄存器進行驅(qū)動,節(jié)省單片機I/O口,或者直接由單片機I/O口驅(qū)動,但會占用更多引腳。
響應(yīng)速度快: 數(shù)字切換響應(yīng)速度非??臁?/span>
成本更低: 數(shù)碼管通常比LCD更便宜。
元器件功能(LED數(shù)碼管):
LED段: 由7個(或8個,帶小數(shù)點)LED構(gòu)成,通過點亮不同LED段來顯示數(shù)字。
共陽極/共陰極: 根據(jù)驅(qū)動方式選擇,決定所有LED段的公共端是接電源正極(共陽)還是負(fù)極(共陰)。
2.5 電源模塊
元器件型號: LM7805(線性穩(wěn)壓器)、AMS1117-3.3(低壓差線性穩(wěn)壓器LDO)、或DC-DC降壓模塊(如基于MP1584等芯片)
器件作用: 為系統(tǒng)的各個模塊提供穩(wěn)定、可靠的直流電源。DS18B20通常工作在3.0V-5.5V,AT89C2051通常工作在3V-5.5V,NRF24L01+工作在1.9V-3.6V,LCD通常工作在5V。因此,需要根據(jù)不同模塊的需求,提供相應(yīng)的穩(wěn)壓電源。
為什么選擇這些元器件:
LM7805: 經(jīng)典的5V線性穩(wěn)壓器,輸入電壓范圍廣(7V-35V),輸出穩(wěn)定,可靠性高,價格便宜。適用于為AT89C2051和5V供電的LCD提供電源。
AMS1117-3.3: 低壓差(LDO)線性穩(wěn)壓器,輸入輸出壓差小,適合電池供電。用于為NRF24L01+等3.3V供電的模塊提供穩(wěn)定電源。其優(yōu)勢在于壓差小,在電池電壓下降時能更好地保持3.3V輸出。
DC-DC降壓模塊: 如基于MP1584等開關(guān)電源芯片的模塊。相較于線性穩(wěn)壓器,開關(guān)電源的轉(zhuǎn)換效率更高,特別是在輸入輸出壓差較大或需要較大電流時,可以顯著減少熱量產(chǎn)生,提高電池續(xù)航能力。對于功耗敏感或需要從較高電壓(如12V電池)降壓的應(yīng)用是更優(yōu)的選擇。
元器件功能:
LM7805/AMS1117: 通過內(nèi)部調(diào)整管將較高的輸入電壓穩(wěn)定到固定的輸出電壓,其特點是輸出電壓紋波小,但轉(zhuǎn)換效率相對較低,剩余能量以熱量形式散失。
DC-DC降壓模塊: 通過高頻開關(guān)、電感和電容的配合,將輸入電壓高效地轉(zhuǎn)換為較低的輸出電壓,轉(zhuǎn)換效率高,發(fā)熱量小。
2.6 其他輔助元器件
晶振: 11.0592MHz或12MHz,為AT89C2051提供精確的時鐘源。11.0592MHz有助于精確實現(xiàn)串口通信波特率。
復(fù)位電路: RC復(fù)位電路(電阻+電容)或?qū)S脧?fù)位芯片(如MAX813),保證單片機上電可靠復(fù)位。
濾波電容: 各電源引腳旁并聯(lián)104(0.1uF)瓷片電容和10uF/47uF電解電容,用于電源濾波,增強系統(tǒng)穩(wěn)定性,抑制高頻干擾。
上拉電阻: DS18B20的DQ引腳需要接一個4.7kΩ左右的上拉電阻,以確保單總線通信的正常進行。
發(fā)光二極管(LED): 用于指示系統(tǒng)工作狀態(tài),如電源指示、數(shù)據(jù)發(fā)送/接收指示等。
按鍵: (可選)用于配置系統(tǒng)參數(shù),如報警閾值、發(fā)送間隔等。
電容、電阻: 構(gòu)成RC延時、限流、分壓等基本電路。
PCB板: 承載所有元器件并實現(xiàn)電氣連接。
3. 系統(tǒng)硬件設(shè)計
3.1 發(fā)射模塊硬件設(shè)計
DS18B20與AT89C2051連接: DS18B20的DQ引腳(數(shù)據(jù)線)直接連接到AT89C2051的一個普通I/O口(如P3.0),同時DQ引腳通過一個4.7kΩ電阻上拉到5V電源。GND引腳接地。VCC引腳接5V電源(若采用獨立供電)。
AT89C2051與InRF401(NRF24L01+)連接:
SCK (P1.0) -> NRF24L01+ SCK
MOSI (P1.1) -> NRF24L01+ MOSI
MISO (P1.2) -> NRF24L01+ MISO
CSN (P1.3) -> NRF24L01+ CSN
CE (P1.4) -> NRF24L01+ CE (使能引腳)
IRQ (P1.5) -> NRF24L01+ IRQ (中斷引腳,可選,用于接收數(shù)據(jù)中斷)
SPI接口: AT89C2051沒有硬件SPI,需要通過軟件模擬SPI。分配P1口或P3口作為SPI的SCK、MOSI、MISO、CSN引腳。例如:
電源: NRF24L01+通常工作在3.3V,因此需要一個AMS1117-3.3V穩(wěn)壓器將5V電源降壓至3.3V供其使用。在3.3V和GND之間并聯(lián)10uF電解電容和0.1uF瓷片電容進行濾波。
電源電路: 外部DC電源輸入(如9V電池或適配器)經(jīng)過LM7805穩(wěn)壓為5V,供AT89C2051、DS18B20(獨立供電模式)以及后續(xù)的3.3V穩(wěn)壓器使用。再由5V通過AMS1117-3.3V為NRF24L01+供電。
晶振與復(fù)位電路: 11.0592MHz或12MHz晶振連接到AT89C2051的XTAL1和XTAL2引腳,并并聯(lián)兩個30pF左右的瓷片電容接地。復(fù)位引腳RST通過RC電路或復(fù)位芯片連接到電源。
3.2 接收模塊硬件設(shè)計
AT89C2051與InRF401(NRF24L01+)連接: 連接方式與發(fā)射模塊類似,電源處理也相同。IRQ引腳在此處更為重要,可以配置外部中斷,當(dāng)NRF24L01+接收到數(shù)據(jù)時觸發(fā)中斷,通知單片機讀取數(shù)據(jù)。
AT89C2051與1602 LCD連接:
數(shù)據(jù)線: 1602 LCD的D4-D7(4位模式)連接到AT89C2051的P1或P3口,例如P1.4-P1.7。
控制線: RS、RW、EN引腳連接到AT89C2051的P1或P3口,例如P1.0、P1.1、P1.2。
背光: VCC和LED+連接到5V,GND和LED-連接到GND,或通過限流電阻連接。VEE通過電位器調(diào)節(jié)對比度。
電源: 1602 LCD通常工作在5V,由LM7805提供的5V電源直接供電。
電源電路: 與發(fā)射模塊類似,提供穩(wěn)定的5V和3.3V電源。
晶振與復(fù)位電路: 同發(fā)射模塊。
4. 系統(tǒng)軟件設(shè)計
軟件設(shè)計是實現(xiàn)系統(tǒng)功能的關(guān)鍵,主要包括DS18B20溫度采集、NRF24L01+無線通信協(xié)議實現(xiàn)以及數(shù)據(jù)顯示。
4.1 發(fā)射模塊軟件流程
系統(tǒng)初始化:
單片機I/O口初始化:配置P1、P3口為輸出或輸入。
定時器初始化:配置定時器用于DS18B20單總線時序的精確延時。
NRF24L01+模塊初始化:配置為發(fā)射模式,設(shè)置工作頻率、數(shù)據(jù)速率、發(fā)送功率、發(fā)送地址、開啟自動重發(fā)和自動應(yīng)答等。這涉及一系列的SPI寄存器寫入操作。
DS18B20溫度采集:
復(fù)位DS18B20: 通過單總線發(fā)送復(fù)位脈沖。
跳過ROM(Skip ROM,0xCC): 如果只有一個DS18B20,可以使用此命令跳過ROM匹配過程。
啟動溫度轉(zhuǎn)換(Convert T,0x44): 發(fā)送此命令啟動DS18B20的溫度轉(zhuǎn)換。
等待轉(zhuǎn)換完成: DS18B20溫度轉(zhuǎn)換需要一定時間(最高分辨率12位時約750ms),可以通過延時或輪詢DS18B20狀態(tài)位(讀數(shù)據(jù)線)來判斷是否完成。
復(fù)位DS18B20: 再次發(fā)送復(fù)位脈沖。
跳過ROM(Skip ROM,0xCC):
讀取暫存器(Read Scratchpad,0xBE): 讀取9字節(jié)的暫存器內(nèi)容,其中包含溫度數(shù)據(jù)和CRC校驗碼。
CRC校驗: 對讀取的9字節(jié)數(shù)據(jù)進行CRC校驗,確保數(shù)據(jù)完整性。
解析溫度值: 從讀取的暫存器中提取溫度數(shù)據(jù)(通常是第0和第1字節(jié)),并根據(jù)DS18B20的數(shù)據(jù)格式將其轉(zhuǎn)換為實際的攝氏溫度值(浮點數(shù)或定點數(shù))。
數(shù)據(jù)封裝與無線發(fā)送:
將獲取到的溫度值(例如,轉(zhuǎn)換為整數(shù),乘以10或100以保留小數(shù)位,或直接發(fā)送浮點數(shù)轉(zhuǎn)換為字節(jié)數(shù)組)進行打包,形成一個數(shù)據(jù)幀。數(shù)據(jù)幀可以包含標(biāo)識符、溫度值、校驗和等信息。
通過SPI接口將數(shù)據(jù)幀寫入NRF24L01+的發(fā)送緩沖區(qū)。
拉高CE引腳(持續(xù)一段時間后拉低)觸發(fā)NRF24L01+發(fā)送數(shù)據(jù)。
等待發(fā)送完成或發(fā)送失?。ㄍㄟ^IRQ中斷或查詢STATUS寄存器)。
進入低功耗模式(可選):發(fā)送完成后,單片機和NRF24L01+可以進入低功耗模式,周期性地喚醒進行下一次測量和發(fā)送,以延長電池壽命。
4.2 接收模塊軟件流程
系統(tǒng)初始化:
單片機I/O口初始化。
NRF24L01+模塊初始化:配置為接收模式,設(shè)置工作頻率、數(shù)據(jù)速率、接收地址等。
LCD初始化:發(fā)送LCD初始化指令,設(shè)置顯示模式、清屏等。
無線數(shù)據(jù)接收:
NRF24L01+進入接收模式并持續(xù)監(jiān)聽。
輪詢或中斷檢測: 周期性輪詢NRF24L01+的STATUS寄存器(RX_DR位)或配置外部中斷(IRQ引腳),當(dāng)有數(shù)據(jù)到達時觸發(fā)。
讀取數(shù)據(jù): 通過SPI接口從NRF24L01+的接收緩沖區(qū)讀取數(shù)據(jù)。
數(shù)據(jù)解析與校驗: 對接收到的數(shù)據(jù)幀進行解析,提取溫度值,并進行校驗(如CRC),確保數(shù)據(jù)有效性。
溫度數(shù)據(jù)顯示:
將解析出的溫度值轉(zhuǎn)換為字符串格式(例如,使用sprintf函數(shù)將浮點數(shù)轉(zhuǎn)換為字符串)。
通過AT89C2051控制1602 LCD顯示屏,將溫度字符串發(fā)送到LCD顯存,并在指定位置顯示出來??梢燥@示“TEMP: XX.X C”等格式。
異常處理: 如果數(shù)據(jù)接收失敗或校驗錯誤,可以在LCD上顯示“RX ERROR”或上次有效值,并進行錯誤計數(shù)。
4.3 DS18B20單總線通信協(xié)議實現(xiàn)細節(jié)(C語言偽代碼)
// 假設(shè)P3.0連接DS18B20的DQ引腳
#define DQ_PIN P3_0 // DQ引腳定義
#define DQ_OUT_MODE DQ_PIN = 0 // 設(shè)置為輸出低
#define DQ_IN_MODE // 設(shè)置為輸入(高阻態(tài),DS18B20拉低)
#define DQ_READ DQ_PIN // 讀取DQ引腳狀態(tài)
// 單總線復(fù)位和存在脈沖
unsigned char DS18B20_Reset() {
unsigned char presence_pulse;
DQ_OUT_MODE; // 拉低DQ
Delay_us(480); // 延時480us
DQ_IN_MODE; // 釋放DQ(高阻態(tài))
Delay_us(60); // 延時60us,等待DS18B20響應(yīng)
presence_pulse = DQ_READ; // 讀取存在脈沖
Delay_us(420); // 延時420us,等待總線恢復(fù)
return presence_pulse; // 0表示存在,1表示不存在
}
// 單總線寫1
void DS18B20_Write1() {
DQ_OUT_MODE;
Delay_us(6); // 保持低電平6us
DQ_IN_MODE;
Delay_us(64); // 保持高電平64us
}
// 單總線寫0
void DS18B20_Write0() {
DQ_OUT_MODE;
Delay_us(60); // 保持低電平60us
DQ_IN_MODE;
Delay_us(10); // 保持高電平10us
}
// 單總線讀位
unsigned char DS18B20_ReadBit() {
unsigned char bit_value;
DQ_OUT_MODE;
Delay_us(6); // 拉低DQ 6us
DQ_IN_MODE;
Delay_us(9); // 等待9us
bit_value = DQ_READ; // 讀取位
Delay_us(55); // 等待55us,總線恢復(fù)
return bit_value;
}
// 單總線寫字節(jié)
void DS18B20_WriteByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
if (dat & 0x01) {
DS18B20_Write1();
} else {
DS18B20_Write0();
}
dat >>= 1;
}
}
// 單總線讀字節(jié)
unsigned char DS18B20_ReadByte() {
unsigned char i, dat = 0;
for (i = 0; i < 8; i++) {
if (DS18B20_ReadBit()) {
dat |= 0x01 << i;
}
}
return dat;
}
// 獲取DS18B20溫度
float Get_DS18B20_Temp() {
unsigned char temp_H, temp_L;
int temp;
float real_temp;
if (DS18B20_Reset() == 0) { // 如果存在
DS18B20_WriteByte(0xCC); // Skip ROM
DS18B20_WriteByte(0x44); // Convert T
// 等待轉(zhuǎn)換完成,此處簡化為延時,實際應(yīng)輪詢DQ或延時750ms
// 可以通過DS18B20_ReadBit()讀取DQ判斷轉(zhuǎn)換是否完成 (DQ為1表示完成)
// while(DS18B20_ReadBit() == 0); // 實際應(yīng)這樣等待
Delay_ms(800); // 粗略延時
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // Skip ROM
DS18B20_WriteByte(0xBE); // Read Scratchpad
temp_L = DS18B20_ReadByte(); // 讀取低字節(jié)
temp_H = DS18B20_ReadByte(); // 讀取高字節(jié)
// 其他7字節(jié)數(shù)據(jù)可以忽略,但通常建議全部讀取,并進行CRC校驗
temp = (temp_H << 8) | temp_L; // 拼接為16位數(shù)據(jù)
// 判斷符號位(最高位)
if (temp & 0xF800) { // 如果是負(fù)數(shù)
temp = ~temp + 1; // 補碼轉(zhuǎn)換
real_temp = (float)temp * 0.0625; // 轉(zhuǎn)換為實際溫度
real_temp = -real_temp;
} else { // 正數(shù)
real_temp = (float)temp * 0.0625;
}
return real_temp;
}
return -999.0; // 表示讀取失敗
}
4.4 NRF24L01+ SPI通信與操作(C語言偽代碼)
// 假設(shè)P1口用于模擬SPI:P1.0=SCK, P1.1=MOSI, P1.2=MISO, P1.3=CSN, P1.4=CE
// SPI引腳定義
#define CSN_PIN P1_3
#define CE_PIN P1_4
#define SCK_PIN P1_0
#define MOSI_PIN P1_1
#define MISO_PIN P1_2
// NRF24L01+ SPI基本操作
void NRF24L01_SPI_WriteByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
SCK_PIN = 0; // SCK拉低
if (dat & 0x80) { // 發(fā)送高位在前
MOSI_PIN = 1;
} else {
MOSI_PIN = 0;
}
dat <<= 1;
SCK_PIN = 1; // SCK拉高,傳輸一位
}
SCK_PIN = 0; // 完成后SCK拉低
}
unsigned char NRF24L01_SPI_ReadByte() {
unsigned char i, dat = 0;
MOSI_PIN = 1; // 讀操作時MOSI可保持高電平
for (i = 0; i < 8; i++) {
SCK_PIN = 0; // SCK拉低
// Delay_us(1); // 適當(dāng)延時以保證建立時間
SCK_PIN = 1; // SCK拉高,采樣MISO
if (MISO_PIN) {
dat |= (0x80 >> i); // 接收高位在前
}
}
SCK_PIN = 0; // 完成后SCK拉低
return dat;
}
// NRF24L01+寫寄存器
unsigned char NRF24L01_Write_Reg(unsigned char reg, unsigned char dat)
{
unsigned char status;
CSN_PIN = 0; // 片選使能
status = NRF24L01_SPI_WriteByte(reg | 0x20); // 寫命令(0x20)+寄存器地址
NRF24L01_SPI_WriteByte(dat); // 寫入數(shù)據(jù)
CSN_PIN = 1; // 片選失能
return status; // 返回狀態(tài)寄存器
}
// NRF24L01+讀寄存器
unsigned char NRF24L01_Read_Reg(unsigned char reg) {
unsigned char reg_val;
CSN_PIN = 0;
NRF24L01_SPI_WriteByte(reg); // 讀命令 + 寄存器地址
reg_val = NRF24L01_SPI_ReadByte(); // 讀取數(shù)據(jù)
CSN_PIN = 1;
return reg_val;
}
// NRF24L01+寫FIFO
unsigned char NRF24L01_Write_Buf(unsigned char reg, unsigned char *pBuf,
unsigned char len) {
unsigned char status, i;
CSN_PIN = 0;
status = NRF24L01_SPI_WriteByte(reg);
for (i = 0; i < len; i++) {
NRF24L01_SPI_WriteByte(*pBuf++);
}
CSN_PIN = 1;
return status;
}
// NRF24L01+讀FIFO
unsigned char NRF24L01_Read_Buf(unsigned char reg, unsigned char *pBuf,
unsigned char len) {
unsigned char status, i;
CSN_PIN = 0;
status = NRF24L01_SPI_WriteByte(reg);
for (i = 0; i < len; i++) {
pBuf[i] = NRF24L01_SPI_ReadByte();
}
CSN_PIN = 1;
return status;
}
// NRF24L01+模塊初始化(發(fā)射端)
void NRF24L01_TX_Init() {
CE_PIN = 0; // 使能芯片配置
NRF24L01_Write_Reg(0x00, 0x0A); // CONFIG: CRC enable, 2-byte CRC, Power
UP, TX mode
NRF24L01_Write_Reg(0x01, 0x00); // EN_AA: disable auto-ack for all pipes
(根據(jù)需求開啟或關(guān)閉)
NRF24L01_Write_Reg(0x02, 0x01); // EN_RXADDR: enable data pipe 0
(接收地址0用于應(yīng)答)
NRF24L01_Write_Reg(0x03, 0x03); // SETUP_AW: 5 bytes address width
NRF24L01_Write_Reg(0x04, 0x03); // SETUP_RETR: auto retransmit delay
1000us, retransmit count 3
NRF24L01_Write_Reg(0x05, 20); // RF_CH: 2.420GHz
NRF24L01_Write_Reg(0x06, 0x06); // RF_SETUP: 2Mbps, 0dBm output power
// 設(shè)置發(fā)射地址(與接收地址一致)
unsigned char TX_ADDR[5] = {0x34, 0x43, 0x10, 0x10, 0x01};
NRF24L01_Write_Buf(0x30, TX_ADDR, 5); // TX_ADDR
NRF24L01_Write_Buf(0x10, TX_ADDR, 5); // RX_ADDR_P0 (for auto-ack)
NRF24L01_Write_Reg(0x11, 32); // RX_PW_P0: payload width (for auto-ack)
CE_PIN = 1; // 進入待機模式
Delay_us(130); // 確保NRF24L01+進入正常工作狀態(tài)
}
// NRF24L01+發(fā)送數(shù)據(jù)
unsigned char NRF24L01_TX_Data(unsigned char *tx_buf, unsigned char len)
{
unsigned char sta;
CE_PIN = 0;
NRF24L01_Write_Buf(0xA0, tx_buf, len); // Write_TX_PAYLOAD
NRF24L01_Write_Reg(0x00, 0x0E); // CONFIG: Power UP, TX mode
CE_PIN = 1; // 啟動發(fā)送
Delay_us(10);
CE_PIN = 0;
// 輪詢發(fā)送狀態(tài)
while((sta = NRF24L01_Read_Reg(0x07))&0x40 == 0); // TX_DS 或 MAX_RT
NRF24L01_Write_Reg(0x07, sta); // 清除中斷標(biāo)志
if(sta&0x20) { // MAX_RT (最大重發(fā)次數(shù))
NRF24L01_Write_Reg(0xE1, 0xFF); // 清空TX FIFO
return 0; // 發(fā)送失敗
}
if(sta&0x60) { // TX_DS (發(fā)送完成)
return 1; // 發(fā)送成功
}
return 0;
}
4.5 1602 LCD顯示驅(qū)動(C語言偽代碼)
// 假設(shè)P1口連接1602 LCD:RS=P1.0, RW=P1.1, EN=P1.2, D4-D7=P1.4-P1.7
// LCD引腳定義
#define LCD_RS P1_0
#define LCD_RW P1_1
#define LCD_EN P1_2
#define LCD_DATA_PORT P1 // 數(shù)據(jù)線所在端口,需位操作
// 寫入命令或數(shù)據(jù)到LCD
void LCD_Write_Byte(unsigned char dat, unsigned char cmd) {
if (cmd) LCD_RS = 1; else LCD_RS = 0; // RS: 1=數(shù)據(jù),0=命令
LCD_RW = 0; // 寫模式
// 先發(fā)送高4位
LCD_DATA_PORT = (LCD_DATA_PORT & 0x0F) | (dat & 0xF0);
LCD_EN = 1; Delay_us(5); LCD_EN = 0;
// 再發(fā)送低4位
LCD_DATA_PORT = (LCD_DATA_PORT & 0x0F) | ((dat << 4) &
0xF0);
LCD_EN = 1; Delay_us(5); LCD_EN = 0;
Delay_ms(2); // 等待LCD處理
}
// 寫入命令
void LCD_Write_Cmd(unsigned char cmd) {
LCD_Write_Byte(cmd, 0);
}
// 寫入數(shù)據(jù)
void LCD_Write_Data(unsigned char dat) {
LCD_Write_Byte(dat, 1);
}
// LCD初始化
void LCD_Init() {
Delay_ms(15); // 上電延時
LCD_Write_Cmd(0x33); // 4位數(shù)據(jù)接口,兩行,5x7點陣
Delay_ms(5);
LCD_Write_Cmd(0x32);
Delay_us(100);
LCD_Write_Cmd(0x28); // 4位接口,兩行,5x7點陣
LCD_Write_Cmd(0x0C); // 顯示開,光標(biāo)關(guān),閃爍關(guān)
LCD_Write_Cmd(0x06); // 地址自動加1,顯示不移動
LCD_Write_Cmd(0x01); // 清屏
Delay_ms(2);
}
// LCD顯示字符串
void LCD_Show_String(unsigned char x, unsigned char y, char *s) {
unsigned char addr;
if (y == 0) addr = 0x80 + x; // 第一行
else addr = 0xC0 + x; // 第二行
LCD_Write_Cmd(addr); // 設(shè)置DDRAM地址
while (*s) {
LCD_Write_Data(*s++);
}
}
5. 系統(tǒng)優(yōu)勢與應(yīng)用前景
5.1 系統(tǒng)優(yōu)勢
低成本: 采用AT89C2051和DS18B20等成熟、價格低廉的元器件,有效控制了系統(tǒng)硬件成本。
低功耗: DS18B20本身功耗極低,NRF24L01+支持多種低功耗模式,配合AT89C2051的空閑模式,發(fā)射模塊可以設(shè)計成電池供電,續(xù)航時間長。
高可靠性: 數(shù)字溫度傳感器DS18B20具有良好的抗干擾能力和高精度,NRF24L01+的自動應(yīng)答和重發(fā)機制提高了無線通信的可靠性。
安裝靈活: 無需布線,發(fā)射模塊可以放置在任何需要監(jiān)測溫度的區(qū)域,部署靈活方便。
擴展性: DS18B20的單總線特性允許多個傳感器并聯(lián)(需增加單片機尋址代碼);NRF24L01+的多管道特性也支持構(gòu)建簡單的星型或點對多點網(wǎng)絡(luò)。
易于開發(fā): 51系列單片機開發(fā)資料豐富,軟件編程相對簡單,調(diào)試周期短。
5.2 應(yīng)用前景
本無線溫度監(jiān)測系統(tǒng)具有廣泛的應(yīng)用前景,包括但不限于:
智能家居: 實時監(jiān)測室內(nèi)外溫度,配合智能空調(diào)、取暖設(shè)備進行聯(lián)動控制。
農(nóng)業(yè)大棚: 監(jiān)測溫室大棚內(nèi)溫度,輔助農(nóng)作物生長環(huán)境控制。
冷鏈物流: 監(jiān)測冷藏車、冷庫溫度,確保貨物在運輸和儲存過程中的質(zhì)量。
倉儲管理: 監(jiān)測倉庫溫度,預(yù)防物品變質(zhì)或火災(zāi)風(fēng)險。
工業(yè)控制: 監(jiān)測生產(chǎn)線關(guān)鍵部位溫度,實現(xiàn)預(yù)警和故障診斷。
環(huán)境監(jiān)測: 監(jiān)測特定區(qū)域的環(huán)境溫度變化,用于氣象站或科研數(shù)據(jù)采集。
醫(yī)療衛(wèi)生: 監(jiān)測醫(yī)院病房、藥品儲藏室溫度,保障醫(yī)療環(huán)境和藥品安全。
6. 系統(tǒng)進一步優(yōu)化與改進方向
功耗優(yōu)化: 更精細的軟件電源管理,利用AT89C2051的空閑模式和NRF24L01+的掉電模式,在非工作時間進入超低功耗狀態(tài),并通過定時器中斷或外部中斷喚醒。
數(shù)據(jù)加密與安全: 對于某些敏感應(yīng)用,可以考慮在數(shù)據(jù)傳輸前進行簡單的數(shù)據(jù)加密,提高通信安全性。
網(wǎng)絡(luò)化擴展: 可以引入路由器或協(xié)調(diào)器,構(gòu)建更復(fù)雜的星型或網(wǎng)狀網(wǎng)絡(luò),實現(xiàn)多點溫度數(shù)據(jù)的集中監(jiān)控。例如,使用更多的NRF24L01+模塊構(gòu)建多傳感器節(jié)點網(wǎng)絡(luò)。
報警功能: 在接收端增加聲光報警模塊,當(dāng)溫度超出預(yù)設(shè)閾值時發(fā)出警報。
數(shù)據(jù)存儲與歷史查詢: 接收端可以增加EEPROM或Flash存儲芯片,用于存儲歷史溫度數(shù)據(jù),并可通過上位機或顯示屏進行查詢。
云平臺接入: 通過增加WiFi模塊(如ESP8266)或GPRS模塊,將溫度數(shù)據(jù)上傳至云平臺,實現(xiàn)遠程監(jiān)控和大數(shù)據(jù)分析。但這會顯著增加單片機的處理能力需求,可能需要升級到更強大的MCU。
用戶界面: 接收端可以考慮使用帶觸摸功能的TFT LCD顯示屏,提供更友好的用戶交互界面。
PCB設(shè)計優(yōu)化: 采用更緊湊、更抗干擾的PCB布局,特別是RF部分的布線需要注意阻抗匹配和接地處理,以確保無線通信的穩(wěn)定性和距離。
電池管理: 對于電池供電的發(fā)射模塊,可以集成電池電量檢測電路,并在電量低時發(fā)出預(yù)警。
自動校準(zhǔn): 可以考慮在系統(tǒng)初始化時或定期進行溫度傳感器校準(zhǔn),提高測量精度。
總結(jié)
本設(shè)計方案詳細闡述了一個基于AT89C2051單片機與InRF401(或NRF24L01+)無線模塊和DS18B20數(shù)字溫度傳感器的無線溫度監(jiān)測系統(tǒng)。通過對核心元器件的深入分析,以及軟硬件設(shè)計的詳細規(guī)劃,為構(gòu)建一個低成本、高可靠、易于實現(xiàn)的無線溫度監(jiān)測系統(tǒng)提供了全面的指導(dǎo)。盡管AT89C2051是一款經(jīng)典的單片機,但其強大的功能和極高的性價比,結(jié)合現(xiàn)代無線通信模塊,依然能夠勝任許多實際應(yīng)用中的溫度監(jiān)測需求。此方案為開發(fā)者提供了一個堅實的基礎(chǔ),在此基礎(chǔ)上可以根據(jù)具體需求進行進一步的功能擴展和性能優(yōu)化。
責(zé)任編輯:David
【免責(zé)聲明】
1、本文內(nèi)容、數(shù)據(jù)、圖表等來源于網(wǎng)絡(luò)引用或其他公開資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對本文的引用持有異議,請聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。
3、本文內(nèi)容僅代表作者觀點,拍明芯城不對內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關(guān)結(jié)果。
4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。
拍明芯城擁有對此聲明的最終解釋權(quán)。