温度传感器的读写时序原理跟红外遥控差不多,关于宋老师的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;
temp=(unsigned int )temp_float;
str[0]= '0' +( (temp/1000)%10 );
str[1]= '0' +( (temp/100)%10 );
str[2]= '0' +( (temp/10)%10 );
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,继续接下一次的显示。
|