新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR 單個DS18B20溫度讀取程序(可測負溫度)

        AVR 單個DS18B20溫度讀取程序(可測負溫度)

        作者: 時間:2016-12-02 來源:網絡 收藏
        使用方法:
        把兩個文件放入工程,需要溫度時調用DS18B20_ReadTemperature,返回值就是溫度.
        DS18B20.h
        /****** AVR 單個DS18B20溫度讀取程序 ******
        * 版本.........: 1.0
        * 目標.........: AVR
        * 文件名.......: DS18B20.h
        * 編譯器.......: IAR for AVR V5.5
        *****************************************/
        #ifndef __DS18B20_H__
        #define __DS18B20_H__

        #include
        #include "delay.h"

        #define DS18B20_DQ_DDR DDRG
        #define DS18B20_DQ_PORT PORTG
        #define DS18B20_DQ_PIN PING
        #define DS18B20_DQ_BIT 4

        #define DS18B20_DQ_IN DS18B20_DQ_DDR &= ~(1 << DS18B20_DQ_BIT)
        #define DS18B20_DQ_OUT DS18B20_DQ_DDR |= (1 << DS18B20_DQ_BIT)
        #define DS18B20_DQ_LOW DS18B20_DQ_PORT &= ~(1 << DS18B20_DQ_BIT)
        #define DS18B20_DQ_HIGH DS18B20_DQ_PORT |= (1 << DS18B20_DQ_BIT)
        #define DS18B20_DQ_VALUE (DS18B20_DQ_PIN & (1 << DS18B20_DQ_BIT))

        externfloatDS18B20_ReadTemperature(void);


        #endif/* __DS18B20_H__ */


        #endif/* __DS18B20_H__ */
        DS18B20.c
        /****** AVR 單個DS18B20溫度讀取程序 ******
        * 版本.........: 1.0
        * 作者.........: 陳利棟
        * 目標.........: AVR
        * 文件名.......: DS18B20.c
        * 編譯器.......: IAR for AVR V5.5
        * 創建時間.....: 2010.10.09
        * 最后修改.....: 2010.10.09
        *****************************************/
        #include "DS18B20.h"

        staticvoidDS18B20_Init(void)
        {
        unsignedchartime_out=0;

        DS18B20_DQ_OUT;
        DS18B20_DQ_HIGH;
        DS18B20_DQ_LOW;
        _delay_us(600);
        DS18B20_DQ_IN;
        DS18B20_DQ_HIGH;
        _delay_us(100);
        while(DS18B20_DQ_VALUE&&((time_out++)<200));
        _delay_us(400);
        }

        staticvoidDS18B20_WriteByte(unsignedchar_data)
        {
        unsignedchari=0;

        DS18B20_DQ_OUT;
        for(i=0;i<8;i++)
        {
        DS18B20_DQ_LOW;
        _delay_us(2);
        if(_data&0x01)
        {
        DS18B20_DQ_HIGH;
        }
        _data>>=1;
        _delay_us(60);
        DS18B20_DQ_HIGH;
        }
        }

        staticunsignedcharDS18B20_ReadByte(void)
        {
        unsignedchari=0,_data=0;

        for(i=0;i<8;i++)
        {
        DS18B20_DQ_OUT;
        DS18B20_DQ_LOW;
        _delay_us(5);
        _data>>=1;
        DS18B20_DQ_HIGH;
        DS18B20_DQ_IN;
        if(DS18B20_DQ_VALUE)
        {
        _data|=0x80;
        }
        DS18B20_DQ_OUT;
        DS18B20_DQ_HIGH;
        _delay_us(60);
        }

        return_data;
        }

        floatDS18B20_ReadTemperature(void)
        {
        unsignedchartl=0,th=0;
        floatt=0;

        DS18B20_Init();
        DS18B20_WriteByte(0xcc);
        DS18B20_WriteByte(0x44);

        DS18B20_Init();
        DS18B20_WriteByte(0xcc);
        DS18B20_WriteByte(0xbe);

        tl=DS18B20_ReadByte();
        th=DS18B20_ReadByte();
        if((th&0xf8)==0)// 正溫度
        {
        t=((th&0x07)<<4)+((tl&0xf0)>>4)+((tl&0x07)*0.125);
        }
        else// 負溫度
        {
        t=-55+(((th&0x07)<<4)+((tl&0xf0)>>4)-0x49)+((tl&0x07)*0.125);
        }

        returnt;
        }


        關鍵詞: AVRDS18B20溫度讀

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 千阳县| 车险| 马公市| 佛学| 汽车| 武鸣县| 金坛市| 彭山县| 大石桥市| 英山县| 汉源县| 武清区| 新乡市| 德保县| 大埔县| 文山县| 梓潼县| 曲水县| 琼结县| 麻城市| 万宁市| 江源县| 通辽市| 陇川县| 瑞金市| 临西县| 尼勒克县| 昂仁县| 天台县| 河西区| 耒阳市| 苏尼特左旗| 晋江市| 曲沃县| 年辖:市辖区| 普宁市| 广河县| 调兵山市| 海门市| 高安市| 吉安县|