基于DS18B20數(shù)字溫度傳感器和AT89C2051+CD4069實現(xiàn)溫度顯示電路設(shè)計方案


原標(biāo)題:基于DS18B20和89C2051實現(xiàn)溫度顯示電路設(shè)計方案
基于DS18B20、AT89C2051與CD4069的數(shù)字溫度顯示電路設(shè)計方案
在本設(shè)計方案中,我們將深入探討如何構(gòu)建一個基于DS18B20數(shù)字溫度傳感器、AT89C2051單片機(jī)和CD4069非門集成電路的數(shù)字溫度顯示系統(tǒng)。該系統(tǒng)旨在實現(xiàn)精確的溫度測量和直觀的數(shù)字顯示,廣泛適用于各種需要實時溫度監(jiān)測的場合,如環(huán)境監(jiān)測、智能家居、工業(yè)控制等。我們將詳細(xì)闡述各個核心元器件的選擇理由、功能特性、在電路中的作用以及具體的電路設(shè)計考量,確保系統(tǒng)穩(wěn)定可靠、性能優(yōu)越。
一、 系統(tǒng)概述與設(shè)計目標(biāo)
本數(shù)字溫度顯示系統(tǒng)的核心目標(biāo)是利用DS18B20傳感器獲取環(huán)境溫度數(shù)據(jù),通過AT89C2051單片機(jī)對數(shù)據(jù)進(jìn)行處理,并最終通過數(shù)碼管(或其他顯示模塊)直觀地顯示出來。為了優(yōu)化系統(tǒng)性能,我們引入CD4069作為輔助元器件,以滿足特定的電平轉(zhuǎn)換或信號驅(qū)動需求。整個系統(tǒng)設(shè)計將著重于功耗優(yōu)化、測量精度、顯示穩(wěn)定性以及成本效益。
核心設(shè)計目標(biāo)包括:
精確的溫度測量: 實現(xiàn)$ pm 0.5^circ C (-10^circ C$ 至 $+85^circ C$范圍內(nèi))的測量精度。
實時溫度顯示: 能夠?qū)崟r更新并顯示當(dāng)前溫度值。
寬溫度測量范圍: 覆蓋$-55^circ C$ 至 $+125^circ C$的溫度范圍。
低功耗設(shè)計: 盡可能降低系統(tǒng)功耗,延長電池供電時的續(xù)航時間。
穩(wěn)定性與可靠性: 確保系統(tǒng)在各種環(huán)境下穩(wěn)定運(yùn)行,抗干擾能力強(qiáng)。
成本效益: 選用高性價比的元器件,降低整體制造成本。
二、 核心元器件選型與分析
2.1 數(shù)字溫度傳感器:DS18B20
型號選擇: DS18B20(TO-92封裝或防水封裝)
選擇理由: DS18B20是美國DALLAS半導(dǎo)體公司生產(chǎn)的一款單總線數(shù)字溫度傳感器,具有以下顯著優(yōu)點(diǎn),使其成為本設(shè)計的首選:
單總線接口: 僅需一根信號線即可與單片機(jī)通信,大大簡化了硬件連接,節(jié)省了單片機(jī)的I/O口資源。這對于I/O資源有限的AT89C2051(僅有15個可編程I/O引腳)尤為重要。
寬溫度測量范圍: 能在$-55^circ C$ 至 $+125^circ C$的范圍內(nèi)進(jìn)行測量,并且在$-10^circ C$ 至 $+85^circ C$范圍內(nèi)精度為$ pm 0.5^circ C $。這種寬范圍和高精度滿足了絕大多數(shù)應(yīng)用場景的需求。
數(shù)字輸出: 直接輸出數(shù)字信號,無需A/D轉(zhuǎn)換電路,避免了模擬信號傳輸中的噪聲干擾和精度損失,簡化了電路設(shè)計。
獨(dú)特ID號: 每個DS18B20都有一個全球唯一的64位序列號,允許多個DS18B20傳感器并聯(lián)在同一條總線上,實現(xiàn)分布式測溫。雖然本設(shè)計初期可能只使用一個,但這一特性為未來的擴(kuò)展提供了便利。
寄生電源模式: 在某些應(yīng)用中,DS18B20可以在沒有獨(dú)立電源引腳的情況下工作,通過數(shù)據(jù)線寄生供電,進(jìn)一步簡化了布線。雖然我們推薦使用外部供電以提高穩(wěn)定性,但此功能在極端情況下提供了靈活性。
可編程分辨率: 用戶可以根據(jù)需求配置9位、10位、11位或12位的溫度轉(zhuǎn)換分辨率,最高可達(dá)$0.0625^circ C$,兼顧了測量速度和精度。
功能: DS18B20內(nèi)部集成了溫度傳感器、A/D轉(zhuǎn)換器、存儲器和單總線接口電路。它能夠?qū)⒏袦y到的溫度轉(zhuǎn)換為對應(yīng)的數(shù)字量,并通過單總線協(xié)議與主控制器(如AT89C2051)進(jìn)行通信,發(fā)送溫度數(shù)據(jù)。其內(nèi)部的ROM存儲器用于存儲唯一的64位序列號,而RAM則用于存儲配置寄存器和溫度寄存器。
在電路中的作用: 作為系統(tǒng)的核心傳感器,負(fù)責(zé)實時采集環(huán)境溫度數(shù)據(jù),并將數(shù)字化的溫度值傳輸給單片機(jī)。它直接決定了系統(tǒng)溫度測量的準(zhǔn)確性和范圍。
2.2 微控制器:AT89C2051
型號選擇: AT89C2051
選擇理由: AT89C2051是ATMEL公司生產(chǎn)的一款高性能、低功耗的CMOS 8位微控制器,兼容標(biāo)準(zhǔn)MCS-51指令集,具有以下特點(diǎn),非常適合作為本溫度顯示系統(tǒng)的核心控制器:
小巧的封裝: 采用20引腳PDIP、SOIC等封裝,體積小巧,便于電路板布線和集成。這對于空間受限的應(yīng)用非常有利。
低功耗: CMOS工藝保證了較低的功耗,符合我們對低功耗設(shè)計的要求,尤其是在電池供電場景下。
內(nèi)置Flash存儲器: 2KB的Flash程序存儲器足以存儲本溫度顯示系統(tǒng)的固件程序,無需外部EEPROM或Flash,降低了成本和復(fù)雜性。
豐富的外設(shè): 盡管引腳較少,但AT89C2051仍提供了兩個16位定時器/計數(shù)器、一個全雙工UART串行口(雖然本設(shè)計可能不直接使用,但為擴(kuò)展留有余地)、中斷控制器等,能夠滿足溫度數(shù)據(jù)采集、處理和顯示所需的功能。
兼容MCS-51指令集: 廣泛的開發(fā)工具和豐富的開發(fā)資源,易于學(xué)習(xí)和編程。對于熟悉51系列單片機(jī)的工程師來說,可以快速上手。
高性價比: 相對于功能更強(qiáng)大的單片機(jī),AT89C2051價格更低廉,有助于控制整體項目成本。
功能: AT89C2051是整個系統(tǒng)的“大腦”,負(fù)責(zé):
DS18B20通信控制: 發(fā)送命令給DS18B20,讀取其返回的溫度數(shù)據(jù)。這涉及到單總線協(xié)議的時序控制。
數(shù)據(jù)處理: 對從DS18B20讀取的原始溫度數(shù)據(jù)進(jìn)行解析、轉(zhuǎn)換(例如,將補(bǔ)碼形式的溫度值轉(zhuǎn)換為直觀的十進(jìn)制溫度值),并根據(jù)需要進(jìn)行單位轉(zhuǎn)換(攝氏度/華氏度)。
顯示控制: 驅(qū)動數(shù)碼管或其他顯示模塊,將處理后的溫度值以數(shù)字形式顯示出來。這通常涉及到數(shù)碼管的段碼轉(zhuǎn)換和位選控制。
系統(tǒng)管理: 處理各種中斷(如定時器中斷用于定時刷新顯示或觸發(fā)溫度轉(zhuǎn)換),協(xié)調(diào)各個模塊的工作。
在電路中的作用: 作為核心控制器,負(fù)責(zé)管理和協(xié)調(diào)整個系統(tǒng)的數(shù)據(jù)流和功能執(zhí)行。它從DS18B20獲取數(shù)據(jù),處理數(shù)據(jù),并將處理結(jié)果發(fā)送到顯示單元。
2.3 CMOS非門集成電路:CD4069
型號選擇: CD4069UB(或CD4069BC等)
選擇理由: CD4069是一款CMOS六非門集成電路。雖然在許多簡單的DS18B20應(yīng)用中可能不需要額外的非門芯片,但在某些特定情況下,它能發(fā)揮關(guān)鍵作用,優(yōu)化電路性能:
信號反相: 提供6個獨(dú)立的非門單元,可以用于信號反相。在某些電平轉(zhuǎn)換或邏輯控制場景下,可能需要將某個信號進(jìn)行反相處理以滿足后續(xù)器件的輸入要求。
緩沖/驅(qū)動能力增強(qiáng): 盡管其驅(qū)動能力有限,但作為CMOS器件,它在一定程度上可以提供信號緩沖,改善信號的波形,或者在驅(qū)動能力不足時進(jìn)行輕微的電流放大。例如,如果單片機(jī)某個I/O口直接驅(qū)動DS18B20的信號線時,在高頻或長線傳輸下可能出現(xiàn)信號衰減或波形失真,CD4069可以用于整形或增強(qiáng)驅(qū)動能力。
電平轉(zhuǎn)換(特定場景): 在DS18B20與AT89C2051的電平兼容性不是問題(兩者通常都工作在5V或3.3V)的情況下,CD4069可能不是必需的。但如果系統(tǒng)中有其他模塊需要不同電平的信號,或者需要將DS18B20的單總線信號進(jìn)行隔離或整形以提高抗干擾能力,CD4069可以提供額外的邏輯層。例如,在多傳感器或復(fù)雜總線環(huán)境中,可能會用非門構(gòu)建一些簡單的邏輯門,增強(qiáng)信號的可靠性。
提高抗干擾能力: 通過對信號進(jìn)行整形或反相,有時可以提高系統(tǒng)對噪聲的抵抗能力。例如,如果單總線信號受到干擾,通過非門整形可以恢復(fù)其清晰的方波形狀。
功能: CD4069內(nèi)部包含六個獨(dú)立的CMOS非門電路。每個非門都有一個輸入和一個輸出,輸出狀態(tài)始終與輸入狀態(tài)相反。其主要功能是進(jìn)行邏輯反相。
在電路中的作用: 在本設(shè)計中,CD4069可能用于以下場景:
DS18B20單總線信號整形: 雖然DS18B20和AT89C2051可以直接通信,但在某些對信號完整性要求較高的場合,或者當(dāng)數(shù)據(jù)線較長時,一個非門可以用于對單總線信號進(jìn)行整形,提高信號質(zhì)量和抗干擾能力。例如,在單片機(jī)與DS18B20之間串聯(lián)一個非門,將單片機(jī)輸出信號反相后再送入DS18B20,或者對DS18B20回傳信號進(jìn)行反相整形。
LED數(shù)碼管驅(qū)動信號的邏輯反相: 如果選擇的是共陰極數(shù)碼管,且單片機(jī)的輸出是高電平點(diǎn)亮,某些驅(qū)動策略下可能需要將單片機(jī)的輸出信號反相。
輔助邏輯控制: 在未來系統(tǒng)擴(kuò)展時,CD4069可以用于構(gòu)建一些簡單的組合邏輯電路,以滿足特定的控制需求。
2.4 顯示模塊:LED數(shù)碼管
型號選擇: 兩位或三位共陰極(或共陽極)LED數(shù)碼管(例如,F(xiàn)5621AH/BH或類似的)
選擇理由:
直觀顯示: 數(shù)碼管是最常見且直觀的數(shù)字顯示方式,尤其適合顯示溫度值。
高亮度: 在各種光照條件下都能清晰顯示。
結(jié)構(gòu)簡單: 易于驅(qū)動和控制,成本低廉。
功耗相對可控: 通過動態(tài)掃描方式可以有效降低整體功耗。
功能: 由7段(加小數(shù)點(diǎn)共8段)LED組成,通過控制不同LED段的點(diǎn)亮或熄滅來顯示0-9的數(shù)字。共陰極數(shù)碼管的公共端接低電平,通過高電平點(diǎn)亮對應(yīng)段;共陽極數(shù)碼管的公共端接高電平,通過低電平點(diǎn)亮對應(yīng)段。
在電路中的作用: 將AT89C2051處理后的溫度數(shù)值以可視化的形式呈現(xiàn)給用戶。
2.5 其他輔助元器件
電源模塊: 5V穩(wěn)壓電源,如AMS1117-5.0穩(wěn)壓芯片配合電解電容和陶瓷電容。提供穩(wěn)定的工作電壓。
晶振與復(fù)位電路: 11.0592MHz晶振和兩個22pF電容用于AT89C2051的時鐘振蕩;RC復(fù)位電路(10uF電容和10kΩ電阻)用于單片機(jī)上電復(fù)位。這些是單片機(jī)正常工作的必需品。
上拉電阻: 4.7kΩ ~ 10kΩ上拉電阻用于DS18B20的DQ線,因為DS18B20的DQ線是開漏輸出。這是單總線通信的必要條件。
限流電阻: 數(shù)碼管每個LED段的串聯(lián)限流電阻(通常為200Ω-1kΩ,具體值根據(jù)數(shù)碼管亮度需求和電源電壓決定),用于保護(hù)LED和控制亮度。
排針/接線端子: 用于外部連接,方便調(diào)試和使用。
PCB板: 承載所有元器件,提供電氣連接。
三、 電路原理設(shè)計
3.1 總體架構(gòu)
整個數(shù)字溫度顯示系統(tǒng)由以下幾個主要模塊組成:
電源模塊: 提供穩(wěn)定的5V直流電源給單片機(jī)和DS18B20。
微控制器模塊: 以AT89C2051為核心,負(fù)責(zé)數(shù)據(jù)采集、處理和顯示控制。
溫度傳感器模塊: DS18B20負(fù)責(zé)溫度測量,并通過單總線與單片機(jī)通信。
顯示模塊: 數(shù)碼管負(fù)責(zé)顯示溫度值,由單片機(jī)驅(qū)動。
輔助邏輯模塊(可選): CD4069根據(jù)需要進(jìn)行信號整形或邏輯處理。
+-----------------+
| Power Supply |
| (5V DC) |
+--------+--------+
|
| VCC, GND
+-----------------+------+-----------------+
| | | |
| DS18B20 | | AT89C2051 |
| (Temperature | | (Microcontroller)|
| Sensor) +-------> DQ (P3.7) |
| | | |
+-----------------+ +--------+--------+
|
|
+-----------------+ | (P1.0-P1.7, P3.0-P3.2)
| | |
| CD4069 | |
| (Optional | |
| Logic Gate) +<-- (Optional) --+
| | |
+-----------------+ |
|
|
+-----------------+ |
| |<--------------+
| LED Digital |
| Display |
| (e.g., 2-digit) |
+-----------------+
3.2 DS18B20與AT89C2051的連接
DS18B20采用單總線通信協(xié)議,其DQ引腳需要連接到AT89C2051的一個通用I/O口(例如P3.7),并外接一個4.7kΩ的上拉電阻到VCC。這是由于DS18B20的DQ引腳是開漏輸出,需要外部上拉電阻才能將線纜拉高。
DS18B20 VCC: 連接到5V電源。
DS18B20 GND: 連接到地。
DS18B20 DQ: 連接到AT89C2051的P3.7(或其他可用I/O口),并串聯(lián)一個4.7kΩ上拉電阻到VCC。
為什么選擇P3.7? AT89C2051的P3口引腳具有第二功能,P3.7通常是/RD(外部數(shù)據(jù)存儲器讀選通),但作為普通I/O口使用時完全沒有問題。選擇它僅是一個示例,任何可用的通用I/O口均可。
3.3 AT89C2051的最小系統(tǒng)
AT89C2051要正常工作,需要搭建一個最小系統(tǒng),包括:
電源: VCC接5V,GND接地。
晶振電路: XTAL1和XTAL2引腳外接一個11.0592MHz的石英晶體振蕩器,兩端各并聯(lián)一個22pF的瓷片電容到地。選擇11.0592MHz是為了方便進(jìn)行串口通信(如果需要),因為這個頻率可以精確地產(chǎn)生標(biāo)準(zhǔn)的波特率。
復(fù)位電路: RST引腳通過一個10uF的電解電容和10kΩ的電阻連接到VCC和GND。當(dāng)電源上電時,電容充電過程會使RST引腳保持高電平一段時間,從而完成復(fù)位操作。
3.4 數(shù)碼管顯示電路
數(shù)碼管的驅(qū)動通常采用動態(tài)掃描方式,以節(jié)省單片機(jī)的I/O口資源并降低功耗。假設(shè)我們使用兩位或三位共陰極數(shù)碼管:
段碼線: 數(shù)碼管的a, b, c, d, e, f, g, dp段碼引腳通過限流電阻(約330Ω)連接到AT89C2051的P1口(例如P1.0-P1.7,共8位)。這些引腳用于控制數(shù)碼管的顯示內(nèi)容。
位選線: 數(shù)碼管的公共端(COM1, COM2, COM3)連接到NPN三極管的基極(通過一個限流電阻),三極管的集電極連接到數(shù)碼管的公共端,發(fā)射極接地。AT89C2051的P3口(例如P3.0, P3.1, P3.2)通過低電平信號控制三極管的導(dǎo)通,從而選擇點(diǎn)亮哪個數(shù)碼管。
為何使用三極管驅(qū)動? 單片機(jī)I/O口的驅(qū)動能力有限,無法直接驅(qū)動數(shù)碼管的所有LED段,尤其是動態(tài)掃描時,瞬時電流可能較大。三極管作為開關(guān),可以提供更大的電流驅(qū)動能力,確保數(shù)碼管段碼的亮度一致性和穩(wěn)定性。
3.5 CD4069在電路中的應(yīng)用(可選但推薦)
如果需要對DS18B20的單總線信號進(jìn)行整形,或者在某些特殊邏輯控制場景下:
單總線信號整形: 將DS18B20的DQ線首先通過CD4069的一個非門輸入,非門的輸出再連接到AT89C2051的P3.7。這樣可以確保進(jìn)入單片機(jī)的信號波形更標(biāo)準(zhǔn)。注意,由于單總線是雙向的,這種接法需要謹(jǐn)慎,更常見的是在某些單向的邏輯控制上使用。對于DS18B20的單總線,通常直接連接單片機(jī)并加上拉電阻即可滿足要求。CD4069更多是在需要邏輯反轉(zhuǎn)或者對信號進(jìn)行一定程度的隔離時考慮。
信號電平轉(zhuǎn)換(如果DS18B20或AT89C2051的工作電壓不同): 如果AT89C2051工作在3.3V,而DS18B20工作在5V,或者反之,CD4069可以用于簡單的電平轉(zhuǎn)換。但通常DS18B20和51系列單片機(jī)都是5V兼容的。
數(shù)碼管位選反相: 如果選擇的是共陽極數(shù)碼管,且單片機(jī)需要高電平來關(guān)閉(即低電平有效)位選,而你希望用高電平信號來選擇數(shù)碼管,那么可以通過CD4069將單片機(jī)的位選信號反相。
注意: 對于DS18B20和AT89C2051的標(biāo)準(zhǔn)連接,CD4069并非必需。但在追求更高穩(wěn)定性和抗干擾能力的工業(yè)應(yīng)用中,或者當(dāng)系統(tǒng)中存在復(fù)雜信號鏈時,考慮使用CD4069進(jìn)行信號整形或邏輯處理是明智之舉。
四、 軟件設(shè)計
軟件是整個系統(tǒng)的靈魂,負(fù)責(zé)實現(xiàn)數(shù)據(jù)的采集、處理和顯示邏輯?;贏T89C2051的C語言編程是主流。
4.1 主程序流程
系統(tǒng)初始化:
配置單片機(jī)I/O口方向。
初始化定時器(用于延時或定時刷新)。
初始化DS18B20(復(fù)位、跳過ROM、配置分辨率等)。
循環(huán)主程序:
發(fā)送溫度轉(zhuǎn)換命令給DS18B20。
等待溫度轉(zhuǎn)換完成(通過查詢或延時)。
從DS18B20讀取溫度數(shù)據(jù)。
對讀取的原始數(shù)據(jù)進(jìn)行處理(解析補(bǔ)碼、轉(zhuǎn)換單位等)。
將處理后的溫度值轉(zhuǎn)換為數(shù)碼管顯示所需的段碼和位碼。
通過動態(tài)掃描方式刷新數(shù)碼管顯示。
延時一段時間,然后重復(fù)上述過程。
4.2 DS18B20通信協(xié)議實現(xiàn)
DS18B20的單總線通信包括:
初始化: 主機(jī)發(fā)送復(fù)位脈沖,DS18B20響應(yīng)存在脈沖。
ROM操作命令: 跳過ROM(0xCC)、讀取ROM(0x33)、匹配ROM(0x55)等。通常使用跳過ROM來簡化單個傳感器的操作。
功能命令: 溫度轉(zhuǎn)換命令(0x44)、讀取暫存器(0xBE)、寫入暫存器(0x4E)等。
關(guān)鍵函數(shù):
Ds18b20_Init()
: DS18B20初始化函數(shù),發(fā)送復(fù)位脈沖并檢測存在脈沖。Ds18b20_WriteByte(unsigned char dat)
: 向DS18B20寫入一個字節(jié)。Ds18b20_ReadByte()
: 從DS18B20讀取一個字節(jié)。Ds18b20_StartConvert()
: 發(fā)送溫度轉(zhuǎn)換命令。Ds18b20_ReadTemp()
: 讀取溫度寄存器并返回溫度值。
4.3 溫度數(shù)據(jù)處理
DS18B20返回的溫度數(shù)據(jù)是16位的補(bǔ)碼形式。需要將其轉(zhuǎn)換為有符號的十進(jìn)制溫度值。例如,如果分辨率設(shè)置為12位,則每位代表$0.0625^circ C$。
正溫度: 直接將16位數(shù)據(jù)乘以$0.0625^circ C$。
負(fù)溫度: 先取反加1(即求補(bǔ)碼),然后轉(zhuǎn)換為正數(shù)再乘以$0.0625^circ C$,最后加上負(fù)號。
示例代碼片段(C語言):
#include <reg2051.h> // 根據(jù)實際單片機(jī)型號調(diào)整頭文件
#include <intrins.h> // 用于_nop_()函數(shù)
// DS18B20引腳定義
sbit DQ = P3^7; // DQ連接到P3.7
// 全局變量
int temperature_value; // 存儲溫度整數(shù)部分
unsigned char decimal_part; // 存儲溫度小數(shù)部分(例如,取一位或兩位小數(shù))
// --- DS18B20驅(qū)動函數(shù)(部分示例,需完善) ---
void DelayUs(unsigned int us) // 微秒級延時
{
while(us--);
}
void Ds18b20_Rst() // 復(fù)位DS18B20
{
DQ = 0; DelayUs(600); // 拉低480us以上
DQ = 1; DelayUs(90); // 拉高等待響應(yīng)90us
// 檢測DS18B20的響應(yīng)脈沖(通常為低電平60-240us)
while(DQ); // 等待DQ變?yōu)榈碗娖?br/> while(!DQ); // 等待DQ變?yōu)楦唠娖?br/>}
void Ds18b20_WriteBit(unsigned char bit_val) // 寫一位數(shù)據(jù)
{
if(bit_val)
{
DQ = 0; DelayUs(5); // 拉低1-15us
DQ = 1; DelayUs(60); // 拉高60us以上
}
else
{
DQ = 0; DelayUs(60); // 拉低60us以上
DQ = 1; DelayUs(5); // 拉高1-15us
}
}
unsigned char Ds18b20_ReadBit() // 讀一位數(shù)據(jù)
{
unsigned char bit_val;
DQ = 0; DelayUs(5); // 拉低1-15us
DQ = 1; DelayUs(10); // 拉高等待數(shù)據(jù)
bit_val = DQ;
DelayUs(50); // 恢復(fù)時間
return bit_val;
}
void Ds18b20_WriteByte(unsigned char dat) // 寫一個字節(jié)
{
unsigned char i;
for(i=0; i<8; i++)
{
Ds18b20_WriteBit(dat & 0x01);
dat >>= 1;
}
}
unsigned char Ds18b20_ReadByte() // 讀一個字節(jié)
{
unsigned char i;
unsigned char dat = 0;
for(i=0; i<8; i++)
{
dat >>= 1;
if(Ds18b20_ReadBit())
{
dat |= 0x80;
}
}
return dat;
}
int GetTemperature() // 獲取溫度值
{
unsigned char TL, TH;
int temp;
Ds18b20_Rst();
Ds18b20_WriteByte(0xCC); // Skip ROM
Ds18b20_WriteByte(0x44); // Convert T
Ds18b20_Rst();
Ds18b20_WriteByte(0xCC); // Skip ROM
Ds18b20_WriteByte(0xBE); // Read Scratchpad
TL = Ds18b20_ReadByte(); // 讀取溫度低字節(jié)
TH = Ds18b20_ReadByte(); // 讀取溫度高字節(jié)
temp = (TH << 8) | TL; // 合并為16位數(shù)據(jù)
// 假設(shè)12位分辨率,需要將temp乘以0.0625
// 為了避免浮點(diǎn)運(yùn)算,可以先乘以1000或100,再進(jìn)行整數(shù)運(yùn)算
// 例如,將溫度值放大10倍,顯示一位小數(shù)
if (temp & 0xF800) // 負(fù)溫度判斷,最高5位為1表示負(fù)數(shù)
{
temp = ~temp + 1; // 取補(bǔ)碼
temperature_value = - (temp * 625 / 10000); // 假設(shè)乘以10000再除以10000,取整數(shù)部分
decimal_part = (temp * 625 / 1000) % 10; // 取小數(shù)第一位
}
else // 正溫度
{
temperature_value = temp * 625 / 10000;
decimal_part = (temp * 625 / 1000) % 10;
}
return temperature_value; // 返回整數(shù)部分溫度,小數(shù)部分在decimal_part中
}
// --- 數(shù)碼管顯示函數(shù)(部分示例,需完善) ---
unsigned char code SegmentCode[] = { // 共陰極數(shù)碼管0-9和負(fù)號的段碼
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x40 // -
};
sbit SEG_A = P1^0; // 對應(yīng)a段
// ...其他段碼線連接P1口
sbit COM1 = P3^0; // 位選1
sbit COM2 = P3^1; // 位選2
// ...其他位選線連接P3口
void Display(int temp_int, unsigned char temp_dec)
{
// 例如顯示XX.Y
unsigned char hundreds, tens, units;
unsigned char sign_display = 0; // 0 for positive, 1 for negative
if (temp_int < 0) {
sign_display = 1;
temp_int = -temp_int; // 取絕對值
}
hundreds = temp_int / 100;
tens = (temp_int / 10) % 10;
units = temp_int % 10;
// 動態(tài)掃描顯示
// 顯示十位(或負(fù)號)
COM1 = 1; COM2 = 0; // 選中十位
if (sign_display) {
P1 = SegmentCode[10]; // 顯示負(fù)號
} else {
P1 = SegmentCode[tens];
}
DelayUs(5000); // 延時一小段時間,保持顯示
COM1 = 0; // 關(guān)閉十位
// 顯示個位
COM1 = 0; COM2 = 1; // 選中個位
P1 = SegmentCode[units] | 0x80; // 顯示個位并點(diǎn)亮小數(shù)點(diǎn)
DelayUs(5000);
COM2 = 0; // 關(guān)閉個位
// 如果是三位顯示,需要再增加一位顯示小數(shù)
// Display decimal part if needed
// ...
}
void main()
{
// 初始化
// ...
// Timer0 init for refresh or other tasks
// ...
while(1)
{
GetTemperature(); // 獲取溫度值
Display(temperature_value, decimal_part); // 顯示溫度值
// 可以加入適當(dāng)?shù)难訒r來控制刷新頻率
// _nop_(); // 或者使用定時器中斷來觸發(fā)顯示刷新和溫度采集
}
}
4.4 顯示驅(qū)動邏輯
使用動態(tài)掃描方式驅(qū)動數(shù)碼管。通過定時器中斷或主循環(huán)延時,快速輪流點(diǎn)亮各個數(shù)碼管的位選,并同步送出對應(yīng)的段碼。由于人眼的視覺暫留效應(yīng),會感覺所有數(shù)碼管都在同時亮著。
段碼生成: 將0-9以及負(fù)號的段碼預(yù)存在數(shù)組中,根據(jù)溫度值直接查表獲取。
位選控制: 通過AT89C2051的I/O口控制三極管的通斷,從而選擇點(diǎn)亮哪個數(shù)碼管。
五、 PCB布局與布線建議
良好的PCB布局和布線對于系統(tǒng)穩(wěn)定性和抗干擾能力至關(guān)重要。
電源去耦: 在AT89C2051的VCC和GND引腳附近放置一個104(0.1uF)的陶瓷電容,以及一個10uF的電解電容,用于濾除高頻噪聲,提供穩(wěn)定的電源。DS18B20的電源引腳附近也應(yīng)放置小容量陶瓷電容。
晶振布局: 晶振和兩個22pF電容應(yīng)盡量靠近AT89C2051的XTAL1和XTAL2引腳,且布線盡量短而直,避免交叉走線,防止干擾。
單總線布線: DS18B20的DQ線應(yīng)盡量短且遠(yuǎn)離干擾源。如果線長,可以考慮屏蔽線。4.7kΩ上拉電阻應(yīng)靠近DQ線。
數(shù)碼管驅(qū)動: 數(shù)碼管的段碼線和位選線應(yīng)避免過長,并且盡可能等長,減少信號傳輸差異。限流電阻應(yīng)靠近數(shù)碼管。
地線設(shè)計: 采用星形接地或大面積鋪地,確保地線阻抗最小,減少地線噪聲。數(shù)字地和模擬地(如果存在)應(yīng)區(qū)分,并通過單點(diǎn)連接。
布局: 將功能相關(guān)的元器件放置在一起,例如電源模塊、單片機(jī)模塊、傳感器模塊和顯示模塊。遵循“由小到大、由近及遠(yuǎn)”的原則。
焊接: 確保焊接牢固,無虛焊、短路。
六、 調(diào)試與測試
6.1 硬件調(diào)試
電源測試: 檢查各芯片的供電電壓是否正常。
晶振測試: 檢查AT89C2051的XTAL1和XTAL2引腳是否有正常的時鐘波形。
復(fù)位測試: 檢查單片機(jī)上電時是否有復(fù)位脈沖。
DS18B20通信測試: 使用示波器或邏輯分析儀監(jiān)測DS18B20的DQ線波形,確保單片機(jī)能夠正確地發(fā)送和接收數(shù)據(jù)。
數(shù)碼管驅(qū)動測試: 編寫簡單的程序,輪流點(diǎn)亮數(shù)碼管的各個段和位,檢查顯示是否正常。
6.2 軟件調(diào)試
分模塊調(diào)試: 先單獨(dú)調(diào)試DS18B20的通信程序,確保能正確讀取溫度值。
數(shù)據(jù)處理調(diào)試: 將讀取到的原始溫度值通過串口發(fā)送到PC端,進(jìn)行驗證,確保數(shù)據(jù)轉(zhuǎn)換正確。
顯示調(diào)試: 逐步調(diào)試數(shù)碼管的段碼和位選控制,確保溫度值能正確顯示。
系統(tǒng)集成調(diào)試: 將所有模塊的軟件集成,進(jìn)行整體測試。
溫度校準(zhǔn): 將系統(tǒng)置于已知溫度環(huán)境中(如冰水混合物$0^circ C$、沸水$100^circ C$),校準(zhǔn)測量誤差。DS18B20本身精度較高,但系統(tǒng)誤差可能來自電源波動、布線干擾等。
七、 功耗分析與優(yōu)化
DS18B20: 正常工作電流在1mA左右,休眠模式下僅幾十微安。可以通過編程使其在兩次測量之間進(jìn)入休眠狀態(tài)。
AT89C2051: 正常工作電流在幾毫安到十幾毫安??梢酝ㄟ^降低晶振頻率、使用空閑模式(Idle Mode)或掉電模式(Power-Down Mode)來降低功耗。在溫度刷新間隔較長時,讓單片機(jī)進(jìn)入低功耗模式,并通過定時器中斷喚醒進(jìn)行測量和顯示。
LED數(shù)碼管: 是主要的耗電部分。采用動態(tài)掃描可以大大降低平均電流,但仍需合理選擇限流電阻,避免過亮導(dǎo)致不必要的功耗。在環(huán)境光線較暗時,可以適當(dāng)降低亮度。
八、 總結(jié)與展望
本設(shè)計方案詳細(xì)闡述了基于DS18B20、AT89C2051和CD4069的數(shù)字溫度顯示系統(tǒng)的設(shè)計與實現(xiàn)。通過對各個元器件的精選和詳盡分析,結(jié)合周密的硬件電路設(shè)計和軟件編程策略,可以構(gòu)建一個性能穩(wěn)定、顯示直觀、功耗可控的溫度測量顯示系統(tǒng)。
未來可擴(kuò)展性:
無線傳輸: 可以加入ESP8266或NRF24L01等無線模塊,實現(xiàn)溫度數(shù)據(jù)的遠(yuǎn)程監(jiān)控。
數(shù)據(jù)記錄: 增加EEPROM或SD卡模塊,實現(xiàn)溫度數(shù)據(jù)的存儲和歷史查詢。
報警功能: 設(shè)定溫度閾值,當(dāng)溫度超出范圍時觸發(fā)蜂鳴器或LED報警。
用戶界面: 增加按鍵,允許用戶切換顯示模式(如攝氏度/華氏度)、設(shè)置報警閾值等。
多傳感器網(wǎng)絡(luò): 利用DS18B20的唯一ID特性,擴(kuò)展為多點(diǎn)溫度測量系統(tǒng)。
本方案為讀者提供了從理論到實踐的詳細(xì)指導(dǎo),旨在幫助工程師和愛好者快速掌握數(shù)字溫度顯示系統(tǒng)的設(shè)計要點(diǎn)。通過理解各元器件的特性及其在系統(tǒng)中的作用,將能夠靈活應(yīng)對各種設(shè)計挑戰(zhàn),并在此基礎(chǔ)上進(jìn)行創(chuàng)新和功能擴(kuò)展。
責(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)容僅代表作者觀點(diǎn),拍明芯城不對內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請讀者明確相關(guān)結(jié)果。
4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。
拍明芯城擁有對此聲明的最終解釋權(quán)。