【任务】使用AT89C51单片机的P0口驱动8个流水LED。
【硬件平台】假定每个LED的正向工作压降为2V,工作电流为3mA,共阳VCC=+5V供电,限流电阻(5-2)/3=1k。P0口每个引脚的最大灌电流为10mA(对3mA有较大余量),因此不必使用三极管扩流驱动。采用总线画法的电路图如下:
【编程思路】
/*采用51单片机*/
#include
/*包含移位指令的头文件*/
#include
/*宏定义无符号整型和无符号字符型,省略表达方式*/
#define uint unsigned int
#define uchar unsigned char
/*每盏灯的亮灭之间有时间间隔,须定义一个延时函数,通过内外循环次数之积来实现*/
void delay(uint x)
{
uchar i; //定义内层循环变量
while(x--) //外层x次循环
{
/*内循环截止条件可根据实际情况确定,这里以100为例, 从0到99执行100个空操作循环*/
for(i=0;i<100;i++);
}
}
/*主程序,实现8个LED依次轮流点亮*/
void main()
{
P0=0xFE;//使八个灯的初始电平状态为11111110,点亮连接P0.0的灯
while(1)//上电后无限循环
{
P0=_crol_(P0,1);//P0值向左移动1为,点亮下一盏灯(上一盏灯熄灭)
/*300可调为其他值,从而改变相邻灯的亮灭间隔时间,使流水效果明显(太快或太慢 都不合适)*/
delay(300);
}
}
【程序截图】