呼吸灯代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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循环有其他用法,可以让多条语句同时执行?