基于單片機的數字溫度計設計
引言
隨著現代信息技術的飛速發展和傳統工業改造的逐步實現.能夠獨立工作的溫度檢測和顯示系統應用于諸多領域。傳統的溫度檢測以熱敏電阻為溫度敏感元件。熱敏電阻的成本低,但需后續信號處理電路,而且可靠性相對較差,測溫準確度低,檢測系統也有一定的誤差。與傳統的溫度計相比,這里設計的數字溫度計具有讀數方便,測溫范圍廣,測溫精確,數字顯示,適用范圍寬等特點。選用AT89C51型單片機作為主控制器件,DSl8B20作為測溫傳感器通過4位共陽極LED數碼管串口傳送數據,實現溫度顯示。通過DSl8B20直接讀取被測溫度值,進行數據轉換,該器件的物理化學性能穩定,線性度較好,在0℃~100℃最大線性偏差小于0.1℃。該器件可直接向單片機傳輸數字信號,便于單片機處理及控制。另外,該溫度計還能直接采用測溫器件測量溫度,從而簡化數據傳輸與處理過程。
系統硬件設計方案
根據系統功能要求,構造圖1所示的系統原理結構框圖。
圖1
系統原理結構框圖
2.1
單片機的選擇
AT89C51作為溫度測試系統設計的核心器件。該器件是INTEL公司生產的MCS一5l系列單片機中的基礎產品,采用了可靠的CMOS工藝制造技術,具有高性能的8位單片機,屬于標準的MCS—51的CMOS產品。不僅結合了HMOS的高速和高密度技術及CHMOS的低功耗特征,而且繼承和擴展了MCS—48單片機的體系結構和指令系統。單片機小系統的電路圖如圖2所示。
圖2
單片機小系統電路
AT89C51單片機的主要特性:
(1)與MCS-51
兼容,4K字節可編程閃爍存儲器;
(2)靈活的在線系統編程,掉電標識和快速編程特性;
(3)壽命為1000次寫/擦周期,數據保留時間可10年以上;
(4)全靜態工作模式:0Hz-33Hz;
(5)三級程序存儲器鎖定;
(6)128*8位內部RAM,32可編程I/O線;
(7)兩個16位定時器/計數器,6個中斷源;
(8)全雙工串行UART通道,低功耗的閑置和掉電模式;
(9)看門狗(WDT)及雙數據指針;
(9)片內振蕩器和時鐘電路;
2.2
溫度傳感器介紹
DS18B20可以程序設定9~12位的分辨率,精度為±0.5°C??蛇x更小的封裝方式,更寬的電壓適用范圍。分辨率設定,及用戶設定的報警溫度存儲在EPROM中,掉電后依然保存。
溫度傳感器DS18B20引腳如圖3所示。
8引腳封裝
TO-92封裝
圖3
溫度傳感器
引腳功能說明:
NC
:空引腳,懸空不使用;
VDD
:可選電源腳,電源電壓范圍3~5.5V。當工作于寄生電源時,此引腳必須接地。
DQ
:數據輸入/輸出腳。漏極開路,常態下高電平。
GND
:為電源地
DS18B20內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。
光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:開始8位(28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環冗余校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一個DS18B20都各不相同,這樣就可以實現一根總線上掛接多個DS18B20的目的。
DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉化為例:用16位符號擴展的二進制補碼讀數形式提供,以0.0625℃/LSB形式表達,其中S為符號位。
這是12位轉化后得到的12位數據,存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625即可得到實際溫度。
例如+125℃的數字輸出為07D0H,+25.0625℃的數字輸出為0191H,-25.0625℃的數字輸出為FF6FH,-55℃的數字輸出為FC90H。
DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的E2RAM,后者存放高溫度和低溫度觸發器TH、TL和結構寄存器。
暫存存儲器包含了8個連續字節,前兩個字節是測得的溫度信息,第一個字節的內容是溫度的低八位,第二個字節是溫度的高八位。第三個和第四個字節是TH、TL的易失性拷貝,第五個字節是結構寄存器的易失性拷貝,這三個字節的內容在每一次上電復位時被刷新。第六、七、八個字節用于內部計算。第九個字節是冗余檢驗字節。
該字節各位的意義如下:
TM
R1
R0
低五位一直都是1,TM是測試模式位,用于設置DS18B20在工作模式還是在測試模式。在DS18B20出廠時該位被設置為0,用戶不要去改動。R1和R0用來設置分辨率,如表1所示:(DS18B20出廠時被設置為12位)
表1
DS18B20溫度轉換時間表
R1
R0
分辨率/位
溫度最大轉向時間
0
0
93.75
0
187.5
0
375
750
根據DS18B20的通訊協議,主機控制DS18B20完成溫度轉換必須經過三個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發送一條ROM指令,最后發送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數據線下拉500微秒,然后釋放,DS18B20收到信號后等待16~60微秒左右,后發出60~240微秒的存在低脈沖,主CPU收到此信號表示復位成功。
2.3
溫度傳感器與單片機的連接
溫度傳感器的單總線(1-Wire)與單片機的P2.0連接,P2.0是單片機的高位地址線A8。P2端口是一個帶內部上拉電阻的8位雙向I/O,其輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對該端口寫“1”,可通過內部上拉電阻將其端口拉至高電平,此時可作為輸入口使用,這是因為內部存在上拉電阻,某一引腳被外部信號拉低時會輸出一個電流。在訪問外部程序存儲器或16位地址的外部數據存儲器時。如執行MOVX
DPTR指令,則表示P2端口送出高8位的地址數據。在訪問8位地址的外部數據存儲器時,可執行MOVX
RI指令,P2端口內容即為特殊功能寄存器(SFR)區中R2寄存器內容,整個訪問期間不改變。在Flash編程和程序校驗時,P2端口也接收高位地址和其他控制信號。圖4為DSl8820內部結構。圖5為DSl8820與單片機的接口電路。
圖4
DS18B20內部結構圖
圖5
DS18B20和單片機的接口連接
2.4
復位信號及外部復位電路
單片機的P1.6端口是MAX813看門狗電路中喂狗信號的輸入端,即單片機每執行一次程序就設置一次喂狗信號,清零看門狗器件。若程序出現異常,單片機引腳RST將出現兩個機器周期以上的高電平,使其復位。該復位信號高電平有效,其有效時間應持續24個振蕩脈沖周期即兩個機器周期以上。若使用頻率為12
MHz的晶體振蕩器,則復位信號持續時間應超過2μs才完成復位操作。
2.5
單片機與報警電路
系統中的報警電路是由發光二極管和限流電阻組成,并與單片機的P1.2端口連接。P1端口的作用和接法與P2端口相同,不同的是在Flash編程和程序校驗期間,P1接收低8位地址數據。
2.6
電源電路
由于該系統需要穩定的5
V電源,因此設計時必須采用能滿足電壓、電流和穩定性要求的電源。該電源采用三端集成穩壓器LM7805。它僅有輸入端、輸出端及公共端3個引腳,其內部設有過流保護、過熱保護及調整管安全保護電路.由于所需外接元件少,使用方便、可靠,因此可作為穩壓電源。圖6為電源電路連接圖。
圖6
電源電路連接圖
2.7
顯示電路
采用技術成熟的74HCl64實現串并轉換。LED顯示分為靜態顯示和動態顯示。這里采用靜態顯示,系統通過單片機的串行口來實現靜態顯示。串行口為方式零狀態,即工作在移位寄存器方式,波特率為振蕩頻率的1/12。當器件執行任何一條將SBUF作為目的寄存器的命令時,數據便開始從RXD端發送。在寫信號有效時,相隔一個機器周期后發送控制端SEND有效,即允許RXD發送數據,同時允許從TXD端輸出移位脈沖。圖7為顯示電路的連接圖。
圖7
顯示電路的連接圖
2.8
看門狗電路
系統中把P1.6作為看門狗的“喂狗”信號;將MAX813的RESET與單片機的復位信號RST連接。由于單片機每執行一次程序,就會給看門狗器件一個復位信號,這樣也可以用手工方式實現復位。當按鍵按下時,SW—SPST就會在MAX813引腳產生一個超過200
ms的低電平,其實看門狗器件在1.6
s時間內沒有復位,使7引腳輸出一個復位信號的作用是相同的,其連接圖如圖8所示。
圖8
看門狗器件的MAX813的連接圖
軟件設計
DSl8820的主要數據元件有:64位激光Lasered
ROM,溫度靈敏元件和非易失性溫度告警觸發器TH和TL。DSBl820可以從單總線獲取電源,當信號線為高電平時,將能量貯存在內部電容器中;當單信號線為低電平時,將該電源斷開,直到信號線變為高電平重新接上寄生(電容)電源為止。此外,還可外接5
V電源,給DSl8820供電。DSl8820的供電方式靈活,利用外接電源還可增加系統的穩定性和可靠性。圖9為讀取數據流程圖。
開始
DS18B20的初始化
啟動溫度轉換
讀取溫度寄存器
跳過讀序列號的操作
跳過讀序列號的操作
DS18B20的初始化
RET
LOW-低八位
HIGH-高八位
圖9
讀取數據的流程圖
讀出溫度數據后,LOW的低四位為溫度的小數部分,可以精確到0.0625℃,LOW的高四位和HIGH的低四位為溫度的整數部分,HIGH的高四位全部為1表示負數,全為0表示正數。所以先將數據提取出來,分為三個部分:小數部分、整數部分和符號部分。小數部分進行四舍五入處理:大于0.5℃的話,向個位進1;小于0.5℃的時候,舍去不要。當數據是個負數的時候,顯示之前要進行數據轉換,將其整數部分取反加一。還因為DS18B20最低溫度只能為-55℃,所以可以將整數部分的最高位換成一個“-”,表示為負數。圖10為溫度數據處理程序的流程圖。
開始
提取整數部分存入HT
提取小數部分存入LT
LT右移三位,將精度降低到0.5攝氏度
HT++
將小數部分整數化
提取符號部分存入sign
LT是否大于5
Sign=?0XF0
RET
負數表示flag=1
HT=~HT+1
Y
N
N
Y
圖10
溫度數據處理流程圖
數據測試
將溫度傳感器與冰水混合物接觸,經過充分攪拌達到熱平衡后調節系統,使顯示讀數為0.00(標定0℃);利用氣壓計讀出當時當地的大氣壓強,并根據大氣壓強和當地重力加速度計算出當時的實際壓強;根據沸點與壓強的關系查出沸點溫度。把溫度傳感器放入沸水中,待顯示讀數穩定后重新調節,使顯示器顯示讀數等于當地當時沸點溫度后工作結束。該溫度計的量程為-50℃~150℃,讀數精度為0.1℃,實際使用一般在0℃~100℃。采用0℃~50℃和50℃~100℃的精密水銀溫度計作檢驗標準,對設計的溫度計進行測試,其結果表明能達到該精度要求。
總結與體會
作為一名電子信息工程的大四學生,我覺得做單片機課程設計是很有意義的,而且也是必要的。在做這次課程設計的過程中,我感觸最深的當屬查閱大量的設計資料了。為了讓自己的設計更加完善,查閱這方面的實際資料是十分必要的,也是必不可少的。
其次,在這次課程設計中,我們運用了以前學過的專業課知識,如:proteus仿真、匯編語言、模擬和數字電路知識等。雖然過去我從未獨立應用過他們,但在學習的過程中帶著問題去學我發現效率很高,這是我做這次課程設計的又一收獲。
最后,要做好一個課程設計,就必須做到:在設計程序之前,對所用單片機的內部結構有一個系統的了解,知道該單片機有哪些資源;要有一個清晰的思路和一個完整的軟件流程圖;在設計程序時,不能妄想一次將整個程序設計好,反復修改、不斷改進是程序設計的必經之路;要養成注釋程序的好習慣,這樣為資料的保留和交流提供了方便;在設計中遇到的問題要記錄,以免下次遇到同樣的問題。
在這次的課程設計中,我真正的意識到,在以后的學習中,要理論聯系實際,把我們所學的理論知識用到實際當中,學習單片機更是如此,程序只有在經常寫與讀的過程中才能提高,這就是這次課程設計的最大收獲。
附錄1
仿真圖
附錄2
程序源代碼
DATA_BUS
BIT
P3.3
FLAG
BIT
00H
;標志位
TEMP_L
EQU
30H
;溫度值低字節
TEMP_H
EQU
31H
;溫度值高字節
TEMP_DP
EQU
32H
;溫度小數
TEMP_INT
EQU
33H
;溫度值整數
TEMP_BAI
EQU
34H
;溫度百位數
TEMP_SHI
EQU
35H
;溫度十位數
TEMP_GE
EQU
36H
;溫度個位數
DIS_BAI
EQU
37H
;顯示百位數
DIS_SHI
EQU
38H
;顯示十位數
DIS_GE
EQU
39H
;顯示個位數
DIS_DP
EQU
3AH
;顯示小數位
DIS_ADD
EQU
3BH
;顯示地址
ORG
0000H
AJMP
START
ORG
0050H
;初始化
START:
MOV
SP,#40H
MAIN:
LCALL
READ_TEMP
;調讀溫度程序
LCALL
PROCESS
;調數據處理程序
AJMP
MAIN
;讀溫度程序
READ_TEMP:
LCALL
RESET_PULSE
;調用復位脈沖程序
MOV
A,#0CCH
;跳過ROM命令
LCALL
WRITE
MOV
A,#44H
;讀溫度
LCALL
WRITE
LCALL
DISPLAY
;顯示溫度
LCALL
RESET_PULSE
;調用復位脈沖程序
MOV
A,#0CCH
;跳過ROM命令
LCALL
WRITE
MOV
A,#0BEH
;讀緩存命令
LCALL
WRITE
LCALL
READ
RET
;復位脈沖程序
RESET_PULSE:
RESET:
SETB
DATA_BUS
NOP
NOP
CLR
DATA_BUS
MOV
R7,#255
DJNZ
R7,$
SETB
DATA_BUS
MOV
R7,#30
DJNZ
R7,$
JNB
DATA_BUS,SETB_FLAG
CLR
FLAG
AJMP
NEXT
SETB_FLAG:
SETB
FLAG
NEXT:
MOV
R7,#120
DJNZ
R7,$
SETB
DATA_BUS
JNB
FLAG,RESET
RET
;寫命令
WRITE:
SETB
DATA_BUS
MOV
R6,#8
CLR
C
WRITING:
CLR
DATA_BUS
MOV
R7,#5
DJNZ
R7,$
RRC
A
MOV
DATA_BUS,C
MOV
R7,#30H
DJNZ
R7,$
SETB
DATA_BUS
NOP
DJNZ
R6,WRITING
RET
;循環顯示段位
DISPLAY:
MOV
R4,#200
DIS_LOOP:
MOV
A,DIS_DP
MOV
P2,#0FFH
MOV
P0,A
CLR
P2.7
LCALL
DELAY2MS
MOV
A,DIS_GE
MOV
P2,#0FFH
MOV
P0,A
SETB
P0.7
CLR
P2.6
LCALL
DELAY2MS
MOV
A,DIS_SHI
MOV
P2,#0FFH
MOV
P0,A
CLR
P2.5
LCALL
DELAY2MS
MOV
A,DIS_BAI
MOV
P2,#0FFH
MOV
P0,A
MOV
A,TEMP_BAI
CJNE
A,#0,SKIP
AJMP
NEXTT
SKIP:
CLR
P2.4
LCALL
DELAY2MS
NEXTT:
NOP
DJNZ
R4,DIS_LOOP
RET
;讀命令
READ:
SETB
DATA_BUS
MOV
R0,#TEMP_L
MOV
R6,#8
MOV
R5,#2
CLR
C
READING:
CLR
DATA_BUS
NOP
NOP
SETB
DATA_BUS
NOP
NOP
NOP
NOP
MOV
C,DATA_BUS
RRC
A
MOV
R7,#30H
DJNZ
R7,$
SETB
DATA_BUS
DJNZ
R6,READING
MOV
@R0,A
INC
R0
MOV
R6,#8
SETB
DATA_BUS
DJNZ
R5,READING
RET
;數據處理
PROCESS:
MOV
R7,TEMP_L
MOV
A,#0FH
ANL
A,R7
MOV
TEMP_DP,A
MOV
R7,TEMP_L
MOV
A,#0F0H
ANL
A,R7
SWAP
A
MOV
TEMP_L,A
MOV
R7,TEMP_H
MOV
A,#0FH
ANL
A,R7
SWAP
A
ORL
A,TEMP_L
MOV
B,#64H
DIV
AB
MOV
TEMP_BAI,A
MOV
A,#0AH
XCH
A,B
DIV
AB
MOV
TEMP_SHI,A
MOV
TEMP_GE,B
MOV
A,TEMP_DP
MOV
DPTR,#TABLE_DP
MOVC
A,@A+DPTR
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_DP,A
MOV
A,TEMP_GE
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_GE,A
MOV
A,TEMP_SHI
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_SHI,A
MOV
A,TEMP_BAI
MOV
DPTR,#TABLE_INTER
MOVC
A,@A+DPTR
MOV
DIS_BAI,A
RET
DELAY2MS:
MOV
R6,#3
LOOP3:
MOV
R5,#250
DJNZ
R5,$
DJNZ
R6,LOOP3
RET
TABLE_DP:
DB
00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB
06H,07H,08H,08H,09H,09H
TABLE_INTER:
DB
03FH,006H,05BH,04FH,066H
DB
06DH,07DH,07H,07FH,06FH
END