新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ds18b20溫度傳感器的51單片C語言程序

        基于ds18b20溫度傳感器的51單片C語言程序

        作者: 時間:2016-11-11 來源:網絡 收藏
        基于ds18b20溫度傳感器51單片C語言程序

        #include

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

        #define uchar unsigned char

        #define uint unsigned int

        sbit DQ=P1^1;

        uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

        uchar tplsb,tpmsb;

        /*延時tms*/

        void delay(uint t)

        {

        uint i;

        while(t--)

        {

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

        {;}

        }

        }

        /* 產生復位脈沖初始化DS18B20 */

        void TxReset(void)

        {

        uint i;

        DQ=0;

        /* 拉低約900us */

        i=100;

        while (i>0) i--;

        DQ=1;

        i=4;

        while (i>0) i--;

        }

        /* 等待應答脈沖 */

        void RxWait (void)

        {

        uint i;

        while(DQ)

        while(~DQ)

        i=4;

        while (i>0) i--;

        }

        /* 讀取數據的一位,滿足讀時隙要求 */

        bit RdBit(void)

        {

        uint i;

        bit b;

        DQ=0;

        i++;

        DQ=1;

        i++;

        i++;

        b=DQ;

        i=8;

        while(i>0) i--;

        return(b);

        }

        /* 讀取數據的一個字節 */

        uchar RdByte(void)

        {

        uchar i,j,b;

        b = 0;

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

        {

        j = RdBit();

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

        }

        return(b);

        }

        /* 寫數據的一個字節,滿足寫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以內拉高

        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++;

        }

        }

        }

        /* 啟動溫度轉換 */

        void convert(void)

        {

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

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

        delay(1);// 延時

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

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

        }

        /* 讀取溫度值 */

        void RdTemp(void)

        {

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

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

        delay(1);// 延時

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

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

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

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

        }

        void send (void)

        { uchar b,c;

        uint i,j;

        b=(tpmsb<<4)|(tplsb>>4);

        for(j=800;j>=0;j--)

        {

        if(j!=0)

        {

        p1=0x80;

        delay(2);

        p1=0x00;

        delay(2);

        p1=0x80;

        delay(2);

        for(i=8;i>>=1;i--)

        { c=b;

        c<

        P1=c;// P1.7輸出

        delay(4);

        }

        }

        else return;}

        }

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

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

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

        制有符號實數(包括小數部分)的轉換。 */

        void main(void)

        {

        do

        {

        delay(1);// 延時1ms

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

        delay(1000);// 延時1s

        RdTemp();// 讀取溫度

        delay(1);

        send();

        }

        while(1);

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 阿合奇县| 轮台县| 南漳县| 通榆县| 辽阳县| 阿图什市| 顺昌县| 镇原县| 平谷区| 建瓯市| 沅陵县| 紫阳县| 民和| 乐亭县| 铁岭市| 曲周县| 景泰县| 宣化县| 霍州市| 镇宁| 喀什市| 普宁市| 成武县| 丹东市| 隆子县| 西华县| 运城市| 华阴市| 余姚市| 津南区| 遂宁市| 曲阳县| 南城县| 册亨县| 黑龙江省| 防城港市| 刚察县| 清徐县| 乐亭县| 山西省| 子洲县|