jianhong_wu 发表于 2015-1-6 22:38:14

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

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

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

sbit LED=P0^0;

void delay(unsigned int ms)
{
      unsigned int i=0,j=0;

      for(i=ms;i>0;i--)
                for(j=20;j>0;j--);
}

void main()
{
      unsigned int t = 50;
      unsigned int d = 1;

      while(t =t+ d)
      {
                LED = t%2;

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

鸿哥-深圳:
首先,把 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));

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

      while(t =t+ d)
      {
                LED = t%2;
                if(LED==1)      
                {
                   delay(t);
                }         
                else
                {
                  delay(100-t);
                }
                if(t>=95||t<=5)
                {
                     d =-d;
                }
      }
}

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

Inc/sq-东莞:
要不要我教你一个最简单最好理解的方法?如下图代码,你看完应该会立刻懂了。

我之前教曹建的时候就是跟他说这个,他一下子懂了。你的灯就可以呼吸了。


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

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

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

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

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

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

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


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


waphaoyun 发表于 2015-1-7 14:41:20

最近忙于期末考试,,,好几天没来了
页: [1]
查看完整版本: 很难得的呼吸灯源代码!还有原理讲解!