单片机P1口控制8个LED循环闪烁 - PROTEUS仿真
单片机P1口控制8个LED循环闪烁 - PROTEUS仿真
本项目使用单片机控制P1口上的8个LED,实现循环闪烁效果。
项目需求:
- 8个LED依次从上往下接在P1.0-P1.7上,LED低电平亮。
- 利用PROTEUS绘制原理图,并编写程序,实现LED的循环闪烁。
- 闪烁效果:VD0、VD7亮,而后VD1、VD6亮,VD2、VD5亮;然后VD3、VD4亮,VD2、VD5亮,VD1、VD6亮。然后如此不断循环。
- 设fosc=12MHz,要求LED每次亮灭延时为0.4s。
原理:
由于是单片机控制LED灯的亮灭,需要连接一个脉冲发生器,将单片机的时钟信号转换为LED灯的亮灭信号。在PROTEUS中,可以使用555定时器来实现脉冲发生器的功能。
接线图:

其中,P1口的8个LED依次从上往下接在P1.0-P1.7上,LED低电平亮。555定时器的输出引脚连接到P0.0口,作为LED的控制信号。
程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
// 延时函数,控制LED的亮灭时间
void delay(uint time) {
uint i,j;
for(i=0; i<time; i++)
for(j=0; j<120; j++);
}
// 二个灯的循环变化
void light1() {
P0 = 0x81; // VD0、VD7亮
delay(400);
P0 = 0x42; // VD1、VD6亮
delay(400);
P0 = 0x24; // VD2、VD5亮
delay(400);
P0 = 0x18; // VD3、VD4亮
delay(400);
P0 = 0x24; // VD2、VD5亮
delay(400);
P0 = 0x42; // VD1、VD6亮
delay(400);
}
// 三个灯的循环变化
void light2() {
P0 = 0x81; // VD0、VD7亮
delay(400);
P0 = 0xC3; // VD1、VD6、VD7亮
delay(400);
P0 = 0xE7; // VD2、VD5、VD6、VD7亮
delay(400);
P0 = 0x3C; // VD3、VD4、VD5、VD6亮
delay(400);
P0 = 0xE7; // VD2、VD5、VD6、VD7亮
delay(400);
P0 = 0xC3; // VD1、VD6、VD7亮
delay(400);
}
// 主函数,循环执行
void main() {
while(1) {
light1();
light2();
}
}
效果图:

编译下载后,可以在PROTEUS中模拟运行。
本项目使用单片机控制LED灯循环闪烁,并利用PROTEUS进行仿真,展现了单片机与外设的交互方式。您可以根据需要修改程序,实现更复杂的LED控制效果。
原文地址: https://www.cveoy.top/t/topic/lEi2 著作权归作者所有。请勿转载和采集!