新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于DS18B20數(shù)字溫度計設計

        基于DS18B20數(shù)字溫度計設計

        作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏
        單片機除了可以測量電信號外,還可以用與溫度、濕度等非電信號的測量,能獨立工作的單片機溫度檢測、溫度控制系統(tǒng)已經(jīng)廣泛的應用于很多領(lǐng)域。單片機的接口信號是數(shù)字信號,要想用單片機作區(qū)溫度這類非電信號,就要使用溫度傳感器將溫度信息轉(zhuǎn)換為電流或者電壓信號輸出,如果轉(zhuǎn)化的信號是模擬信號,還需要進行A/D轉(zhuǎn)化,以滿足單片機接口的需要。

        本試驗結(jié)合溫度傳感器DS18B20及單線技術(shù)實現(xiàn)數(shù)字溫度計的設計。

        本文引用地址:http://www.104case.com/article/201611/315963.htm

        主要器件:

        1、AT89C52單片機芯片,控制溫度傳感器和數(shù)據(jù)處理。

        2、單線數(shù)字溫度傳感器DS18B20。

        試驗流程圖:

        實驗電路圖:

        試驗程序代碼:

        //DigThermo.h程序

        #ifndef_DIGTHERMO_H//防止DigThermo.h被重復引用

        #define_DIGTHERMO_H

        #include //引用標準庫的頭文件

        #include

        #include

        #include

        #define uchar unsigned char

        #define uint unsigned int

        uchar tplsb,tpmsb;//溫度值低位、高位字節(jié)

        sbit DQ = P3^5;//數(shù)據(jù)通信線DQ

        #endif

        //DigThermo.c程序

        #include "DigThermo.h"

        /*延時t毫秒*/

        void delay(uint t)

        {

        uint i;

        while(t--)

        {

        /*對于11.0592M時鐘,約延時1ms */

        for (i=0;i<125;i++)

        {}

        }

        }

        /*產(chǎn)生復位脈沖初始化DS18B20 */

        void TxReset(void)

        {

        uint i;

        DQ = 0;

        /*拉低約900us */

        i = 100;

        while (i>0)i--;

        DQ = 1;//產(chǎn)生上升沿

        i = 4;

        while (i>0)i--;

        }

        /*等待應答脈沖*/

        void RxWait(void)

        {

        uint i;

        while(DQ);

        while(~DQ);//檢測到應答脈沖

        i = 4;

        while (i>0)i--;

        }

        /*讀取數(shù)據(jù)的一位,滿足讀時隙要求*/

        bit RdBit(void)

        {

        uint i;

        bit b;

        DQ = 0;

        i++;

        DQ = 1;

        i++;i++;//延時15us以上,讀時隙下降沿后15us,DS18B20輸出數(shù)據(jù)才有效

        b = DQ;

        i = 8;

        while(i>0) i--;

        return (b);

        }

        /*讀取數(shù)據(jù)的一個字節(jié)*/

        uchar RdByte(void)

        {

        uchar i,j,b;

        b = 0;

        for (i=1;i<=8;i++)

        {

        j = RdBit();

        b = (j<<7)|(b>>1);

        }

        return(b);

        }

        /*寫數(shù)據(jù)的一個字節(jié),滿足寫1和寫0的時隙要求*/

        void WrByte(uchar b)

        {

        uint i;

        uchar j;

        bit btmp;

        for(j=1;j<=8;j++)

        {

        btmp = b&0x01;

        b = b>>1;//取下一位(由低位向高位)

        if (btmp)

        {

        /*寫1 */

        DQ = 0;

        i++;i++;//延時,使得15us以內(nèi)拉高

        DQ = 1;

        i = 8;

        while(i>0) i--;//整個寫1時隙不低于60us

        }

        else

        {

        /*寫0 */

        DQ = 0;

        i = 8;

        while(i>0) i--;//保持低在60us到120us之間

        DQ = 1;

        i++;

        i++;

        }

        }

        }

        /*啟動溫度轉(zhuǎn)換*/

        void convert(void)

        {

        TxReset();//產(chǎn)生復位脈沖,初始化DS18B20

        RxWait();//等待DS18B20給出應答脈沖

        delay(1);//延時

        WrByte(0xcc);// skip rom命令

        WrByte(0x44);// convert T命令

        }

        /*讀取溫度值*/

        void RdTemp(void)

        {

        TxReset();//產(chǎn)生復位脈沖,初始化DS18B20

        RxWait();//等待DS18B20給出應答脈沖

        delay(1);//延時

        WrByte(0xcc);// skip rom命令

        WrByte(0xbe);// read scratchpad命令

        tplsb = RdByte();//溫度值低位字節(jié)(其中低4位為二進制的“小數(shù)”部分)

        tpmsb = RdByte();//高位值高位字節(jié)(其中高5位為符號位)

        }

        /*主程序,讀取的溫度值最終存放在tplsb和tpmsb變量中。

        tplsb其中低4位為二進制的“小數(shù)”部分;tpmsb其中高

        5位為符號位。真正通過數(shù)碼管輸出時,需要進行到十進

        制有符號實數(shù)(包括小數(shù)部分)的轉(zhuǎn)換。*/

        void main(void)

        {

        do

        {

        delay(1);//延時1ms

        convert();//啟動溫度轉(zhuǎn)換,需要750ms

        delay(1000);//延時1s

        RdTemp();//讀取溫度

        }

        while(1);

        }



        關(guān)鍵詞: DS18B20數(shù)字溫度

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 新龙县| 苏尼特左旗| 包头市| 治多县| 托克逊县| 松阳县| 红安县| 雷山县| 富蕴县| 建昌县| 徐州市| 富锦市| 历史| 永仁县| 昌黎县| 普陀区| 保德县| 洛川县| 红安县| 扶余县| 师宗县| 杭州市| 中卫市| 思南县| 柳河县| 天津市| 福鼎市| 香格里拉县| 荔浦县| 泾源县| 镇江市| 荆州市| 恭城| 黔江区| 威信县| 嘉义县| 和政县| 五家渠市| 黔东| 嵩明县| 安宁市|