微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 18b20 温度转换

18b20 温度转换

时间:10-02 整理:3721RD 点击:
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; //小数

怎么了,这代码没有问题啊

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

现学现卖下,为啥他要 除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

我来学习的   支持了            

你先看一下它的数据是怎样保存的就知道知道他是怎样操作的了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top