新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DS18B20的原理與應用

        DS18B20的原理與應用

        作者: 時間:2016-11-21 來源:網絡 收藏
        DS18B20的特點:
        • DS18B20 單線數字溫度傳感器,即“一線器件”,其具有獨特的優點:
        • ( 1 )采用單總線的接口方式與微處理器連接時僅需要一條口線即可實現微處理器與 DS18B20 的雙向通訊。單總線具有經濟性好,抗干擾能力強,適合于惡劣環境的現場溫度測量,使用方便等優點,使用戶可輕松地組建傳感器網絡,為測量系統的構建引入全新概念。
        • ( 2 )測量溫度范圍寬,測量精度高 DS18B20 的測量范圍為 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范圍內,精度為 ± 0.5°C 。
        • ( 3 )在使用中不需要任何外圍元件。
        • ( 4 )持多點組網功能 多個 DS18B20 可以并聯在惟一的單線上,實現多點測溫。
        • ( 5 )供電方式靈活 DS18B20 可以通過內部寄生電路從數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從而使系統結構更趨簡單,可靠性更高。
        • ( 6 )測量參數可配置 DS18B20 的測量分辨率可通過程序設定 9~12 位。
        • ( 7 )負壓特性電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作。
        • ( 8 )掉電保護功能 DS18B20 內部含有 EEPROM ,在系統掉電以后,它仍可保存分辨率及報警溫度的設定值。
        • DS18B20 具有體積更小、適用電壓更寬、更經濟、可選更小的封裝方式,更寬的電壓適用范圍,適合于構建自己的經濟的測溫系統,因此也就被設計者們所青睞。

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



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



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


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


        DS18B20中的溫度傳感器完成對溫度的測量,用16位二進制形式提供,形式表達,其中S為符號位。



        例如:
        +125℃的數字輸出07D0H
        (正溫度直接把16進制數轉成10進制即得到溫度值 )

        -55℃的數字輸出為 FC90H。
        (負溫度把得到的16進制數取反后加1 再轉成10進制數)



        DS18B20的工作時序:

        初始化時序


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

        寫操作

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

        讀操作


        對于讀數據操作時序也分為讀0時序和讀1時序兩個過程。讀時隙是從主機把單總線拉低之后,在1微秒之后就得釋放單總線為高電平,以讓DS18B20把數據傳輸到單總線上。DS18B20在檢測到總線被拉低1微秒后,便開始送出數據,若是要送出0就把總線拉為低電平直到讀周期結束。若要送出1則釋放總線為高電平。主機在一開始拉低總線1微秒后釋放總線,然后在包括前面的拉低總線電平1微秒在內的15微秒時間內完成對總線進行采樣檢測,采樣期內總線為低電平則確認為0。采樣期內總線為高電平則確認為1。完成一個讀時序過程,至少需要60us才能完成


        DS18B20 單線通信:
        DS18B20 單線通信功能是分時完成的,他有嚴格的時隙概念,如果出現序列混亂, 1-WIRE 器件將不響應主機,因此讀寫時序很重要。系統對 DS18B20 的各種操作必須按協議進行。根據 DS18B20 的協議規定,微控制器控制 DS18B20 完成溫度的轉換必須經過以下 3個步驟 :
        (1)每次讀寫前對 DS18B20 進行復位初始化。復位要求主 CPU 將數據線下拉 500us ,然后釋放, DS18B20 收到信號后等待 16us~60us 左右,然后發出60us~240us 的存在低脈沖,主 CPU 收到此信號后表示復位成功。
        (2)發送一條 ROM 指令

        (3)發送存儲器指令



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


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




        C語言代碼




        sbit DQ=P3^3;
        uchar t; //設置全局變量,專門用于延時程序

        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++);//延時月9us????????????????????????? for(t=0;t<2;t++);
        dat>>=1;
        if(DQ==1)
        {
        dat|=0x80;
        }
        else
        dat|=0x00;
        for(t=0;t<1;t++);//延時3us,兩個個讀時序間至少需要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,兩個寫時序間至少需要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復位電平RO

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄平县| 宁化县| 古浪县| 麦盖提县| 高尔夫| 临颍县| 博乐市| 大庆市| 田林县| 杭锦旗| 淄博市| 娄底市| 陇川县| 江孜县| 安图县| 壶关县| 东辽县| 安丘市| 金山区| 甘孜| 大渡口区| 卢龙县| 潼关县| 原阳县| 乌拉特中旗| 鄢陵县| 西青区| 巫山县| 神池县| 盐源县| 仙桃市| 泽库县| 通河县| 金沙县| 巴林右旗| 临沭县| 德阳市| 宝坻区| 平乡县| 汾西县| 福清市|