单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 231|回复: 22
打印 上一主题 下一主题
收起左侧

数码管亮度自动调节,单片机控制程序上的问题

  [复制链接]
跳转到指定楼层
楼主
各位好,我想用单片机+光敏电阻实现数码管亮度调节,
目前程序位选放中断,但要实现亮度自动调节,那么位选开和关都需要加时延,这样一来位选就不能在定时中断中进行了。


我已知的位选不放中断的思路:

开始: A 选通 延时on_time ,关闭A延时6ms-on_time

B 选通 延时on_time ,关闭B延时6ms-on_time

C 选通 延时on_time ,关闭C延时6ms-on_time

D选通 延时on_time ,关闭 D延时6ms-on_time

我想请教:1. 程序思路该是什么样的?

                 2. 很多人位选没有用定时中断,但我的理解位选需放中断,这样理解没错吧?



微信图片_20190314135605.jpg (549.14 KB, 下载次数: 3)

微信图片_20190314135605.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
geyobing 发表于 2019-3-14 13:38 | 只看该作者
固定刷新频率,然后根据光敏电阻来调节开的时间长短,实现亮度变化,一般会放在中断中去进行切换的,主流程肯定有别的事要做的

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
 楼主| join22life 发表于 2019-3-14 14:00 | 只看该作者
就像图中那样,每5ms中断一次用于开位选,但是一个数码管显示时间将近6ms,等到第二个中断来时进入第二个数码管显示,以此类推,使用没有显示数码管显示没有完毕被中断,这样对程序有什么影响吗?
回复

使用道具 举报

地板
wulin 发表于 2019-3-14 15:37 | 只看该作者
join22life 发表于 2019-3-14 14:00
就像图中那样,每5ms中断一次用于开位选,但是一个数码管显示时间将近6ms,等到第二个中断来时进入第二个数 ...

调节数码管亮度其实就是调节数码管导通和截止时间比例,具体方案还要看数码管的驱动方式。比较倾向于采用PWM方式给位选供电。数码管静态显示控制亮度简单些,数码管动态显示控制亮度比较麻烦。
回复

使用道具 举报

5#
 楼主| join22life 发表于 2019-3-14 15:43 | 只看该作者
geyobing 发表于 2019-3-14 13:38
固定刷新频率,然后根据光敏电阻来调节开的时间长短,实现亮度变化,一般会放在中断中去进行切换的,主流程 ...

我现在写了一个光敏电阻不同值对应开位选的时长的函数,放主循环中;
另一个开各个位选函数,放主循环中,通过中断每5ms开位,这个思路是正确的吧?
回复

使用道具 举报

6#
zhb2004xp 发表于 2019-3-14 16:09 | 只看该作者
多位数码管的显示本身就是利用人眼的视觉错觉造成的,如果要增加视觉上亮度强度的感觉,理论上是要增加闪烁的频率,但是如果显示内容同样变化频率较快的话,会造成全部显示8的视觉错觉。
回复

使用道具 举报

7#
 楼主| join22life 发表于 2019-3-14 22:21 | 只看该作者
zhb2004xp 发表于 2019-3-14 16:09
多位数码管的显示本身就是利用人眼的视觉错觉造成的,如果要增加视觉上亮度强度的感觉,理论上是要增加闪烁 ...

这个像你说的,我现在就是出现数字显示不清有全8现象了
回复

使用道具 举报

8#
 楼主| join22life 发表于 2019-3-14 22:22 | 只看该作者
wulin 发表于 2019-3-14 15:37
调节数码管亮度其实就是调节数码管导通和截止时间比例,具体方案还要看数码管的驱动方式。比较倾向于采用 ...

看来我把亮度调节想的简单化了
回复

使用道具 举报

9#
Y_G_G 发表于 2019-3-14 23:41 | 只看该作者
其实没有那么复杂的,不要用中断
你写两个延时的函数,一个控制数码管开,另一个控制数码管关
等于是数码亮>延时1>数码管灭>延时2>显示下一个数码管
把光敏电阻ADC的值用来作为延时的时间,
延时1的向上加,到0延时结束
延时2的向下减,到0延时结束
这样一来,总的延时时长就是恒定不变的了,不会因为光敏电阻的变化而变化了
回复

使用道具 举报

10#
我们的青春阿 发表于 2019-3-15 06:40 | 只看该作者
join22life 发表于 2019-3-14 15:43
我现在写了一个光敏电阻不同值对应开位选的时长的函数,放主循环中;
另一个开各个位选函数,放主循环中 ...

思路很好,可以试一试!不行了再换种方式,作品就是在不断的调试中成长的

评分

参与人数 5黑币 +42 收起 理由
Sawardeakar + 8 很给力!
areyouok + 10
春风十里吹死你 + 10
微小苛 + 10 赞一个!
zhengchong60 + 4 赞一个!

查看全部评分

回复

使用道具 举报

11#
 楼主| join22life 发表于 2019-3-15 12:24 | 只看该作者
Y_G_G 发表于 2019-3-14 23:41
其实没有那么复杂的,不要用中断
你写两个延时的函数,一个控制数码管开,另一个控制数码管关
等于是数码亮> ...

恩,多谢,下午准备解决这个问题
回复

