基于蓝桥杯的单片机模块练习——DS18B20温度传感器各类异常情况总结

基于蓝桥杯的单片机模块练习——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();函数里面有关闭中断的处理,影响到了定时器中断刷新数码管,导致其他显示界面的显示效果也受到影响而产生闪烁

  • 18
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ 金龍戲水 ღ

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值