标题: 不用PWM的单片机呼吸灯程序(视觉暂留) [打印本页]

作者: 323    时间: 2019-5-2 08:44
标题: 不用PWM的单片机呼吸灯程序(视觉暂留)
此呼吸灯不用PWM也能呼吸!!
原理是由于人眼的视觉残留特性:人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。
举一个简单的例子,我们家里使用的灯是50Hz,一秒钟会亮灭50次,但是我们觉得灯是一直亮着的。

单片机源程序如下:
  1. #include<reg52.h>
  2. void delay(int x)
  3. {
  4. int i;
  5. for (i=x;i>0;i--);
  6. }
  7. void main ()
  8. {
  9. int ledlx,cycle=400;
  10. while(1)
  11. {
  12. for(ledlx=0;ledlx<cycle;ledlx++)                /////////呼吸灯
  13. {
  14. P1=0;
  15. delay(ledlx);
  16. P1=0xff;
  17. delay(cycle-ledlx);
  18. }
  19. for(ledlx=cycle;ledlx>0;ledlx--)

  20. {
  21. P1=0;
  22. delay(ledlx);
  23. P1=0xff;
  24. delay(cycle-ledlx);
  25. }
  26. }
  27. }
复制代码

所有资料51hei提供下载:
呼吸灯.rar (279 Bytes, 下载次数: 13)





作者: 323    时间: 2019-5-2 08:45
大家有问题可以问哈!!

作者: 曾先生    时间: 2019-5-2 22:12
这个for写的巧妙.可以用定时.细分也可以吗?
作者: 323    时间: 2019-5-3 09:16
曾先生 发表于 2019-5-2 22:12
这个for写的巧妙.可以用定时.细分也可以吗?

emmm啥叫定时细分,我是小白,不太懂,不好意思哈。。如果您用定时器的话,每次进中断的时间不是一样的么?好像达不到要求吧……

作者: dzbj    时间: 2019-5-3 11:12
先感谢楼主分享

说说我自己的想法

首先这个程序的意思和PWM一样啊 不也是逐步改变亮灭时间的占空比调整亮和灭时间 其次 用for语句写抛物面在51上对系统占用太大了 基本上干不了别的事 除非一个片子只做呼吸灯 但如果只做呼吸灯用个51片子又太浪费 用555做也是一样的

我给家里的夜灯做了个控制板 没人活动的时候就是呼吸状态 开始也是用和你一样的for写 但要同时通讯 和多个模块同步状态以及检测电流 判断是否有故障等等事以后就出问题了 总有某个事件做不好 后来还是用中断的方式写
作者: 323    时间: 2019-5-3 14:08
dzbj 发表于 2019-5-3 11:12
先感谢楼主分享

说说我自己的想法

确实,您说的没错,原理是和PWM一样,不同仅在于这个不用中断。可能也就在定时器用完的情况下用用吧……(就是定时器不够用的时候)但是在定时器用完的情况下,程序一般都挺大的,加了这个可能会像您说的那样出问题(您是用什么芯片的,是不是芯片的问题),所以吧……好像确实没什么用。我是个小白,非常感谢您的回复!!
作者: dzbj    时间: 2019-5-3 21:53
323 发表于 2019-5-3 14:08
确实,您说的没错,原理是和PWM一样,不同仅在于这个不用中断。可能也就在定时器用完的情况下用用吧…… ...

我用的是STC片子 通常底层控制我觉得8位足够了 相比之下51内核的简单 涉及图像处理或者中央控制才会用到STM32之类的

小白也没关系 都从小白到大白的 哈哈

我觉得在程序里 除了非常短暂和必须的情况 尽量不用Delay或while(--t)之类的死延时 这种程序工作时cpu就在那空转 除了中断什么事都干不了 比如所有任务循环一次不到1ms Delay在应用中最小的等待时间是5ms 就意味着有5次不能执行其它事 还有 for语句对运算时间的消耗比较大 我一般不会用for去写主程序 多数用在单一的功能模块里 更多用判断标记 if执行时间小于for不少呢 另外51的硬件自资源太少了 中断实在要慎用 能不用的尽量不用 即便STC8系有更多定时器和中断 其实放开了用也是不够的 自己写功能的一点点感受 仅供参考
作者: 323    时间: 2019-5-4 09:42
dzbj 发表于 2019-5-3 21:53
我用的是STC片子 通常底层控制我觉得8位足够了 相比之下51内核的简单 涉及图像处理或者中央控制才会用到S ...

嗯嗯,学到了,谢谢大佬哈!!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1