温度传感器的读写时序原理跟红外遥控差不多,关于宋老师的lesson16_2例程的DS18B20.c的代码这里我们就不讲解了,
《手把手教你学51单片机》文档第16章都已讲解明白。我们要讲解的是温度数值的转换如何在液晶屏上显示出来。
1.大于等于0度的转换
首先我们知道大于等于0度的时候,临时存取没有转换过的16位的变量的数值只需要乘以0.0625就是转换出来的实际温度了。
看到以下表格就知道,0x07D0=2000,实际温度就是2000*0.0625=+125度。
假如temp是unsigned int型变量用来存取没有转换过的临时温度,那么我们再定义一个float型的变量temp_float。
我们把temp强制转换成float类型,这样“temp_float=(float)temp*0.0625”就是实际的温度了。
我们要想把实际温度显示在液晶屏上该如何做呢?
假如我们要显示的范围只需保留一位小数即可,那么要显示像19.2度这样,我们要做的是把temp_float再乘以10.0,
然后又强制转换回来“temp=(u16)temp_float;”让temp存取192这个unsigned int类型的数据。
我们定义一个数组str。
str[0]='0'+( (temp/100)%10 );
str[1]='0'+( (temp/10)%10 );
str[2]='.';
str[3]='0'+( temp%10 );
这样的话“LcdShowStr(0, 0, str);”就是显示19.2了。
可是温度传感器测温最高有125度,也就是我们也要满足测量超过100度时候的显示。
比如显示101.2度时,液晶屏是这样显示
显示29.5度液晶屏要这样显示
显示0.7度液晶屏要这样显示,可以看到小数点要灵活改变
那么我们需要重新完善显示的代码,我们定义一个u8变量temp_i初始化时为0
temp_float=(float)temp*0.0625*10.0;//实际温度值再乘以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++; LcdShowStr(0, 0, str+temp_i); //显示到液晶屏上 temp_i=0;
我们做的是高位为0不显示,也就是当温度为25.9度时,有
str[0]=’0’; str[1]=’2’; str[2]=’5’; str[3]=’.’; str[4]=’9’;
而“LcdShowStr(0, 0, str+temp_i);”就是从str[1]开始显示,这样液晶屏就是这样显示了
同理当温度为0.7度时,“LcdShowStr(0, 0, str+temp_i);”里的temp_i的值为2,那么就是从str[2]开始显示,显示就如以下的方式了,显示完了temp_i要清0,继续接下一次的显示。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程