Logo

郎哥编程

51 单片机流水灯完整实验教程:原理 + 电路 + 代码 + 仿真

2026-09-11 51

一、实验目标

1. 熟悉AT89C52单片机的基本IO口结构与输出工作原理,掌握单片机IO口高低电平输出特性。

2. 掌握Keil软件的工程创建、代码编写、编译、生成HEX文件的完整操作流程。

3. 熟练使用Proteus软件绘制单片机仿真电路,完成程序加载与仿真调试。

4. 理解LED流水灯的工作逻辑,掌握延时函数的编写与使用,实现IO口循环输出高低电平控制LED依次点亮熄灭。

5. 初步掌握单片机程序调试、电路故障排查的基本方法。

二、实验原理

1.AT89C52 IO口工作原理

AT89C52单片机拥有4组8位双向IO口,分别为P0、P1、P2、P3,共32个IO引脚。其中P1、P2、P3口内部自带上拉电阻,可直接作为输出端口使用;P0口为开漏输出,无内部上拉电阻,作为输出时需外接上拉电阻,本实验选用P1口作为LED控制输出口,简化电路设计。

单片机IO口输出低电平(0V)时,可形成回路驱动LED点亮;输出高电平(5V)时,LED两端无电压差,灯具熄灭。通过程序循环改变P1口各位的电平状态,即可实现LED的流水闪烁效果。

2.LED驱动原理

LED发光二极管为单向导通器件,正向导通电压约1.8~2.2V,工作电流约5~10mA。若直接串联单片机IO口,过大电流会烧毁LED或单片机引脚,因此必须串联220Ω限流电阻,限制回路电流,保护器件正常工作。本实验采用共阳极接法,LED正极接5V电源,负极通过限流电阻连接单片机P1口引脚。

3.流水灯实现逻辑

通过C语言程序控制P1口输出数据,结合延时函数固定灯光点亮时长。利用循环移位语句,让P1口8位引脚依次输出低电平,其余引脚输出高电平,使8个LED按照固定顺序依次点亮、熄灭,循环往复形成流水效果。延时函数的作用是延缓电平切换速度,让人眼清晰观察到流水动态效果,避免灯光闪烁过快无法分辨。

三、实验用电子元件

元件名称 搜索关键词 型号/参数 数量 备注
51 单片机 AT89C52 AT89C52 1 主控芯片
发光二极管 LED LED-RED 红色 LED 8 共阳极接法
电阻 RES 200Ω 8 LED 限流电阻
电阻(复位电路 RES 10kΩ 1 复位电路电容
电解电容 CAP-ELEC 10μF 1 复位电路电容
晶振 CRYSTAL 11.0592MHz 1 单片机时钟
瓷片电容 CAP 22pF 2 晶振起振电容

补充说明:

1、Proteus 放置元件时,直接在器件库 Keywords 列输入上面的搜索关键词即可快速找到。

2、电路:RST 引脚 → 10k 电阻接 GND、10μF 电解电容接 + 5V;XTAL1/XTAL2 接 11.0592 晶振 + 两个 30pF 瓷片电容到 GND;

3、8 路 LED:阳极接 + 5V,阴极串联 220Ω 电阻后接到 P1.0~P1.7。

四、实验用工具软件

软件名称 版本号 用途
Keil uVision V5 编写和编译51单片机程序
Proteus V8.15  电路原理图绘制与仿真

五、实验电路设计

复位电路:复位引脚RST通过10K电阻接地、10uF电容接5V,构成上电自动复位电路,保证单片机开机正常初始化。

晶振电路:XTAL1、XTAL2引脚外接11.0592MHz晶振,搭配两个22pF瓷片电容接地,为单片机提供时钟振荡信号。

LED电路:8个LED正极统一接5V电源,负极分别串联200Ω限流电阻后,依次连接单片机P1.0~P1.7引脚。

六、实验程序设计

1.程序功能

实现8个LED从P1.0到P1.7依次单向流水点亮,单个LED点亮延时500ms,循环往复,无间断运行。

2.程序代码

#include <reg52.h>  //导入AT89C52单片机寄存器定义头文件
//延时函数,约500ms@11.0592MHz晶振
void Delay_ms(unsigned int t)
{
    unsigned int i,j;
    for(i=t;i>0;i--)
        for(j=110;j>0;j--);
}
//主函数
void main(void)
{
    unsigned char led,i;
    while(1)  //死循环,持续运行流水效果
    {
        led = 0xfe;  //初始值:P1.0低电平,第一个LED点亮,其余熄灭
        for(i=0;i<8;i++)  //循环8次,遍历8个LED
        {
            P1 = led;  //将赋值数据输出到P1口
            Delay_ms(500);  //延时500ms,保持灯光状态
            led = led << 1;  //左移一位,切换下一个LED
            if(led == 0x00)  //移位结束后重置初始状态
            {
                led = 0xfe;
            }
        }
    }
}

代码解读

reg52.h 包含AT89C52单片机所有IO口、寄存器的地址定义,是51单片机编程必备头文件。

Delay_ms()延时函数通过双层循环空语句实现软件延时,适配11.0592MHz晶振,精准控制灯光停留时间,解决单片机运行速度过快、人眼无法识别闪烁的问题。

main函数采用死循环保证程序持续运行,初始赋值0xfe(二进制11111110),仅P1.0输出低电平,首个LED点亮;通过左移运算依次让后续IO口输出低电平,实现LED逐一点亮;移位完成后重置初始值,循环往复形成流水效果。

七、实验操作步骤

1、Keil软件程序编译

1、打开Keil uVision5,新建Project工程,命名为“LED流水灯”,选择单片机型号为“AT89C52”,确认添加启动文件。

2. 新建.c源文件,粘贴上述实验代码,将文件添加至工程目录中。

3. 点击工程配置选项,勾选“Create HEX File”,设置HEX文件生成格式为Hex-80。

4. 点击编译按钮,无报错、0警告后,工程目录下生成对应的HEX可执行文件。

2、Proteus电路搭建与仿真

1. 打开Proteus 8 Professional,新建空白仿真图纸,在元器件库中搜索添加AT89C52、LED、RES(电阻)、CRYSTAL(晶振)、CAP(电容)等器件。

2. 按照实验电路设计要求,完成晶振、复位、LED限流电路的接线,核对引脚对应关系,避免接线错误。

3. 双击AT89C52单片机,在Program File选项中加载Keil生成的HEX文件,设置晶振频率为11.0592MHz。

4. 点击仿真运行按钮,观察LED灯光变化效果。

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论