很难得的呼吸灯源代码!还有原理讲解!
本帖最后由 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-东莞:
我上面这个,只是逐渐亮,然后灭怎么办,反过来不就是了嘛?
鸿哥-深圳:
高,实在是高。藏得好深呐,妙极了。看到这个段程序,让我有一种想飞的感觉,飘飘然,我真的还想再活五百年。
最近忙于期末考试,,,好几天没来了
页:
[1]