找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1299|回复: 13
收起左侧

DS18B20输出值为什么那么单调

[复制链接]
ID:71233 发表于 2022-1-21 13:12 | 显示全部楼层 |阅读模式
本帖最后由 新新科技 于 2022-1-21 13:20 编辑

  几年前从T宝上购买的不锈钢封装防水型DS18b20温度探头,近期拿出来用用。  我设置的有效数字是到到小数点后一位的,即:从18B20读出十二位数据,然后乘0.625,得到上百的温度值(计算的结果是200即为20度,计算的结果是185即为18.5度)。
  但偶然的机会发现一个奇怪的问题:就是其温度显示一般是整数值,要么就是小数0.5的值,例如显示18度,18.5度,19.5度,就是不会显示18.1、18.2、18.3等数据。怀疑是换算出问题,直接检查从18B20读出的高四位和低八位的十六进制数据,结果:一般是0尾的或是8尾的,例如0x0130,0x138等,所以基本不用考虑是换算产生的错误。
  这种现象是不是DS18b20温度传感器是冒牌的或是国产的导致的?请高手给分析分析,谢谢!




2022-01-21_130726.png
回复

使用道具 举报

ID:716656 发表于 2022-1-21 15:46 | 显示全部楼层
没用过ds18b20,但是查了一下,该器件精度是±0.5℃的,所以数值每次变化最小范围应该就是0.5℃吧。PTC\NTC精度会高点吧
回复

使用道具 举报

ID:824490 发表于 2022-1-21 16:06 | 显示全部楼层
精度与分辩率的问题。。。 18B20的精度是0.5度,也就是说其测到的数值与实际温度的误差在0.5之内。 分辩率是0.625度,就是说测到的数值是0.625的倍数。
回复

使用道具 举报

ID:71233 发表于 2022-1-21 18:19 | 显示全部楼层
本帖最后由 新新科技 于 2022-1-21 18:23 编辑
压着我头发啦 发表于 2022-1-21 15:46
没用过ds18b20,但是查了一下,该器件精度是±0.5℃的,所以数值每次变化最小范围应该就是0.5℃吧。PTC\NTC ...

精度0.5℃的意思是说,如果正确温度是20℃,那么18b20测得的结果最低可能是19.5℃,而最高可能是20.5℃,那么,如果正确的温度是20.2℃呢?
回复

使用道具 举报

ID:423911 发表于 2022-1-21 19:59 | 显示全部楼层
你不是不漏了一个“0”?应该是0.0625吧?

评分

参与人数 2黑币 +15 收起 理由
TEC + 10 赞一个!
名字不是重点 + 5 很给力!你是对的,多谢提醒!

查看全部评分

回复

使用道具 举报

ID:624769 发表于 2022-1-21 20:00 | 显示全部楼层
我不知道你的 * 0.625 是用什么方式计算的, 但是, 一般用18B20的话,通常的做法是把得到的值左移4位,高8位就是温度的整数值,低8位为0的话就是整数温度,非0就是 0.5 的温度。18B20 一般也就测一下室温,没有什么好期待的。
回复

使用道具 举报

ID:160500 发表于 2022-1-21 20:31 | 显示全部楼层
精度和分辨率不是一回事,仔细看看手册就知道了
回复

使用道具 举报

ID:160500 发表于 2022-1-21 20:42 | 显示全部楼层
看看这个表
51hei图片20220121204133.png
回复

使用道具 举报

ID:96682 发表于 2022-1-22 00:06 来自手机 | 显示全部楼层
塑封的小数点后的数字能连续变化,金属封装对温度就没那么敏感了。关键还是看程序怎样
回复

使用道具 举报

ID:71233 发表于 2022-1-22 10:14 | 显示全部楼层
zlj20181110 发表于 2022-1-21 19:59
你不是不漏了一个“0”?应该是0.0625吧?

没错,乘0.0625得到的是浮点准确数值,我乘0.625是将这个数值扩大10倍,以便于显示到LCD1602上,上面的问题叙述有提及。
回复

使用道具 举报

ID:71233 发表于 2022-1-22 10:22 | 显示全部楼层
wc86110 发表于 2022-1-22 00:06
塑封的小数点后的数字能连续变化,金属封装对温度就没那么敏感了。关键还是看程序怎样

关键程序:
void readtemp_ds18b20() //读取温度
{
        uint  temp32;
        uchar templ,temph;
        EA=0;
        rest_ds18b20();//复位
        write_ds18b20(0xcc); //跳过读序列号的操作
        write_ds18b20(0x44); //启动温度转换
        delay_50us(15);
        rest_ds18b20();//复位
        write_ds18b20(0xcc); //跳过读序列号的操作
        write_ds18b20(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        templ=read_ds18b20();//低八位
        temph=read_ds18b20();//高八位

        temp32=(temph<<8)|templ;//合并为十六位
        if((temph&0xf0))//判断温度的正负性
        {
                temp32=~temp32+1;
                temp32=temp32*0.625;//温度值扩大10倍
                temp=-temp32;//温度为负数
        }
        else//为正数
        {        
                temp=temp32*0.625;        //温度值扩大10倍
        }
EA=1;

}

void show_18B20()//显示18B20的温度
{
        uchar i;
        LcdSetCursor(2,7); //显示位置
        i=temp/100;
        write_LCD_data(tex[ i]);// //显示百位,即温度十位
        i=temp/10%10;
        write_LCD_data(tex[i ]);// //显示十位,即温度个位
        write_LCD_data('.');//显示小数点
        i=temp%10;
        write_LCD_data(tex[i ]);//显示个位,即温度小数部分
}
回复

使用道具 举报

ID:71233 发表于 2022-1-22 16:47 | 显示全部楼层
再次看看手册,终于弄明白了,是配置寄存器的问题。DS18B20一般出厂是设置为12位的,但本人手头的18b20是设置为9位精度的,所以只能测量到整数度数或0.5度数。谢谢大家的关注!

评分

参与人数 1黑币 +10 收起 理由
TEC + 10 赞一个!

查看全部评分

回复

使用道具 举报

ID:625730 发表于 2022-1-22 18:58 | 显示全部楼层
新新科技 发表于 2022-1-21 18:19
精度0.5℃的意思是说,如果正确温度是20℃,那么18b20测得的结果最低可能是19.5℃,而最高可能是20.5℃, ...

精度正负0.5度,应该这么理解:如果测量值是20度,那么实际的温度在-19.5到20.5之间。
回复

使用道具 举报

ID:378108 发表于 2022-1-29 00:08 | 显示全部楼层
18b20可以设置不同的采样位数,比如7位,9位,你初始化的时候,估计把它忘了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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