单片机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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录