基于蓝桥杯的单片机模块练习——DS18B20温度传感器各类异常情况总结
开始时显示85
原因:因为温度传感器的温度转换需要一定的时间,所以刚一开始温度转换然后紧接着读取温度,再显示出来,他读取的温度便是上一次转换的结果,由于ds18b20初始温度值为85,所以这里的“上一次转换的结果”就是85.
解决方法:在程序初始化的部分加上
Read_Temperature();//此时读取的温度值为默认的85
Delay_1ms(750);//等待上一个read函数温度转换完成
Read_Temperature();//此时再读取的温度值就变成了第一个read函数转换完成的温度值
温度显示一会正常一会异常
现象:例如需要显示的温度为:26.1,而数码管显示在26.1和3.5(或者其他的一些不该出现的值)之间来回跳变。
原因: 没有考虑到单片机进入中断对onewire时序的影响。造成时序紊乱,读出来的温度值自然是乱的。
解决:在必要处加上EA = 0;
//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
EA = 0;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
EA = 1;
}
//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
EA = 0;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
EA = 1;
return dat;
}
温度显示时数码管闪烁厉害
原因:因为Read_Temperature();函数里面有关闭中断的处理,影响到了定时器中断刷新数码管,导致显示效果不佳
解决:可以定时读取温度,而不是在while(1)里面毫不间隔地读取。可以用定时器,定时800ms执行一次Read_Temperature();
读取温度时需要注意的问题
在使用Read_Temperature();时,最好加一层判断。就是说只有在需要显示温度界面的时候才使用Read_Temperature(),而在其他显示界面不能使用此函数。因为Read_Temperature();函数里面有关闭中断的处理,影响到了定时器中断刷新数码管,导致其他显示界面的显示效果也受到影响而产生闪烁