a片在线观看免费看视频_欧美婬片在线a_同性男男无遮挡无码视频_久久99狠狠色精品一区_《性妲己》电影在线观看_久久久99婷婷久久久久久_亚洲精品久久久久58_激情在线成人福利小电影_色婷婷久久综合五月激情网

0 賣盤信息
BOM詢價
您現在的位置: 首頁 > 技術方案 >無線互聯 > 基于AT89C2051單片機和InRF401+DSl8B20數字溫度傳感器的無線監測系統設計方案

基于AT89C2051單片機和InRF401+DSl8B20數字溫度傳感器的無線監測系統設計方案

來源: elecfans
2021-11-18
類別:無線互聯
eye 6
文章創建人 拍明

原標題:基于AT89C2051和InRF401的無線監測系統設計方案

基于AT89C2051與InRF401+DS18B20的無線溫度監測系統設計方案

在現代工業、農業、倉儲管理、環境監測乃至于智能家居等諸多領域,對環境溫度的實時、精確監測與無線傳輸需求日益迫切。傳統的有線溫度監測系統在部署靈活性、布線成本以及復雜環境下可靠性方面存在諸多限制。無線溫度監測系統以其非接觸式、易于安裝、維護成本低等顯著優勢,成為解決上述問題的理想方案。本設計方案旨在構建一個基于經典的AT89C2051單片機與高集成度無線收發模塊InRF401,并配合高性能數字溫度傳感器DS18B20的無線溫度監測系統。該系統將實現對目標區域溫度數據的精確采集、無線傳輸、以及數據接收與顯示,為相關應用提供穩定可靠的溫度監測解決方案。

image.png

1. 系統概述與總體架構

本無線溫度監測系統主要由兩個核心部分組成:溫度數據采集與無線發射模塊,以及無線數據接收與顯示模塊。

溫度數據采集與無線發射模塊: 該模塊負責感應環境溫度,將模擬信號轉換為數字信號,通過單片機進行處理,并將處理后的溫度數據通過無線方式發送出去。其核心組成包括:DS18B20數字溫度傳感器、AT89C2051單片機、InRF401無線收發模塊、電源模塊及必要的接口電路。

無線數據接收與顯示模塊: 該模塊負責接收無線發射模塊發送的溫度數據,對數據進行解析,并通過顯示單元將溫度值直觀地呈現給用戶。其核心組成包括:InRF401無線收發模塊、AT89C2051單片機、LCD液晶顯示屏(或數碼管)、電源模塊及必要的接口電路。

整個系統的工作流程可以概括為:DS18B20采集溫度數據,并將數字信號發送給AT89C2051單片機;單片機對數據進行處理和封裝;InRF401模塊將數據通過無線方式發送;接收端的InRF401模塊接收數據并發送給接收端的AT89C2051單片機;接收單片機解析數據并通過LCD或數碼管顯示出來。

2. 核心元器件選型與分析

2.1 單片機:AT89C2051

元器件型號: AT89C2051

器件作用: AT89C2051作為整個系統的核心控制器,負責管理和協調各個模塊的工作。在發射端,它負責讀取DS18B20的溫度數據、對數據進行格式化處理、控制InRF401無線模塊的數據發送;在接收端,它負責接收InRF401模塊解調后的數據、對數據進行解析、控制顯示模塊顯示溫度值。

為什么選擇這顆元器件:

  • 成本效益高: AT89C2051是一款經典的8位CMOS微控制器,其價格低廉,非常適合成本敏感型的應用。

  • 資源豐富且易于開發: 盡管引腳數量較少(20引腳),但內部集成了2KB的Flash可編程存儲器、128字節RAM、兩個16位定時器/計數器、一個全雙工串行口以及可編程I/O端口。對于本溫度監測系統所需的串口通信(與DS18B20的單總線通信模擬實現,或與InRF401的SPI/UART通信)和基本的控制任務而言,其資源完全足夠。

  • 功耗相對較低: CMOS技術使得其在正常工作和空閑模式下功耗相對較低,有利于延長電池供電系統的使用壽命。

  • 開發資料豐富,學習曲線平緩: 作為51系列單片機的衍生型號,AT89C2051擁有大量的開發資料、成熟的開發工具鏈(如Keil C51)以及廣泛的社區支持,對于開發者而言,入門和調試都相對容易。

  • 集成度高,外圍電路簡單: 相較于需要大量外圍芯片才能實現類似功能的方案,AT89C2051內部集成了許多功能模塊,減少了外部元件的數量,從而簡化了電路設計,降低了PCB的復雜度。

