呼吸灯代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

写一段程序,使单片机上LED红·蓝·绿三种颜色的灯呼吸

#include"STC89C5xRC.h"

void delay100Us(unsigned int cnt)

{

unsigned int i;

while(cnt--)

{i=6;

while(i--)

;

}

}

void delayMs(unsigned int cnt)

{

unsigned int i;

while(cnt--)

{i=82;

while(i--)

;

}

}

void delay(unsigned int t)

{

while(t--);

}

void main(void)

{

unsigned int CYCLE=600,PWM_LOW=0;

P2=0;

while(1)

{

delay(40000);

for(PWM_LOW=1;PWM_LOW

{

P20=1;

P21=1;

P22=0;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) {

P20=1;

P21=1;

P22=0;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

delay(40000);

for(PWM_LOW=1;PWM_LOW

P20=1;

P21=0;

P22=1;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--) {

P20=1;

P21=0;

P22=1;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

delay(40000);

for(PWM_LOW=1;PWM_LOW

P20=0;

P21=1;

P22=1;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)

{

P20=0;

P21=1;

P22=1;

delay(PWM_LOW);

P20=1;

P21=1;

P22=1;

delay(CYCLE-PWM_LOW);

}

}

}

代码中,P20,P21,P22,分别表示红蓝绿三种颜色,P20=1,表示红灯灭,P20=0,表示红灯亮原理:主要是利用占空比,

初始化一个值CYCLE,令PWM_LOW由1开始,每一个循环,先令其中一个灯亮,保持时间为delay(PWM_LOW),然后熄灭,时间为delay(CYCLE-PWM_LOW),随着循环次数增多,delay(PWM_LOW)越来越长,而delay(CYCLE-PWM_LOW)不变。

换而言之,灯是亮一会,灭一会,只不过亮的时间增多,而灭的时间不变,这就相单于提高亮的比例时间,这大概就是占空比提高了,而肉眼看起来就是灯由灭,慢慢变到最亮。

灯由亮变到暗,最后灭,则是减低它的占空比。看起来就是灯在呼吸了。

这个代码不是我写的,是复制同学的,至于为什么他没有在主函数声明CYCLE-PWM_LOW,而直接调用delay(CYCLE-PWM_LOW),还成功了?我也不清楚。

另外,老师说,等一个灯历经了灭——亮——灭的完整过程,才开始下一个灯,是初学者的做法,效率不高,可以改进为一个灯在灭——亮的过程中间,开始下一个灯的灭——亮,这样看起来效果更好。但是,我不知道怎么做。这个同时的问题我不知道怎麽处理,在for循环里,只知道它执行完一条语句才去执行下一条语句。难道有其他循环体可以使多条语句同时执行,还是for循环有其他用法,可以让多条语句同时执行?

相关文档
最新文档