温度传感器的读写时序原理跟红外遥控差不多,关于宋老师的lesson16_2例程的DS18B20.c的代码这里我们就不讲解了,

《手把手教你学51单片机》文档第16章都已讲解明白。我们要讲解的是温度数值的转换如何在液晶屏上显示出来。


1.大于等于0度的转换

首先我们知道大于等于0度的时候,临时存取没有转换过的16位的变量的数值只需要乘以0.0625就是转换出来的实际温度了。

看到以下表格就知道,0x07D0=2000,实际温度就是2000*0.0625=+125度。

温度传感器1

假如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度时,液晶屏是这样显示

温度传感器2


显示29.5度液晶屏要这样显示

温度传感器3


显示0.7度液晶屏要这样显示,可以看到小数点要灵活改变

温度传感器4


那么我们需要重新完善显示的代码,我们定义一个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]开始显示,这样液晶屏就是这样显示了

温度传感器5


同理当温度为0.7度时,“LcdShowStr(0, 0, str+temp_i);”里的temp_i的值为2,那么就是从str[2]开始显示,显示就如以下的方式了,显示完了temp_i要清0,继续接下一次的显示。

温度传感器6

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)