注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

耳朵的博客

做自己想做的人

 
 
 

日志

 
 

AVR 单个DS18B20温度读取程序(原创)(可测负温度)  

2010-10-09 02:39:17|  分类: AVR |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
使用方法:
把两个文件放入工程,需要温度时调用DS18B20_ReadTemperature,返回值就是温度.
DS18B20.h
/****** AVR 单个DS18B20温度读取程序 ******

* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: AVR
* 文件名.......: DS18B20.h
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.09
* 最后修改.....: 2010.10.09
*****************************************/
#ifndef __DS18B20_H__
#define __DS18B20_H__

#include <ioavr.h>
#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))

extern float DS18B20_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"

static void DS18B20_Init(void)
{
    unsigned char time_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);
}

static void DS18B20_WriteByte(unsigned char _data)
{
    unsigned char i = 0;

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

static unsigned char DS18B20_ReadByte(void)
{
    unsigned char i = 0, _data = 0;

    for (i = 0i < 8i++)
    {
        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;
}

float DS18B20_ReadTemperature(void)
{
    unsigned char tl = 0, th = 0;
    float t = 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);
    }

    return t;
}
  评论这张
 
阅读(1529)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018