使用道具 举报

12#
 楼主| join22life 发表于 2019-3-15 12:28 | 只看该作者
Y_G_G 发表于 2019-3-14 23:41
其实没有那么复杂的,不要用中断
你写两个延时的函数,一个控制数码管开,另一个控制数码管关
等于是数码亮> ...

抱歉还是有个疑问,位选不是应该通过中断才是最好的吗?
回复

使用道具 举报

13#
本厨 发表于 2019-3-15 14:45 | 只看该作者
延时1的向上加,到0延时结束 延时2的向下减,到0延时结束
回复

使用道具 举报

14#
Y_G_G 发表于 2019-3-15 15:11 | 只看该作者
join22life 发表于 2019-3-15 12:28
抱歉还是有个疑问,位选不是应该通过中断才是最好的吗?

位选要中断干嘛呢?
8个数码管以下的,扫描显示,一个接一个的显示,最后ADC一次,用不也多长时间的
如果你觉得程序还要干点的别的什么的话,加入到延时函数里面进行也可以的了
回复

使用道具 举报

15#
 楼主| join22life 发表于 2019-3-17 22:27 | 只看该作者
多谢各位的帮助,现在程序能实现10级自动亮度调节,但发现adc分阶用的值不好取,导致有时光线变化在某个值附近时,数码管亮度一直来回切换,看着闪动。
我大概知道用冗余,但是比如一级亮度(100 < adc)&&(adc >150),
二级亮度( 159  < adc ) && ( adc > 200 ),此时150-159间的数值状态我该怎么处理,如果都放else那么肯定不行的。
另外:光敏电阻的特性曲线网上也没找到相关资料,只知道亮阻值暗阻值,比较融通。
回复

使用道具 举报

16#
 楼主| join22life 发表于 2019-3-17 22:28 | 只看该作者
Y_G_G 发表于 2019-3-15 15:11
位选要中断干嘛呢?
8个数码管以下的,扫描显示,一个接一个的显示,最后ADC一次,用不也多长时间的
如果你 ...

感谢解答!
我记得学动态数码管显示时,老师强调用中断来开位,所以之前都是这么做的,但现在像这样需要延时的,就行不通了,所以很疑惑。
回复

使用道具 举报

17#
 楼主| join22life 发表于 2019-3-17 22:31 | 只看该作者
本厨 发表于 2019-3-15 14:45
延时1的向上加,到0延时结束 延时2的向下减,到0延时结束

总时长25ms,开显示时长为on_time,
那么关显示25-on_time,你的累加累减能麻烦再讲下吗?
回复

使用道具 举报

18#
 楼主| join22life 发表于 2019-3-18 21:36 | 只看该作者
geyobing 发表于 2019-3-14 13:38
固定刷新频率,然后根据光敏电阻来调节开的时间长短,实现亮度变化,一般会放在中断中去进行切换的,主流程 ...

抱歉还是有个点没想明白,固定刷新率,光敏电阻来调节开的时间长短,这两点我都做了,但位选放中断中,比如5ms就要开一个位选,这时该位选打开后又存在开时间的延时,要是大于5ms话岂不是影响第二个位选的显示效果,一直不明白这点,请赐教多谢了。
回复

使用道具 举报

19#
hhh402 发表于 2019-3-18 22:18 | 只看该作者
用中断是最好的选择,延时程序要慎用,延时就是浪费资源。4位数码管100HZ刷新率,就是2.5ms刷新一位数码管,要分10级亮度就是:使用250us的中断,10个中断(总共25ms)刷一位数码管,要1级亮度就是1个中断开,9个中断关;要2级亮度就是2个中断开,8个中断关;以此类推。
回复

使用道具 举报

20#
 楼主| join22life 发表于 2019-3-19 21:29 | 只看该作者
hhh402 发表于 2019-3-18 22:18
用中断是最好的选择,延时程序要慎用,延时就是浪费资源。4位数码管100HZ刷新率,就是2.5ms刷新一位数码管 ...

解决我之前的那个疑惑。很感谢你的思路,受益匪浅!
回复

使用道具 举报

21#
geyobing 发表于 2019-3-20 09:54 | 只看该作者
19楼的讲的已经很好了,关于你采集光敏电阻波动的情况,你可以做一些小手段,举例0-1000,分10段,理论上0-100对应1,101-200对应2,以此类推,但是为了不出现一会弱一会亮的情况,可以加些额外条件,比如现在属于1段,那就必须值大于120才能跳到2段,如果现在属于2段值必须小于80才能调到1段,这样就可以避免临界值切来切去的问题,这个值要根据你实际的调整一下。
回复

使用道具 举报

22#
 楼主| join22life 发表于 2019-3-21 16:00 | 只看该作者
geyobing 发表于 2019-3-20 09:54
19楼的讲的已经很好了,关于你采集光敏电阻波动的情况,你可以做一些小手段,举例0-1000,分10段,理论上0- ...

非常感谢你的回复!我会试着把程序调整。
回复

使用道具 举报

23#
lids 发表于 2019-3-25 12:32 | 只看该作者
去看看我这个帖子,有你想要的关于数码管根据环境亮度自动调节的程序及电路http://www.51hei.com/bbs/dpj-146620-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

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