找回密码
 立即注册

QQ登录

只需一步,快速开始

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

不用PWM的单片机呼吸灯程序(视觉暂留)

[复制链接]
跳转到指定楼层
楼主
ID:500421 发表于 2019-5-2 08:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此呼吸灯不用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)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:500421 发表于 2019-5-2 08:45 | 只看该作者
大家有问题可以问哈!!
回复

使用道具 举报

板凳
ID:257098 发表于 2019-5-2 22:12 | 只看该作者
这个for写的巧妙.可以用定时.细分也可以吗?
回复

使用道具 举报

地板
ID:500421 发表于 2019-5-3 09:16 | 只看该作者
曾先生 发表于 2019-5-2 22:12
这个for写的巧妙.可以用定时.细分也可以吗?

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

使用道具 举报

5#
ID:47286 发表于 2019-5-3 11:12 | 只看该作者
先感谢楼主分享

说说我自己的想法

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

我给家里的夜灯做了个控制板 没人活动的时候就是呼吸状态 开始也是用和你一样的for写 但要同时通讯 和多个模块同步状态以及检测电流 判断是否有故障等等事以后就出问题了 总有某个事件做不好 后来还是用中断的方式写
回复

使用道具 举报

6#
ID:500421 发表于 2019-5-3 14:08 | 只看该作者
dzbj 发表于 2019-5-3 11:12
先感谢楼主分享

说说我自己的想法

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

使用道具 举报

7#
ID:47286 发表于 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系有更多定时器和中断 其实放开了用也是不够的 自己写功能的一点点感受 仅供参考
回复

使用道具 举报

8#
ID:500421 发表于 2019-5-4 09:42 | 只看该作者
dzbj 发表于 2019-5-3 21:53
我用的是STC片子 通常底层控制我觉得8位足够了 相比之下51内核的简单 涉及图像处理或者中央控制才会用到S ...

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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