元器件功能:

  • 中央處理器(CPU): 執行程序指令,控制所有內部和外部操作。

  • 閃存(Flash Memory): 2KB的片內可編程Flash存儲器,用于存儲用戶程序代碼和固定數據。

  • 隨機存取存儲器(RAM): 128字節的片內RAM,用于存儲臨時數據、堆棧和寄存器。

  • I/O端口: 15個可編程I/O引腳,可配置為輸入或輸出,用于與DS18B20、InRF401以及顯示模塊進行數據和控制信號的交互。

  • 定時器/計數器: 兩個16位定時器/計數器(T0和T1),可用于產生延時、計時、計數事件等,例如精確控制DS18B20的單總線時序。

  • 串行通信接口(UART): 全雙工串行口,雖然AT89C2051的UART引腳可能被復用,但在本設計中,與DS18B20的通信是基于其單總線協議,通過GPIO口模擬實現;與InRF401的通信則取決于InRF401的具體接口,如果是SPI或模擬UART,則需要通過GPIO口模擬。

  • 中斷系統: 兩個外部中斷源和定時器中斷源,用于響應外部事件(如InRF401的數據接收中斷)或定時事件。

2.2 數字溫度傳感器:DS18B20

元器件型號: DS18B20

器件作用: DS18B20是本系統的核心傳感元件,負責將環境溫度轉換為數字信號,供單片機讀取。

為什么選擇這顆元器件:

  • 單總線接口: DS18B20采用獨特的單總線(1-Wire)通信協議,僅需一根信號線即可與單片機進行通信,極大地簡化了硬件連接,節省了單片機的I/O口資源。這對于引腳資源有限的AT89C2051尤為重要。

  • 寬溫度測量范圍與高精度: 測量范圍覆蓋-55°C至+125°C,在此范圍內,精度在-10°C至+85°C時可達到±0.5°C,足以滿足大多數環境溫度監測需求。其高分辨率(可配置為9~12位,對應0.5°C~0.0625°C)確保了測量的精確性。

  • 數字輸出: DS18B20直接輸出數字溫度值,省去了傳統模擬溫度傳感器所需的A/D轉換電路,簡化了系統設計,提高了抗干擾能力,并減少了誤差源。

  • 寄生電源模式: DS18B20支持寄生電源模式,即只需兩根線(數據線和地線)即可工作,電源由數據線提供。這對于需要節省布線或空間的應用非常有益,雖然通常為了穩定性,仍會建議獨立供電。

  • 唯一序列號: 每個DS18B20都帶有一個唯一的64位序列號,允許多個DS18B20并聯在同一條單總線上進行識別和尋址,實現多點溫度監測。這為系統的擴展性提供了可能。

元器件功能:

  • 溫度感應元件: 內部集成有高精度半導體溫度傳感器。

  • A/D轉換器: 將感應到的模擬溫度信號轉換為數字信號。

  • 單總線接口: 實現與單片機的串行通信,支持數據讀寫和功能控制。

  • 存儲器: 包括一個用于存儲溫度值和配置參數的暫存器(Scratchpad)以及一個用于存儲高低溫報警閾值的EEPROM。

  • 報警功能: 可編程的高低溫報警功能,當溫度超出設定范圍時,DS18B20可以發出報警信號。

2.3 無線收發模塊:InRF401 (或NRF24L01+等類似模塊)

