新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機DS18B20溫度測量

        51單片機DS18B20溫度測量

        作者: 時間:2016-11-30 來源:網絡 收藏

        /***************************************************************************/
        /*DS18B20演示程序 */
        /*目標器件:AT89S51 */
        /*晶振:11.0592MHZ */
        /*編譯環境:Keil 7.50A */
        /***************************************************************************/
        /*********************************包含頭文件********************************/
        #include
        /*******************************共陽LED段碼表*******************************/
        unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
        /*********************************端口定義**********************************/
        sbit DQ=P3^3; //數據傳輸線接單片機的相應的引腳
        /*********************************定義全局變量******************************/
        unsigned char tempL=0; //臨時變量低位
        unsigned char tempH=0; //臨時變量高位
        float temperature; //溫度值
        /****************************************************************************
        函數功能:延時子程序
        入口參數:k
        出口參數:
        /****************************************************************************/
        void delay(unsigned int k)
        {
        unsigned int n;
        n=0;
        while(n < k)
        {n++;}
        return;
        }
        /****************************************************************************
        函數功能:數碼管掃描延時子程序
        入口參數:
        出口參數:
        ***************************************************************************/
        void delay1(void)
        {
        int k;
        for(k=0;k<400;k++);
        }
        /****************************************************************************
        函數功能:數碼管顯示子程序
        入口參數:k
        出口參數:
        /****************************************************************************/
        void display(int k)
        {
        P2=0xfe;
        P0=tab[k/1000];
        delay1();
        P2=0xfd;
        P0=tab[k%1000/100];
        delay1();
        P2=0xfb;
        P0=tab[k%100/10];
        delay1();
        P2=0xf7;
        P0=tab[k%10];
        delay1();
        P2=0xff;
        }
        /****************************************************************************
        函數功能:DS18B20初始化子程序
        入口參數:
        出口參數:
        /****************************************************************************/
        Init_DS18B20(void)
        {
        unsigned char x=0;
        DQ=1; //DQ先置高
        delay(8); //延時
        DQ=0; //發送復位脈沖
        delay(85); //延時(>480ms)
        DQ=1; //拉高數據線
        delay(14); //等待(15~60ms)
        }
        /****************************************************************************
        函數功能:向DS18B20讀一字節數據
        入口參數:
        出口參數:dat
        /****************************************************************************/
        ReadOneChar(void)
        {
        unsigned char i=0;
        unsigned char dat=0;
        for (i=8;i>0;i--)
        {
        DQ=1;
        delay(1);
        DQ=0;
        dat>>=1;
        DQ=1;
        if(DQ)
        dat|=0x80;
        delay(4);
        }
        return(dat);
        }
        /****************************************************************************
        函數功能:向DS18B20寫一字節數據
        入口參數:dat
        出口參數:
        ****************************************************************************/
        WriteOneChar(unsigned char dat)
        {
        unsigned char i=0;
        for(i=8;i>0;i--)
        {
        DQ=0;
        DQ=dat&0x01;
        delay(5);
        DQ=1;
        dat>>=1;
        }
        delay(4);
        }
        /****************************************************************************
        函數功能:向DS18B20讀溫度值
        入口參數:
        出口參數:temperature
        ****************************************************************************/
        ReadTemperature(void)
        {
        Init_DS18B20(); //初始化
        WriteOneChar(0xcc); //跳過讀序列號的操作
        WriteOneChar(0x44); //啟動溫度轉換
        delay(125); //轉換需要一點時間,延時
        Init_DS18B20(); //初始化
        WriteOneChar(0xcc); //跳過讀序列號的操作
        WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
        tempL=ReadOneChar(); //讀出溫度的低位LSB
        tempH=ReadOneChar(); //讀出溫度的高位MSB
        //溫度轉換,把高低位做相應的運算轉化為實際溫度
        temperature=((tempH*256)+tempL)*0.0625;
        delay(200);
        return(temperature);
        }
        /****************************************************************************
        函數功能:主程序
        入口參數:
        出口參數:
        ****************************************************************************/
        void main()
        {
        float i;
        while(1)
        {
        i=ReadTemperature();
        display(i);
        }
        }
        相信看到這里,你應該可以理解DS18B20數字溫度傳感器的原理是怎么樣的了,你也可以根據自己的需要來寫一下溫度探測及相關控制的程序。由于篇幅有限,讀者朋友可以通過網站或電子郵件一起交流與學習

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 庄浪县| 开阳县| 宜章县| 麻江县| 新乡市| 定结县| 阳曲县| 泰兴市| 绥阳县| 阿勒泰市| 万载县| 富宁县| 临城县| 枣强县| 景谷| 井冈山市| 宝应县| 田林县| 伊川县| 海城市| 乌拉特前旗| 海南省| 灯塔市| 体育| 邵阳市| 海城市| 肇庆市| 黑龙江省| 噶尔县| 仁布县| 肥乡县| 东乡县| 昭平县| 石泉县| 大丰市| 南陵县| 宜丰县| 上犹县| 资源县| 梅州市| 金堂县|