独闷闷网

 找回密码
 立即注册
搜索
查看: 3143|回复: 1
收起左侧

[原创] 很难得的呼吸灯源代码!还有原理讲解!

[复制链接]
发表于 2015-1-6 22:38:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2015-1-10 11:04 编辑

肖亚平--成都:
  1. #include<reg52.h>

  2. sbit LED=P0^0;

  3. void delay(unsigned int ms)
  4. {
  5.         unsigned int i=0,j=0;

  6.         for(i=ms;i>0;i--)
  7.                 for(j=20;j>0;j--);
  8. }

  9. void main()
  10. {
  11.         unsigned int t = 50;
  12.         unsigned int d = 1;

  13.         while(t =t+ d)
  14.         {
  15.                 LED = t%2;

  16.                 delay(t*(LED==1)+(100-t)*(LED==0));
  17.                 if(t>=95||t<=5)
  18. {
  19.                      d =-d;
  20. }
  21.         }
  22. }
复制代码
这个可以实现一个呼吸灯,最后几句,我没有硬是没有弄明白是什么意思?

鸿哥-深圳:
首先,把 delay(t*(LED==1)+(100-t)*(LED==0));看做是:
(1)当LED亮的时候(LED==1)等于1,(LED==0)等于0,此时
delay(t*(LED==1)+(100-t)*(LED==0))相当于delay(t);
(2)当LED灭的时候(LED==1)等于0,(LED==0)等于1,此时
delay(t*(LED==1)+(100-t)*(LED==0))相当于delay((100-t));

鸿哥点评:这段代码作者明显有耍酷得嫌疑,搞得有点太花俏了。以上代码相当于
  1. void main()
  2. {
  3.         unsigned int t = 50;
  4.         unsigned int d = 1;

  5.         while(t =t+ d)
  6.         {
  7.                 LED = t%2;
  8.                 if(LED==1)        
  9.                 {
  10.                    delay(t);
  11.                 }         
  12.                 else
  13.                 {
  14.                     delay(100-t);
  15.                 }
  16.                 if(t>=95||t<=5)
  17.                 {
  18.                      d =-d;
  19.                 }
  20.         }
  21. }
复制代码

肖亚平--成都:
谢谢,鸿哥,我先慢慢的看看吧。

Inc/sq-东莞:
要不要我教你一个最简单最好理解的方法?如下图代码,你看完应该会立刻懂了。
2.jpg
我之前教曹建的时候就是跟他说这个,他一下子懂了。你的灯就可以呼吸了。


泽坤—江夏:
呼吸灯不是要慢慢的暗再慢慢的灭吗?这样不就亮灭吗?怎么会慢慢亮起来?

Inc/sq-东莞:
看来你这个学弟/学妹想象力真的好差呀,还需努力哇.

鸿哥-深圳:
跟大家解释一下吧。其实我也不懂。我感觉你的程序应该就是亮灭两种状态.

Inc/sq-东莞:
就是在0~500这个区间中,每个时刻,大于某个阶段就亮,小于某个阶段就灭,这不就是PWM吗?所谓的呼吸灯,不就是利用占空比来控制灯的亮度吗?那么占空比,不就是1个周期中高电平所占的时间吗?如果开关频率快了,人眼不能分辨了,不就显示一定亮度了吗?呼吸灯的原理是利用PWM渐变的占空比,你根据这个思路再去想想它。

峰哥-福建:
第一次是500后面就减小了,不就时间上有变化?延迟时间。

泽坤—江夏:
说到pwm就懂了。我之前都是写pwm来控制。

Inc/sq-东莞:
我上面这个,只是逐渐亮,然后灭怎么办,反过来不就是了嘛?


鸿哥-深圳:
高,实在是高。藏得好深呐,妙极了。看到这个段程序,让我有一种想飞的感觉,飘飘然,我真的还想再活五百年。


乐于分享,勇于质疑!
发表于 2015-1-7 14:41:20 | 显示全部楼层
最近忙于期末考试,,,好几天没来了
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2020-10-29 01:45 , Processed in 0.146558 second(s), 20 queries .

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