新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機中使用DS18B20溫度傳感器C語言程序(參考4)

        單片機中使用DS18B20溫度傳感器C語言程序(參考4)

        作者: 時間:2016-11-18 來源:網絡 收藏
        #include

        #include

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

        sbit DQ = P2^2; //定義DS18B20端口DQ
        sbit BEEP=P2^3 ; //定義報警接口
        unsigned char presence ; //定義傳感器初始化標志
        unsigned char code LEDData[ ] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xff};
        unsigned char data temp_data[2] = {0x00,0x00}; //存儲零時值
        unsigned char data display[2] = {0x00,0x00};
        unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
        void beep();
        sbit DIN = P0^7; //小數點
        bit flash=0; //顯示開關標記

        /**********************************************************/
        void Delay(unsigned int num)//延時函數
        {
        while( --num );
        }

        /**********************************************************/
        Init_DS18B20(void)//初始化ds1820
        {

        DQ = 1; //DQ復位
        _nop_();
        _nop_(); //稍做延時2ms
        DQ = 0; //單片機將DQ拉低,發出復位脈沖(要求480us~960us)
        Delay(70); //精確延時566us
        DQ = 1; //拉高總線(要求16~60us)
        Delay(5); //延時46us
        presence = DQ; //如果=0則初始化成功 =1則初始化失敗
        Delay(25);
        DQ = 1;
        return(presence); //返回信號,0=presence,1= no presence
        }
        /**********************************************************/
        ReadOneChar(void)//讀一個字節
        {
        unsigned char i = 0;
        unsigned char dat = 0;

        for (i = 8; i > 0; i--)
        {
        DQ = 0; // 給脈沖信號
        dat >>= 1;
        DQ = 1; // 給脈沖信號

        if(DQ)
        dat |= 0x80;
        Delay(4);
        }

        return (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;
        }
        }

        /*********************************************************/

        Read_Temperature(void)//讀取溫度
        {
        Init_DS18B20();
        if(presence==1)
        { beep();flash=1;} //DS18B20不正常,蜂鳴器報警
        else
        {
        flash=0;
        WriteOneChar(0xCC); // 跳過讀序號列號的操作
        WriteOneChar(0x44); // 啟動溫度轉換

        Init_DS18B20();
        WriteOneChar(0xCC); //跳過讀序號列號的操作
        WriteOneChar(0xBE); //讀取溫度寄存器

        temp_data[0] = ReadOneChar(); //溫度低8位
        temp_data[1] = ReadOneChar(); //溫度高8位
        }
        }
        /*********************************************************/
        Disp_Temperature()//顯示溫度
        {
        unsigned char n=0;

        display[2]=temp_data[1]/10;
        display[1]=temp_data[0]%10;

        P0 =LEDData[display[1]]; //顯示個位
        DIN = 0;
        P2 = 0xef;
        Delay(300);

        P0 =LEDData[display[2]]; //顯示十位
        P2 = 0xdf;
        Delay(300);


        P2 = 0xff; //關閉顯示
        }

        /*********************************************************/
        void beep()
        {
        unsigned char i;
        for (i=0;i<100;i++)
        {
        Delay(60);
        BEEP=!BEEP; //BEEP取反
        }
        BEEP=1; //關閉蜂鳴器
        }

        /*********************************************************/
        void main(void)
        {
        while(1)
        {
        Read_Temperature();
        if(flash==0)
        {Disp_Temperature();}
        else P2 = 0xff ; //DS18B20不正常,關閉顯示
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 彭阳县| 阳春市| 乐清市| 云林县| 揭东县| 个旧市| 柘荣县| 玉溪市| 侯马市| 佳木斯市| 棋牌| 萍乡市| 吴旗县| 九龙城区| 阿巴嘎旗| 什邡市| 陇南市| 平乐县| 潮安县| 古丈县| 常山县| 汤原县| 称多县| 垫江县| 公主岭市| 峡江县| 正蓝旗| 凭祥市| 牡丹江市| 和田县| 广德县| 郁南县| 闻喜县| 西华县| 白河县| 财经| 丰镇市| 宁波市| 岐山县| 丁青县| 中宁县|