[DemoCode下载] Mini51读DS18B20温度传感器例程

[复制链接]
 楼主| jliu_nuvoton 发表于 2015-4-17 10:53 | 显示全部楼层 |阅读模式
本程序通过P5.2口与DS18B20通讯,读取DS18B20然后通过串口将读到的温度以float型输出,(DS18B20温度分辨率为12位,串口波特率为115200)


Mini51 DS18B20.zip (200.3 KB, 下载次数: 72)
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是个好的温度传感器,不论是学习还是产品,应用都很广泛
gaoyang9992006 发表于 2015-4-19 17:05 | 显示全部楼层
quray1985 发表于 2015-4-18 22:23
DS18B20是个好的温度传感器,不论是学习还是产品,应用都很广泛

这个温度传感器好用是好用,但是有个不好的就是价格有点贵了。
quray1985 发表于 2015-4-19 20:10 | 显示全部楼层
gaoyang9992006 发表于 2015-4-19 17:05
这个温度传感器好用是好用,但是有个不好的就是价格有点贵了。

是的,好像还有温湿度传感器一体的那种吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

28

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

28

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部