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