專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)DS18B20溫度測(cè)量

作者:劉山   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年11月13日   【字體:

    大家好,通過(guò)以前的學(xué)習(xí),我們已經(jīng)對(duì)51單片機(jī)綜合學(xué)習(xí)系統(tǒng)的使用方法及學(xué)習(xí)方式有所了解與熟悉,學(xué)會(huì)了步進(jìn)電機(jī)控制的基本知識(shí),體會(huì)到了綜合學(xué)習(xí)系統(tǒng)的易用性與易學(xué)性,這一期我們將一起學(xué)習(xí)數(shù)字溫度傳感器DS18B20的基本原理與使用方法。
      先看一下我們將要使用的51單片機(jī)綜合學(xué)習(xí)系統(tǒng)能完成哪些實(shí)驗(yàn)與產(chǎn)品開(kāi)發(fā)工作:分別有流水燈,數(shù)碼管顯示,液晶顯示,按鍵開(kāi)關(guān),蜂鳴器奏樂(lè),繼電器控制,IIC總線(xiàn),SPI總線(xiàn),PS/2實(shí)驗(yàn),AD模數(shù)轉(zhuǎn)換,光耦實(shí)驗(yàn),串口通信,紅外線(xiàn)遙控,無(wú)線(xiàn)遙控,溫度傳感,步進(jìn)電機(jī)控制等等。
     單總線(xiàn)溫度傳感器DS18B20簡(jiǎn)介
     DS18B20是DALLAS公司生產(chǎn)的單總線(xiàn)式數(shù)字溫度傳感器,它具有微型化、低功耗、高性能、搞干擾能力強(qiáng)、易配處理器等優(yōu)點(diǎn),特別適用于構(gòu)成多點(diǎn)溫度測(cè)控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(hào)(提供9位二進(jìn)制數(shù)字)給單片機(jī)處理,且在同一總線(xiàn)上可以?huà)旖佣鄠(gè)傳感器芯片。它具有3引腳TO-92小體積封裝形式,溫度測(cè)量范圍為-55℃~+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625℃,被測(cè)溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出,其工作電源既可在遠(yuǎn)端引入,也可采用寄生電源方式產(chǎn)生,多個(gè)DS18B20可以并聯(lián)到3根或2根線(xiàn)上,CPU只需一根端口線(xiàn)就能與多個(gè)DS18B20通信,占用微處理器的端口較少,可節(jié)省大量的引線(xiàn)和邏輯電路。以上特點(diǎn)使DS18B20非常適用于遠(yuǎn)距離多點(diǎn)溫度檢測(cè)系統(tǒng)。
    DS18B20外形及引腳說(shuō)明
    在TO-92和SO-8的封裝中引腳有所不同,具體差別請(qǐng)查閱PDF手冊(cè),在TO-92封裝中引腳分配如下:
    1(GND):地
    2(DQ):?jiǎn)尉(xiàn)運(yùn)用的數(shù)據(jù)輸入輸出引腳
    3(VDD):可選的電源引腳
    DS18B20工作過(guò)程及時(shí)序
    DS18B20內(nèi)部的低溫度系數(shù)振蕩器是一個(gè)振蕩頻率隨溫度變化很小的振蕩器,為計(jì)數(shù)器1提供一頻率穩(wěn)定的計(jì)數(shù)脈沖。
    高溫度系數(shù)振蕩器是一個(gè)振蕩頻率對(duì)溫度很敏感的振蕩器,為計(jì)數(shù)器2提供一個(gè)頻率隨溫度變化的計(jì)數(shù)脈沖。
    初始時(shí),溫度寄存器被預(yù)置成-55℃,每當(dāng)計(jì)數(shù)器1從預(yù)置數(shù)開(kāi)始減計(jì)數(shù)到0時(shí),溫度寄存器中寄存的溫度值就增加1℃,這個(gè)過(guò)程重復(fù)進(jìn)行,直到計(jì)數(shù)器2計(jì)數(shù)到0時(shí)便停止。
    初始時(shí),計(jì)數(shù)器1預(yù)置的是與-55℃相對(duì)應(yīng)的一個(gè)預(yù)置值。以后計(jì)數(shù)器1每一個(gè)循環(huán)的預(yù)置數(shù)都由斜率累加器提供。為了補(bǔ)償振蕩器溫度特性的非線(xiàn)性性,斜率累加器提供的預(yù)置數(shù)也隨溫度相應(yīng)變化。計(jì)數(shù)器1的預(yù)置數(shù)也就是在給定溫度處使溫度寄存器寄存值增加1℃計(jì)數(shù)器所需要的計(jì)數(shù)個(gè)數(shù)。
    DS18B20內(nèi)部的比較器以四舍五入的量化方式確定溫度寄存器的最低有效位。在計(jì)數(shù)器2停止計(jì)數(shù)后,比較器將計(jì)數(shù)器1中的計(jì)數(shù)剩余值轉(zhuǎn)換為溫度值后與0.25℃進(jìn)行比較,若低于0.25℃,溫度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃時(shí),溫度寄存器的最低位就進(jìn)位然后置0。這樣,經(jīng)過(guò)比較后所得的溫度寄存器的值就是最終讀取的溫度值了,其最后位代表0.5℃,四舍五入最大量化誤差為±1/2LSB,即0.25℃。
    溫度寄存器中的溫度值以9位數(shù)據(jù)格式表示,最高位為符號(hào)位,其余8位以二進(jìn)制補(bǔ)碼形式表示溫度值。測(cè)溫結(jié)束時(shí),這9位數(shù)據(jù)轉(zhuǎn)存到暫存存儲(chǔ)器的前兩個(gè)字節(jié)中,符號(hào)位占用第一字節(jié),8位溫度數(shù)據(jù)占據(jù)第二字節(jié)。
    DS18B20測(cè)量溫度時(shí)使用特有的溫度測(cè)量技術(shù)。DS18B20內(nèi)部的低溫度系數(shù)振蕩器能產(chǎn)生穩(wěn)定的頻率信號(hào);同樣的,高溫度系數(shù)振蕩器則將被測(cè)溫度轉(zhuǎn)換成頻率信號(hào)。當(dāng)計(jì)數(shù)門(mén)打開(kāi)時(shí),DS18B20進(jìn)行計(jì)數(shù),計(jì)數(shù)門(mén)開(kāi)通時(shí)間由高溫度系數(shù)振蕩器決定。芯片內(nèi)部還有斜率累加器,可對(duì)頻率的非線(xiàn)性度加以補(bǔ)償。測(cè)量結(jié)果存入溫度寄存器中。一般情況下的溫度值應(yīng)該為9位,但因符號(hào)位擴(kuò)展成高8位,所以最后以16位補(bǔ)碼形式讀出。
    DS18B20工作過(guò)程一般遵循以下協(xié)議:初始化——ROM操作命令——存儲(chǔ)器操作命令——處理數(shù)據(jù)
    ① 初始化
    單總線(xiàn)上的所有處理均從初始化序列開(kāi)始。初始化序列包括總線(xiàn)主機(jī)發(fā)出一復(fù)位脈沖,接著由從屬器件送出存在脈沖。存在脈沖讓總線(xiàn)控制器知道DS1820 在總線(xiàn)上且已準(zhǔn)備好操作。
   ② ROM操作命令
    一旦總線(xiàn)主機(jī)檢測(cè)到從屬器件的存在,它便可以發(fā)出器件ROM操作命令之一。所有ROM操作命令均為8位長(zhǎng)。這些命令列表如下:
