DS18B20的原理與應用
DS18B20的特點(diǎn):
DS18B20內部結構:
主要由4部分組成:64 位ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。ROM中的64位序列號是出廠(chǎng)前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個(gè)DS18B20的64位序列號均不相同。64位ROM的排的循環(huán)冗余校驗碼(CRC=X^8+X^5+X^4+1)。 ROM的作用是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現一根總線(xiàn)上掛接多個(gè)DS18B20的目的。

DS18B20管腳排列:
1. GND為電源地;
2. DQ為數字信號輸入/輸出端;
3. VDD為外接供電電源輸入端(在寄生電源接線(xiàn)方式時(shí)接地)

DS18B20內部構成:
高速暫存存儲器由9個(gè)字節組成,當溫度轉換命令發(fā)布后,經(jīng)轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲器的第0和第1個(gè)字節。單片機可通過(guò)單線(xiàn)接口讀到該數據,讀取時(shí)低位在前,高位在后,對應的溫度計算:當符號位S=0時(shí),直接將二進(jìn)制位轉換為十進(jìn)制;當S=1時(shí),先將補碼變?yōu)樵a,再計算十進(jìn)制值。

溫度的低八位數據 0
溫度的高八位數據 1
高溫閥值 2
低溫閥值 3
保留 4
保留 5
計數剩余值 6
每度計數值 7
CRC 校驗 8
讀操作

對于讀數據操作時(shí)序也分為讀0時(shí)序和讀1時(shí)序兩個(gè)過(guò)程。讀時(shí)隙是從主機把單總線(xiàn)拉低之后,在1微秒之后就得釋放單總線(xiàn)為高電平,以讓DS18B20把數據傳輸到單總線(xiàn)上。DS18B20在檢測到總線(xiàn)被拉低1微秒后,便開(kāi)始送出數據,若是要送出0就把總線(xiàn)拉為低電平直到讀周期結束。若要送出1則釋放總線(xiàn)為高電平。主機在一開(kāi)始拉低總線(xiàn)1微秒后釋放總線(xiàn),然后在包括前面的拉低總線(xiàn)電平1微秒在內的15微秒時(shí)間內完成對總線(xiàn)進(jìn)行采樣檢測,采樣期內總線(xiàn)為低電平則確認為0。采樣期內總線(xiàn)為高電平則確認為1。完成一個(gè)讀時(shí)序過(guò)程,至少需要60us才能完成
(1)每次讀寫(xiě)前對 DS18B20 進(jìn)行復位初始化。復位要求主 CPU 將數據線(xiàn)下拉 500us ,然后釋放, DS18B20 收到信號后等待 16us~60us 左右,然后發(fā)出60us~240us 的存在低脈沖,主 CPU 收到此信號后表示復位成功。
(2)發(fā)送一條 ROM 指令

(3)發(fā)送存儲器指令

具體操作舉例:
現在我們要做的是讓DS18B20進(jìn)行一次溫度的轉換,那具體的操作就是:
1、主機先作個(gè)復位操作,
2、主機再寫(xiě)跳過(guò)ROM的操作(CCH)命令,
3、然后主機接著(zhù)寫(xiě)個(gè)轉換溫度的操作命令,后面釋放總線(xiàn)至少一秒,讓DS18B20完成轉換的操作。在這里要注意的是每個(gè)命令字節在寫(xiě)的時(shí)候都是低字節先寫(xiě),例如CCH的二進(jìn)制為11001100,在寫(xiě)到總線(xiàn)上時(shí)要從低位開(kāi)始寫(xiě),寫(xiě)的順序是“零、零、壹、壹、零、零、壹、壹”。整個(gè)操作的總線(xiàn)狀態(tài)如下圖。

