温度传感器代码解析Ⅰ

点击打开在线编译器,边学边练

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

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


1.大于等于0度的转换

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

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

13.3.png

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

13.4.png


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

13.5.png


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

13.6.png


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

13.7.png


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

13.8.png


本文固定URL:https://www.dotcpp.com/course/397

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)