一、实验目标
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灯光变化效果。