用51单片机实现流水灯的方法有多种:普通电灯法,位移法,数组法。其次模拟电路的电流图也与点一盏LED相似。具体如下:
一 首先是最简单的代码:
#include <reg52.h> //头文件
sbit led0=P0^0;
sbit led1=P0^1; // 定义八盏灯,并规定每个灯的io接口
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void delay(void) // 声明延迟函数
{
unsigned char a,b; //定义两个变量a,b
for(a=0;a<200;a++)
for(b=0;b<200;b++); //这是两个for循环嵌套。用分号来区分。
} // 每当a循环一次,b都要循环200次。同时200也是灯闪烁的时间。
void main() //主函数
{
led0=0; //点亮第一个灯泡
delay(); // 延时函数
led0=1; //熄灭灯泡
delay(); //延时 通过这一系列过程实现闪烁
led1=0;
delay();
led1=1;
delay();
led2=0;
delay();
led2=1;
delay();
led3=0;
delay();
led3=1;
delay();
led4=0;
delay();
led4=1;
delay();
led5=0;
delay();
led5=1;
delay();
led6=0;
delay();
led6=1;
delay();
led7=0;
delay(); 但是该方法存在弊端:需要一个个的定义变量。如果需要同时让许多灯点亮的话则不大方便。代码过于繁琐。因此可以使用其他两种方法
led7=1;
delay();
led8=0;
delay();
led8=1;
delay();
}
二 使用数组的方法点亮十六盏流水灯
void delay(void) 要使十六盏灯亮,所以需要在后面加上0xff(11111111)即全灭
{ 如果不是需要十六盏则不需要加上最后一个数组。
unsigned char a,b; //声明函数,声明灯的闪烁情况,与上一个代码相同。
for(a=0;a<200;a++)
for(b=0;b<200;b++); // for 语句循环嵌套
}
{
unsigned char i;
while(1) // while语句是为了使使循环持续进行
{
for(i=0;i<9;i++) //定义一个i,
{
P0=table[i]; // i取值为数组中的值。依次点亮前八盏灯
delay(); // 延迟
}
{
for(i=0;i<9;i++) // 继续赋值,继续点亮后8盏灯
{
P2=table[i];
delay();
}
}
}
}
#include<intrins.h> // 因此要用到左右移函数,所以加入这个头文件
typedef unsigned char u8;
{
u8 i;
led=0xfe;
delay(50000); //´óÔ¼ÑÓʱ450ms
while(1)
{
/* for(i=0;i<8;i++)
{
P2=~(0x01<<i); //将1右移一位,然后将结果取反赋值到P2
delay(50000); //
}
*/
for(i=0;i<;i++) //左移一位
{
led=_crol_(led,1);
delay(50000); //
}
for(i=0;i<7;i++) //将led右移一位
{
led=_cror_(led,1);
delay(50000); //大约延时450ms
}
}
}