A08基于51单片机汇编LED流水灯Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-13 12:07:47    阅读:16 次   消耗积分:5 分

image.png

A08基于51单片机汇编LED流水灯Proteus设计

一、设计任务

使用51单片机设计一个简易LED流水灯。

1、使用汇编语言设计。

2、使用8个LED进行流水。

3、流水灯先自上而下流水,然后自下向上流水。

4、重复以上的流水过程。

8个LED接在P2口,靠一条移位指令就能做出经典的流水效果,这是汇编里最值得练手的程序之一。

二、仿真演示

仿真运行效果

仿真里能看到8个LED依次点亮,从上跑到头再掉头往回跑,循环不停。

程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

Keil工程截图

实物效果:

实物演示

三、关于程序

核心思路:让一个"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哪个灯亮":

阶段初值二进制亮的灯
下流水0FEH11111110第1个(最低位)
上流水7FH01111111第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再跑仿真。

五、资料下载

付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A07基于51单片机汇编LED台灯Proteus设计
下一篇:A09基于51单片机汇编LED流水灯Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}