何宗虎, 張德祥, 張玲君
摘 要:提出采用單總線數字式溫度傳感器DS18B20 和單片機組成的新型高精度溫度測量儀的設計。介紹了溫度傳感器DS18B20的結構、特點和工作原理,設計了DS18B20和AT89S52單片機的溫度測量系統硬件電路和軟件編程,主要包括溫度采集、溫度顯示及報警控制等功能。整個系統具有結構簡單,測量精度高,傳輸距離遠,抗干擾能力強,溫度讀取方便和造價低等一系列優點,適用于生產生活及科學研究中對溫度的測量,應用前景十分廣闊。
關鍵詞:溫度測量; 單片機; DS18B20; 數碼管顯示
中圖分類號:TN876-34
文獻標識碼:A
文章編號:1004-373X(2011)09-0130-03
Design of High-accuracy Temperature Detecting System Based on Single Chip Microcomputer
HE Zong-hu, ZHANG De-xiang, ZHANG Ling-jun
(Institute of Electrical Engineering and Automation, Anhui University, Hefei 230039, China)
Abstract: A new high-accuracy temperature detecting system based on single-bus digital temperature sensor DS18B20 and single chip microcomputer (SCM) is proposed. In this paper, the structure, characteristics and working principle of temperature sensor DS18B20 is introduced. Hardware circuit and software programming (including temperature acquisition, temperature display and alarm control functions) of the temperature measurement system are designed based on DS18B20 and AT89S52 SCM. The whole system has a series of advantages of simple structure, high detection accuracy, long transmission distance, strong anti-interference ability, easy to read temperature and low cost. It has a bright application future in daily life and scientific research for temperature measurement.
Keywords: temperature measurement; SCM; DS18B20; nixie display
0 引 言
溫度是工業生產過程和實驗過程中比較重要的一個參數,精確的溫度測量和及時的顯示溫度是很重要的。目前溫度測量系統種類繁多,功能參差不齊。單片機具有體積小,價格便宜,通用性和靈活性強的特點,利用單片機設計溫度測量系統,既可以滿足功能要求,又經濟實惠。數字溫度測量傳感器DS18B20是單一總線的高精度測量器件,它克服了以前模擬式傳感器與微機接口時需要的A/D轉換器及其他復雜外圍電路的缺點[1]。本文就是運用單片機及其接口和集成單總線溫度傳感器DS18B20構建一個高精度的溫度測量和顯示系統,并且通過開關進行溫度上限的設置,如果溫度超過設定值就會報警或進行相應的控制命令。設計的電路簡單,易于實現,而且還具有一定的擴展功能,可以擴展成多點采集和更復雜的功能。
1 系統硬件設計
整個系統主要由主控中心(單片機) 、溫度傳感器DS18B20、數碼管顯示及開關控制等功能模塊組成[2-3]。可以通過開關調節報警溫度的上限,既可以使上限增加,也可以使上限減小,這樣就可以用于不同場合了,系統的框圖如圖1所示。
圖1 系統硬件結構框圖
1.1 溫度傳感器DS18B20
DS18B20是美國Dallas半導體公司生產的數字式溫度傳感器,提供9位溫度讀數,指示溫度[4-5]。溫度信息通過單線接口送入DS18B20或者從DS18B20送出,所以從處理器到DS18B20僅需連接一條線。讀、寫和完成溫度變換所需的電源可以由數據本身提供,而不需要外部電源。這使得DS18B20與單片機接口變得很簡單,克服了模擬式傳感器與微機接口時需要的A/D轉換及其他復雜外圍電路的缺點,而且它具有結構簡單、成本低、體積小、抗干擾能力強、使用簡單等優點。最重要的是DS18B20的ROM中存有其芯片的惟一標識碼,即任意兩個DS18B20的標識碼是不同的,特別適合與微處理芯片構成多點溫度測量控制系統。DS18B20是DS1820的改進型,分辨率為9~12位可編程控制,由其寄存器R0,R1的兩位狀態決定。測量范圍從-55~+125 ℃,增量值為0.5 ℃。
DS18B20在內部以時鐘周期個數計數來測量溫度,并且提供0.5 ℃的分辨率。溫度讀數以16位、符號擴展的二進制補碼讀數形式提供。需要注意的是在DS18B20中溫度以1/2 ℃LSB(最低有效位) 形式表示時,產生以下9位格式:
MSB LSB
1
11100110
1.2 鍵盤控制設計
系統工作前先由用戶自己設定一個兩位溫度值作為報警值,打開電源,單片機復位初始化,閉合開關中斷程序,按復位開關,每按一次報警值就會在初始化的基礎上加1 ℃,數碼管顯示設定值[6-8]。用戶進行核對查看顯示的數字值是否與設置值一樣,然后打開開關進行周圍溫度測量值傳輸。由于報警值可以由用戶自己設定,故系統能適應各種不同溫度的環境。
1.3 其他的部分
系統主要采用的是7段共陽極數碼管顯示測量的溫度值,由發光二極管和蜂鳴器進行報警。如果測的溫度值高于設定值1 ℃,報警系統就會報警(發光二極管點亮,蜂鳴器鳴響)。這樣可以從聲音和視覺上收到系統的警報。
1.4 系統的電路原理圖
系統的電路原理圖如圖2所示。
圖2 系統電路原理圖
2 軟件設計
系統開始工作時,首先進行I/O口初始化、報警值初始化,然后判斷開關是否閉合,由用戶自己在原報警值的基礎上更改,確定后由單片機控制軟件發出溫度讀取指令,通過數字溫度傳感器DS18B20采集當前溫度值,轉換后經過單總線傳輸給單片機,單片機經過處理由數碼管顯示,如果超出設置的報警值1 ℃,系統就會報警(發光二極管點亮、蜂鳴器鳴響) [9-10]。系統的軟件部分主要是由中斷子程序、讀寫DB18B20程序、顯示程序和報警系統四部分組成,主程序流程圖如圖3所示。
圖3 主程序流程圖
設計的部分程序如下:
#include
#include
#include
sbit DQ = P3^2;//定義DS18B20的數據口
sbit SET=P3^3;//定義報警值的控制開關
unsigned char TAP[10]= //共陽極,不帶點
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
unsigned char TAP2[10]=//共陽極,帶點
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};
//定義一個存放轉換后溫度值的數組,溫度值為字符型(ASCII碼),小數點后保留2位
unsigned char str[10];
//延時子程序,延時(10*D+3)us
void delay_10us(unsigned char D)
{unsigned char i;
for (i=0;i {_nop_();//空操作,一個指令周期 _nop_(); } } //DS18B20初始化 void INIT(void) {DQ = 0; delay_10us(50); //等待500 μs DQ = 1;//釋放18B20數據線。 delay_10us(9); //等待90 μs while (!DQ);//等待18B20準備好 } //讀DS18B20的程序 unsigned char READ(void) {unsigned char i; unsigned char D = 0; for (i=0;i<8;i++) //讀8位數據 {D=D>>1; //先讀數據低位 DQ = 0; _nop_ (); DQ = 1; //釋放18B20數據線 for (j=1;j<9;j++) {_nop_(); } if(DQ) D += 0x80; //如果數據線上是″1″,D最高位為″1″,否則為″0″ delay_10us (6); } return D;//返回值為D,即讀出的一個字節數據。 } //寫DS18B20的程序 void WRITE(unsigned char D) {unsigned char i; for (i=0;i<8;i++) {DQ = 0; if (D & 0x01) DQ = 1; elseDQ = 0; delay_10us(8); DQ = 1; D = D >> 1;//右移一位,準備寫下一位 } } //顯示程序(str數組內元素是ASCII碼,所以要減去48) void display(void) {unsigned char i; unsigned char j=100; while(j--) { for (i=0;i<255;i++) { P0 = TAP [str[0]-48]; P2 = 0x1; } for (i=0;i<255;i++) { P0 = TAP2[str[1]-48]; P2 = 0x2; } for (i=0;i<255;i++) {P0 = TAP[str[3]-48]; P2 = 0x4; } for(i=0;i<255;i++) {P0 = TAP[str[4]-48]; P2 = 0x8; } } } //主程序 void main() {unsigned char warning=30; unsigned char TMP_H = 0; unsigned char TMP_L = 0; shortTMP= 0; //短整型數據 float TMP_F = 0; //浮點型數據 P1_0=0; //開機時測試溫度超限警報LED燈 while(1) { while(!SET) //報警值確定 { delay_10us(5); while(!SET) { if(P1_0==0) warning+=1;//增加上限 else if(P1_1==0) warning+=1;//減小上限 elsewarning+=0; str[0]=warning/10+48; str[1]=warning%10+48; str[3]=48; str[4]=48; display(); delay_10us(5); } } INIT(); //初始化DS18B20 WRITE(0xCC);//跳過ROM配置 WRITE(0x44);//開始轉換溫度 display(); //默認至少等待750 ms,用于溫度轉換 INIT();//初始化DS18B20 WRITE(0xCC);//跳過ROM配置 WRITE(0xBE);//準備讀取溫度值 TMP_L=READ(); //讀取溫度值的低8位 TMP_H=READ(); //讀取溫度值的高4位 TMP=TMP_H; TMP=(TMP<<8) | TMP_L;//高位左移8位與低位相或(加) 賦值于TMP TMP_F=TMP * 0.0625;//計算溫度值 sprintf(str,″%.2f″,TMP_F);//將浮點數轉換成字符型,存入str數組 if(TMP_F>=warning)P1_0=0; //如果溫度值大于等于報警值,報警 else P1_0=1; } } 3 結 語 基于C51系列單片機和DS18B20數字溫度傳感器的溫度測量系統結構簡單、成本低、操作方便,比較好推廣,而且也可以根據情況進行擴展,比如進行多點采集等。 參考文獻 [1]劉衛民.集成溫度傳感器DS1820原理及應用[J].黑龍江科技信息,2008(21):52. [2]楊偉偉.淺談基于單片機的溫度測控系統設計[J].信息與電腦:理論版,2010(2):50-51. [3]何錫才.傳感器及其應用電路[M].北京:電子工業出版社,2002. [4]李虹,溫秀梅,高振天.基于MSP430單片機和DS18B20的小型測溫系統[J].微計算機信息,2006,22(2):137-138. [5]檀永,陳小平.基于DS1620的溫度變送器設計[J].江蘇電器,2006(4):4-6,10. [6]張立科.單片機典型外圍器件及應用實例[M].北京:人民郵電出版社,2006. [7]鄔楊波.一種基于VHDL的7段LED數碼管顯示控制器[J].機電工程,2008,25(7):51-54. [8]馬臣崗, 孟立凡.基于單總線式無線溫度采集系統設計[J].電子設計工程,2010(3):31-33. [9]劉瑞新.單片機原理及應用教程[M].北京:機械工業出版社,2003. [10]張義和,王敏男,許宏昌.例說51單片機[M].北京:人民郵電出版社,2008. 2011年5月1日第34卷第9期現代電子技術Modern Electronics TechniqueMay 2011Vol.34 No.9 注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文