元器件型號: InRF401(這里假設InRF401是一個低成本、易于集成的RF收發模塊。若無此具體型號,通常會選擇NRF24L01+或Si4432等)。鑒于InRF401信息相對較少,這里以NRF24L01+作為示例進行詳細闡述,因為它在低功耗無線通信領域應用極為廣泛且性能優異,是InRF401的常見替代品或同類型產品。

器件作用: InRF401(或NRF24L01+)是本系統實現無線數據傳輸的關鍵組件。它負責將單片機處理后的數字溫度數據調制成無線電波發射出去,并在接收端接收無線電波并解調出數字數據,從而實現兩點間的無線通信。

為什么選擇NRF24L01+(作為InRF401的代表):

  • 工作頻率與抗干擾: 工作在2.4GHz ISM(工業、科學、醫療)頻段,這是全球通用且免費的頻段,具有較好的抗干擾能力。

  • 高數據傳輸速率: 支持1Mbps或2Mbps的空中數據傳輸速率,可以快速傳輸少量溫度數據,滿足實時性要求。

  • 低功耗設計: 具有多種省電模式(如掉電模式、空閑模式),在發射和接收模式下電流消耗也相對較低,非常適合電池供電的無線設備,有助于延長發射模塊的續航時間。

  • 自動應答與自動重發: 內部集成了自動應答和自動重發機制,大大簡化了軟件層的錯誤檢測和糾正,提高了通信的可靠性。

  • 多點通信能力: 具有6路數據接收管道(Data Pipes),理論上可以支持一點對多點或多點對一點的通信網絡,為系統擴展性提供了可能。

  • 硬件接口簡單: 采用SPI(串行外設接口)與單片機進行通信,SPI接口速度快,且只需四根線(CSN, SCK, MOSI, MISO)即可完成通信,對于AT89C2051這樣的單片機來說,通過軟件模擬SPI或利用其IO口進行位操作即可實現通信。

  • 集成度高: 內部集成了射頻前端、基帶處理器等,外圍元件極少,通常只需幾顆電容即可工作,降低了硬件設計復雜度。

  • 模塊化易于使用: 市面上存在大量基于NRF24L01+的模塊,通常帶有天線接口,直接引出SPI引腳和電源引腳,方便用戶集成到自己的電路板上。

元器件功能(以NRF24L01+為例):

  • 射頻收發器: 完成射頻信號的調制、解調、發射和接收。

  • 基帶處理器: 處理數字基帶信號,包括數據打包、解包、CRC校驗、自動應答和自動重發等功能。

  • 增強型ShockBurst?: 一種高效的硬件數據包處理協議,包括數據包格式、自動數據包組裝、自動應答和自動重發等。

  • 多通道: 支持125個頻道,可以方便地進行跳頻,進一步提高抗干擾能力。

  • SPI接口: 與微控制器進行高速數據交換和配置的接口。

  • 低功耗管理: 通過各種模式(如掉電模式、待機模式、RX模式、TX模式)實現功耗優化。

2.4 顯示模塊:1602 LCD液晶顯示屏 (或LED數碼管)

元器件型號: 1602 LCD液晶顯示屏(或其他兼容型號,如2004 LCD)或共陽/共陰LED數碼管(如FMD5461AS)

器件作用: 顯示模塊用于接收端,將單片機解析出的溫度數據顯示出來,方便用戶直觀地查看。

為什么選擇1602 LCD:

  • 顯示內容豐富: 1602 LCD可以顯示兩行,每行16個字符,除了溫度值,還可以顯示單位、狀態信息等,比數碼管能提供更多信息。

  • 功耗相對較低: 相較于點陣式LCD,段式LCD(如1602)的功耗更低,適合長時間運行的設備。

  • 接口簡單: 1602 LCD采用并口(8位或4位)與單片機通信,雖然占用AT89C2051的I/O口較多,但在接收端,AT89C2051的I/O口資源相對充足。如果I/O口緊張,也可以選擇IIC接口的1602 LCD,但需要額外的IIC驅動芯片或軟件模擬IIC。

  • 成本低廉: 1602 LCD是市場上非常普及且價格低廉的顯示器件。

  • 編程控制相對簡單: 有成熟的驅動庫和例程可供參考,便于開發。

