18b20 温度转换

2019-07-15 19:36发布

void tmrtemp (void) //读取温度
{
unsigned char a,b;
tmreset (); //复位
dmsec (1); //延时
tmwbyte (0xcc); //跳过序列号命令
tmwbyte (0xbe); //发送读取命令
a = tmrbyte (); //读取低位温度
b = tmrbyte (); //读取高位温度
if(b>0x7f) //最高位为1 时温度是负
{
  a=~a; b=~b+1; //补码转换,取反加一
  fg=0; //读取温度为负时fg=0
}
sdata = a/16+b*16; //整数部分                     求解 这部分转换原理?
xiaoshu1 = (a&0x0f)*10/16; //小数第一位
xiaoshu2 = (a&0x0f)*100/16%10;//小数
xiaoshu=xiaoshu1*10+xiaoshu2; //小数
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
xbq1416
1楼-- · 2019-07-15 21:36
怎么了,这代码没有问题啊
ksl2670218710
2楼-- · 2019-07-15 23:47
xbq1416 发表于 2014-5-23 18:56
怎么了,这代码没有问题啊


datasheet 说的是读取的数据乘以它的精度
为什么这里这么算?是不是元器件匹配的算法
sdata = a/16+b*16; //整数部分
xiaoshu1 = (a&0x0f)*10/16; //小数第一位
xiaoshu2 = (a&0x0f)*100/16%10;//小数
xiaoshu=xiaoshu1*10+xiaoshu2; //小数


me860
3楼-- · 2019-07-16 04:24
本帖最后由 me860 于 2014-5-24 01:03 编辑

现学现卖下,为啥他要 除16 或 乘16 而不是直接乘以他的精度(真正需要乘以0.0625的只有后4位二进制数),这样做是为了提高计算速度(为啥慢可以百度  单片机  浮点运算),这个0.0625=1/16 ,在这里a为低8位,b为高八位,对于整数的求解,举个例子
   0000 0101(b)     0101 1000(a)   根据datasheet可知a的低4位为小数部分,a的高4位和b的低4位为整数部分,对于a的低4位对于这次求解没有用处,可以用a/16的方法来去低4位(a >>= 4 右移4位 等效于a/16)
a=5,b*16=80 sdata = a/16+b*16 即85(主要用的二进制转十六进制的算法)
小数部分,a&0xf = 0000 1000  同上(1000 )*0.0625等效于(1000 )/16  1000转成10进制为8 即结果为0.5  xiaoshu1 = (a&0x0f)*10/16; 结果就是5

这个if(b>0x7f) //最高位为1 时温度是负
{
  a=~a; b=~b+1; //补码转换,取反加一(楼主自己查一下补码转原码的方法,会发现这是错的(应该是~ba +1),当温度为零下时就会出错)
  fg=0; //读取温度为负时fg=0
}
给LZ个地址,里面最后有18B20的程序,写的很好(我就是参考的里面作者)
http://wenku.baidu.com/link?url= ... gpn5jtsEGXvIEi1pwOG
就是啊
4楼-- · 2019-07-16 07:08
 精彩回答 2  元偷偷看……
依然落叶飘零
5楼-- · 2019-07-16 11:39
你先看一下它的数据是怎样保存的就知道知道他是怎样操作的了。

一周热门 更多>