找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5051|回复: 10
收起左侧

DS18B20温度显示一直不准确,不知道是时序还是哪里错了,求大佬解决。

[复制链接]
ID:495586 发表于 2020-12-22 10:50 | 显示全部楼层 |阅读模式

void Delay1ms(uchar ms)
{
        uint x,y;
        for(x=ms; x>0; x--)
        {
                for(y=124; y>0; y--);
        }
}
void delay_us(uchar us)
{
        while(--us);
}
uchar Ds18b20Init()
{
        uchar i;
        bit x;
        DSPORT = 1;                           //将总线拉低480us~960us
        delay_us(5);       
        while(i--);        //延时642us
        DSPORT = 0;                           //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
        delay_us(300);
        delay_us(300);
        DSPORT = 1;
        delay_us(50);
        x= DSPORT;
        delay_us(25);
        return x;          //初始化成功
}
void Ds18b20WriteByte(uchar dat)
{
        uint  j;

        for(j=0; j<8; j++)
        {
                DSPORT = 0;                          //每写入一位数据之前先把总线拉低1us
                DSPORT = dat & 0x01;   //然后写入一个数据,从最低位开始
                delay_us(25);
                DSPORT = 1;                   //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                dat >>= 1;
        }
        delay_us(25);
}
uchar Ds18b20ReadByte()
{
        uchar byte = 0;
        uint  j;       
        for(j=8; j>0; j--)
        {
                DSPORT = 0;
                byte >>= 1;           //先将总线拉低1us
                DSPORT = 1;           //然后释放总线                //延时6us等待数据稳定
                if(DSPORT)
                        byte |= 0x80;
                        delay_us(25);                                          
        }                               
        return byte;
}
void  Ds18b20ChangTemp()
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);                  //跳过ROM操作命令                 
        Ds18b20WriteByte(0x44);
}
void  Ds18b20ReadTempCom()
{       

        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);              //跳过ROM操作命令
        Ds18b20WriteByte(0xbe);              //发送读取温度命令
}
int Ds18b20ReadTemp()
{
        char temp ;
        uchar tmh, tml;
        Ds18b20ChangTemp();
        Delay1ms(30);                                   //先写入转换命令
        Ds18b20ReadTempCom();                          //然后等待转换完后发送读取温度命令
        tml = Ds18b20ReadByte();                //读取温度值共16位,先读低字节
        tmh = Ds18b20ReadByte();                //再读高字节
        temp = tmh<<8|tml;
        return temp;
}


~J3MC~_IJ2EB9I]RY5QHT5G.png

温度补偿的超声波测距.zip

164.23 KB, 下载次数: 8

回复

使用道具 举报

ID:495586 发表于 2020-12-22 10:51 | 显示全部楼层
LCD1602那里不用管,只是方便看的
回复

使用道具 举报

ID:342822 发表于 2020-12-22 12:53 | 显示全部楼层
ds18b20输出线要加电阻接vcc
回复

使用道具 举报

ID:863432 发表于 2020-12-22 13:40 | 显示全部楼层
楼上正解,单总线通信,需要加上拉电阻的,4.7K~10K均可。另外,一定注意延时函数,因为STC晶振精度会导致延时函数的精度有限,所以可使用示波器辅助之,很多出不来结果都是延时不对所致。
回复

使用道具 举报

ID:213173 发表于 2020-12-22 16:27 | 显示全部楼层
楼主仔细逐条对比就知道哪里错了 无标题.jpg
测试.zip (126.4 KB, 下载次数: 27)
回复

使用道具 举报

ID:495586 发表于 2020-12-22 21:29 | 显示全部楼层
wulin 发表于 2020-12-22 16:27
楼主仔细逐条对比就知道哪里错了

谢谢大佬,问题已成功解决
回复

使用道具 举报

ID:495586 发表于 2020-12-22 21:29 | 显示全部楼层
taotie 发表于 2020-12-22 12:53
ds18b20输出线要加电阻接vcc

问题已解决,感谢大佬的答案!!
回复

使用道具 举报

ID:390416 发表于 2020-12-25 16:55 | 显示全部楼层
http://www.51hei.com/bbs/dpj-200465-1.html 这个是DS18B20的资料 看我这个资料 大家更容易学会
回复

使用道具 举报

ID:981842 发表于 2021-12-18 15:09 | 显示全部楼层
wulin 发表于 2020-12-22 16:27
楼主仔细逐条对比就知道哪里错了

大佬,我打开你的工程文件后数码管显示一直是0,请问是什么原因呢
回复

使用道具 举报

ID:981842 发表于 2021-12-19 00:31 | 显示全部楼层
cainiaoqiebeiyo 发表于 2021-12-18 15:09
大佬,我打开你的工程文件后数码管显示一直是0,请问是什么原因呢

我找到问题了,是我用proteus8打开的,proteus8里的ds18b20好像不能用,显示会出错,用proteus7打开就好了,打扰大佬了
回复

使用道具 举报

ID:96682 发表于 2021-12-19 05:48 来自手机 | 显示全部楼层
好像?新版本是向下兼容的,正常操作不至于会出现这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表