DS18B20的特點:
DS18B20 單線數字溫度傳(chuan) 感器,即“一線器件”,其具有獨特的優(you) 點:
( 1 )采用單總線的接口方式 與(yu) 微處理器連接時僅(jin) 需要一條口線即可實現微處理器與(yu) DS18B20 的雙向通訊。單總線具有經濟性好,抗幹擾能力強,適合於(yu) 惡劣環境的現場溫度測量,使用方便等優(you) 點,使用戶可輕鬆地組建傳(chuan) 感器網絡,為(wei) 測量係統的構建引入全新概念。
( 2 )測量溫度範圍寬,測量精度高 DS18B20 的測量範圍為(wei) -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C範圍內(nei) ,精度為(wei) ± 0.5°C 。
( 3 )在使用中不需要任何外圍元件。
( 4 )持多點組網功能 多個(ge) DS18B20 可以並聯在惟一的單線上,實現多點測溫。
( 5 )供電方式靈活 DS18B20 可以通過內(nei) 部寄生電路從(cong) 數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從(cong) 而使係統結構更趨簡單,可靠性更高。
( 6 )測量參數可配置 DS18B20 的測量分辨率可通過程序設定 9~12 位。
( 7 ) 負壓特性電源極性接反時,溫度計不會(hui) 因發熱而燒毀,但不能正常工作。
( 8 )掉電保護功能 DS18B20 內(nei) 部含有 EEPROM ,在係統掉電以後,它仍可保存分辨率及報警溫度的設定值。
DS18B20 具有體(ti) 積更小、適用電壓更寬、更經濟、可選更小的封裝方式,更寬的電壓適用範圍,適合於(yu) 構建自己的經濟的測溫係統,因此也就被設計者們(men) 所青睞。
DS18B20內(nei) 部結構:
主要由4部分組成:64 位ROM、溫度傳(chuan) 感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個(ge) DS18B20的64位序列號均不相同。64位ROM的排的循環冗餘(yu) 校驗碼(CRC=X^8+X^5+X^4+1)。 ROM的作用是使每一個(ge) DS18B20都各不相同,這樣就可以實現一根總線上掛接多個(ge) DS18B20的目的。
DS18B20管腳排列:
1. GND為(wei) 電源地;
2. DQ為(wei) 數字信號輸入/輸出端;
3. VDD為(wei) 外接供電電源輸入端(在寄生電源接線方式時接地)

DS18B20內(nei) 部構成:
高速暫存存儲(chu) 器由9個(ge) 字節組成,當溫度轉換命令發布後,經轉換所得的溫度值以二字節補碼形式存放在高速暫存存儲(chu) 器的第0和第1個(ge) 字節。單片機可通過單線接口讀到該數據,讀取時低位在前,高位在後,對應的溫度計算:當符號位S=0時,直接將二進製位轉換為(wei) 十進製;當S=1時,先將補碼變為(wei) 原碼,再計算十進製值。

溫度的低八位數據 0
溫度的高八位數據 1
高溫閥值 2
低溫閥值 3
保留 4
保留 5
計數剩餘(yu) 值 6
每度計數值 7
CRC 校驗 8
DS18B20中的溫度傳(chuan) 感器完成對溫度的測量,用16位二進製形式提供,形式表達,其中S為(wei) 符號位。

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

主機首先發出一個(ge) 480-960微秒的低電平脈衝(chong) ,然後釋放總線變為(wei) 高電平,並在隨後的480微秒時間內(nei) 對總線進行檢測,如果有低電平出現說明總線上有器件已做出應答。若無低電平出現一直都是高電平說明總線上無器件應答。
做為(wei) 從(cong) 器件的DS18B20在一上電後就一直在檢測總線上是否有480-960微秒的低電平出現,如果有,在總線轉為(wei) 高電平後等待15-60微秒後將總線電平拉低60-240微秒做出響應存在脈衝(chong) ,告訴主機本器件已做好準備。若沒有檢測到就一直在檢測等待。
寫(xie) 操作

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