元器件功能(1602 LCD):

  • 顯示控制器: HD44780(或兼容)控制器,負責接收指令和數據,并驅動液晶顯示。

  • 字符發生器: 內置ROM和RAM,用于存儲字符點陣數據,可以顯示英文字母、數字和一些特殊符號。

  • 數據/指令接口: D0-D7數據線(或D4-D7用于4位模式)、RS(寄存器選擇)、RW(讀寫選擇)、EN(使能)等控制線。

  • 背光: 大部分1602 LCD帶有LED背光,提供在光線不足條件下的可視性,但會增加功耗。

為什么選擇LED數碼管(作為替代):

  • 簡單直觀: 對于僅僅顯示數字溫度值而言,數碼管顯示效果直觀,易于識別。

  • 驅動簡單: 可以通過74HC595等串行移位寄存器進行驅動,節省單片機I/O口,或者直接由單片機I/O口驅動,但會占用更多引腳。

  • 響應速度快: 數字切換響應速度非???。

  • 成本更低: 數碼管通常比LCD更便宜。

元器件功能(LED數碼管):

  • LED段: 由7個(或8個,帶小數點)LED構成,通過點亮不同LED段來顯示數字。

  • 共陽極/共陰極: 根據驅動方式選擇,決定所有LED段的公共端是接電源正極(共陽)還是負極(共陰)。

2.5 電源模塊

元器件型號: LM7805(線性穩壓器)、AMS1117-3.3(低壓差線性穩壓器LDO)、或DC-DC降壓模塊(如基于MP1584等芯片)

器件作用: 為系統的各個模塊提供穩定、可靠的直流電源。DS18B20通常工作在3.0V-5.5V,AT89C2051通常工作在3V-5.5V,NRF24L01+工作在1.9V-3.6V,LCD通常工作在5V。因此,需要根據不同模塊的需求,提供相應的穩壓電源。

為什么選擇這些元器件:

  • LM7805: 經典的5V線性穩壓器,輸入電壓范圍廣(7V-35V),輸出穩定,可靠性高,價格便宜。適用于為AT89C2051和5V供電的LCD提供電源。

  • AMS1117-3.3: 低壓差(LDO)線性穩壓器,輸入輸出壓差小,適合電池供電。用于為NRF24L01+等3.3V供電的模塊提供穩定電源。其優勢在于壓差小,在電池電壓下降時能更好地保持3.3V輸出。

  • DC-DC降壓模塊: 如基于MP1584等開關電源芯片的模塊。相較于線性穩壓器,開關電源的轉換效率更高,特別是在輸入輸出壓差較大或需要較大電流時,可以顯著減少熱量產生,提高電池續航能力。對于功耗敏感或需要從較高電壓(如12V電池)降壓的應用是更優的選擇。

元器件功能:

  • LM7805/AMS1117: 通過內部調整管將較高的輸入電壓穩定到固定的輸出電壓,其特點是輸出電壓紋波小,但轉換效率相對較低,剩余能量以熱量形式散失。

  • DC-DC降壓模塊: 通過高頻開關、電感和電容的配合,將輸入電壓高效地轉換為較低的輸出電壓,轉換效率高,發熱量小。

