搜索
bottom↓
回复: 33

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

[复制链接]

出0入0汤圆

发表于 2013-7-27 10:00:12 | 显示全部楼层 |阅读模式
从开始在玩DS18B20温度传感器的时候,用在数码管上显示就会闪烁。

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2013-7-27 10:16:52 | 显示全部楼层
在读写每一位时关中断就够了,才关断60US而已,不会闪的

出0入0汤圆

发表于 2013-7-27 10:29:56 | 显示全部楼层
楼主可以搜索一下“时间片轮”学一下设计思想!

出0入0汤圆

发表于 2013-7-27 10:43:39 | 显示全部楼层
扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。

出0入0汤圆

 楼主| 发表于 2013-7-27 12:44:48 | 显示全部楼层
SNOOKER 发表于 2013-7-27 10:16
在读写每一位时关中断就够了,才关断60US而已,不会闪的

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

出0入0汤圆

 楼主| 发表于 2013-7-27 12:45:54 | 显示全部楼层
yidaosky 发表于 2013-7-27 10:35
改延时

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

出0入0汤圆

 楼主| 发表于 2013-7-27 12:46:55 | 显示全部楼层
hwbrat 发表于 2013-7-27 10:43
扫描数码管应该要用定时器中断,但定时器中断并不只为扫描数码管服务。

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

出0入0汤圆

 楼主| 发表于 2013-7-27 12:54:49 | 显示全部楼层
luohui5003 发表于 2013-7-27 10:29
楼主可以搜索一下“时间片轮”学一下设计思想!

谢谢,这个感觉很不错。继续看

出0入147汤圆

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

出0入0汤圆

发表于 2013-7-27 13:10:29 | 显示全部楼层
扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。

出0入0汤圆

发表于 2013-7-27 13:11:19 | 显示全部楼层
你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描一位数码管

出0入0汤圆

 楼主| 发表于 2013-7-27 13:31:50 | 显示全部楼层
fastweb 发表于 2013-7-27 13:11
你的程序即使不适用RTOS难道也不开定时器产生自己的时基吗?比如1ms的定时器,除了时基处理,可以顺便扫描 ...

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

出0入0汤圆

发表于 2013-7-27 13:42:14 | 显示全部楼层
要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反应这个标志)

出0入0汤圆

发表于 2013-7-27 13:47:11 | 显示全部楼层
不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再次启动温度转换,转换一下思维先读取再启动下次转换,而不是启动以后死等转换完成再读取就行了

出0入0汤圆

 楼主| 发表于 2013-7-27 13:49:46 | 显示全部楼层
fastweb 发表于 2013-7-27 13:42
要在定时器里输出显示扫描,不能用标注后在主程序里做输出(因为你的主程序有时候要等待AD之类的,会延迟反 ...

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

出0入0汤圆

 楼主| 发表于 2013-7-27 14:03:12 | 显示全部楼层
little_Monkey 发表于 2013-7-27 13:47
不用定时器也行,读取一次温度以后马上扫描并启动下一次温度转换,扫描几次时间超过转换时间以后再次读取再 ...

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

出0入0汤圆

发表于 2013-7-27 14:11:44 | 显示全部楼层
wt418995874 发表于 2013-7-27 14:03
把数码管显示函数当延时来用

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

出0入0汤圆

 楼主| 发表于 2013-7-27 14:38:38 | 显示全部楼层
dreampet 发表于 2013-7-27 13:07
这个跟怎么扫描数码管没关系,根本问题是你不应该在DS18B20转换温度时干等着。
因此,最简单的办法是调整温 ...

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

出0入0汤圆

 楼主| 发表于 2013-7-27 14:39:58 | 显示全部楼层
lcw_swust 发表于 2013-7-27 13:10
扫描数码管放在定时中断里。
18B20读写一个位时要先关中断,读写一个位完成后再开中断。 ...

谢谢,很多种方法

出0入147汤圆

发表于 2013-7-27 15:10:30 | 显示全部楼层
wt418995874 发表于 2013-7-27 14:38
嗯,启动转换温度及读取温度,都放在中断里面,判断时间到就执行启动或者转换,其余时间主函数继续扫描显 ...

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

出0入0汤圆

发表于 2013-7-27 19:45:47 | 显示全部楼层
可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最简单的方式。

出0入0汤圆

 楼主| 发表于 2013-7-27 20:50:03 | 显示全部楼层
dreampet 发表于 2013-7-27 15:10
不是放在中断里面,而是放在主函数里面,中断里面只置标志位,在主函数检测标志位执行相应程序。 ...

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

出0入0汤圆

 楼主| 发表于 2013-7-27 20:51:12 | 显示全部楼层
sdf159372008 发表于 2013-7-27 19:45
可以不用中断,显示函数直接放在MAIN里面,然后再凭空捏造一个数码管(程序中再多加一位数码管),这样是最 ...

为何要多加一位数码管呢

出0入0汤圆

发表于 2013-7-28 10:30:59 | 显示全部楼层
wt418995874 发表于 2013-7-27 20:51
为何要多加一位数码管呢

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

出0入0汤圆

 楼主| 发表于 2013-7-28 13:37:39 | 显示全部楼层
INT0 发表于 2013-7-28 10:30
虚拟的数码管不是为了显示,只是为了腾出时间采集DS18B20的数值的吧?

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

出0入147汤圆

发表于 2013-7-28 13:57:07 | 显示全部楼层
wt418995874 发表于 2013-7-27 20:50
这样不太好,之前试过。
不知道是不是我弄的不好

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

出0入0汤圆

 楼主| 发表于 2013-7-28 15:21:51 | 显示全部楼层
dreampet 发表于 2013-7-28 13:57
DS18B20启动转换至多1ms,读取温度时间更短。
难道你要在每个1ms中断里面都做所有事情?
只能说你的程序 ...

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

出0入0汤圆

发表于 2013-7-28 15:38:44 | 显示全部楼层
貌似,你在初始化18B20的时候,应该把中断关掉

出0入0汤圆

发表于 2013-7-29 00:44:50 | 显示全部楼层
wt418995874 发表于 2013-7-27 20:51
为何要多加一位数码管呢

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

出0入0汤圆

发表于 2013-8-10 07:58:58 来自手机 | 显示全部楼层
有帮助。。。。

出0入0汤圆

发表于 2013-8-10 16:55:36 | 显示全部楼层
很简单啊,做一个状态机,每次读写一位数据啊,读写一位,看下数码管该不该扫描了,不该扫描就再读写下一位

出0入0汤圆

发表于 2015-4-8 20:10:41 | 显示全部楼层
mark下,正对此事发愁

出20入25汤圆

发表于 2015-4-8 21:14:28 | 显示全部楼层
归根结底是读18B20时间用得太长,可以考虑分步做,在读18B20的函数里

出0入0汤圆

发表于 2017-5-10 18:00:17 | 显示全部楼层
用状态机来做。把读温度分几步来来做,而不是一次做完
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 23:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表