在单片机学习过程中,流水灯实验是一个非常基础且常见的入门项目。它不仅能够帮助初学者理解单片机的基本工作原理,还能锻炼对I/O端口的控制能力。本文将详细介绍如何使用汇编语言编写一个简单的流水灯程序,并给出完整的代码示例。
一、实验目的
1. 理解单片机I/O端口的基本操作;
2. 掌握汇编语言中延时子程序的编写方法;
3. 学习通过程序控制LED灯的依次点亮与熄灭。
二、实验硬件环境
本实验以常见的AT89C51单片机为例,配合共阴极LED连接至P1口。每个LED的阳极接电源,阴极通过限流电阻接到P1口的相应引脚。
三、程序设计思路
流水灯的核心思想是:通过改变P1口的输出状态,使LED按顺序亮起或熄灭。为了实现“流动”的效果,需要在每次改变状态后加入适当的延时,以保证人眼可以观察到变化。
程序流程如下:
1. 初始化P1口为输出模式;
2. 循环执行以下操作:
- 将P1口设置为某一位为低电平(点亮对应LED);
- 延时一段时间;
- 将该位恢复为高电平(关闭LED);
- 移动到下一位,重复上述过程。
四、汇编语言代码实现
以下是一个基于Keil C51开发环境的汇编语言程序示例:
```asm
ORG 0000H
AJMP START
ORG 0030H
START:
MOV P1, 0FFH ; 初始化P1口为高电平(所有LED熄灭)
LOOP:
MOV A, 0FEH; 第一个LED亮(P1.0为0)
MOV P1, A
ACALL DELAY ; 调用延时子程序
MOV A, 0FDH; 第二个LED亮(P1.1为0)
MOV P1, A
ACALL DELAY
MOV A, 0FBH; 第三个LED亮(P1.2为0)
MOV P1, A
ACALL DELAY
MOV A, 0F7H; 第四个LED亮(P1.3为0)
MOV P1, A
ACALL DELAY
MOV A, 0EFH; 第五个LED亮(P1.4为0)
MOV P1, A
ACALL DELAY
MOV A, 0DFH; 第六个LED亮(P1.5为0)
MOV P1, A
ACALL DELAY
MOV A, 0BFH; 第七个LED亮(P1.6为0)
MOV P1, A
ACALL DELAY
MOV A, 07FH; 第八个LED亮(P1.7为0)
MOV P1, A
ACALL DELAY
SJMP LOOP ; 循环执行
DELAY:
MOV R7, 0FFH ; 延时子程序
DELAY_LOOP:
MOV R6, 0FFH
DELAY_NEXT:
DJNZ R6, DELAY_NEXT
DJNZ R7, DELAY_LOOP
RET
END
```
五、程序说明
- MOV P1, 0FFH:初始化P1口为全高电平,所有LED熄灭。
- MOV A, XXH:将对应的位设为低电平,其他保持高电平。
- ACALL DELAY:调用延时函数,控制LED亮灭间隔。
- SJMP LOOP:无限循环,实现流水灯效果。
六、注意事项
1. LED的连接方式应与程序中设定的逻辑一致(如共阴或共阳);
2. 延时时间可通过调整R6和R7的值进行调节;
3. 若使用不同的单片机型号,需确认I/O端口的配置是否一致。
七、总结
通过本实验,我们掌握了如何使用汇编语言控制单片机的I/O端口,并实现了基本的流水灯功能。这为后续更复杂的单片机应用打下了坚实的基础。对于初学者来说,这是一个非常有价值的实践项目,有助于加深对单片机底层工作的理解。


