资讯详情

温度传感器代码解析Ⅱ

1.转换小于0度

我们知道,当测量的实际温度低于0度时,temp未转换的情况如下图所示

26119f5f33ea2c9f4c201cf4c783f326.png

我们已经知道高5位为1表示负数,所以-0.为什么1111115度 1111 1111 1000。

负数计算涉及补码知识。xFFF8.除了高5位,那就是

111 1111 1000

反码为 000 0000 0111

补码是反码加1,即000 0000 1000

这样0.五是补码(十进制8)乘以0.0625得来。

要知道负数需要注意的是temp低11位,补码实际上是减去211次(2048)temp低11位数值。

-55度时,补码为2048-0x0490=880。 转换就是880*0.0625=55.符号为-55度。

因为测量负数只能测量-0.1~-55.0,所以液晶屏的显示有以下两种情况

我们是这样处理代码的。temp=temp&0x07FF;//去掉高5位,把它变成0

temp=2048-temp;//此时的temp为补码

temp_float=(float)temp*0.0625*10.0;///实际温度值乘以10倍

temp=(unsignedint)temp_float;///得到16位整形手术的值

str[0]='-';//添加负数符号

str[1]='0' ((temp/100));//当温度低于-10度时,需要显示十位数

str[2]='0' ((temp/10));//温度必须显示个位数,即使是0,例如-0.5”

str[3]='.';

str[4]='0' (temp);///温度必须显示小数点后的一个

if(str[1]=='0')

{

str[1]='-';/如果温度不低于-10.0度(比如是-9.8度),让str如果温度低于或等于-10,则填充负数符号.0度,然后填充负数符号str[0]

LcdShowStr(0,0,str 1);//温度高于-10.0度,只显示4个字符

}

elseLcdShowStr(0,0,str);//.0度,显示5个字符

实际温度是-10.5个字符(例如-11.7度)。

实际温度大于-10.0的话,比如-9.8度,高位为0不显示,所以str[1]等于‘0’str[1]=LcdShowStr(0, 0, str 1);

2.再谈指针

我们将上述两种转换方法整合成温度转换函数unsignedcharTEMP_CONV(unsignedint*temp,unsignedchar*str)

{

unsignedcharres;

floattemp_float;

res=Get18B20Temp(temp);///读取当前温度,输入参数为指针类型

if(res)///读取成功时,温度转换

{

if((*temp>>11)==0)///温度大于0度

{

temp_float=((float)(*temp))*0.0625*10.0;//*temp在不转换的情况下,将实际温度值乘以10倍

*temp=(unsignedint)temp_float;///得到16位整形手术的值

str[0]='0' ((*temp/1000));//当温度大于或等于100度时,需要显示百位数

str[1]='0' ((*temp/100));//当温度大于或等于10度时,需要显示十位数

str[2]='0' ((*temp/10));//当温度大于或等于1度时,需要显示个位数

str[3]='.';

str[4]='0' ((*temp));///温度必须显示小数点后的一个

if(str[0]=='0')temp_i ;

if(str[1]=='0')temp_i ;

return1;//阅读温度成功,返回值为1

}

elseif((*temp>>11)>0)///温度小于0度

{

*temp=(*temp)&0x07FF;//去掉高5位,把它变成0

*temp=2048-(*temp);//此时的temp为补码

temp_float=((float)(*temp))*0.0625*10.0;///实际温度值乘以10倍

*temp=(unsignedint)temp_float;&nsp;      //得到16位整型的数值

str[0]='-';                                 //添加负数的符号

str[1]='0'+( (*temp/100)%10 );              //当温度在-10度以下时需要显示十位数

str[2]='0'+( (*temp/10)%10 );               //温度必须显示个位数,哪怕是0,比如“-0.5”

str[3]='.';

str[4]='0'+( (*temp)%10 );                  //温度必须显示小数点后的一位

if(str[1]=='0')

{

str[1]='-';

temp_i=1;//实际温度大于-10.0度的时候,假如是-5.4度,那么“LcdShowStr(0, 0, str+temp_i);”就是显示“-5.4”,小数点就是在第3个显示格上显示

//实际温度小于等于-10.0度的时候,假如是-12.6度,str[1]不等于‘0’,

//这样temp_i是等于0的,那么“LcdShowStr(0, 0, str+temp_i);”显示“-12.6”,小数点就是在第4个显示格上显示

}

return 1;    //读取温度成功,返回值一律为1

}

}

return 0;//读取温度不成功,返回值为0

}

这个函数在主函数里的用法就是判断返回值是否为1if( TEMP_CONV(&temp,str)==1 )     //返回值为1代表读取温度成功

我们在主函数里定义了一个u16类型的变量temp,

传入给“unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)”的第一个参数是变量temp的指针,然后该函数执行的第一句“res = Get18B20Temp(temp);”此时传入的参数temp是个指针变量,“Get18B20Temp(temp)”函数内部的执行就是把温度数据赋给传入的指针的那个内存里,后面的“*temp”代表的就是这个内存的变量,也就是读出的未转换的温度值。

标签: 传感器if550510路温度传感器55c传感器m63p传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台