51单片机流水灯可以通过移位函数_crol_、移位运算符、数组等方法来实现。
看原理图
普通的51单片机开发板的LED模块的灯都是通过接电阻与单片机的IO口直接相连,一般连在P2口上也有其他IO口等等,写代码前要先看原理图灯连在哪里。
我的是连在P2上,如图:
图片:
代码如下
#include "reg52.h"
#include<intrins.h> //包含移位函数的头文件
typedef unsigned char u8;
#define led P2 //流水灯要是接在其他IO口就把P2改过去
u8 tap[] = {0xe7,0xdb,0xbd,0x7e};
u8 tap1[] = {0x7e,0xbd,0xdb,0xe7};
static u8 a;
void Delay() //延时函数
{
u8 i, j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void zuoyi() //左移函数
{
for(a=0;a<7;a++)
{
led=_crol_(led, 1);
Delay();
}
}
void youyi() //右移函数
{
for(a=0;a<7;a++)
{
led=_cror_(led,1);
Delay();
}
}
void zuoyoutonshiyi() //左右同时移动
{
for(a=0;a<4;a++)
{
led = tap1[a];
Delay();
}
led = 0xff;
Delay();
for(a=0;a<4;a++)
{
led = tap[a];
Delay();
}
led = 0xff;
}
void pingshan() //八颗灯分别闪两下
{
for(a=0;a<2;a++)
{
led = 0x0f;
Delay();
led = 0xf0;
Delay();
}
}
//可以通过主函数改变调用子函数顺序来实现花样流水灯
void main()
{
P0 = 0x00; //关闭数码管的显示
Delay();
while(1)
{
led=~0x01;
zuoyi();
Delay();
youyi();
Delay();
zuoyoutonshiyi();
Delay();
pingshan();
Delay();
}
}