讀取RAM內的溫度數據。同樣,這個(gè)操作也要接照三個(gè)步驟。
1、主機發(fā)出復位操作并接收DS18B20的應答(存在)脈沖。
2、主機發(fā)出跳過(guò)對ROM操作的命令(CCH)。
3、主機發(fā)出讀取RAM的命令(BEH),隨后主機依次讀取DS18B20發(fā)出的從第0一第8,共九個(gè)字節的數據。如果只想讀取溫度數據,那在讀完第0和第1個(gè)數據后就不再理會(huì )后面DS18B20發(fā)出的數據即可。同樣讀取數據也是低位在前的。整個(gè)操作的總線(xiàn)狀態(tài)如下圖:
C語(yǔ)言代碼
sbit DQ=P3^3;
uchar t; //設置全局變量,專(zhuān)門(mén)用于延時(shí)程序
bit Init_DS18B20(void)
{
bit flag;
DQ=1;
_nop_(); //??????????????? for(t=0;t<2;t++);
DQ=0;
for(t=0;t<200;t++);
DQ=1;
for(t=0;t<15;t++);//????????????????? for(t=0;t<10;t++);
flag=DQ;
for(t=0;t<200;t++);
return flag;
}
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1; //人為拉高,為單片機檢測DS18B20的輸出電平做準備
for(t=0;t<3;t++);//延時(shí)月9us ????????????????????????? for(t=0;t<2;t++);
dat>>=1;
if(DQ==1)
{
dat|=0x80;
}
else
dat|=0x00;
for(t=0;t<1;t++);//延時(shí)3us,兩個(gè)個(gè)讀時(shí)序間至少需要1us的恢復期 ??????????for(t=0;t<8;t++);
}
return dat;
}
void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();// ??????????????????????????????????????????????
DQ=dat&0x01;
for(t=0;t<15;t++);//延時(shí)約45us,DS18B20在15~60us對數據采樣 ??????????????? for(t=0;t<10;t++);
DQ=1; //釋放數據線(xiàn)
for(t=0;t<1;t++); //延時(shí)3us,兩個(gè)寫(xiě)時(shí)序間至少需要1us的恢復期
dat>>=1;
}
for(t=0;t<4;t++);
}
void ReadyReadTemp(void)
{
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delaynms(1000); // ?????????????????????????? delaynms(200);
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
}
- DS18B20 單線(xiàn)數字溫度傳感器,即“一線(xiàn)器件”,其具有獨特的優(yōu)點(diǎn):
- ( 1 )采用單總線(xiàn)的接口方式與微處理器連接時(shí)僅需要一條口線(xiàn)即可實(shí)現微處理器與 DS18B20 的雙向通訊。單總線(xiàn)具有經(jīng)濟性好,抗干擾能力強,適合于惡劣環(huán)境的現場(chǎng)溫度測量,使用方便等優(yōu)點(diǎn),使用戶(hù)可輕松地組建傳感器網(wǎng)絡(luò ),為測量系統的構建引入全新概念。
- ( 2 )測量溫度范圍寬,測量精度高 DS18B20 的測量范圍為 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范圍內,精度為 ± 0.5°C 。
- ( 3 )在使用中不需要任何外圍元件。
- ( 4 )持多點(diǎn)組網(wǎng)功能 多個(gè) DS18B20 可以并聯(lián)在惟一的單線(xiàn)上,實(shí)現多點(diǎn)測溫。
- ( 5 )供電方式靈活 DS18B20 可以通過(guò)內部寄生電路從數據線(xiàn)上獲取電源。因此,當數據線(xiàn)上的時(shí)序滿(mǎn)足一定的要求時(shí),可以不接外部電源,從而使系統結構更趨簡(jiǎn)單,可靠性更高。
- ( 6 )測量參數可配置 DS18B20 的測量分辨率可通過(guò)程序設定 9~12 位。
- ( 7 )負壓特性電源極性接反時(shí),溫度計不會(huì )因發(fā)熱而燒毀,但不能正常工作。
- ( 8 )掉電保護功能 DS18B20 內部含有 EEPROM ,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。
DS18B20 具有體積更小、適用電壓更寬、更經(jīng)濟、可選更小的封裝方式,更寬的電壓適用范圍,適合于構建自己的經(jīng)濟的測溫系統,因此也就被設計者們所青睞。
DS18B20內部結構:

DS18B20管腳排列:
1.
2.
3.

