18b20可以设置不同的采样位数,比如7位,9位,你初始化的时候,估计把它忘了。 |
新新科技 发表于 2022-1-21 18:19 精度正负0.5度,应该这么理解:如果测量值是20度,那么实际的温度在-19.5到20.5之间。 |
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 ]);//显示个位,即温度小数部分 } |
zlj20181110 发表于 2022-1-21 19:59 没错,乘0.0625得到的是浮点准确数值,我乘0.625是将这个数值扩大10倍,以便于显示到LCD1602上,上面的问题叙述有提及。 |
塑封的小数点后的数字能连续变化,金属封装对温度就没那么敏感了。关键还是看程序怎样 |
看看这个表 |
51hei图片20220121204133.png (59.02 KB, 下载次数: 53)
精度和分辨率不是一回事,仔细看看手册就知道了 |
我不知道你的 * 0.625 是用什么方式计算的, 但是, 一般用18B20的话,通常的做法是把得到的值左移4位,高8位就是温度的整数值,低8位为0的话就是整数温度,非0就是 0.5 的温度。18B20 一般也就测一下室温,没有什么好期待的。 |
本帖最后由 新新科技 于 2022-1-21 18:23 编辑 压着我头发啦 发表于 2022-1-21 15:46 精度0.5℃的意思是说,如果正确温度是20℃,那么18b20测得的结果最低可能是19.5℃,而最高可能是20.5℃,那么,如果正确的温度是20.2℃呢? |
精度与分辩率的问题。。。 18B20的精度是0.5度,也就是说其测到的数值与实际温度的误差在0.5之内。 分辩率是0.625度,就是说测到的数值是0.625的倍数。 |
没用过ds18b20,但是查了一下,该器件精度是±0.5℃的,所以数值每次变化最小范围应该就是0.5℃吧。PTC\NTC精度会高点吧 |