wt418995874 发表于 2013-7-27 10:00:12

怎么解决DS18B20温度值在数码管显示会闪烁

从开始在玩DS18B20温度传感器的时候,用在数码管上显示就会闪烁。

原因就扫描数码管的时候中间出现了一段时间没扫描到,这段时间刚好就是在温度转换时候的一段延时时间太长了,导致数码管显示会闪烁

不知道有什么方法可以解决,之前也有用中断来扫描数码管,感觉要是用一个定时器中断来扫描数码管会不会太浪费。

不知道大家在扫描数码管的时候是采用哪种方法来扫描的???

SNOOKER 发表于 2013-7-27 10:16:52

在读写每一位时关中断就够了,才关断60US而已,不会闪的

luohui5003 发表于 2013-7-27 10:29:56

楼主可以搜索一下“时间片轮”学一下设计思想!

hwbrat 发表于 2013-7-27 10:43:39

扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。

wt418995874 发表于 2013-7-27 12:44:48

SNOOKER 发表于 2013-7-27 10:16 static/image/common/back.gif
在读写每一位时关中断就够了,才关断60US而已,不会闪的

读写每一位关闭中断?我在主函数大循环显示,不用中断来显示的,就不管中断的了

wt418995874 发表于 2013-7-27 12:45:54

yidaosky 发表于 2013-7-27 10:35 static/image/common/back.gif
改延时

这延时是温度转换时间,大小不能改

wt418995874 发表于 2013-7-27 12:46:55

hwbrat 发表于 2013-7-27 10:43 static/image/common/back.gif
扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。

这么说用数码管显示最好还是用中断比较好

wt418995874 发表于 2013-7-27 12:54:49

luohui5003 发表于 2013-7-27 10:29 static/image/common/back.gif
楼主可以搜索一下“时间片轮”学一下设计思想!

{:smile:} 谢谢,这个感觉很不错。继续看

dreampet 发表于 2013-7-27 13:07:56

这个跟怎么扫描数码管没关系,根本问题是你不应该在DS18B20转换温度时干等着。
因此,最简单的办法是调整温度转换函数的调用方式,假设有个1ms的定时中断,改成如下形式
if (TempTimer == 0){
DS18B20_StartConv();    启动转换的时间 不到1ms
TempTimer = 500;
}
else if (--TempTimer == 0)
{
DS18B20_GetTemp();
}

lcw_swust 发表于 2013-7-27 13:10:29

扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。

fastweb 发表于 2013-7-27 13:11:19

你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描一位数码管

wt418995874 发表于 2013-7-27 13:31:50

fastweb 发表于 2013-7-27 13:11 static/image/common/back.gif
你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描 ...

有点懂了。楼上那位朋友介绍时间片轮,我去看看后,感觉有点头绪了。
你说的也就是这样吧。
我这样理解的,定时器定时1ms,作为时基,而当每到该执行的程序,在定时器时间到就标志下,然后主函数就可以执行了

fastweb 发表于 2013-7-27 13:42:14

要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反应这个标志)

little_Monkey 发表于 2013-7-27 13:47:11

不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再次启动温度转换,转换一下思维先读取再启动下次转换,而不是启动以后死等转换完成再读取就行了

wt418995874 发表于 2013-7-27 13:49:46

fastweb 发表于 2013-7-27 13:42 static/image/common/back.gif
要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反 ...

嗯,定时器中断中每次终端处理的程序不能太多。这样子对每个需要在中断中处理的函数的时间进行计算了

wt418995874 发表于 2013-7-27 14:03:12

little_Monkey 发表于 2013-7-27 13:47 static/image/common/back.gif
不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再 ...

把数码管显示函数当延时来用

lxa0 发表于 2013-7-27 14:11:44

wt418995874 发表于 2013-7-27 14:03 static/image/common/back.gif
把数码管显示函数当延时来用

这个是正解~~~~~~~~~~~~~

wt418995874 发表于 2013-7-27 14:38:38

