
作者:秦老師,華清遠見教育科技集團講師。
一、DS18B20簡介
DS18B20是常用的數字溫(wen)度計(ji)。DS18B20數字溫(wen)度計(ji)提供9至(zhi)12位(可配(pei)置(zhi))溫(wen)度讀數,表明(ming)該設備的溫(wen)度。
信息通過單總線接口被發(fa)送到DS18B20或從DS18B20發(fa)出,因此從中(zhong)央微處理器到DS18B20只有需要(yao)一個線(和地(di)線)。
讀(du),寫和進行(xing)溫度轉(zhuan)換所(suo)需(xu)要的(de)電源,可(ke)(ke)以由(you)數據線本身來提供(gong),無需(xu)外部電源。 由(you)于每個DS18B20含有唯一的(de)序列號,多個DS18B20可(ke)(ke)以掛載(zai)在一條單總線上。這(zhe)允許在許多不同的(de)地(di)方,放置溫度傳感器。
這(zhe)個功(gong)能是非常有用(yong)的,可以應(ying)用(yong)在包(bao)括HVAC環境控制,建筑物內部(bu)的溫度(du)感應(ying), 設備或機械,過(guo)程監測和控制等(deng)領域。
二、DS18B20硬件連接
 
  
DS18B20引(yin)腳圖                                                           DS18B20 原理圖
DS18B20 有三(san)個引腳。根據原理圖(tu)可知(zhi),DS18B20采(cai)用了外(wai)部供(gong)電(dian)的(de)(de)連接方式,而DQ引腳上(shang)(shang)拉10k電(dian)阻。DQ引腳連接在4412芯片的(de)(de)GPK1_1 引腳上(shang)(shang)面。
| GND | 地 | 
| DQ | 數據線 | 
| VDD | 電源(可選) | 
三、DS18B20時序分析
DS18B20是一(yi)個單(dan)總線,輸入(ru)和輸出都是通(tong)過DQ引腳,我們(men)需(xu)要根據時序圖,不斷的操作DQ這個引腳,實現(xian)具體的功能(neng)。
(一)ds18b20復位時序和函數實現

通(tong)過復位信號,可以檢測(ce)DS18B20是(shi)否工作正常,并通(tong)知DS18B20準備通(tong)信。
(1)4412拉低DQ引腳,復位周期開始。
(2)DQ引(yin)腳上的(de)低電平保持(chi)480us—960us 的(de)時間,然后(hou)釋(shi)放(fang)總線。
(3)4412延時16us—60us等待DS18B20應答(da)。
(4)DS18B20拉(la)低DQ引腳60us—240us,表示應答。
4412讀(du)取DQ引腳電平,如果(guo)是低(di)電平,表示初始化完成。
(5)DS18B20應答(da)信號結(jie)束(shu)后,釋放總線,DQ引腳被上(shang)拉(la)電阻拉(la)高,復位周(zhou)期結(jie)束(shu)。
實現ds18b20的復位代碼: 
              void DS18_Reset()
              {
                        GPK1.PUD  = 0;                                       //GPK1_1 禁止上下拉 
                        GPK1.CON  = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4;   //設置GPK1_1為輸出引腳 
                        GPK1.DAT  &= ~(0x1 << 1);                                 //設置GPK1_1 輸出‘0’,拉低DQ引腳 
                        delay_us(700);                                                                 //延時 600us
                        GPK1.DAT  |= 0x1 << 1;                                                        //GPK1_1釋放總線 
                        GPK1.CON  &= ~(0xF << 4);                                               //設置GPK1_1為輸入引腳 
                        while(GPK1.DAT  & (0x1 << 1));                      //等待DS18B20應答信號 (DQ引腳低電平) 
                        while(!(GPK1.DAT  & (0x1 << 1)));
                                    //等待DS18B20應答信號結束(DQ引腳高電平) 
               }
(二)ds18b20寫時序和函數實現

