C51单片机16个LED流水灯
由于平时太忙,很久没在CSDN上记录点东西了,写点单片机相关的吧,大神可忽略,内容只针对初学者。
一、功能
从第一个灯到第16个灯依次点亮(速度快),再反过来点亮一遍(速度慢),然后16个灯同时闪烁,最后16个灯全部点亮(保持一段时间常亮)。依次往复循环上述效果。
二、proteus仿真图
16个灯分别用P1口和P2口,LED阳极已接高电平,通过控制阴极的高低电平状态来控制LED灯的亮灭。
三、代码
方法一:通过给P1、P2口的每一个灯赋初值来实现,方法比较笨,但很直观,浅显易懂。
#include<reg51.h>
void delay(unsigned int i)
{
while(i--);
}
void main()
{
long int j;
while(1)
{
P1=0XFE; 1111 1110 低电平点亮,从第一个灯开始
delay(10000);
P1=0XFD; //1111 1101
delay(10000);
P1=0XFB; //1111 1011 以下以此类推
delay(10000);
P1=0XF7;
delay(10000);
P1=0XEF;
delay(10000);
P1=0XDF;
delay(10000);
P1=0XBF;
delay(10000);
P1=0X7F;
delay(10000);
P1=0XFF; //每结束一轮统一关一次
P2=0XFE;
delay(10000);
P2=0XFD;
delay(10000);
P2=0XFB;
delay(10000);
P2=0XF7;
delay(10000);
P2=0XEF;
delay(10000);
P2=0XDF;
delay(10000);
P2=0XBF;
delay(10000);
P2=0X7F;
delay(10000);
P2=0XFF;
P2=0X7F;
delay(30000);
P2=0XBF;
delay(30000);
P2=0XDF;
delay(30000);
P2=0XEF;
delay(30000);
P2=0XF7;
delay(30000);
P2=0XFB;
delay(30000);
P2=0XFD;
delay(30000);
P2=0XFE;
delay(30000);
P2=0XFF;
P1=0X7F;
delay(30000);
P1=0XBF;
delay(30000);
P1=0XDF;
delay(30000);
P1=0XEF;
delay(30000);
P1=0XF7;
delay(30000);
P1=0XFB;
delay(30000);
P1=0XFD;
delay(30000);
P1=0XFE;
delay(30000);
P1=0XFF;
for(j=0;j<50000;j++) /保持亮一段时间
{
P1=0X00;
P2=0X00;
}
P1=0Xff; //最后也关一次
P2=0Xff;
}
}
方法二:代码量会少很多,通过给P1、P2口赋一个初值(只需赋值一次),利用左移"<<“和右移”>>"让灯的状态自动变化,比如P1=0XFE;即P1口的状态是1111 1110,此时第一个灯点亮,当进行一次左移<<运算后,P1口的状态就变为1111 1101,此时就是第二个灯点亮,那么循环8次就能使连接P1口的所有灯点亮。此方法稍微灵活一点,当然方法还有很多,比如还可以用_crol_和_cror_这两个左右移函数,也可以用数组来实现,总之方法很多,初学者应该都要去试一遍。
#include<reg51.h>
void delay(unsigned int i)
{
while(i--);
}
void main()
{
unsigned char aa,bb,i;
long int j;
while(1)
{
aa=0x01; //先让接P1口的8个灯顺序点亮
for(i=0;i<8;i++)
{
P1=~aa;
delay(10000);
aa<<=1;
}
P1=0xff;
bb=0x01; //再让接P2口的8个灯顺序点亮
for(i=0;i<8;i++)
{
P2=~bb;
delay(10000);
bb<<=1;
}
P2=0xff;
bb=0x80; //接P2口的8个灯反序点亮
for(i=0;i<8;i++)
{
P2=~bb;
delay(30000);
bb>>=1;
}
P2=0xff;
aa=0x80; //接P1口的8个灯反序点亮
for(i=0;i<8;i++)
{
P1=~aa;
delay(30000);
aa>>=1;
}
P1=0xff;
for(j=0;j<40000;j++) //16个灯保持常亮一段时间
{
P1=0x00;
P2=0x00;
}
P1=0xff;
P2=0xff;
}
}