dreampet 发表于 2013-7-27 13:07 static/image/common/back.gif
这个跟怎么扫描数码管没关系,根本问题是你不应该在DS18B20转换温度时干等着。
因此,最简单的办法是调整温 ...

嗯,启动转换温度及读取温度,都放在中断里面,判断时间到就执行启动或者转换,其余时间主函数继续扫描显示。谢谢

wt418995874 发表于 2013-7-27 14:39:58

lcw_swust 发表于 2013-7-27 13:10 static/image/common/back.gif
扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。 ...

谢谢,很多种方法{:smile:}

dreampet 发表于 2013-7-27 15:10:30

wt418995874 发表于 2013-7-27 14:38 static/image/common/back.gif
嗯,启动转换温度及读取温度,都放在中断里面,判断时间到就执行启动或者转换,其余时间主函数继续扫描显 ...

不是放在中断里面,而是放在主函数里面,中断里面只置标志位,在主函数检测标志位执行相应程序。

sdf159372008 发表于 2013-7-27 19:45:47

可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最简单的方式。

wt418995874 发表于 2013-7-27 20:50:03

dreampet 发表于 2013-7-27 15:10 static/image/common/back.gif
不是放在中断里面,而是放在主函数里面,中断里面只置标志位,在主函数检测标志位执行相应程序。 ...

这样不太好,之前试过。
不知道是不是我弄的不好

wt418995874 发表于 2013-7-27 20:51:12

sdf159372008 发表于 2013-7-27 19:45 static/image/common/back.gif
可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最 ...

为何要多加一位数码管呢

INT0 发表于 2013-7-28 10:30:59

wt418995874 发表于 2013-7-27 20:51 static/image/common/back.gif
为何要多加一位数码管呢

虚拟的数码管不是为了显示,只是为了腾出时间采集DS18B20的数值的吧?

wt418995874 发表于 2013-7-28 13:37:39

INT0 发表于 2013-7-28 10:30 static/image/common/back.gif
虚拟的数码管不是为了显示,只是为了腾出时间采集DS18B20的数值的吧?

也对,时间不够就加多一位

dreampet 发表于 2013-7-28 13:57:07

wt418995874 发表于 2013-7-27 20:50 static/image/common/back.gif
这样不太好,之前试过。
不知道是不是我弄的不好

DS18B20启动转换至多1ms,读取温度时间更短。
难道你要在每个1ms中断里面都做所有事情?
只能说你的程序架构效率及低,要学会合理的利用时间,用大白话说就是:不要让单片机忙的时候忙死,闲的时候闲死。

wt418995874 发表于 2013-7-28 15:21:51

dreampet 发表于 2013-7-28 13:57 static/image/common/back.gif
DS18B20启动转换至多1ms,读取温度时间更短。
难道你要在每个1ms中断里面都做所有事情?
只能说你的程序 ...

谢谢,懂了,之前都没合理安排好时间

孤独stranger 发表于 2013-7-28 15:38:44

貌似,你在初始化18B20的时候,应该把中断关掉

sdf159372008 发表于 2013-7-29 00:44:50

wt418995874 发表于 2013-7-27 20:51 static/image/common/back.gif
为何要多加一位数码管呢

因为不用中断的话,最后一位的显示时间比较长(读取18B20的时间),所以亮度不均。多加一位可以解决这个问题

nieyingjie 发表于 2013-8-10 07:58:58

有帮助。。。。

zhangshixing 发表于 2013-8-10 16:55:36

很简单啊,做一个状态机,每次读写一位数据啊,读写一位,看下数码管该不该扫描了,不该扫描就再读写下一位

DMing 发表于 2015-4-8 20:10:41

mark下,正对此事发愁

chenchaoting 发表于 2015-4-8 21:14:28

归根结底是读18B20时间用得太长,可以考虑分步做,在读18B20的函数里

52HLX 发表于 2017-5-10 18:00:17

用状态机来做。把读温度分几步来来做,而不是一次做完
页: [1]
查看完整版本: 怎么解决DS18B20温度值在数码管显示会闪烁