左現(xiàn)剛,劉艷昌
(河南科技學(xué)院 信息工程學(xué)院,新鄉(xiāng) 453003)
單片機(jī)系統(tǒng)除了可以對(duì)電信號(hào)進(jìn)行測(cè)量外,還可以通過外接傳感器對(duì)溫度信號(hào)進(jìn)行測(cè)量。傳統(tǒng)的溫度檢測(cè)大多以熱敏電阻為傳感器,但熱敏電阻可靠性差、測(cè)量的溫度不夠準(zhǔn)確,且必須經(jīng)專門的接口電路轉(zhuǎn)成數(shù)字信號(hào)后才能被單片機(jī)處理。DS18B20是一種集成數(shù)字溫度傳感器,采用單總線與單片機(jī)連接即可實(shí)現(xiàn)溫度的測(cè)量。
系統(tǒng)是以AT89S51單片機(jī)、DS18B20單線溫度轉(zhuǎn)換器和LED為主要元器件得的一個(gè)對(duì)溫度進(jìn)行數(shù)據(jù)采集并在LED上進(jìn)行顯示的系統(tǒng)。它實(shí)現(xiàn)的功能就是把模擬的溫度信號(hào)以數(shù)字化的形式在LED上顯示出來,使人們更直接方便的讀出溫度值。系統(tǒng)整體框圖如下圖1所示。

圖1 系統(tǒng)整體框圖
DS18B20是美國(guó)DALLAS半導(dǎo)體公司推出的第一片支持“一線總線”接口的溫度傳感器,它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配微處理器等優(yōu)點(diǎn),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(hào)供單片機(jī)處理,可實(shí)現(xiàn)溫度的精度測(cè)量與控制。測(cè)溫范圍為-55℃~+125℃,在-10℃~+85℃時(shí)精度為±0.5℃,分辨率可通過編程控制設(shè)置為0.5℃,0.25℃,0.125℃和0.0625℃。
DS18B20的內(nèi)部框圖如圖2所示,主要包括寄生電源、溫度傳感器、64位激光ROM單線接口、存放中間數(shù)據(jù)的高速貯存器、用于存儲(chǔ)用戶設(shè)定的溫度上下限值、觸發(fā)器存儲(chǔ)與控制邏輯、8位循環(huán)冗余校驗(yàn)碼發(fā)生器等7部分。

圖2 DS18B20內(nèi)部框圖
高速寄存器RAM由9個(gè)字節(jié)的存儲(chǔ)器組成。其中,第0、1字節(jié)是溫度轉(zhuǎn)換有效位,第0字節(jié)的低3位存放了溫度的高位,高5位存放溫度的正負(fù)值;第1字節(jié)的高4位存放溫度的低位,后4位存放溫度的小數(shù)部分;第2和第3個(gè)字節(jié)是DS18B20的與內(nèi)部E2PROM的有關(guān)的TH和TL,用來存儲(chǔ)溫度上限和下限,可以通過程序設(shè)計(jì)把溫度的上下限從單片機(jī)中讀到TH和TL中,并通過程序再?gòu)?fù)制到DS18B20內(nèi)部E2PROM中,同時(shí)TH和TL在器件加電后復(fù)制E2PROM的內(nèi)容;第4個(gè)字節(jié)是配置寄存器,第4個(gè)字節(jié)的數(shù)字也可以更新;第5,6,7三個(gè)字節(jié)是保留的。
DS18B20中的溫度傳感器完成對(duì)溫度的測(cè)量,通過16位符號(hào)擴(kuò)展的2進(jìn)制補(bǔ)碼讀數(shù)形式提供,以0.0625℃/LSB形式表達(dá),如表1所示。

表1 高速寄存器RAM
DS18B20是單片機(jī)外設(shè),單片機(jī)為主器件,DS18B20為從器件。圖3的接法是單片機(jī)與一個(gè)DS18B20通信,單片機(jī)只需要一個(gè)I/O口就可以控制DS18B20,為了增加單片機(jī)I/O口驅(qū)動(dòng)的可靠性,總線上接有上拉電阻。對(duì)如果要控制多個(gè)DS18B20進(jìn)行溫度采集,只要將所有DS18B20的DQ全部連接到總線上就可以了,在操作時(shí),通過讀取每個(gè)DS18B20內(nèi)部芯片的序列號(hào)來識(shí)別。
由于DS18B20是在一根I/O線上讀寫數(shù)據(jù),因此,對(duì)讀寫的數(shù)據(jù)位有著嚴(yán)格的時(shí)序要求。DS18B20有嚴(yán)格的通信協(xié)議來保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議定義了三種信號(hào)的時(shí)序:初始化時(shí)序、讀時(shí)序和寫時(shí)序。所有時(shí)序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動(dòng)啟動(dòng)寫時(shí)序開始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動(dòng)讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。下面分別介紹操作步驟。