2.6 其他輔助元器件

  • 晶振: 11.0592MHz或12MHz,為AT89C2051提供精確的時鐘源。11.0592MHz有助于精確實現串口通信波特率。

  • 復位電路: RC復位電路(電阻+電容)或專用復位芯片(如MAX813),保證單片機上電可靠復位。

  • 濾波電容: 各電源引腳旁并聯104(0.1uF)瓷片電容和10uF/47uF電解電容,用于電源濾波,增強系統穩定性,抑制高頻干擾。

  • 上拉電阻: DS18B20的DQ引腳需要接一個4.7kΩ左右的上拉電阻,以確保單總線通信的正常進行。

  • 發光二極管(LED): 用于指示系統工作狀態,如電源指示、數據發送/接收指示等。

  • 按鍵: (可選)用于配置系統參數,如報警閾值、發送間隔等。

  • 電容、電阻: 構成RC延時、限流、分壓等基本電路。

  • PCB板: 承載所有元器件并實現電氣連接。

3. 系統硬件設計

3.1 發射模塊硬件設計

  • DS18B20與AT89C2051連接: DS18B20的DQ引腳(數據線)直接連接到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 (中斷引腳,可選,用于接收數據中斷)

    • SPI接口: AT89C2051沒有硬件SPI,需要通過軟件模擬SPI。分配P1口或P3口作為SPI的SCK、MOSI、MISO、CSN引腳。例如:

    • 電源: NRF24L01+通常工作在3.3V,因此需要一個AMS1117-3.3V穩壓器將5V電源降壓至3.3V供其使用。在3.3V和GND之間并聯10uF電解電容和0.1uF瓷片電容進行濾波。

  • 電源電路: 外部DC電源輸入(如9V電池或適配器)經過LM7805穩壓為5V,供AT89C2051、DS18B20(獨立供電模式)以及后續的3.3V穩壓器使用。再由5V通過AMS1117-3.3V為NRF24L01+供電。

  • 晶振與復位電路: 11.0592MHz或12MHz晶振連接到AT89C2051的XTAL1和XTAL2引腳,并并聯兩個30pF左右的瓷片電容接地。復位引腳RST通過RC電路或復位芯片連接到電源。

3.2 接收模塊硬件設計

  • AT89C2051與InRF401(NRF24L01+)連接: 連接方式與發射模塊類似,電源處理也相同。IRQ引腳在此處更為重要,可以配置外部中斷,當NRF24L01+接收到數據時觸發中斷,通知單片機讀取數據。

  • AT89C2051與1602 LCD連接:

    • 數據線: 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通過電位器調節對比度。

    • 電源: 1602 LCD通常工作在5V,由LM7805提供的5V電源直接供電。

  • 電源電路: 與發射模塊類似,提供穩定的5V和3.3V電源。

  • 晶振與復位電路: 同發射模塊。

4. 系統軟件設計

軟件設計是實現系統功能的關鍵,主要包括DS18B20溫度采集、NRF24L01+無線通信協議實現以及數據顯示。

4.1 發射模塊軟件流程

  1. 系統初始化:

    • 單片機I/O口初始化:配置P1、P3口為輸出或輸入。

    • 定時器初始化:配置定時器用于DS18B20單總線時序的精確延時。

    • NRF24L01+模塊初始化:配置為發射模式,設置工作頻率、數據速率、發送功率、發送地址、開啟自動重發和自動應答等。這涉及一系列的SPI寄存器寫入操作。

  2. DS18B20溫度采集:

    • 復位DS18B20: 通過單總線發送復位脈沖。

    • 跳過ROM(Skip ROM,0xCC): 如果只有一個DS18B20,可以使用此命令跳過ROM匹配過程。

    • 啟動溫度轉換(Convert T,0x44): 發送此命令啟動DS18B20的溫度轉換。

    • 等待轉換完成: DS18B20溫度轉換需要一定時間(最高分辨率12位時約750ms),可以通過延時或輪詢DS18B20狀態位(讀數據線)來判斷是否完成。

    • 復位DS18B20: 再次發送復位脈沖。

    • 跳過ROM(Skip ROM,0xCC):

    • 讀取暫存器(Read Scratchpad,0xBE): 讀取9字節的暫存器內容,其中包含溫度數據和CRC校驗碼。

    • CRC校驗: 對讀取的9字節數據進行CRC校驗,確保數據完整性。

    • 解析溫度值: 從讀取的暫存器中提取溫度數據(通常是第0和第1字節),并根據DS18B20的數據格式將其轉換為實際的攝氏溫度值(浮點數或定點數)。

  3. 數據封裝與無線發送:

    • 將獲取到的溫度值(例如,轉換為整數,乘以10或100以保留小數位,或直接發送浮點數轉換為字節數組)進行打包,形成一個數據幀。數據幀可以包含標識符、溫度值、校驗和等信息。

    • 通過SPI接口將數據幀寫入NRF24L01+的發送緩沖區。

    • 拉高CE引腳(持續一段時間后拉低)觸發NRF24L01+發送數據。

    • 等待發送完成或發送失敗(通過IRQ中斷或查詢STATUS寄存器)。

    • 進入低功耗模式(可選):發送完成后,單片機和NRF24L01+可以進入低功耗模式,周期性地喚醒進行下一次測量和發送,以延長電池壽命。

