
A09基于51单片机汇编LED流水灯Proteus设计
一、设计任务
使用51单片机设计一个简易LED流水灯。
1、使用汇编语言设计。
2、使用8个LED进行流水。
3、流水灯先自上而下流水两次,然后自下向上流水两次,最后全部LED闪烁两次。
4、重复以上的流水过程。
同样8个LED,这个设计不靠移位指令,改用查表法,可以做出比单向流水更丰富的花样。
二、仿真演示

仿真里能看到流水灯先下上各跑两轮,然后反向再跑一轮,最后全体闪烁两次,接着循环。
程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

实物效果:

三、关于程序
核心思路:把每一步的显示码预先写进一张表,程序按顺序从表里取数送P1口。
`
START: MOV DPTR,#TABLE ;数据指针指向表头地址
S1: MOV A,#00H ;设置地址偏移量
MOVC A,@A+DPTR ;根据DPTR到表内取显示码
CJNE A,#01H,S2 ;判断是否是结束码
LJMP START
S2: MOV P1,A ;将取到的显示码送P1口显示
LCALL DELAY
INC DPTR ;数据指针加1
LJMP S1`
1、MOVC查表指令怎么工作
MOVC A,@A+DPTR 是"变址寻址"指令:把DPTR(表头地址)加上A里的偏移量,到ROM对应位置取出一个字节。
这个程序每圈把A清0当偏移量、用DPTR逐字节往前走,效果就是按顺序读表:第一次读表头第0字节,DPTR加1,第二次读第1字节,以此类推。
2、显示码表全貌
表一共36个字节,分四大段:
| 段 | 内容 | 效果 |
| 第1段 | 0FEH,0FDH,0FBH,0F7H / 0EFH,0DFH,0BFH,07FH | 下流水一次+上流水一次 |
| 第2段 | 同上8个再重复一遍 | 完成设计要求的"各两次" |
| 第3段 | 07FH,0BFH,0DFH,0EFH / 0F7H,0FBH,0FDH,0FEH | 反向流水各一次 |
| 第4段 | 00H,0FFH,00H,0FFH | 全灭全亮,闪烁两次 |
| 结束码 | 01H | 读到它就跳回START重来 |
第3段是程序比基础需求多加的花样:反向流水,视觉上更丰富。
3、结束码为什么是01H
显示码只有三种形态:只有一位是0的(xxFH)、全0的(00H)、全1的(0FFH),不可能出现01H。所以拿01H当"表尾哨兵"是安全的。
判断用CJNE(比较不等跳转):取到的数不是01H,就去S2显示;是01H,说明表读完了,LJMP START重新开始。
4、查表法和移位法的区别
| 移位法(A08) | 查表法(A09) | |
| 原理 | RLC/RRC算出来 | 预先存好查出来 |
| 花样 | 只能顺序流动 | 任意顺序、可重复、可闪烁 |
| 改花样 | 改指令逻辑 | 只改表里的数据 |
| 占用 | 省ROM | 每个步骤占1字节ROM |
想做更复杂的灯光秀(比如两边往中间挤、随机闪烁),就用查表法,把想要的效果一个个写进表里即可。
特别注意: 表里的数据用DB定义在程序末尾,增删字节后结束码01H必须留在最后;偏移量A每圈都要清0,别忘了。
四、特别注意
特别注意: 仿真跑起来灯不亮,先检查压缩包是否解压完整;Proteus用7.8或8.6版本;改了汇编源码要重新编译生成hex再跑仿真。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