圖3 單片機(jī)與一個(gè)DS18B20通信
1)初始化
初始化是單片機(jī)對(duì)DS18B20的基本操作,主要目的是單片機(jī)感知DS18B20存在并為下一步操作做準(zhǔn)備,同時(shí)啟動(dòng)DS18B20,程序設(shè)計(jì)根據(jù)時(shí)序進(jìn)行。DS18B20初始化操作步驟為:
(1)先將數(shù)據(jù)線置高電平1,然后延時(shí)(可有可無);
(2)數(shù)據(jù)線拉到低電平0。然后延時(shí)750μs(該時(shí)間范圍可以在480~960μs),調(diào)用延時(shí)函數(shù)決定;
(3)數(shù)據(jù)線拉到高電平1。如果單片機(jī)P1.0接DS18B20的DQ引腳,則P1.0 此時(shí)設(shè)置高電平,稱為單片機(jī)對(duì)總線電平管理權(quán)釋放。此時(shí),P1.0的電平高低由DS18B20的DQ輸出決定;
(4)延時(shí)等待。如果初始化成功,則在15~60ms總線上產(chǎn)生一個(gè)由DS18B20返回的低電平0,據(jù)該狀態(tài)可以確定它的存在。但是應(yīng)注意,不能無限地等待,不然會(huì)使程序進(jìn)入死循環(huán),所以要進(jìn)行超時(shí)判斷;
(5)若單片機(jī)讀到數(shù)據(jù)線上的低電平0后,說明DS18B20存在并相應(yīng),還要進(jìn)行延時(shí),其延時(shí)的時(shí)間從發(fā)出高電平算起(第(5)步的時(shí)間算起)最少要 480μs;
(6)將數(shù)據(jù)線再次拉到高電平1,結(jié)束初始化步驟。
從單片機(jī)對(duì)DS18B20的初始化過程來看,單片機(jī)與DS18B20之間的關(guān)系如同有人與人之間對(duì)話,單片機(jī)要對(duì)DS18B20操作,必須先證實(shí)DS18B20的存在,當(dāng)DS18B2響應(yīng)后,單片機(jī)才能進(jìn)行下面的操作。
2)對(duì)DS18B20寫數(shù)據(jù)
(1)數(shù)據(jù)線先置低電平0,數(shù)據(jù)發(fā)送的起始信號(hào);
(2)延時(shí)確定的時(shí)間為15μs;
(3)按低位到高位順序發(fā)送數(shù)據(jù)(一次只發(fā)送一位);
(4)延時(shí)時(shí)間為45μs,等待DS18B20接收;
(5)將數(shù)據(jù)線拉到高電平1,單片機(jī)釋放總線;
(6)重復(fù)(1)~(5)步驟,直到發(fā)送完整個(gè)字節(jié);
(7)最后將數(shù)據(jù)線拉高,單片機(jī)釋放總線。
3)DS18B20讀數(shù)據(jù)
(1)將數(shù)據(jù)線拉高;
(2)延時(shí) 2μs;
(3)將數(shù)據(jù)線拉低到0;
(4)延時(shí)6μs,延時(shí)時(shí)比寫數(shù)據(jù)時(shí)間短;
(5)將數(shù)據(jù)線拉高到1,釋放總線;
(6)延時(shí) 4μs;
(7)讀數(shù)據(jù)線的狀態(tài)得到一個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理;
(8)延時(shí) 30μs;
(9)重復(fù)(1)~(7)步驟,直到讀取完一個(gè)字節(jié)。
只有在熟悉了DS18B20操作時(shí)序后,才能對(duì)器件進(jìn)行編程,由于DS18B20有器件編號(hào)、溫度數(shù)據(jù)有低位高位、另外還有溫度的上線限,讀取的數(shù)據(jù)較多,所以DS18B20提供了自己的指令。
1)ROM操作指令
DS18B20指令主要有ROM操作指令、溫度操作指令兩類。ROM操作指令主要針對(duì)DS18B20的內(nèi)部ROM。每一個(gè)DS18B20都有自己獨(dú)立的編號(hào),存放在DS18B20內(nèi)部64位ROM中,ROM內(nèi)容見表2所示。64位ROM中的序列號(hào)是出廠前已經(jīng)固化好,它可以看做該DS18B20的地址序列碼。其各位排列順序是,開始8位為產(chǎn)品類型標(biāo)號(hào),接下來48位是該DS18B20自身的序列號(hào),最后8位是前面56位的CRC循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。

表264 位 ROM 定義
ROM的作用是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一條總線上掛接多個(gè)DS18B20的目的。ROM操作指令如表3所示。
在實(shí)際應(yīng)用中,如果總線上只存在一個(gè)DS18B20,就不需要讀取ROM編碼以及匹配ROM編碼了,只要跳過ROM(CCH)命令,就可進(jìn)行如下溫度轉(zhuǎn)換和讀取操作。
2)溫度操作指令
溫度操作指令見表4所示,DS18B20在出廠時(shí)溫度數(shù)值默認(rèn)為12位,其中最高位為符號(hào)位,即