當我們需要從DS18B20寫數據的(de)時候,必須嚴格DS18B20的(de)寫時序,進(jin)行操作。
向DS18B20寫邏輯0操作(zuo):
(1)4412拉低(di)DQ引(yin)腳,寫(xie)周期開始。
(2)DQ引(yin)腳保持低電(dian)平15us左右。
(3)DQ引腳繼續保持低電平20us--45us。
(4)釋放總線。
向(xiang)DS18B20寫邏(luo)輯1操作:
(1)4412拉低DQ引(yin)腳,寫(xie)周期開始(shi)。
(2)DQ引(yin)(yin)腳上的低電(dian)平保持大(da)于1us后,拉(la)高DQ引(yin)(yin)腳 ,總共15us。
(3)DQ引(yin)腳繼續(xu)保持(chi)高電平(ping)20us—45us
(4)釋放總線。
實現向DS18B20寫入一個字節代碼:
void DS18_Write(unsigned char data)
               {
                        unsigned  char i;
                        GPK1.CON  = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4;     //設置GPK1_1為輸出引腳 
               
                        for(i =  0; i < 8; i++)
                        {
                                  GPK1.DAT  |= 0x1 << 1;                                          //設置GPK1_1 輸出1
                                  delay_us(1);                                   //延時1us
                                  GPK1.DAT  &= ~(0x1 << 1);                                                //設置GPK1_1 輸出0形成下降沿 
                                  delay_us(12);                                 //延時12us,大于1us小于15us 
                                  if(data  & 0x1)                                                                //如果數據低位為1
                                  GPK1.DAT  |= 0x1 << 1;                                     //設置GPK1_1 輸出1
                                  delay_us(40);                                                                 //延時40us
                                  data  = data >> 2;                                //數據右移1位 
                        }
               }
(三)ds18b20寫時序和函數實現

當我們需(xu)要從DS18B20讀(du)數據的(de)時候,必(bi)須嚴格(ge)DS18B20的(de)讀(du)時序,進(jin)行操作。
(1)通過(guo)4412拉(la)低DQ引腳(jiao),讀(du)周期開始。
(2)DQ引腳上的低電平(ping)至少保持1us 的時間,然后釋(shi)放(fang)引腳。
(3)4412延時幾us(留物理電平反應(ying)時間),讀取DQ引腳的數據。
注意:根據(ju)圖中(zhong)MASTER SAMPLES指示,從拉低電平(ping)轉換開始,留(liu)給(gei)物理電平(ping)轉換時(shi)間(jian),到后4412的對(dui)DQ引腳讀取操作應給(gei)在15us之內完成。
(4)15us后讀時隙(xi)結束時,DQ引腳將通過(guo)外部上拉電(dian)阻(zu)拉回高電(dian)平。
4412延(yan)時(shi)45us等待讀周期結束。
實現向DS18B20讀入一個字節數據代碼:
unsigned char DS18_Read()
               {
                        unsigned  char i, Temp = 0;                                                       //初始化接受變量Temp為0 
                        for(i =  0; i < 8; i++)
                        {
                                  GPK1.CON  = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4;  //設置GPK1_1為輸出引腳 
                                  GPK1.DAT  |= 0x1 << 1;                                                 //設置GPK1_1 輸出1
                                  GPK1.DAT  &= ~(0x1 << 1);                                                        //設置GPK1_1 輸出0,形成下降沿 
                                  GPK1.DAT  |= 0x1 << 1;                                                      //GPK1_1釋放總線 
                                  GPK1.CON  &= ~(0xF << 4);                                             //設置GPK1_1為輸出引腳 
                                  Temp  >>= 1;                                    //接受變量右移1位 
                                  if(GPK1.DAT  & (0x1 << 1))                                                        //讀取DQ引腳,如果DQ為1
                                  Temp  |= 0x80;                              //接受變量Temp,高位置1
                                  delay_us(30);                                    //延時30us
                        }
                        return  Temp;
                                           //返回接受變量
               }