流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。
下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。
//数组法
#include <reg52.h> //头文件
#define uchar unsigned char
uchar tab[16]={ 0xfe , 0xfd , 0xfb , 0xf7 , 0xef , 0xdf , 0xbf , 0x7f , 0x7f , 0xbf , 0xdf , 0xef , 0xf7 , 0xfb , 0xfd , 0xfe };
//因为采用了共阳极接法,所以要点亮哪个灯就给哪一位赋0
//8个灯,对应两个十六进制数的八个数位
//从右到左,再从左到右,奇偶位,内外位修改数字顺序即可
void delay( )
{
uchar i,j;
for(i=0; i<255; i++)//为了让人眼看清灯的闪烁而延时
for(j=0; j<255; j++);
}
void main( ) //主函数
{
uchar i;
P1 = 0xff; //熄灭所有LED,避免上电亮灯
while (1) //永真
{
for(i=0;i<16; i++)
{
P1=tab[i]; //改变P1口的电位
delay( ); //延时函数
}
}
}
//移位符
#include <reg52.h> //包含reg52.h头文件
#define uchar unsigned char
void Delay()
{
uchar i, j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
void main()
{
uchar i, temp;
P1 = 0xff; //在移位符中会舍弃数位,所以必须赋初值
while(1)
{
temp = 0x01; //为了赋值方便,取反码给要点亮的灯赋1
for (i=0;i<8;i++) //奇偶位,i改4,<<2
{
P1 = ~ temp; //temp值取反送P1口
temp = temp << 1 ; //左移一位
Delay()
}
temp = 0x80;
for (i=0;i<8;i++) //奇偶位,i改4,>>2
{
P1 = ~ temp; //temp值取反送P1口
temp = temp >> 1 ; //右移一位
Delay();
}
}
}
//库函数
#include <reg52.h>
#include <intrins.h> //调用函数库
#define uchar unsigned char
void delay()
{
uchar i,j;
for (i=0;i<255;i++)
for (j=0;j<255;j++);
}
void main()
{
uchar i,temp;
P1 = 0xff;
while (1)
{ temp=0x7f;
for(i=0; i<8; i++) //奇偶项i改成4,temp后改成2
{ P1=temp;
delay( );
temp=_cror_( temp,1) ;//r代表right,右移
}
temp=0xfe;
for(i=0; i<8; i++) //奇偶项i改成4,temp后改成2
{ P1=temp;
delay( );
temp=_crol_( temp,1) ; //l代表left,左移
}
}
}
编译时要注意修改晶振频率并创建hex文件。
?
点亮效果呈现在proteus上,大家也可以根据仿真电路图去挑选自己需要的元器件组建不同功能的电路。
流水灯演示
谢谢大家。