對於(yu) 讀數據操作時序也分為(wei) 讀0時序和讀1時序兩(liang) 個(ge) 過程。讀時隙是從(cong) 主機把單總線拉低之後,在1微秒之後就得釋放單總線為(wei) 高電平,以讓DS18B20把數據傳(chuan) 輸到單總線上。DS18B20在檢測到總線被拉低1微秒後,便開始送出數據,若是要送出0就把總線拉為(wei) 低電平直到讀周期結束。若要送出1則釋放總線為(wei) 高電平。主機在一開始拉低總線1微秒後釋放總線,然後在包括前麵的拉低總線電平1微秒在內(nei) 的15微秒時間內(nei) 完成對總線進行采樣檢測,采樣期內(nei) 總線為(wei) 低電平則確認為(wei) 0。采樣期內(nei) 總線為(wei) 高電平則確認為(wei) 1。完成一個(ge) 讀時序過程,至少需要60us才能完成
DS18B20 單線通信:
DS18B20 單線通信功能是分時完成的,他有嚴(yan) 格的時隙概念,如果出現序列混亂(luan) , 1-WIRE 器件將不響應主機,因此讀寫(xie) 時序很重要。係統對 DS18B20 的各種操作必須按協議進行。根據 DS18B20 的協議規定,微控製器控製 DS18B20 完成溫度的轉換必須經過以下 3個(ge) 步驟 :
(1)每次讀寫(xie) 前對 DS18B20 進行複位初始化。複位要求主 CPU 將數據線下拉 500us ,然後釋放, DS18B20 收到信號後等待 16us~60us 左右,然後發出60us~240us 的存在低脈衝(chong) ,主 CPU 收到此信號後表示複位成功。
(2)發送一條 ROM 指令

(3)發送存儲(chu) 器指令

具體(ti) 操作舉(ju) 例:
現在我們(men) 要做的是讓DS18B20進行一次溫度的轉換,那具體(ti) 的操作就是:
1、主機先作個(ge) 複位操作,
2、主機再寫(xie) 跳過ROM的操作(CCH)命令,
3、然後主機接著寫(xie) 個(ge) 轉換溫度的操作命令,後麵釋放總線至少一秒,讓DS18B20完成轉換的操作。在這裏要注意的是每個(ge) 命令字節在寫(xie) 的時候都是低字節先寫(xie) ,例如CCH的二進製為(wei) 11001100,在寫(xie) 到總線上時要從(cong) 低位開始寫(xie) ,寫(xie) 的順序是“零、零、壹、壹、零、零、壹、壹”。整個(ge) 操作的總線狀態如下圖。
讀取RAM內(nei) 的溫度數據。同樣,這個(ge) 操作也要接照三個(ge) 步驟。
1、主機發出複位操作並接收DS18B20的應答(存在)脈衝(chong) 。
2、主機發出跳過對ROM操作的命令(CCH)。
3、主機發出讀取RAM的命令(BEH),隨後主機依次讀取DS18B20發出的從(cong) 第0一第8,共九個(ge) 字節的數據。如果隻想讀取溫度數據,那在讀完第0和第1個(ge) 數據後就不再理會(hui) 後麵DS18B20發出的數據即可。同樣讀取數據也是低位在前的。整個(ge) 操作的總線狀態如下圖:

C語言代碼
sbit DQ=P3^3;
uchar t; //設置全局變量,專(zhuan) 門用於(yu) 延時程序
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; //人為(wei) 拉高,為(wei) 單片機檢測DS18B20的輸出電平做準備
for(t=0;t<3;t++);//延時月9us ????????????????????????? for(t=0;t<2;t++);
dat>>=1;
if(DQ==1)
{
dat|=0x80;
}
else
dat|=0x00;
for(t=0;t<1;t++);//延時3us,兩(liang) 個(ge) 個(ge) 讀時序間至少需要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++);//延時約45us,DS18B20在15~60us對數據采樣 ??????????????? for(t=0;t<10;t++);
DQ=1; //釋放數據線
for(t=0;t<1;t++); //延時3us,兩(liang) 個(ge) 寫(xie) 時序間至少需要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);
}