
A06基于51单片机汇编流LED闪烁Proteus设计
一、设计任务
使用51单片机设计一个闪烁的LED。
1、使用汇编语言设计。
2、使用单片机控制1个LED进行闪烁,亮一段时间、灭一段时间,一直循环。
这个设计是汇编入门的最小实例:整个程序只有"点灯-延时-灭灯-延时"四步,适合第一次接触51汇编的人把软硬件流程跑通。
二、仿真演示

仿真里能看到一个LED以固定的节奏闪烁,亮灭交替不停。
程序在Keil里用汇编编写,编译生成hex后加载到Proteus的51芯片里运行。工程截图如下:

实物效果:

三、关于程序
程序结构极其简单,主循环就四行:
`
START: SETB P2.7 ;LED熄灭
LCALL DELAY
CLR P2.7 ;LED点亮
LCALL DELAY
LJMP START`
1、亮灭怎么控制
LED接在P2.7口线上,通过位操作直接控制:
| 指令 | P2.7电平 | LED状态 |
| SETB P2.7 | 高电平 | 熄灭 |
| CLR P2.7 | 低电平 | 点亮 |
这里的LED是低电平点亮(共阳极接法),所以"清0"才是亮。 Proteus里LED不亮的时候,先看看是不是把高低电平搞反了。
2、延时子程序的三层循环
闪烁的快慢由DELAY子程序决定,它用了三层循环嵌套:
| 层 | 寄存器 | 初值 | 作用 |
| 最内层 | R7 | 248 | DJNZ R7,$ 原地打转 |
| 中间层 | R6 | 20 | 每圈重装R7,跑20遍 |
| 最外层 | R5 | 20 | 每圈重装R6,跑20遍 |
圈数算法:单层DJNZ指令要2个机器周期,最内层一圈约496个周期;中间层20遍、最外层20遍,总周期数约20×20×496≈198400。
晶振12MHz时1个机器周期是1微秒,一次DELAY约0.2秒。亮一次+灭一次就是0.4秒左右,一秒大约闪2.5次。
3、想改闪烁速度
只改DELAY的三个初值就行:
| 想得到的效果 | 改法 |
| 闪更快 | 把R6或R7的初值改小 |
| 闪更慢 | 加大R5的层数,或把初值改大 |
| 占空比不等 | 亮灭两次LCALL之间插不同的延时次数 |
特别注意: 改完初值要重新编译生成hex再跑仿真,Keil不会自动更新。
四、特别注意
特别注意: 仿真跑起来灯不亮,先检查压缩包是否解压完整;Proteus用7.8或8.6版本;改了汇编源码要重新编译生成hex再跑仿真。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

