打印
[DemoCode下载]

Mini51读DS18B20温度传感器例程

[复制链接]
1405|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jliu_nuvoton|  楼主 | 2015-4-17 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序通过P5.2口与DS18B20通讯,读取DS18B20然后通过串口将读到的温度以float型输出,(DS18B20温度分辨率为12位,串口波特率为115200)


Mini51 DS18B20.zip (200.3 KB)
沙发
gaoyang9992006| | 2015-4-17 20:32 | 只看该作者
#include "mini51series.h"


#define SDA  P52                     //DS18B20的数据口位P5.2



void DS18B20_Reset(void);
void DS18B20_WriteByte(uint8_t dat);
uint8_t DS18B20_ReadByte(void);

int16_t ReadTemp(void)
{
                uint8_t  TPH,TPL;
                int16_t temp;
       
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!SDA);                    //等待转换完成

    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节       
                temp=TPH;
                temp<<=8;
                temp|=TPL;
    return (temp);
}


/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset(void)
{
                uint8_t i;
    i = 1;
    while (i)
    {
        SDA = 0;                     //送出低电平复位信号
                                CLK_SysTickDelay(480);                        //延时至少480us
        SDA = 1;                     //释放数据线
        CLK_SysTickDelay(60);       //等待60us
        i = SDA;                    //检测存在脉冲
        CLK_SysTickDelay(420);      //等待设备释放数据线
    }
}

/**************************************
从DS18B20读1字节数据
**************************************/
uint8_t DS18B20_ReadByte(void)
{
    uint8_t i;
    uint8_t dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        SDA = 0;                     //开始时间片
        CLK_SysTickDelay(1);        //延时等待
        SDA = 1;                     //准备接收
        CLK_SysTickDelay(1);        //接收延时
        if (SDA) dat |= 0x80;        //读取数据
        CLK_SysTickDelay(60);        //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uint8_t dat)
{
    uint8_t i;

    for (i=0; i<8; i++)             //8位计数器
    {
        SDA = 0;                     //开始时间片
        CLK_SysTickDelay(1);        //延时等待                                                     
                                if (dat&0x01) SDA =1;                                //送出数据                       
        CLK_SysTickDelay(60);       //等待时间片结束
        SDA = 1;                     //恢复数据线
        CLK_SysTickDelay(1);        //恢复延时
                                dat >>= 1;  
    }
}

使用特权

评论回复
板凳
gaoyang9992006| | 2015-4-17 20:33 | 只看该作者
贴出来,吸引一下眼球。

使用特权

评论回复
地板
quray1985| | 2015-4-18 22:23 | 只看该作者

DS18B20是个好的温度传感器,不论是学习还是产品,应用都很广泛

使用特权

评论回复
5
gaoyang9992006| | 2015-4-19 17:05 | 只看该作者
quray1985 发表于 2015-4-18 22:23
DS18B20是个好的温度传感器,不论是学习还是产品,应用都很广泛

这个温度传感器好用是好用,但是有个不好的就是价格有点贵了。

使用特权

评论回复
6
quray1985| | 2015-4-19 20:10 | 只看该作者
gaoyang9992006 发表于 2015-4-19 17:05
这个温度传感器好用是好用,但是有个不好的就是价格有点贵了。

是的,好像还有温湿度传感器一体的那种吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

28

帖子

3

粉丝