Read ROM(讀ROM)[33h]
    此命令允許總線(xiàn)主機(jī)讀DS18B20的8位產(chǎn)品系列編碼,唯一的48位序列號(hào),以及8位的CRC。此命令只能在總線(xiàn)上僅有一個(gè)DS18B20的情況下可以使用。如果總線(xiàn)上存在多于一個(gè)的從屬器件,那么當(dāng)所有從片企圖同時(shí)發(fā)送時(shí)將發(fā)生數(shù)據(jù)沖突的現(xiàn)象(漏極開(kāi)路會(huì)產(chǎn)生線(xiàn)與的結(jié)果)。
    Match ROM( 符合ROM)[55h]
    此命令后繼以64位的ROM數(shù)據(jù)序列,允許總線(xiàn)主機(jī)對(duì)多點(diǎn)總線(xiàn)上特定的DS18B20尋址。只有與64位ROM序列嚴(yán)格相符的DS18B20才能對(duì)后繼的存貯器操作命令作出響應(yīng)。所有與64位ROM序列不符的從片將等待復(fù)位脈沖。此命令在總線(xiàn)上有單個(gè)或多個(gè)器件的情況下均可使用。
    Skip ROM( 跳過(guò)ROM )[CCh]
    在單點(diǎn)總線(xiàn)系統(tǒng)中,此命令通過(guò)允許總線(xiàn)主機(jī)不提供64位ROM編碼而訪(fǎng)問(wèn)存儲(chǔ)器操作來(lái)節(jié)省時(shí)間。如果在總線(xiàn)上存在多于一個(gè)的從屬器件而且在Skip ROM命令之后發(fā)出讀命令,那么由于多個(gè)從片同時(shí)發(fā)送數(shù)據(jù),會(huì)在總線(xiàn)上發(fā)生數(shù)據(jù)沖突(漏極開(kāi)路下拉會(huì)產(chǎn)生線(xiàn)與的效果)。
    Search ROM( 搜索ROM)[F0h]
    當(dāng)系統(tǒng)開(kāi)始工作時(shí),總線(xiàn)主機(jī)可能不知道單線(xiàn)總線(xiàn)上的器件個(gè)數(shù)或者不知道其64位ROM編碼。搜索ROM命令允許總線(xiàn)控制器用排除法識(shí)別總線(xiàn)上的所有從機(jī)的64位編碼。
    Alarm Search(告警搜索)[ECh]
    此命令的流程與搜索ROM命令相同。但是,僅在最近一次溫度測(cè)量出現(xiàn)告警的情況下,DS18B20才對(duì)此命令作出響應(yīng)。告警的條件定義為溫度高于TH 或低于TL。只要DS18B20一上電,告警條件就保持在設(shè)置狀態(tài),直到另一次溫度測(cè)量顯示出非告警值或者改變TH或TL的設(shè)置,使得測(cè)量值再一次位于允許的范圍之內(nèi)。貯存在EEPROM內(nèi)的觸發(fā)器值用于告警。
    ③ 存儲(chǔ)器操作命令
    Write Scratchpad(寫(xiě)暫存存儲(chǔ)器)[4Eh]
    這個(gè)命令向DS18B20的暫存器中寫(xiě)入數(shù)據(jù),開(kāi)始位置在地址2。接下來(lái)寫(xiě)入的兩個(gè)字節(jié)將被存到暫存器中的地址位置2和3?梢栽谌魏螘r(shí)刻發(fā)出復(fù)位命令來(lái)中止寫(xiě)入。
    Read Scratchpad(讀暫存存儲(chǔ)器)[BEh]
    這個(gè)命令讀取暫存器的內(nèi)容。讀取將從字節(jié)0開(kāi)始,一直進(jìn)行下去,直到第9(字節(jié)8,CRC)字節(jié)讀完。如果不想讀完所有字節(jié),控制器可以在任何時(shí)間發(fā)出復(fù)位命令來(lái)中止讀取。
    Copy Scratchpad(復(fù)制暫存存儲(chǔ)器)[48h]
    這條命令把暫存器的內(nèi)容拷貝到DS18B20的E2存儲(chǔ)器里,即把溫度報(bào)警觸發(fā)字節(jié)存入非易失性存儲(chǔ)器里。如果總線(xiàn)控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而DS18B20又正在忙于把暫存器拷貝到E2存儲(chǔ)器,DS18B20就會(huì)輸出一個(gè)“0”,如果拷貝結(jié)束的話(huà),DS18B20 則輸出“1”。如果使用寄生電源,總線(xiàn)控制器必須在這條命令發(fā)出后立即起動(dòng)強(qiáng)上拉并最少保持10ms。
    Convert T(溫度變換)[44h]
    這條命令啟動(dòng)一次溫度轉(zhuǎn)換而無(wú)需其他數(shù)據(jù)。溫度轉(zhuǎn)換命令被執(zhí)行,而后DS18B20保持等待狀態(tài)。如果總線(xiàn)控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而DS18B20又忙于做時(shí)間轉(zhuǎn)換的話(huà),DS18B20將在總線(xiàn)上輸出“0”,若溫度轉(zhuǎn)換完成,則輸出“1”。如果使用寄生電源,總線(xiàn)控制器必須在發(fā)出這條命令后立即起動(dòng)強(qiáng)上拉,并保持500ms。
    Recall E2(重新調(diào)整E2)[B8h]
    這條命令把貯存在E2中溫度觸發(fā)器的值重新調(diào)至?xí)捍娲鎯?chǔ)器。這種重新調(diào)出的操作在對(duì)DS18B20上電時(shí)也自動(dòng)發(fā)生,因此只要器件一上電,暫存存儲(chǔ)器內(nèi)就有了有效的數(shù)據(jù)。在這條命令發(fā)出之后,對(duì)于所發(fā)出的第一個(gè)讀數(shù)據(jù)時(shí)間片,器件會(huì)輸出溫度轉(zhuǎn)換忙的標(biāo)識(shí):“0”=忙,“1”=準(zhǔn)備就緒。
    Read Power Supply(讀電源)[B4h]
    對(duì)于在此命令發(fā)送至DS18B20之后所發(fā)出的第一讀數(shù)據(jù)的時(shí)間片,器件都會(huì)給出其電源方式的信號(hào):“0”=寄生電源供電,“1”=外部電源供電。
    ④ 處理數(shù)據(jù)
    DS18B20的高速暫存存儲(chǔ)器由9個(gè)字節(jié)組成,其分配如圖3所示。當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高速暫存存儲(chǔ)器的第0和第1個(gè)字節(jié)。單片機(jī)可通過(guò)單線(xiàn)接口讀到該數(shù)據(jù),讀取時(shí)低位在前,高位在后。
    DS18B20溫度數(shù)據(jù)表
    上表是DS18B20溫度采集轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在DS18B20的兩個(gè)8比特的RAM中,二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于或等于0,這5位為0,只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。
    溫度轉(zhuǎn)換計(jì)算方法舉例:
    例如當(dāng)DS18B20采集到+125℃的實(shí)際溫度后,輸出為07D0H,則:
    實(shí)際溫度=07D0H╳0.0625=2000╳0.0625=1250C。
    例如當(dāng)DS18B20采集到-55℃的實(shí)際溫度后,輸出為FC90H,則應(yīng)先將11位數(shù)據(jù)位取反加1得370H(符號(hào)位不變,也不作為計(jì)算),則:
    實(shí)際溫度=370H╳0.0625=880╳0.0625=550C。
    DS18B20軟、硬件設(shè)計(jì)
    本實(shí)例介紹DS18B20與單片機(jī)之間的軟、硬件接口,通過(guò)單片機(jī)來(lái)讀取DS18B20的溫度值,并將溫度值通過(guò)數(shù)碼管顯示出來(lái)。在實(shí)驗(yàn)中先要將功能選擇開(kāi)關(guān)調(diào)到DS18B20位置上。
