18b20 温度转换
{
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
我来学习的 支持了
你先看一下它的数据是怎样保存的就知道知道他是怎样操作的了。