DS18B20內部構成:
高速暫存存儲器由9個(gè)字節組成,當溫度轉換命令發(fā)布后,經(jīng)轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲器的第0和第1個(gè)字節。單片機可通過(guò)單線(xiàn)接口讀到該數據,讀取時(shí)低位在前,高位在后,對應的溫度計算:當符號位S=0時(shí),直接將二進(jìn)制位轉換為十進(jìn)制;當S=1時(shí),先將補碼變?yōu)樵a,再計算十進(jìn)制值。

溫度的低八位數據 0
溫度的高八位數據 1
DS18B20中的溫度傳感器完成對溫度的測量,用16位二進(jìn)制形式提供,形式表達,其中S為符號位。


例如:
+125℃的數字輸出07D0H
(正溫度直接把16進(jìn)制數轉成10進(jìn)制即得到溫度值 )
-55℃的數字輸出為 FC90H。
(負溫度把得到的16進(jìn)制數取反后加1 再轉成10進(jìn)制數)
DS18B20的工作時(shí)序:
初始化時(shí)序

主機首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線(xiàn)變?yōu)楦唠娖?,并在隨后的480微秒時(shí)間內對總線(xiàn)進(jìn)行檢測,如果有低電平出現說(shuō)明總線(xiàn)上有器件已做出應答。若無(wú)低電平出現一直都是高電平說(shuō)明總線(xiàn)上無(wú)器件應答。
做為從器件的DS18B20在一上電后就一直在檢測總線(xiàn)上是否有480-960微秒的低電平出現,如果有,在總線(xiàn)轉為高電平后等待15-60微秒后將總線(xiàn)電平拉低60-240微秒做出響應存在脈沖,告訴主機本器件已做好準備。若沒(méi)有檢測到就一直在檢測等待。
寫(xiě)操作

寫(xiě)周期最少為60微秒,最長(cháng)不超過(guò)120微秒。寫(xiě)周期一開(kāi)始做為主機先把總線(xiàn)拉低1微秒表示寫(xiě)周期開(kāi)始。隨后若主機想寫(xiě)0,則繼續拉低電平最少60微秒直至寫(xiě)周期結束,然后釋放總線(xiàn)為高電平。若主機想寫(xiě)1,在一開(kāi)始拉低總線(xiàn)電平1微秒后就釋放總線(xiàn)為高電平,一直到寫(xiě)周期結束。而做為從機的DS18B20則在檢測到總線(xiàn)被拉底后等待15微秒然后從15us到45us開(kāi)始對總線(xiàn)采樣,在采樣期內總線(xiàn)為高電平則為1,若采樣期內總線(xiàn)為低電平則為0。


例如:
(正溫度直接把16進(jìn)制數轉成10進(jìn)制即得到溫度值 )
(負溫度把得到的16進(jìn)制數取反后加1 再轉成10進(jìn)制數)
DS18B20的工作時(shí)序:
初始化時(shí)序

主機首先發(fā)出一個(gè)480-960微秒的低電平脈沖,然后釋放總線(xiàn)變?yōu)楦唠娖?,并在隨后的480微秒時(shí)間內對總線(xiàn)進(jìn)行檢測,如果有低電平出現說(shuō)明總線(xiàn)上有器件已做出應答。若無(wú)低電平出現一直都是高電平說(shuō)明總線(xiàn)上無(wú)器件應答。
做為從器件的DS18B20在一上電后就一直在檢測總線(xiàn)上是否有480-960微秒的低電平出現,如果有,在總線(xiàn)轉為高電平后等待15-60微秒后將總線(xiàn)電平拉低60-240微秒做出響應存在脈沖,告訴主機本器件已做好準備。若沒(méi)有檢測到就一直在檢測等待。
寫(xiě)操作

寫(xiě)周期最少為60微秒,最長(cháng)不超過(guò)120微秒。寫(xiě)周期一開(kāi)始做為主機先把總線(xiàn)拉低1微秒表示寫(xiě)周期開(kāi)始。隨后若主機想寫(xiě)0,則繼續拉低電平最少60微秒直至寫(xiě)周期結束,然后釋放總線(xiàn)為高電平。若主機想寫(xiě)1,在一開(kāi)始拉低總線(xiàn)電平1微秒后就釋放總線(xiàn)為高電平,一直到寫(xiě)周期結束。而做為從機的DS18B20則在檢測到總線(xiàn)被拉底后等待15微秒然后從15us到45us開(kāi)始對總線(xiàn)采樣,在采樣期內總線(xiàn)為高電平則為1,若采樣期內總線(xiàn)為低電平則為0。
讀操作

