DS18b20,急救,16进制的数为什么乘以0.0625就变成10进制数了

alone1 2013-09-07 01:39:16
tem_l=readbyte();
tem_h=readbyte();
t=tem_h<<8;
t=t|tem_l;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
问题一:tem_l和tem_2为二进数,怎么经过 tt=t*0.0625就变成了10进制数


问题二: t=tt*10+0.5;这句话是四舍五入,怎么理解,请举例说明
...全文
3624 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
骁Captain 2013-09-09
  • 打赏
  • 举报
回复
引用 4 楼 alone1 的回复:
谢谢,大家的答复,我这两天又看了一下书,根据ds18b20的温度寄存器字节格式,个人觉的0.0625=1/16是将左移四移,去掉其小数位,而不是从精度这个方面介绍,因为默认的分辨率是12位,这个应该是他的精度,
不能理解为移位操作,因为移位的左右操作数都必须为整型,这里tt是浮点型。
alone1 2013-09-08
  • 打赏
  • 举报
回复
谢谢,大家的答复,我这两天又看了一下书,根据ds18b20的温度寄存器字节格式,个人觉的0.0625=1/16是将左移四移,去掉其小数位,而不是从精度这个方面介绍,因为默认的分辨率是12位,这个应该是他的精度,
骁Captain 2013-09-07
  • 打赏
  • 举报
回复 5
第一问,实际上不是进制转换,而是测量值到实际温度的转换,DS18B20的精度为0.0625度,即读回数据的最低位代表0.0625度,实际测量值t×0.0625就转换为实际温度值。 比如 读回的数据为: 0000 0001 1001 0000,十六进制为0x190,十进制400,乘以0.0625后得25,即实际温度是25度。
骁Captain 2013-09-07
  • 打赏
  • 举报
回复 3
第二个问题,四舍五入。 因为在C中,整型数的除法没有小数部分,只有整数部分,就是截尾,比如 3.1~3.9 取整都是3,没有进行四舍五入到最近的整数。 t=tt*10+0.5,就实现了四舍五入,比如t的值在[9.5~10.5),加0.5之后,t [10.0~11.0), 按照C的运算规则, t = 10,和我们正常的四舍五入计算结果是一致的。
单片机工程师 2013-09-07
  • 打赏
  • 举报
回复
1、结果为几进制,取决于tt的变量类型,几进制对于电脑都是一样的,你可以直接用数码管显示tem_1,也可以得到十进制的结果。 2、第二个问题说清楚些,我没看懂

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