DS18B20读取温度导致数码管闪烁问题

想必中断导致数码管闪烁的问题一定让大家都很头疼吧。解决(缓解)这个问题的办法有很多,今天看到了一篇很好的文章,偷偷把代码贴下来:

(1条消息) DS18B20温度传感器闪烁中断问题测试_#法外狂徒张三的博客-CSDN博客icon-default.png?t=M0H8https://methadone-no1.blog.csdn.net/article/details/115569951?spm=1001.2014.3001.5502看了这篇文章,确实让我清晰的认识到了自己的无知。原来这个问题还有这么高端的解决办法,但是因为我的能力有限,以及我这个人倔脾气,我尝试找了找有没有更无脑一点的解决办法。结果,经过我“长时间”,我想出的一个“笨方法”。

看我细细道来:我们分析数码管闪烁的原因,就是中断导致每个位亮的时间不同。(这里还得感谢上面那篇文章的博主)那我们主要就是想,如何使得使得每位亮的时间基本相同呢?这里还要提出一点:单总线完成一个写字节的时间大概在60~120us,读字节也差不多,即我们完成一次温度转换和读取的时间在1ms左右(实际上略小于1ms)。(上面的博主认为是6ms,我保留观点,但这个不是很重要啦)。所以,如果在这1ms内,我们完全关闭中断,数码管肯定有一位亮的时间比其他数码管亮的时间长。这就导致了数码管闪烁。

那么,我们看到,我们是在开始通信时关闭中断,结束通信时开启中断。我的想法是在每次读写之前关中断,完成之后开中断,并且中间延时5us。相当于均匀了一下数码管亮的时间。其实这个很模糊。但是,经过实验,效果还是比较好的。emmmmmmm,可能不会让大家很满意,因为肉眼仔细看还是看得出来的。下面我贴出源码吧:

void read_tem()
{ 

			EA = 0;

/开始转换温度

			init_ds18b20();

		    EA = 1;//
			Delay5us1();//
	        EA = 0;//
			
            Write_DS18B20(0xcc);
		    
            EA = 1;//
			Delay5us1();//
	        EA = 0;//

			Write_DS18B20(0x44);

			EA = 1;//
	        Delay5us1();//
			EA = 0;//

///读取温度

			init_ds18b20();	

            EA = 1;//
			Delay5us1();//
	        EA = 0;//

			Write_DS18B20(0xcc);
	
            EA = 1;//
			Delay5us1();//
	        EA = 0;//

			Write_DS18B20(0xbe);
	
            EA = 1;//
			Delay5us1();//
	        EA = 0;//

	 		tem = Read_DS18B20();   //这里不能这么乱搞,两次读取数据是在一起的
			tem |= (Read_DS18B20()<<8);
			EA = 1;

	        tem = tem*6.25;
}

其实,我们想要看的更仔细一点,可以用手机的摄影模式看一看。经过实验,上面的方法与关一次中断相比,刷新的顺序更加整齐一点。

emmmm,还要提一嘴,我的数码管刷新频率是16ms.

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值