哪位兄弟帮看一下如何让程序变得更简便,实现一个流水呼吸灯 在此基础上怎么改呢
#include
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
void Delay(unsigned int t);
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0;
P1=0xFF;
while (1)
{
LED0=1;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW//PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
LED0=0; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
LED0=1; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
LED0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
//主循环中添加其他需要一直工作的程序
break;}
while (1)
{
LED0=1;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW//PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
LED1=0; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
LED1=1; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
LED1=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程
LED1=0;
Delay(PWM_LOW);
LED1=1;
Delay(CYCLE-PWM_LOW);
}
//主循环中添加其他需要一直工作的程序
break;}
while (1)
{
LED2=1;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW//PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
LED2=0; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
LED2=1; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
LED2=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程
LED2=0;
Delay(PWM_LOW);
LED2=1;
Delay(CYCLE-PWM_LOW);
}
//主循环中添加其他需要一直工作的程序
break;}
void Delay(unsigned int t)
{
while(--t);
}
用循环结构和数组来简化代码,这样可以避免多次复制黏贴代码,同时也可以方便地扩展流水灯的数量
#include <reg52.h>
#define LED_NUM 8
#define CYCLE 600
sbit LED_Pins[LED_NUM] = {P1^0, P1^1, P1^2, P1^3, P1^4, P1^5, P1^6, P1^7};
void Delay(unsigned int t);
void main(void)
{
unsigned int PWM_LOW = 0;
unsigned int i = 0;
while (1)
{
for (i = 0; i < LED_NUM; i++)
{
LED_Pins[i] = 1;
Delay(60000);
for (PWM_LOW = 1; PWM_LOW < CYCLE; PWM_LOW++)
{
LED_Pins[i] = 0;
Delay(PWM_LOW);
LED_Pins[i] = 1;
Delay(CYCLE - PWM_LOW);
}
LED_Pins[i] = 0;
}
}
}
void Delay(unsigned int t)
{
while (--t);
}
之前我们说过可以通过软件STC-IPS来生成一个没有参数的延时函数,但是延长的时间是固定的,在软件里设置500ms,它就只能延时500ms。我们可以改造函数,让函数的参数为延长的时间,这样就可以方便我们随时改变参数来控制时间。
首先我们需要生成一个延时1ms的延时函数。
复制代码,粘贴到工程文件中。我们在括号里面添加形参xms,参数类型为unsigned int。它的意思是无符号整型数。不直接用int是为了节省空间。
然后把函数主题放到一个while循环里,每执行一次xms-1,执行xms次后跳出循环。说人话就是,我们每执行一次while循环内的操作,延时1ms,执行xms次,就能延时xms 毫秒。
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
有了这个,我们就可以随心所欲地调整延时的长度。