
A08基于51单片机汇编LED流水灯Proteus设计
一、设计任务
使用51单片机设计一个简易LED流水灯。
1、使用汇编语言设计。
2、使用8个LED进行流水。
3、流水灯先自上而下流水,然后自下向上流水。
4、重复以上的流水过程。
8个LED接在P2口,靠一条移位指令就能做出经典的流水效果,这是汇编里最值得练手的程序之一。
二、仿真演示

仿真里能看到8个LED依次点亮,从上跑到头再掉头往回跑,循环不停。
程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

实物效果:

三、关于程序
核心思路:让一个"0"在8位数据里移动,送到P2口,看起来就是灯在流水。
`
START: MOV A,#0FEH ;设置输出初值(只有最低位是0)
SETB C ;进位标志置1
S1: MOV P2,A ;输出A值
LCALL DELAY
RLC A ;A带进位循环左移
JC S1 ;若移位次数达到8次,重设输出初值
MOV A,#7FH ;换成只有最高位是0
SETB C
S2: MOV P2,A
LCALL DELAY
RRC A ;A带进位循环右移
JC S2
LJMP START`
1、初值为什么是0FEH
8个LED是低电平点亮,所以"哪个位是0哪个灯亮":
| 阶段 | 初值 | 二进制 | 亮的灯 |
| 下流水 | 0FEH | 11111110 | 第1个(最低位) |
| 上流水 | 7FH | 01111111 | 第8个(最高位) |
2、RLC和RRC的移动轨迹
带进位循环左移(RLC)时,数据整体左移一位,最低位补进位位的内容:
| 移位次数 | A的值 | 亮的灯 |
| 初值 | 0FEH | 第1个 |
| 第1次 | 0FDH | 第2个 |
| 第2次 | 0FBH | 第3个 |
| 第3次 | 0F7H | 第4个 |
| 第4次 | 0EFH | 第5个 |
| 第5次 | 0DFH | 第6个 |
| 第6次 | 0BFH | 第7个 |
| 第7次 | 07FH | 第8个 |
上流水用RRC(循环右移),轨迹正好反过来,从第8个灯回到第1个。
3、JC是怎么"数满8次"的
这是全程序最巧的地方:一开始SETB C把进位位置1,这个1跟着数据一起被循环移位搬来搬去,移满8次之后又回到进位位,此时JC条件成立,跳出循环重设初值。
也就是说:用一条JC指令代替了"数8次"的计数器,不用额外占用寄存器。
4、延时控制流水速度
延时子程序和闪烁设计一样是三层循环(R5=20、R6=20、R7=248),每步停留约0.2秒。想改流水速度就改这三个初值。
特别注意: 如果发现灯是"乱跳"不是顺序流水,检查P2口和LED的低位对应关系;如果流动方向反了,把RLC改成RRC即可。
四、特别注意
特别注意: 仿真跑起来灯不亮,先检查压缩包是否解压完整;Proteus用7.8或8.6版本;改了汇编源码要重新编译生成hex再跑仿真。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