/***************************************************************************/
/*DS18B20演示程序 */
/*目標(biāo)器件:AT89S51 */
/*晶振:11.0592MHZ */
/*編譯環(huán)境:Keil 7.50A */
/***************************************************************************/
/*********************************包含頭文件********************************/
#include <reg51.h>
/*******************************共陽(yáng)LED段碼表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*********************************端口定義**********************************/
sbit DQ=P3^3; //數(shù)據(jù)傳輸線(xiàn)接單片機(jī)的相應(yīng)的引腳
/*********************************定義全局變量******************************/
unsigned char tempL=0; //臨時(shí)變量低位
unsigned char tempH=0; //臨時(shí)變量高位
float temperature; //溫度值
/****************************************************************************
函數(shù)功能:延時(shí)子程序
入口參數(shù):k
出口參數(shù):
/****************************************************************************/
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}
/****************************************************************************
函數(shù)功能:數(shù)碼管掃描延時(shí)子程序
入口參數(shù):
出口參數(shù):
***************************************************************************/
void delay1(void)
{
int k;
for(k=0;k<400;k++);
}
/****************************************************************************
函數(shù)功能:數(shù)碼管顯示子程序
入口參數(shù):k
出口參數(shù):
/****************************************************************************/
void display(int k)
{
P2=0xfe;
P0=tab[k/1000];
delay1();
P2=0xfd;
P0=tab[k%1000/100];
delay1();
P2=0xfb;
P0=tab[k%100/10];
delay1();
P2=0xf7;
P0=tab[k%10];
delay1();
P2=0xff;
}
/****************************************************************************
函數(shù)功能:DS18B20初始化子程序
入口參數(shù):
出口參數(shù):
/****************************************************************************/
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延時(shí)
DQ=0; //發(fā)送復(fù)位脈沖
delay(85); //延時(shí)(>480ms)
DQ=1; //拉高數(shù)據(jù)線(xiàn)
delay(14); //等待(15~60ms)
}
/****************************************************************************
函數(shù)功能:向DS18B20讀一字節(jié)數(shù)據(jù)
入口參數(shù):
出口參數(shù):dat
/****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/****************************************************************************
函數(shù)功能:向DS18B20寫(xiě)一字節(jié)數(shù)據(jù)
入口參數(shù):dat
出口參數(shù):
****************************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
/****************************************************************************
函數(shù)功能:向DS18B20讀溫度值
入口參數(shù):
出口參數(shù):temperature
****************************************************************************/
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
//溫度轉(zhuǎn)換,把高低位做相應(yīng)的運(yùn)算轉(zhuǎn)化為實(shí)際溫度
temperature=((tempH*256)+tempL)*0.0625;
delay(200);
return(temperature);
}
/****************************************************************************
函數(shù)功能:主程序
入口參數(shù):
出口參數(shù):
****************************************************************************/
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(i);
}
}
相信看到這里,你應(yīng)該可以理解DS18B20數(shù)字溫度傳感器的原理是怎么樣的了,你也可以根據(jù)自己的需要來(lái)寫(xiě)一下溫度探測(cè)及相關(guān)控制的程序。由于篇幅有限,讀者朋友可以通過(guò)網(wǎng)站或電子郵件一起交流與學(xué)習(xí)

關(guān)閉窗口

相關(guān)文章