1.小于0度的转换
我们知道当测量的实际温度为0度以下时,temp没转换时的情况为下图所示
我们已经知道高5位为1表示的是负数,那么-0.5度的时候为什么是1111 1111 1111 1000。
负数的计算涉及到补码的知识。首先0xFFF8,除去高5位那就是
111 1111 1000
反码为 000 0000 0111
而补码就是反码加1,也就是补码为000 0000 1000
这样0.5就是由补码(十进制的8)乘以0.0625得来。
我们要知道,负数的时候需要关注的是temp的低11位,补码其实就是2的11次方(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=(unsigned int)temp_float; //得到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]='-'; //如果温度没有低于等于-10.0度(比如是-9.8度),让str[1]填充负数符号,如果温度低于等于-10.0度,那么填充负数符号的是str[0]
LcdShowStr(0, 0, str+1); //温度高于-10.0度,只需显示4个字符
}
else LcdShowStr(0, 0, str); //温度低于等于-10.0度,显示5个字符
实际温度是-10.0以下的话就是显示5个字符(比如-11.7度)。
实际温度大于-10.0的话,比如-9.8度,要做到高位为0不显示,所以str[1]等于'0'时让“str[1]='-';”。这样的话“LcdShowStr(0, 0, str+1);”就是如下图显示了
2.再谈指针
以上两种转换方式我们整合成了一个“温度转换”的函数
unsigned char TEMP_CONV(unsigned int *temp, unsigned char *str)
{
unsigned char res;
float temp_float;
res = Get18B20Temp(temp); //读取当前温度,传入的参数是指针类型
if (res) //读取成功时,进行温度转换
{
if( (*temp>>11)==0 ) //温度大于等于0度
{
temp_float=( (float)(*temp) ) *0.0625*10.0; //*temp就是没有转换时的16位那个变量,然后再把实际温度值再乘以10倍
*temp=(unsigned int)temp_float; //得到16位整型的数值
str[0]='0'+( (*temp/1000)%10 ); //当温度大于等于100度时需要显示百位数
str[1]='0'+( (*temp/100)%10 ); //当温度大于等于10度时需要显示十位数
str[2]='0'+( (*temp/10)%10 ); //当温度大于等于1度时需要显示个位数
str[3]='.';
str[4]='0'+( (*temp)%10 ); //温度必须显示小数点后的一位
if(str[0]=='0')temp_i++;
if(str[1]=='0')temp_i++;
return 1;//读取温度成功,返回值一律为1
}
else if( (*temp>>11)>0 )//温度小于0度
{
*temp=(*temp)&0x07FF; //清除掉高5位使其变为0
*temp=2048-(*temp); //此时的temp为补码
temp_float=( (float)(*temp) )*0.0625*10.0; //实际温度值再乘以10倍
*temp=(unsigned int)temp_float; //得到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
}
这个函数在主函数里的用法就是判断返回值是否为1
if( 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”代表的就是这个内存的变量,也就是读出的未转换的温度值。
上一篇:51单片机-温度传感器代码解析Ⅰ
下一篇:51单片机-温度传感器代码独立文件
推荐阅读
史海拾趣
随着业务的不断扩展和市场需求的增加,德利威电子在1998年实现了全系列防水开关的生产,并取得了RS33A开关专利。同年,公司还扩大了经营规模,搬入了自购的厂办大楼,并增加了资本额至一千五百万元。这些举措不仅提升了公司的生产能力和产品品质,也为公司未来的发展奠定了坚实的基础。
Bellnix Co Ltd自创立之初,便以技术创新为核心竞争力。在电子元器件制造领域,公司不断投入研发,推出了一系列高性能、低成本的芯片产品。这些产品不仅在国内市场占据了一席之地,还成功打入了国际市场,赢得了众多客户的认可。随着技术的不断积累,Bellnix逐渐在行业内树立起了技术领先的形象,从而实现了公司的快速发展。
中环公司一直致力于技术创新和研发。在太阳能单晶硅制造领域,公司不断推出新的技术和产品,以满足市场的不断变化。2009年,公司在内蒙古投资建设了太阳能级单晶硅工厂,开始进行太阳能级单晶硅产品的规模生产,并成功研发和应用了金刚线DW切割工艺。这一创新技术大大提高了生产效率和产品质量,使中环在行业中取得了领先地位。
在当今社会,绿色环保和可持续发展已成为全球共识。作为一家具有社会责任感的企业,DMC积极践行绿色环保理念,致力于实现可持续发展。在生产过程中,DMC采用环保材料和清洁能源,减少废弃物和污染物的排放。同时,DMC还注重产品的环保性能设计,推出了一系列符合环保标准的产品。此外,DMC还积极参与社会公益活动,支持环保事业和社区建设。
作为薄膜开关的先驱和专家,EECO Switch公司在该领域拥有超过30年的丰富经验。公司凭借其精湛的制造工艺和严格的品质控制,成功打造出了众多优质的薄膜开关产品。这些产品广泛应用于医疗设备、航空电子设备、军用产品和工业控制等领域,赢得了众多客户的信任和好评。
1993年,Transico公司收购了EECO Switch部门,这标志着EECO Switch公司进入了一个全新的发展阶段。在被收购后,EECO Switch获得了更多的资源和支持,进一步加速了其业务拓展的步伐。公司不仅在原有的人机界面产品领域继续深耕细作,还积极拓展新的业务领域,如智能家居、物联网等。
本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 当将模拟信号转换成方波脉冲后,再将脉冲信号送入单片机,那么单片机是怎样处理这个脉冲信号的? … 查看全部问答∨ |
|
本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 比赛结束了,学习没有结束,最近看论坛里有点冷清,大家要加油啊! FPGA_学生交流:69611574 期待你的加入! … 查看全部问答∨ |
|
最近做了一个题目,使用蓝牙接收到的数据在LED点阵上显示出来,但是前提是不知道要接收的数据的内容。该如何实现接收到的数据用编程直接转换成LED点阵上能识别的二进制数。是该做一个字库还是有其他什么别的方法。请专业人士帮忙解决一下。谢谢。… 查看全部问答∨ |
目前通过网络下载将开发工作站上编译的wince镜像下载到目标机。现在目标机和开发工作站已经可以连接起来了,目标机上显示Jumping to 0x0013AC2C,开发工作站能出现下载进度显示界面。 但是下载结束后,出现如下Find Source的对话框,Please enter ...… 查看全部问答∨ |
哪位达人用过《EVC高级编程及其应用开发》这本书上基础数据库的例子? 我在wince下试了这个程序,可是不好使阿,添加不了,也删除不了,请问是还需要安装什么程序还是本身实例程序有问题啊?… 查看全部问答∨ |
USB虚拟串口例程从USB端发数据到串口是否一次只能了送一个 USB虚拟串口例程Virtual_COM_Port没作任何修改,从USB端发数据到串口,两端都是用串口调试助手。比如从真实串口端发 ...… 查看全部问答∨ |