4.2 接收模塊軟件流程

  1. 系統初始化:

    • 單片機I/O口初始化。

    • NRF24L01+模塊初始化:配置為接收模式,設置工作頻率、數據速率、接收地址等。

    • LCD初始化:發送LCD初始化指令,設置顯示模式、清屏等。

  2. 無線數據接收:

    • NRF24L01+進入接收模式并持續監聽。

    • 輪詢或中斷檢測: 周期性輪詢NRF24L01+的STATUS寄存器(RX_DR位)或配置外部中斷(IRQ引腳),當有數據到達時觸發。

    • 讀取數據: 通過SPI接口從NRF24L01+的接收緩沖區讀取數據。

    • 數據解析與校驗: 對接收到的數據幀進行解析,提取溫度值,并進行校驗(如CRC),確保數據有效性。

  3. 溫度數據顯示:

    • 將解析出的溫度值轉換為字符串格式(例如,使用sprintf函數將浮點數轉換為字符串)。

    • 通過AT89C2051控制1602 LCD顯示屏,將溫度字符串發送到LCD顯存,并在指定位置顯示出來??梢燥@示“TEMP: XX.X C”等格式。

    • 異常處理: 如果數據接收失敗或校驗錯誤,可以在LCD上顯示“RX ERROR”或上次有效值,并進行錯誤計數。

4.3 DS18B20單總線通信協議實現細節(C語言偽代碼)

  // 假設P3.0連接DS18B20的DQ引腳
  #define DQ_PIN P3_0 // DQ引腳定義
  #define DQ_OUT_MODE DQ_PIN = 0 // 設置為輸出低
  #define DQ_IN_MODE  // 設置為輸入(高阻態,DS18B20拉低)
  #define DQ_READ     DQ_PIN    // 讀取DQ引腳狀態
  // 單總線復位和存在脈沖
  unsigned char DS18B20_Reset() {
  unsigned char presence_pulse;
  DQ_OUT_MODE;       // 拉低DQ
  Delay_us(480);     // 延時480us
  DQ_IN_MODE;        // 釋放DQ(高阻態)
  Delay_us(60);      // 延時60us,等待DS18B20響應
  presence_pulse = DQ_READ; // 讀取存在脈沖
  Delay_us(420);     // 延時420us,等待總線恢復
  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,總線恢復
  return bit_value;
  }
  // 單總線寫字節
  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;
  }
  }
  // 單總線讀字節
  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
  // 等待轉換完成,此處簡化為延時,實際應輪詢DQ或延時750ms
  // 可以通過DS18B20_ReadBit()讀取DQ判斷轉換是否完成 (DQ為1表示完成)
  // while(DS18B20_ReadBit() == 0); // 實際應這樣等待
  Delay_ms(800); // 粗略延時
  DS18B20_Reset();
  DS18B20_WriteByte(0xCC); // Skip ROM
  DS18B20_WriteByte(0xBE); // Read Scratchpad
  temp_L = DS18B20_ReadByte(); // 讀取低字節
  temp_H = DS18B20_ReadByte(); // 讀取高字節
  // 其他7字節數據可以忽略,但通常建議全部讀取,并進行CRC校驗
  temp = (temp_H << 8) | temp_L; // 拼接為16位數據
  // 判斷符號位(最高位)
  if (temp & 0xF800) { // 如果是負數
  temp = ~temp + 1; // 補碼轉換
  real_temp = (float)temp * 0.0625; // 轉換為實際溫度
  real_temp = -real_temp;
  } else { // 正數
  real_temp = (float)temp * 0.0625;
  }
  return real_temp;
  }
  return -999.0; // 表示讀取失敗
  }

