王 月
(揚(yáng)州職業(yè)大學(xué), 江蘇 揚(yáng)州 225009)
本文提出并設(shè)計(jì)了一款實(shí)時(shí)溫度測量電路,該電路能夠及時(shí)獲取當(dāng)前溫度,并通過一個(gè)按鍵輕松實(shí)現(xiàn)溫度和時(shí)間顯示的切換。電路選用數(shù)字式溫度傳感器DS18B20將溫度轉(zhuǎn)換為一串二進(jìn)制數(shù),通過一根數(shù)據(jù)線發(fā)送給STC89C52單片機(jī)處理,處理后的溫度數(shù)值再發(fā)送給顯示設(shè)備進(jìn)行顯示。常見的單片機(jī)顯示設(shè)備有數(shù)碼管、點(diǎn)陣、液晶屏等,本電路選用8位LED共陰數(shù)碼管作為顯示設(shè)備。另外在電路中添加了1個(gè)獨(dú)立按鍵進(jìn)行時(shí)間顯示和溫度顯示的切換。
圖1為硬件電路圖。電路控制核心為STC89C52單片機(jī),外接時(shí)鐘電路、復(fù)位電路以及電源構(gòu)成了單片機(jī)最小系統(tǒng)。在時(shí)鐘電路中選用振蕩頻率為12MHz的晶振,可以計(jì)算出單片機(jī)的一個(gè)機(jī)器周期為1μs,這樣方便電路進(jìn)行時(shí)間的計(jì)算。采用數(shù)字式溫度傳感器DS18B20檢測溫度,8位共陰數(shù)碼管顯示時(shí)間以及溫度值,按鍵K1可以切換時(shí)間以及溫度顯示。
圖1 硬件電路圖
本電路采用DS18B20進(jìn)行測溫,DS18B20的1引腳接電源地,2引腳為數(shù)據(jù)輸入輸出端,接單片機(jī)P1.3口,3引腳為可選電源引腳,在本電路中采用外部電源給DS18B20供電,3引腳接外部電源Vcc。
DS18B20與單片機(jī)之間數(shù)據(jù)傳送只需要通過一根數(shù)據(jù)線DQ就可以實(shí)現(xiàn),DS18B20將溫度值轉(zhuǎn)換為9~12位的數(shù)字量經(jīng)DQ端一位一位地傳送給單片機(jī)。DS18B20與單片機(jī)之間成功實(shí)現(xiàn)數(shù)據(jù)傳送,須嚴(yán)格遵守DS18B20的工作時(shí)序[1]。
DS18B20初始化時(shí)序:單片機(jī)拉低數(shù)據(jù)線電位產(chǎn)生下降沿后至少延時(shí)480μs(單片機(jī)發(fā)復(fù)位脈沖),釋放數(shù)據(jù)線電位,DS18B20在檢測到數(shù)據(jù)線電位上升沿后的15~60μs會拉低數(shù)據(jù)線電位60~240μs(發(fā)存在脈沖),單片機(jī)檢測到該低電平,表示DS18B20初始化成功,否則DS18B20初始化失敗。在實(shí)際使用時(shí),若事先確定DS18B20與單片機(jī)之間的硬件接線無誤,在DS18B20器件完好的情況下,也可以跳過檢測存在脈沖,在單片機(jī)釋放數(shù)據(jù)線電位后,直接延時(shí)至少480μs。
寫時(shí)序:單片機(jī)先將數(shù)據(jù)線電位拉低產(chǎn)生一個(gè)下降沿,之后將1位數(shù)據(jù)發(fā)送到數(shù)據(jù)線(數(shù)據(jù)由低位到高位一位一位發(fā)送),延時(shí)60μs等待DS18B20接收數(shù)據(jù),之后釋放數(shù)據(jù)線電位,重復(fù)前面的步驟發(fā)送第2位數(shù)據(jù),直至發(fā)送完一個(gè)完整的字節(jié)。
讀時(shí)序:單片機(jī)先將數(shù)據(jù)線電位拉低延時(shí)至少1μs,釋放數(shù)據(jù)線電位準(zhǔn)備讀數(shù)據(jù),延時(shí)10μs讀數(shù)據(jù)線的狀態(tài)得到1位數(shù)據(jù),并進(jìn)行數(shù)據(jù)處理,之后至少再延時(shí)45μs,重復(fù)前面步驟,讀取第2位數(shù)據(jù),直到讀完一個(gè)字節(jié)。
DS18B20將測得的溫度轉(zhuǎn)化為2個(gè)字節(jié)的數(shù)字量存儲在其內(nèi)部RAM中,字節(jié)0和字節(jié)1分別用來存放溫度數(shù)字量的低8位LSB和高8位MSB,圖2為溫度寄存器單元的格式,DS18B20上電復(fù)位時(shí)默認(rèn)的精度為12位,其中高字節(jié)MSB的前5位“S”為溫度符號位,若溫度大于0,S為0,否則S為1。溫度高字節(jié)MSB的低3位以及溫度低字節(jié)LSB均表示溫度數(shù)值的大小,只要將數(shù)值乘以0.0625即可得到實(shí)際溫度值,需要注意的是當(dāng)溫度小于0℃時(shí),需要將該數(shù)值進(jìn)行取反加1操作后再乘以0.0625計(jì)算出實(shí)際溫度值。
圖2 溫度寄存器單元格式
單片機(jī)每次對DS18B20進(jìn)行操作都需要遵循以下3個(gè)步驟:DS18B20初始化、ROM操作命令和存儲器RAM操作命令。這3個(gè)步驟必須依次執(zhí)行,前面的完成了才能進(jìn)行下一個(gè)步驟,DS18B20初始化成功后才能對其內(nèi)部的ROM進(jìn)行操作。
每一個(gè)DS18B20都有唯一的64位長的ROM編碼,開始8位是產(chǎn)品系列編碼(DS18B20的編碼是10H),接著是48位的唯一的序列號,最后的8位是前56位CRC。
ROM操作命令有五種,分別為讀ROM、匹配ROM、搜索ROM、跳過ROM和報(bào)警搜索。
本電路中,因?yàn)橹皇褂昧艘粋€(gè)DS18B20進(jìn)行測溫,可以使用跳過讀序列號(Skip ROM)命令,代碼為0CCH,從而節(jié)省測溫時(shí)間。每次對DS18B20進(jìn)行操作,都需要執(zhí)行這五種ROM操作命令之一,之后才能對RAM進(jìn)行操作。DS18B20內(nèi)部RAM操作命令具體見表1。
表1 DS18B20內(nèi)部RAM操作命令
本電路中,需要使用到的RAM命令有:(1)溫度變換,代碼為44H,用來啟動DS18B20進(jìn)行溫度轉(zhuǎn)換;(2)讀內(nèi)部RAM命令,代碼為0BEH,讀RAM 中 9個(gè)字節(jié)的內(nèi)容。在后面的軟件程序中會應(yīng)用到。
數(shù)碼管顯示方式有靜態(tài)和動態(tài)顯示兩種,在本設(shè)計(jì)中使用動態(tài)顯示方式,在較短的一個(gè)時(shí)間周期里(常用20ms)循環(huán)點(diǎn)亮8個(gè)數(shù)碼管,利用視覺殘留效應(yīng),看起來八個(gè)數(shù)碼管像是同時(shí)點(diǎn)亮的[2]。
從DS18B20啟動溫度轉(zhuǎn)換到能夠讀取溫度值的數(shù)字量,中間需要等待幾百毫秒的時(shí)間,這段時(shí)間可以用來調(diào)用若干遍顯示子程序。
本設(shè)計(jì)中通過按鍵K1來切換溫度或時(shí)間顯示,在按鍵處理子程序中,當(dāng)按鍵按下去一次,位存儲單元20H的取值取反一次,在主程序中對位單元20H的取值進(jìn)行判斷,當(dāng)(20H)為0時(shí)調(diào)用若干遍溫度顯示子程序,當(dāng)(20H)為1時(shí)調(diào)用若干遍時(shí)間顯示子程序,這樣就實(shí)現(xiàn)了溫度顯示和時(shí)間顯示的切換,見圖3。
圖4為T0中斷服務(wù)程序,本電路采用單片機(jī)內(nèi)部的T0定時(shí)器產(chǎn)生時(shí)基信號,在主程序參數(shù)初始化部分,設(shè)置T0工作在方式1,要產(chǎn)生50ms的定時(shí)時(shí)間,T0初始值設(shè)置為(TH0)=3CH,(TL0)=0B0H,開啟T0的中斷,這樣50ms就進(jìn)入一次T0中斷服務(wù)程序,在T0中斷服務(wù)程序中先關(guān)閉定時(shí)器T0,重新賦初值,之后再開啟定時(shí)器T0,重新進(jìn)入下一個(gè)50ms計(jì)時(shí)周期,R7用來記錄進(jìn)入T0中斷服務(wù)程序的次數(shù),(R7)=20時(shí),1s時(shí)間到,將秒單元的內(nèi)容加1。
圖3 主程序流程
圖4 T0中斷服務(wù)程序
本電路實(shí)物調(diào)試時(shí)可通過按鍵K1切換時(shí)間顯示和溫度顯示。時(shí)間顯示范圍為00-00-00(時(shí)分秒)至23-59-59。計(jì)時(shí)采用定時(shí)器T0工作于方式1,每次計(jì)時(shí)溢出進(jìn)入 T0中斷服務(wù)程序,需要重新賦初值后才能進(jìn)行下一周期的計(jì)時(shí),中間就會有幾條指令的時(shí)間誤差,經(jīng)過計(jì)算可知一天累積下來實(shí)際時(shí)間會比理論時(shí)間慢10s。為消除該時(shí)間誤差,分別在早上7點(diǎn)整以及晚上7點(diǎn)整直接將秒單元值加5s,這樣就能保證一天下來時(shí)間是準(zhǔn)確無誤的。
本電路中DS18B20輸出的溫度為12位數(shù)字量,溫度最小分辨率可達(dá)0.0625℃,溫度值僅保留至小數(shù)點(diǎn)后1位。在程序中具體處理過程為:取溫度低8位LSB中的低4位,將該4位的數(shù)字經(jīng)過乘以10再除以16的運(yùn)算后,取其整數(shù)部分即為溫度的小數(shù)數(shù)值的大小。
表2記載了2019年2月26日當(dāng)天的一些時(shí)間點(diǎn)對應(yīng)的溫度值,從表2中可以看出溫度隨時(shí)間的變化關(guān)系,但是這個(gè)變化關(guān)系不夠直觀,這是本電路需要改進(jìn)的地方,后面可以使用LCD12864顯示溫度的變化曲線從而使得電路測量結(jié)果更加直觀。
表2 時(shí)間與溫度的對應(yīng)值