用51单片机点亮流水灯的几种方法
1. 直接按位操作一个一个点亮
#include<reg51.h>//头文件
sbit LED0=P2^0; //位定义单片机接LED灯的端口
sbit LED1=P2^1;
sbit LED2=P2^2;
sbit LED3=P2^3;
sbit LED4=P2^4;
sbit LED5=P2^5;
sbit LED6=P2^6;
sbit LED7=P2^7;
void delay()//延时函数
{
unsigned char a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()//主函数
{
while(1)
{
LED0=0;//第一个灯亮
delay();//延时
LED0=1;//第一个灯灭 以下以此类推
LED1=0;
delay();
LED1=1;
LED2=0;
delay();
LED2=1;
LED3=0;
delay();
LED3=1;
LED4=0;
delay();
LED4=1;
LED5=0;
delay();
LED5=1;
LED6=0;
delay();
LED6=1;
LED7=0;
delay();
LED7=1;
}
}
2 利用数组结合for循环点亮流水灯
#include<reg51.h>//头文件
unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//将8个LED灯亮放在一个数组中
void delay()//延时函数
{
unsigned char a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()//主函数
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
P2=table[i];//for循环将LED灯显示出来
delay(); //延时
}
}
}
3 利用左移符号<<实现流水灯显示
#include<reg51.h>//头文件
#define uchar unsigned char//宏定义用uchar表示unsigned char
#define uint unsigned int //宏定义用uint表示unsigned int
void delay()//延时函数
{
unsigned char a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()//主函数
{
uchar k,i;
while(1)
{
k=0xfe;//11111110 <<
for(i=0;i<8;i++)
{
P2=k;
delay();//延时
k=k<<1; //11111100 <<左移运算符,左移后最右边补0
k=k|0x01;//00000001 |按位或,把最低位置变1
} //11111101
} //11111010
//00000001
//11111011
}
4 利用循环函数实现流水灯
#include<reg51.h>//头文件
#include<intrins.h>//循环函数所在的库
#define uchar unsigned char//宏定义用uchar表示unsigned char
#define uint unsigned int //宏定义用uint表示unsigned int
void delay() //延时函数
{
unsigned char a,b;
for(a=0;a<200;a++)
for(b=0;b<200;b++);
}
void main()//主函数
{
uchar k;
k=0xfe;
while(1)
{
P2=k;
delay();
k=_crol_(k,1);//11111110
} //11111101
//_crol_(a,b) 循环左移函数,a是代表左移的值,b是代表左移的位数
//_cror_(a,b) 循环右移函数,a是代表右移的值,b是代表右移的位数
}
注:
- 该程序51单片机开发板P2口接的是8位跑马灯
- 该程序51单片机开发板中LED位低电平驱动,即为0是灯亮