怎么解决DS18B20温度值在数码管显示会闪烁
从开始在玩DS18B20温度传感器的时候,用在数码管上显示就会闪烁。原因就扫描数码管的时候中间出现了一段时间没扫描到,这段时间刚好就是在温度转换时候的一段延时时间太长了,导致数码管显示会闪烁
不知道有什么方法可以解决,之前也有用中断来扫描数码管,感觉要是用一个定时器中断来扫描数码管会不会太浪费。
不知道大家在扫描数码管的时候是采用哪种方法来扫描的??? 在读写每一位时关中断就够了,才关断60US而已,不会闪的 楼主可以搜索一下“时间片轮”学一下设计思想! 扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。 SNOOKER 发表于 2013-7-27 10:16 static/image/common/back.gif
在读写每一位时关中断就够了,才关断60US而已,不会闪的
读写每一位关闭中断?我在主函数大循环显示,不用中断来显示的,就不管中断的了 yidaosky 发表于 2013-7-27 10:35 static/image/common/back.gif
改延时
这延时是温度转换时间,大小不能改 hwbrat 发表于 2013-7-27 10:43 static/image/common/back.gif
扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。
这么说用数码管显示最好还是用中断比较好 luohui5003 发表于 2013-7-27 10:29 static/image/common/back.gif
楼主可以搜索一下“时间片轮”学一下设计思想!
{:smile:} 谢谢,这个感觉很不错。继续看 这个跟怎么扫描数码管没关系,根本问题是你不应该在DS18B20转换温度时干等着。
因此,最简单的办法是调整温度转换函数的调用方式,假设有个1ms的定时中断,改成如下形式
if (TempTimer == 0){
DS18B20_StartConv(); 启动转换的时间 不到1ms
TempTimer = 500;
}
else if (--TempTimer == 0)
{
DS18B20_GetTemp();
} 扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。 你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描一位数码管 fastweb 发表于 2013-7-27 13:11 static/image/common/back.gif
你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描 ...
有点懂了。楼上那位朋友介绍时间片轮,我去看看后,感觉有点头绪了。
你说的也就是这样吧。
我这样理解的,定时器定时1ms,作为时基,而当每到该执行的程序,在定时器时间到就标志下,然后主函数就可以执行了 要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反应这个标志) 不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再次启动温度转换,转换一下思维先读取再启动下次转换,而不是启动以后死等转换完成再读取就行了 fastweb 发表于 2013-7-27 13:42 static/image/common/back.gif
要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反 ...
嗯,定时器中断中每次终端处理的程序不能太多。这样子对每个需要在中断中处理的函数的时间进行计算了 little_Monkey 发表于 2013-7-27 13:47 static/image/common/back.gif
不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再 ...
把数码管显示函数当延时来用 wt418995874 发表于 2013-7-27 14:03 static/image/common/back.gif
把数码管显示函数当延时来用
这个是正解~~~~~~~~~~~~~ dreampet 发表于 2013-7-27 13:07 static/image/common/back.gif
这个跟怎么扫描数码管没关系,根本问题是你不应该在DS18B20转换温度时干等着。
因此,最简单的办法是调整温 ...
嗯,启动转换温度及读取温度,都放在中断里面,判断时间到就执行启动或者转换,其余时间主函数继续扫描显示。谢谢 lcw_swust 发表于 2013-7-27 13:10 static/image/common/back.gif
扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。 ...
谢谢,很多种方法{:smile:} wt418995874 发表于 2013-7-27 14:38 static/image/common/back.gif
嗯,启动转换温度及读取温度,都放在中断里面,判断时间到就执行启动或者转换,其余时间主函数继续扫描显 ...
不是放在中断里面,而是放在主函数里面,中断里面只置标志位,在主函数检测标志位执行相应程序。 可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最简单的方式。 dreampet 发表于 2013-7-27 15:10 static/image/common/back.gif
不是放在中断里面,而是放在主函数里面,中断里面只置标志位,在主函数检测标志位执行相应程序。 ...
这样不太好,之前试过。
不知道是不是我弄的不好 sdf159372008 发表于 2013-7-27 19:45 static/image/common/back.gif
可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最 ...
为何要多加一位数码管呢 wt418995874 发表于 2013-7-27 20:51 static/image/common/back.gif
为何要多加一位数码管呢
虚拟的数码管不是为了显示,只是为了腾出时间采集DS18B20的数值的吧? INT0 发表于 2013-7-28 10:30 static/image/common/back.gif
虚拟的数码管不是为了显示,只是为了腾出时间采集DS18B20的数值的吧?
也对,时间不够就加多一位 wt418995874 发表于 2013-7-27 20:50 static/image/common/back.gif
这样不太好,之前试过。
不知道是不是我弄的不好
DS18B20启动转换至多1ms,读取温度时间更短。
难道你要在每个1ms中断里面都做所有事情?
只能说你的程序架构效率及低,要学会合理的利用时间,用大白话说就是:不要让单片机忙的时候忙死,闲的时候闲死。
dreampet 发表于 2013-7-28 13:57 static/image/common/back.gif
DS18B20启动转换至多1ms,读取温度时间更短。
难道你要在每个1ms中断里面都做所有事情?
只能说你的程序 ...
谢谢,懂了,之前都没合理安排好时间 貌似,你在初始化18B20的时候,应该把中断关掉 wt418995874 发表于 2013-7-27 20:51 static/image/common/back.gif
为何要多加一位数码管呢
因为不用中断的话,最后一位的显示时间比较长(读取18B20的时间),所以亮度不均。多加一位可以解决这个问题 有帮助。。。。 很简单啊,做一个状态机,每次读写一位数据啊,读写一位,看下数码管该不该扫描了,不该扫描就再读写下一位 mark下,正对此事发愁 归根结底是读18B20时间用得太长,可以考虑分步做,在读18B20的函数里 用状态机来做。把读温度分几步来来做,而不是一次做完
页:
[1]