表3 ROM 操作指令
溫度值共11位,單片機(jī)在讀取數(shù)據(jù)時(shí),依次從高速寄存器第0、1地址讀2字節(jié)共16位,讀完后將低11位的二進(jìn)制數(shù)轉(zhuǎn)轉(zhuǎn)換為實(shí)際溫度值。0地址對(duì)應(yīng)的1個(gè)字節(jié)的前5個(gè)數(shù)字為符號(hào)位,這5位同時(shí)變化,前5位為1時(shí),讀取的溫度為負(fù)值;前5位為0時(shí),讀取的溫度為正值,且溫度為正值時(shí),只要將測(cè)得的數(shù)值乘以0.0625即可得到實(shí)際溫度值。

表4 溫度操作指令
AT89S51單片機(jī)和DS18B20的硬件連接圖如圖4所示,單片機(jī)的P10口和DS18B20的數(shù)據(jù)口相連接。單片機(jī)通過P10口對(duì)DS18B20進(jìn)行初始化,DS18B20將轉(zhuǎn)換后的數(shù)字溫度值通過P10口傳給單片機(jī)。

圖4 溫度采集系統(tǒng)硬件連接圖
本程序采用Keil 公司IDE軟件uVision3設(shè)計(jì)和編譯。主要包括溫度檢測(cè)和顯示,按鍵驅(qū)動(dòng)和溫度控制等。其中溫度檢測(cè)是單片機(jī)通過調(diào)用初始化函數(shù)對(duì)DS18B20按照初始化時(shí)序進(jìn)行初始化,啟動(dòng)溫度的轉(zhuǎn)換,再將轉(zhuǎn)換后的數(shù)字傳給單片機(jī),單片機(jī)通過計(jì)算將數(shù)字溫度轉(zhuǎn)換成實(shí)際的溫度值,通過數(shù)碼管顯示出來,并和設(shè)置的溫度值進(jìn)行比較,如何大于設(shè)置的溫度上限或者小于設(shè)置的溫度的下限,則給P11管腳一個(gè)低電平信號(hào),則PNP三極管8550導(dǎo)通,驅(qū)動(dòng)蜂鳴器發(fā)出告警聲音;同時(shí)調(diào)用控制程序來控制P12管腳以便吸合或者斷開,達(dá)到根據(jù)溫度來控制的目的。其初始化函數(shù)可以根據(jù)上面介紹的過程寫出,下面詳細(xì)的介紹對(duì)DS18B20的溫度讀取函數(shù)。主程序流程圖如圖5所示。
/*******************************
* 讀取溫度函數(shù)
*******************************/
uint ReadTemperature(void)
{
unsigned char a=0,b=0;
Init_DS18B20(); //DS18B20初始化函數(shù)
WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delay(200); //延遲一段時(shí)間,等待溫度轉(zhuǎn)換完畢

圖5 主程序流程圖
Init_DS18B20(); //在讀溫度值前必須重新初始化18b20;
WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
a=ReadOneChar();//讀溫度值低8位,賦給變量a。
b=ReadOneChar();//讀溫度值高8位,賦給變量b。
t=b;
t<<=8; //
t=t|a; //把溫度值低8位和溫度值高8位賦給變量t。
tt=t*0.0625; //12位分辨率,乘以溫度分辨率0.0625后為溫度值
t=tt*10+0.5; //取小數(shù)點(diǎn)后一位值,因此要放大10倍后加0.5輸出,即四舍五入。
return(t); //返回溫度值,送LED顯示并和設(shè)置的溫度值進(jìn)行比較。
}
DS18B20體積小、精度高、接口簡(jiǎn)單、硬件開銷低、附加功能強(qiáng)。將溫度檢測(cè)與溫度數(shù)據(jù)輸出都集成在一個(gè)微小的芯片上,不需要A/D轉(zhuǎn)換,并且能自動(dòng)產(chǎn)生CRC檢驗(yàn)碼,從而使得其的抗干擾糾錯(cuò)能力很強(qiáng)、可靠性更高、使用更為方便?;贏T89S51系列單片機(jī)和DS18B20數(shù)字溫度傳感器的溫度測(cè)量系統(tǒng)結(jié)構(gòu)簡(jiǎn)單、成本低、操方便,比較好推廣,而且也可以根據(jù)情況進(jìn)行擴(kuò)展,比如進(jìn)行多點(diǎn)采集等。
[1] 孔慶霞, 朱全銀.基于DS18B20的遠(yuǎn)距離分布式溫度數(shù)據(jù)采集系統(tǒng)[J].電子測(cè)量技術(shù), 2009, 32: 4.
[2] 馬臣崗, 孟立凡.基于單總線式無線溫度采集系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程, 2010(3): 31-33.
[3] 舒斌, 吳建, 仲志燕.基于單片機(jī)和FPGA的遠(yuǎn)程溫度監(jiān)控系統(tǒng)[J].現(xiàn)代電子技術(shù),2008,31(17):127-130.
[4] 張軍.智能溫度傳感器DS18B20及其應(yīng)用[J].儀表技術(shù),2010, 4: 68-70.
[5] 周學(xué)軍.基于AT89C2051的數(shù)字溫度計(jì)設(shè)計(jì)[J].現(xiàn)代電子技術(shù), 2010, 17: 164-165.