對于讀數據操作時(shí)序也分為讀0時(shí)序和讀1時(shí)序兩個(gè)過(guò)程。讀時(shí)隙是從主機把單總線(xiàn)拉低之后,在1微秒之后就得釋放單總線(xiàn)為高電平,以讓DS18B20把數據傳輸到單總線(xiàn)上。DS18B20在檢測到總線(xiàn)被拉低1微秒后,便開(kāi)始送出數據,若是要送出0就把總線(xiàn)拉為低電平直到讀周期結束。若要送出1則釋放總線(xiàn)為高電平。主機在一開(kāi)始拉低總線(xiàn)1微秒后釋放總線(xiàn),然后在包括前面的拉低總線(xiàn)電平1微秒在內的15微秒時(shí)間內完成對總線(xiàn)進(jìn)行采樣檢測,采樣期內總線(xiàn)為低電平則確認為0。采樣期內總線(xiàn)為高電平則確認為1。完成一個(gè)讀時(shí)序過(guò)程,至少需要60us才能完成
DS18B20 單線(xiàn)通信:
DS18B20 單線(xiàn)通信功能是分時(shí)完成的,他有嚴格的時(shí)隙概念,如果出現序列混亂, 1-WIRE 器件將不響應主機,因此讀寫(xiě)時(shí)序很重要。系統對 DS18B20 的各種操作必須按協(xié)議進(jìn)行。根據 DS18B20 的協(xié)議規定,微控制器控制 DS18B20 完成溫度的轉換必須經(jīng)過(guò)以下 3個(gè)步驟 :(1)每次讀寫(xiě)前對 DS18B20 進(jìn)行復位初始化。復位要求主 CPU 將數據線(xiàn)下拉 500us ,然后釋放, DS18B20 收到信號后等待 16us~60us 左右,然后發(fā)出60us~240us 的存在低脈沖,主 CPU 收到此信號后表示復位成功。
(2)發(fā)送一條 ROM 指令

(3)發(fā)送存儲器指令

具體操作舉例:
現在我們要做的是讓DS18B20進(jìn)行一次溫度的轉換,那具體的操作就是:
1、主機先作個(gè)復位操作,
2、主機再寫(xiě)跳過(guò)ROM的操作(CCH)命令,
3、然后主機接著(zhù)寫(xiě)個(gè)轉換溫度的操作命令,后面釋放總線(xiàn)至少一秒,讓DS18B20完成轉換的操作。在這里要注意的是每個(gè)命令字節在寫(xiě)的時(shí)候都是低字節先寫(xiě),例如CCH的二進(jìn)制為11001100,在寫(xiě)到總線(xiàn)上時(shí)要從低位開(kāi)始寫(xiě),寫(xiě)的順序是“零、零、壹、壹、零、零、壹、壹”。整個(gè)操作的總線(xiàn)狀態(tài)如下圖。

讀取RAM內的溫度數據。同樣,這個(gè)操作也要接照三個(gè)步驟。
1、主機發(fā)出復位操作并接收DS18B20的應答(存在)脈沖。
2、主機發(fā)出跳過(guò)對ROM操作的命令(CCH)。
3、主機發(fā)出讀取RAM的命令(BEH),隨后主機依次讀取DS18B20發(fā)出的從第0一第8,共九個(gè)字節的數據。如果只想讀取溫度數據,那在讀完第0和第1個(gè)數據后就不再理會(huì )后面DS18B20發(fā)出的數據即可。同樣讀取數據也是低位在前的。整個(gè)操作的總線(xiàn)狀態(tài)如下圖:

C語(yǔ)言代碼
sbit DQ=P3^3;
uchar t;
bit Init_DS18B20(void)
{
}
uchar ReadOneChar(void)
{
}
void WriteOneChar(uchar dat)
{
}
void ReadyReadTemp(void)
{
}
評論