Logo

郎哥编程

51单片机实验:流水灯实验

2026-10-10 5

本次实验学习 AT89C52 单片机 IO 口结构与电平输出原理,掌握 Keil 新建工程、编码编译及生成 HEX 文件流程;使用 Proteus 绘制仿真电路,加载程序完成调试。理解 LED 流水灯逻辑,编写延时函数控制 IO 口循环切换电平,实现 LED 依次亮灭,初步学会单片机程序调试与电路故障排查方法。

一、实验目标

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按照固定顺序依次点亮、熄灭,循环往复形成流水效果。延时函数的作用是延缓电平切换速度,让人眼清晰观察到流水动态效果,避免灯光闪烁过快无法分辨。

三、实验用电子元件

序号

元件名称

搜索关键词

型号/参数

数量

备注

1

51 单片机

AT89C52

AT89C52

1

主控芯片

2

发光二极管 LED

LED-RED

红色 LED

8

共阳极接法

3

电阻

RES

200Ω

8

LED 限流电阻

4

电阻(复位电路)

RES

10kΩ

1

复位上拉电阻

5

电解电容

CAP-ELEC

10μF

1

复位电路电容

6

晶振

CRYSTAL

11.0592MHz

1

单片机时钟

7

瓷片电容

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

电路原理图绘制与仿真

五、实验电路设计

51单片机流水灯实验电路

复位电路:复位引脚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灯光变化效果。

评论区

请 登录 后发表评论
暂无评论