嶺南師范學(xué)院網(wǎng)絡(luò)與信息技術(shù)中心 葉小樂
基于DS 1 8 B 2 0的多點溫度采集系統(tǒng)設(shè)計
嶺南師范學(xué)院網(wǎng)絡(luò)與信息技術(shù)中心 葉小樂
以DS18B20數(shù)字溫度傳感器和AT89C52單片機為核心,設(shè)計了一種多點溫度采集系統(tǒng)。系統(tǒng)由DS18B20溫度采集模塊、RS-232串口通信模塊、LCD1602液晶顯示模塊和聲光報警等模塊組成。給出了系統(tǒng)的具體硬件電路與程序設(shè)計,實現(xiàn)了對多點溫度的采集、顯示、傳輸和異常報警。系統(tǒng)可以廣泛應(yīng)用于糧倉、溫室大棚等農(nóng)業(yè)生產(chǎn)領(lǐng)域,具有廣闊的應(yīng)用前景。
溫度采集;DS18B20;單片機
溫度是農(nóng)業(yè)生產(chǎn)中的一個重要參數(shù),在眾多農(nóng)業(yè)生產(chǎn)領(lǐng)域中需要對溫度進行監(jiān)測,大型糧倉需要對上百個點的溫度進行監(jiān)測,掌握各個點在不同時刻的溫度變化,以提高倉儲量,同時有效地避免發(fā)生霉變現(xiàn)象。針對這種需要多點溫度采集的情況,本文設(shè)計提出了一種基于AT89C52單片機和DS18B20數(shù)字溫度傳感器的多點溫度采集系統(tǒng)。系統(tǒng)可以實時獲取多點溫度數(shù)據(jù),并將溫度值與報警設(shè)定值進行比較,判斷是否發(fā)出聲光報警,同時將溫度值送LCD1602進行實時顯示,并把溫度數(shù)據(jù)通過串口通訊傳輸給上位PC機,由PC機處理后通過網(wǎng)絡(luò)傳輸?shù)娇刂浦行摹?/p>
系統(tǒng)的控制核心選用8位單片機AT89C52,由DS18B20溫度采集模塊、RS-232串口通信模塊、LCD1602液晶顯示模塊和聲光報警模塊組成,如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)圖
根據(jù)系統(tǒng)結(jié)構(gòu)設(shè)計出包含AT89C52單片機與DS18B20數(shù)字溫度傳感器、串口、LCD以及聲光報警電路的整體電路圖,如圖2所示。
這里AT89C52單片機采用DIP-40封裝,包括4組8位的輸入/輸出口;LCD1602的D0~D7引腳連接單片機的P0.0~P0.7口,RS引腳連接單片機的P3.5口,E引腳連接單片機的P3.4口;聲光報警電路連接單片機的P2.3口;DS18B20數(shù)字溫度傳感器采用單總線技術(shù)(1-WireBus),即在單片機接口中只用一根導(dǎo)線(I/O信號線)就可以連接多個數(shù)字溫度傳感器,并能夠直接把被測溫度值轉(zhuǎn)化為串行信號在單總線上傳輸,這里選用單片機的P2.1口通過單總線與兩個DS18B20的數(shù)據(jù)線引腳DQ相連,單總線通過10K的上拉電阻R6連接+5V電源,DS18B20傳感器可位于離單片機150m以內(nèi)的任何地方;并且為了能夠和上位PC機進行長距離數(shù)據(jù)傳輸,系統(tǒng)選用RS-232串行接口,通信距離能夠達到15米,上位PC機通過VC程序控制串口來接收單片機發(fā)送的溫度數(shù)據(jù),所以系統(tǒng)能夠滿足在需要較大范圍溫度測控的場合布置使用。
圖2 系統(tǒng)電路圖
系統(tǒng)使用的是美國DALLAS半導(dǎo)體公司推出的系列單總線溫度傳感器芯片DS18B20[1],該芯片具有以下優(yōu)點:(1)體積小,只有電源、接地、數(shù)據(jù)線共3個引腳,極大地節(jié)約了系統(tǒng)資源[2];(2)功耗低、成本低、性能高;(3)測溫范圍廣,可測范圍在-55℃到+125℃之間;(4)可組網(wǎng),每個DS18B20都有唯一的序列號,可用于多點測溫;(5)線路簡單,DS18B20作為1-wire單總線數(shù)字溫度傳感器,采用一根信號線實現(xiàn)信號的雙向傳輸,接口簡單,便于擴展和維護[3],只需要占用單片機的一個端口即可通信,本設(shè)計采用AT89C52單片機的P2.1端口與DS18B20進行通信,詳見圖2所示;(6)適用電壓寬,從3V一直到5.5V;(7)用戶可以在9位到12位之間選擇數(shù)字溫度的分辨率,傳感器直接輸出溫度值的數(shù)字信號,抗干擾能力好;(8)可在內(nèi)部設(shè)置溫度的上、下限告警。
系統(tǒng)選用美國ATMEL公司制造的8位單片機AT89C52做主控制器。這種單片機采用ATMEL公司的高密度非易失存儲器技術(shù)生產(chǎn),兼容工業(yè)標準的MCS-51指令系統(tǒng)和8052的產(chǎn)品引腳,片內(nèi)含有8k字節(jié)可擦寫Flash只讀程序存儲器(PEROM)與256字節(jié)隨機數(shù)據(jù)存儲器(RAM)。該單片機擁有1個8位CPU,1個片內(nèi)振蕩器及時鐘電路,3個16位定時/計數(shù)器,21個特殊功能寄存器,4個8位并行I/O口,共32條可編程I/O端線,1個可編程全雙工串行口,8個中斷源[4,5]。AT89C52單片機可以為嵌入式系統(tǒng)行業(yè)提供高性價比、高靈活度的解決方案。
這里采用LCD1602液晶顯示模塊來實時顯示所測溫度。該款液晶顯示模塊以其功耗低、顯示內(nèi)容豐富、超薄輕巧、體積小的優(yōu)勢,被廣泛應(yīng)用于低功耗的應(yīng)用系統(tǒng)和袖珍式儀表當中。這種工業(yè)字符型的液晶顯示模塊能夠同時顯示2行,每行16個字符,共計32個字符,本設(shè)計每行顯示一個采集點的溫度值。該液晶模塊自帶標準字庫,有160個不同的點陣字符圖形被存儲于其內(nèi)部字符發(fā)生存儲器(CGROM)中,這些字符包括英文字母的大小寫、阿拉伯數(shù)字、常用的符號等,每一個字符均對應(yīng)有一個固定的代碼??梢酝ㄟ^指令編程來實現(xiàn)對液晶顯示模塊的讀寫、屏幕和光標的操作等。
系統(tǒng)實時測量各點溫度,如果溫度達到告警設(shè)置,則由單片機的系統(tǒng)軟件控制P2.3引腳交替輸出高低電平,使三極管驅(qū)動聲光設(shè)備發(fā)出報警。
AT89C52單片機的串行接口與RS-232標準串口通信連接的接口電路詳見圖2所示。因為AT89C52單片機的串行接口采用TTL電平,從而和采用RS-232電平的PC機串口在接口規(guī)范上不一致,所以需要在單片機的串行接口和PC機的標準串行接口之間進行電平轉(zhuǎn)換,這里采用的是MAX232接口芯片來實現(xiàn)TTL電平到RS-232接口電平的轉(zhuǎn)換的。
系統(tǒng)軟件使用Keil C51開發(fā),采取模塊化的設(shè)計方法,使程序的結(jié)構(gòu)清晰,提高了開發(fā)調(diào)試的效率,利于以后軟件的升級和系統(tǒng)功能的擴展。程序設(shè)計模塊主要包括主程序、溫度轉(zhuǎn)換子程序、DS18B20時序子程序等。
主程序的主要功能是負責(zé)溫度數(shù)據(jù)的實時處理:調(diào)用溫度轉(zhuǎn)換子程序獲取實時溫度數(shù)據(jù),將實時溫度值與報警設(shè)定值進行比較,判斷是否發(fā)出聲光報警,同時將溫度值送LCD1602進行實時顯示,并同時把溫度數(shù)據(jù)由串口通訊實時發(fā)送給上位PC機。主程序流程圖如圖3所示。
圖3 主程序流程圖
主程序相關(guān)代碼程序如下:
void main() {
uint i;
fl oat tempr;
init();//初始化函數(shù)
while (1) {
for (i = 0;i < 2;i++) {
tempr = get_temp(get_serial + i * 8);//調(diào)用溫度轉(zhuǎn)換程序獲取實時溫度數(shù)據(jù)
if (i == 0) { //第一個溫度傳感器
if (tempr > warn1) {warn(1);} //判斷溫度是否超標報警
write_com(0x80);//在LCD的第一行顯示
sprintf(table1 + 6,” %0.1f”,tempr);//精確到小數(shù)點后一位
Display_LCD_String(table1);//送往LCD顯示Send_COM_String(table1);//由串口發(fā)送給上位PC機
}
if (i == 1) { //第二個溫度傳感器
if (tempr > warn2) {warn(2);} //判斷溫度是否超標報警
write_com(0x80 + 0x40);//在LCD的第二行顯示sprintf(table2 + 6,” %0.1f”,tempr);//精確到小數(shù)點后一位
Display_LCD_String(table2);//送往LCD顯示
Send_COM_String(table2);//由串口發(fā)送給上位PC機
} } } }
DS18B20在上電后是處于空閑狀態(tài)的,依據(jù)其單總線協(xié)議,每次溫度轉(zhuǎn)換都需要單片機通過以下4個步驟器發(fā)送命令控制傳感器來完成:(1)對DS18B20進行初始化即復(fù)位操作;(2)初始化成功后發(fā)送ROM指令用于識別器件;(3)發(fā)送一條RAM指令控制DS18B20完成相應(yīng)操作;(4)收發(fā)數(shù)據(jù)。由此設(shè)計溫度轉(zhuǎn)換子程序的程序流程圖如圖4所示。
圖4 溫度轉(zhuǎn)換子程序流程圖
DS18B20完成溫度轉(zhuǎn)換后得到的12位數(shù)據(jù)存儲于兩個8位的RAM中,如果溫度小于0,需要把測得的數(shù)值取反加1再乘以0.0625便是實際溫度,如果溫度大于0,把測得的數(shù)值乘以0.0625就是實際溫度。編寫設(shè)計溫度轉(zhuǎn)換子程序如下:
f
l oat get_temp(uchar *rom) ∥DS18B20溫度轉(zhuǎn)換函數(shù)
{
uchar a,b;
uint temp;
fl oat f_temp;
dsreset();//對DS18B20進行初始化即復(fù)位操作
delay(1);
tempwritebyte(0x55);// 匹配ROM指令,用來選定與所給ROM編碼相匹配的傳感器
tempwriteromcode(rom);//發(fā)送一個ROM編碼
tempwritebyte(0x44);// 發(fā)送溫度轉(zhuǎn)換指令
dsreset();//對DS18B20進行初始化即復(fù)位操作
delay(1);
tempwritebyte(0x55);// 匹配ROM指令,用來選定與所給ROM編碼相匹配的傳感器
tempwriteromcode(rom);//發(fā)送一個ROM編碼
tempwritebyte(0xbe);// 發(fā)送讀出暫存器指令
a = tempreadbyte();//讀低8位
b = tempreadbyte();//讀高8位
temp = b;
temp <<= 8;//兩個字節(jié)組合為1個字
temp = temp | a;
if ((temp & 0xf800) == 0xf800) { //判斷溫度正負值
f_temp = (~temp + 1) * 0.0625*-1;
} else {
f_temp = temp * 0.0625;//溫度在寄存器中為12位 分辨率位0.0625度
}
return f_temp;//返回實際溫度值
}
由于DS18B20是采用單總線協(xié)議方式在一根I/O線上進行數(shù)據(jù)的讀寫,這要求對數(shù)據(jù)位的讀寫有著嚴格的時序來保證各位數(shù)據(jù)得到正確完整地傳輸,并且所有的數(shù)據(jù)讀寫均由最低位開始。本系統(tǒng)單片機使用的晶振頻率是11.0592MHz,根據(jù)DS18B20的初始化時序、寫時序和讀時序要求,分別設(shè)計編寫了3個子程序。
(1)初始化時序:它是單總線上所有傳輸過程的開始。整個初始化過程由主機發(fā)出的復(fù)位脈沖和DS18B20發(fā)出的響應(yīng)脈沖組成。初始化時序子程序如下:
void dsreset(void) { ∥初始化時序函數(shù)
uint i;
ds = 0; ∥拉低總線
i = 103;
while (i > 0) ∥延時
i--;
ds = 1;∥釋放總線
i = 4;
while (i > 0) ∥延時
i--;
}
(2)讀時序:DS18B20只有在檢測到主機啟動讀時序后才向主機傳輸數(shù)據(jù)。因此在主機發(fā)送了讀數(shù)據(jù)命令后,必須馬上產(chǎn)生讀時序,以便DS18B20能夠傳輸數(shù)據(jù)。讀時序子程序如下:
bit tempreadbit(void) { ∥讀1位數(shù)據(jù)時序函數(shù)
uint i;
bit dat;
ds = 0; ∥拉低總線
i++;∥i++ 起延時作用
ds = 1;∥釋放總線
i++;∥i++ 起延時作用
i++;
dat = ds;∥讀1位數(shù)據(jù)
i = 8;
while (i > 0) ∥延時
i--;
return (dat);
}
uchar tempreadbyte(void) //讀1個字節(jié)數(shù)據(jù)時序函數(shù){
uchar i,j,dat;
dat = 0;
for (i = 1;i <= 8;i++) {
j = tempreadbit();
dat = (j << 7) | (dat >> 1);//剛好一個字節(jié)在dat里
}
return (dat);
}
(3)寫時序:對于DS18B20的寫時序分為寫0時序與寫1時序兩個過程。寫“0”時序用于主機向DS18B20寫入0,寫“1”時序用于主機向DS18B20寫入1。寫時序子程序如下:void tempwritebit(bit dat) { ∥寫1位數(shù)據(jù)時序函數(shù)
uint i;
if (dat) ∥寫 1
{ ds = 0; ∥拉低總線
i++;∥i++ 起延時作用
i++;
ds = 1;∥釋放總線,由上拉電阻將單總線拉至高電平
i = 8;
while (i > 0) ∥延時
i--;
} else { ∥寫 0
ds = 0; ∥拉低總線
i = 8;
while (i > 0) ∥延時
i--;
ds = 1;∥釋放總線
i++;∥i++ 起延時作用
i++;
} }
void tempwritebyte(uchar dat) //寫一個字節(jié)數(shù)據(jù)時序函數(shù)
{
uchar j;
bit testb;
for (j = 1;j <= 8;j++) {
testb = dat & 0x01;
dat = dat >> 1;
tempwritebit(testb);
} }
在通過模塊化的電路調(diào)試、軟件測試和整體集成后,系統(tǒng)各方面性能都滿足設(shè)計要求,測溫準確,數(shù)據(jù)顯示、傳輸和聲光報警都工作正常。隨著科學(xué)技術(shù)的發(fā)展,尤其是計算機技術(shù)的發(fā)展與普及,數(shù)據(jù)采集技術(shù)將有更為廣闊的發(fā)展前景[6],本文設(shè)計的遠距離多點數(shù)字式溫度采集系統(tǒng)作為一種數(shù)據(jù)采集技術(shù)可以廣泛應(yīng)用于糧倉、溫室大棚等農(nóng)業(yè)生產(chǎn)領(lǐng)域。
[1]DALLAS公司.DS18B20使用手冊[Z].2003.
[2]宋丹.多路溫度巡檢系統(tǒng)的設(shè)計與應(yīng)用[J].自動化與儀表,2008, 23(9):13-15.
[3]張彥兵,劉永前,李義強.1-wire總線驅(qū)動電路設(shè)計[J].傳感技術(shù)學(xué)報,2006,19(4):1020-1028.
[4]李文娟,海霞,葉諶雯.一種基于超聲波的檢測防撞系統(tǒng)的設(shè)計[J].自動化博覽,2007(6):80-81.
[5]王安敏,張凱.基于AT89C52單片機的超聲波測距系統(tǒng)[J].儀表技術(shù)與傳感器,2006(6):45-46.
[6]朱曉榮,周東輝.一種實用的分布式數(shù)據(jù)采集和控制系統(tǒng)[J].電子產(chǎn)品世界,2003(8):34-36.
Design of Multi-point Temperature Acquisition System Based on DS18B20
YE Xiao-le
(Information and Educational Technique Center,Zhanjiang Normal University,Zhanjiang 524048,China)
A multi-point temperature acquisition system is designed based on DS18b20 digital thermometer and AT89C52 MCU.The system consists of temperature acquisition module,RS-232 serial communication module,LCD1602 module,voice and light alarm module.The design method of concrete hardware and software of the system is given,and the system realizes the acquisition,indication,transmission and abnormal alarm of multipoint temperature.The system can be widely applie in agriculture domain such as granary,green house and so on,it has wide application prospects.
Temperature Acquisition;DS18B20;MCU
嶺南師范學(xué)院自然科學(xué)基金項目(L1211)。
葉小樂(1979—),男,江西大余人,碩士研究生,計算機科學(xué)與技術(shù)實驗師,研究方向:嵌入式系統(tǒng)、計算機網(wǎng)絡(luò)。