4.4 NRF24L01+ SPI通信與操作(C語言偽代碼)

  // 假設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) { // 發送高位在前
  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); // 適當延時以保證建立時間
  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); // 寫入數據
  CSN_PIN = 1; // 片選失能
  return status; // 返回狀態寄存器
  }
  // 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(); // 讀取數據
  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+模塊初始化(發射端)
  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 (根據需求開啟或關閉)
  NRF24L01_Write_Reg(0x02, 0x01); // EN_RXADDR: enable data pipe 0 (接收地址0用于應答)
  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
  // 設置發射地址(與接收地址一致)
  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+進入正常工作狀態
  }
  // NRF24L01+發送數據
  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; // 啟動發送
  Delay_us(10);
  CE_PIN = 0;
  // 輪詢發送狀態
  while((sta = NRF24L01_Read_Reg(0x07))&0x40 == 0); // TX_DS 或 MAX_RT
  NRF24L01_Write_Reg(0x07, sta); // 清除中斷標志
  if(sta&0x20) { // MAX_RT (最大重發次數)
  NRF24L01_Write_Reg(0xE1, 0xFF); // 清空TX FIFO
  return 0; // 發送失敗
  }
  if(sta&0x60) { // TX_DS (發送完成)
  return 1; // 發送成功
  }
  return 0;
  }

4.5 1602 LCD顯示驅動(C語言偽代碼)

  // 假設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 // 數據線所在端口,需位操作
  // 寫入命令或數據到LCD
  void LCD_Write_Byte(unsigned char dat, unsigned char cmd) {
  if (cmd) LCD_RS = 1; else LCD_RS = 0; // RS: 1=數據,0=命令
  LCD_RW = 0; // 寫模式
  // 先發送高4位
  LCD_DATA_PORT = (LCD_DATA_PORT & 0x0F) | (dat & 0xF0);
  LCD_EN = 1; Delay_us(5); LCD_EN = 0;
  // 再發送低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);
  }
  // 寫入數據
  void LCD_Write_Data(unsigned char dat) {
  LCD_Write_Byte(dat, 1);
  }
  // LCD初始化
  void LCD_Init() {
  Delay_ms(15); // 上電延時
  LCD_Write_Cmd(0x33); // 4位數據接口,兩行,5x7點陣
  Delay_ms(5);
  LCD_Write_Cmd(0x32);
  Delay_us(100);
  LCD_Write_Cmd(0x28); // 4位接口,兩行,5x7點陣
  LCD_Write_Cmd(0x0C); // 顯示開,光標關,閃爍關
  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); // 設置DDRAM地址
  while (*s) {
  LCD_Write_Data(*s++);
  }
  }

5. 系統優勢與應用前景

5.1 系統優勢

  • 低成本: 采用AT89C2051和DS18B20等成熟、價格低廉的元器件,有效控制了系統硬件成本。

  • 低功耗: DS18B20本身功耗極低,NRF24L01+支持多種低功耗模式,配合AT89C2051的空閑模式,發射模塊可以設計成電池供電,續航時間長。

  • 高可靠性: 數字溫度傳感器DS18B20具有良好的抗干擾能力和高精度,NRF24L01+的自動應答和重發機制提高了無線通信的可靠性。

  • 安裝靈活: 無需布線,發射模塊可以放置在任何需要監測溫度的區域,部署靈活方便。

  • 擴展性: DS18B20的單總線特性允許多個傳感器并聯(需增加單片機尋址代碼);NRF24L01+的多管道特性也支持構建簡單的星型或點對多點網絡。

  • 易于開發: 51系列單片機開發資料豐富,軟件編程相對簡單,調試周期短。

