求一个ds18b20例案,正负数都可以显示,精度到0.1的

2020-02-01 16:34发布

最简单的skip rom方案 或者给我讲一下最后接收到的两个byte的数据怎么处理就行了
谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
yao1
1楼-- · 2020-02-02 05:23
回复【4楼】Ilove51andAVR  
-----------------------------------------------------------------------
有一点不明白,temp前面定义为类型的变量?
51不是8位单片机吗?怎么temp可以为16位的数据呢?
-----------------------------------------------------------------------
unsigned int tmpvalue; 16位 ......
unsigned char low,high; 8位 ......

18B20:
    测量数据以16位带符号位扩展的二进制补码形式存放
    单片机读取温度,一次读2字节16位,读完将低11位的二进制转化为十进制后乘0.0625即为实际温度,只需要判断11位即可
还需要判断温度正负:前5位为符号位,1为负,0为正
1)前5位为1时,读取温度为负值,实际温度=测得数值需要取反加1再乘0.0625
  -55  ——11111 10010010000——低11位取反011 0110 1111(十进制879)——加1(880)——乘0.0625——实际温度880*0.0625=55(11111为负)   
2)前5位为0时,读取温度为正值,实际温度=测得数值乘0.0625
  +125 ——00000 11111010000——低11位十进制为2000 ——2000*0.0625=125  00000位正

上面的程序只能读正的 要读负值 增加判断(注意变量名不一样)
把tplsb和tpmsb都是8位的合成一个16位的有符号数t;temp为浮点数
t=tpmsb<<8;
t=t|tplsb
if(t<0)   //负温度
{
    temp=(~t+1)*0.0625*10+0.5; //负温度时,取反加1再乘以0.0625得实际温度,乘10+0.5显示小数点一位,且四舍五入
}
else   //正温度
{     
    temp=t*0.0625*10+0.5;    //正温度 实际温度=测得数值乘0.0625
}
XA144F
2楼-- · 2020-02-02 07:16
还在乘以0.0625……这就是右移4位啊!浮点乘法增加多少运算量?
chill520
3楼-- · 2020-02-02 10:19

(原文件名:表1.JPG)
yao1
4楼-- · 2020-02-02 12:13
 精彩回答 2  元偷偷看……
NemoGu
5楼-- · 2020-02-02 17:09
数字温度传感器 做不到那么高的精度吧
DS18B25的精度只有±0.5℃,分辨率0.0625℃
MAXIM官方的datasheet上有精度的曲线
liudaolunhui
6楼-- · 2020-02-02 20:57
二楼的帖子是不错的,赞一个

一周热门 更多>