新聞中心

        DS18B20單總線溫度控制

        作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò) 收藏
        C代碼:

        #include
        sbit DQ = P1^0; //定義ds18b20通信端口
        unsigned char a,b,c,d;
        unsigned char temp1,temp2,temp;
        unsigned char code dispbitcode[]={0x10,0x20,0x40,0x80,0x00};//共陰位碼
        unsigned char code dispcode[]= { 0X3F,/*0*/
        0X06,/*1*/
        0X5B,/*2*/
        0X4F,/*3*/
        0X66,/*4*/
        0X6D,/*5*/
        0X7D,/*6*/
        0X07,/*7*/
        0X7F,/*8*/
        0X6F,/*9*/};//共陰段碼
        /*************延時(shí)子程序*******************************/
        void delay(unsigned int x)//最小1毫秒
        {
        unsigned char j;
        while(x--)
        {
        for(j=0;j<125;j++)
        {;}
        }
        }
        /***************顯示子程序**********************/
        void display(unsigned char qian,unsigned char bai,unsigned char shi,unsigned char ge)
        {
        P3=dispbitcode[0];
        P0=dispcode[qian]; //顯示千位
        delay(5);
        //P3=dispbitcode[5];
        //P2=dispcode[11];
        P3=dispbitcode[1];
        P0=dispcode[bai]; //顯示佰位
        delay(5);
        //P3=dispbitcode[5];
        //P2=dispcode[11];
        P3=dispbitcode[2];
        P0=dispcode[shi]; //顯示十位
        delay(5);
        //P3=dispbitcode[5];
        //P2=dispcode[11];
        P3=dispbitcode[3];
        P0=dispcode[ge]; //顯示個(gè)位
        delay(5);
        }
        /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/

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

        void delay_18B20(unsigned int i)
        {
        while(i--);
        }

        /**********ds18b20初始化函數(shù)**********************/

        void Init_DS18B20(void)
        {
        unsigned char x=0;
        DQ = 1; //DQ復(fù)位
        delay_18B20(8); //稍做延時(shí)
        DQ = 0; //單片機(jī)將DQ拉低
        delay_18B20(80); //精確延時(shí) 大于 480us
        DQ = 1; //拉高總線
        delay_18B20(14);
        x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
        delay_18B20(20);
        }

        /***********ds18b20讀一個(gè)字節(jié)**************/

        unsigned char ReadOneChar(void)
        {
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
        DQ = 0; // 給脈沖信號(hào)
        dat>>=1;
        DQ = 1; // 給脈沖信號(hào)
        if(DQ)
        dat|=0x80;
        delay_18B20(4);
        }
        return(dat);
        }

        /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/

        void WriteOneChar(unsigned char dat)
        {
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
        DQ = 0;
        DQ = dat&0x01;
        delay_18B20(5);
        DQ = 1;
        dat>>=1;
        }
        }

        /**************讀取ds18b20當(dāng)前溫度************/

        unsigned char ReadTemperature(void)
        {
        unsigned char a=0;
        unsigned char b=0;
        unsigned char t=0;

        Init_DS18B20();
        WriteOneChar(0xCC); // 跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換

        delay_18B20(100); // this message is wery important

        Init_DS18B20();
        WriteOneChar(0xCC); //跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度

        delay_18B20(100);

        a=ReadOneChar(); //讀取溫度值低位
        b=ReadOneChar(); //讀取溫度值高位
        temp1=b<<4;
        temp1+=(a&0xf0)>>4;
        temp2=a&0x0f;

        temp=((b*256+a)>>4); //當(dāng)前采集溫度值除16得實(shí)際溫度值
        return(temp);
        }
        void main(void)
        {
        unsigned char abcd;
        while(1)
        {
        abcd=ReadTemperature();
        a=abcd/1000;//送去顯示
        b=abcd%1000/100;
        c=abcd%1000%100/10;
        d=abcd%1000%100%10;
        display(a,b,c,d);
        }
        }



        關(guān)鍵詞: DS18B20單總線溫度控

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 同江市| 修文县| 樟树市| 夏津县| 津市市| 肥城市| 福海县| 三明市| 东安县| 河北区| 宁乡县| 乐至县| 同心县| 清原| 库伦旗| 鄂尔多斯市| 万盛区| 大城县| 中西区| 满城县| 札达县| 新津县| 辉县市| 东阳市| 抚宁县| 伽师县| 阳山县| 左云县| 株洲市| 寿阳县| 射洪县| 综艺| 凭祥市| 定襄县| 平邑县| 镇远县| 承德市| 晋城| 福安市| 长垣县| 博兴县|