5.2 應用前景

本無線溫度監測系統具有廣泛的應用前景,包括但不限于:

  • 智能家居: 實時監測室內外溫度,配合智能空調、取暖設備進行聯動控制。

  • 農業大棚: 監測溫室大棚內溫度,輔助農作物生長環境控制。

  • 冷鏈物流: 監測冷藏車、冷庫溫度,確保貨物在運輸和儲存過程中的質量。

  • 倉儲管理: 監測倉庫溫度,預防物品變質或火災風險。

  • 工業控制: 監測生產線關鍵部位溫度,實現預警和故障診斷。

  • 環境監測: 監測特定區域的環境溫度變化,用于氣象站或科研數據采集。

  • 醫療衛生: 監測醫院病房、藥品儲藏室溫度,保障醫療環境和藥品安全。

6. 系統進一步優化與改進方向

  • 功耗優化: 更精細的軟件電源管理,利用AT89C2051的空閑模式和NRF24L01+的掉電模式,在非工作時間進入超低功耗狀態,并通過定時器中斷或外部中斷喚醒。

  • 數據加密與安全: 對于某些敏感應用,可以考慮在數據傳輸前進行簡單的數據加密,提高通信安全性。

  • 網絡化擴展: 可以引入路由器或協調器,構建更復雜的星型或網狀網絡,實現多點溫度數據的集中監控。例如,使用更多的NRF24L01+模塊構建多傳感器節點網絡。

  • 報警功能: 在接收端增加聲光報警模塊,當溫度超出預設閾值時發出警報。

  • 數據存儲與歷史查詢: 接收端可以增加EEPROM或Flash存儲芯片,用于存儲歷史溫度數據,并可通過上位機或顯示屏進行查詢。

  • 云平臺接入: 通過增加WiFi模塊(如ESP8266)或GPRS模塊,將溫度數據上傳至云平臺,實現遠程監控和大數據分析。但這會顯著增加單片機的處理能力需求,可能需要升級到更強大的MCU。

  • 用戶界面: 接收端可以考慮使用帶觸摸功能的TFT LCD顯示屏,提供更友好的用戶交互界面。

  • PCB設計優化: 采用更緊湊、更抗干擾的PCB布局,特別是RF部分的布線需要注意阻抗匹配和接地處理,以確保無線通信的穩定性和距離。

  • 電池管理: 對于電池供電的發射模塊,可以集成電池電量檢測電路,并在電量低時發出預警。

  • 自動校準: 可以考慮在系統初始化時或定期進行溫度傳感器校準,提高測量精度。

總結

本設計方案詳細闡述了一個基于AT89C2051單片機與InRF401(或NRF24L01+)無線模塊和DS18B20數字溫度傳感器的無線溫度監測系統。通過對核心元器件的深入分析,以及軟硬件設計的詳細規劃,為構建一個低成本、高可靠、易于實現的無線溫度監測系統提供了全面的指導。盡管AT89C2051是一款經典的單片機,但其強大的功能和極高的性價比,結合現代無線通信模塊,依然能夠勝任許多實際應用中的溫度監測需求。此方案為開發者提供了一個堅實的基礎,在此基礎上可以根據具體需求進行進一步的功能擴展和性能優化。

責任編輯:David

【免責聲明】

1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。

2、本文的引用僅供讀者交流學習使用,不涉及商業目的。

3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。

4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。

拍明芯城擁有對此聲明的最終解釋權。

上一篇: 已是第一篇

相關資訊

拍明芯城微信圖標

各大手機應用商城搜索“拍明芯城”

下載客戶端,隨時隨地買賣元器件!

拍明芯城公眾號
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告