
A22基于51单片机汇编语言独立按键LED台灯Proteus设计
用51单片机外部中断0做一盏按键台灯:按下按键灯亮,再按一次灯灭,一直按一直切换。和A07的查询法不同,这版主程序只写了一条LJMP $原地等,按键完全交给INT0中断处理,CPU不用反复扫描引脚,按下瞬间就响应。资料包含Proteus仿真文件和完整汇编源码,适合第一次接触51中断系统的同学。
一、设计实现功能
本设计功能简介:使用51单片机和汇编语言设计一个独立按键控制LED台灯的proteus仿真,要求以下功能:
1、使用汇编语言编写程序。
2、独立按键接外部中断0(P3.2),下降沿触发。
3、每按一次按键,P1.0上的LED状态翻转一次,实现开灯/关灯。
二、资源汇总
1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。
2、程序文件:main.asm汇编源码,以及编译好的cx.hex。
3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。
三、设计介绍
拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。
电路很简单:LED串一个限流电阻接P1.0(低电平点亮),独立按键一端接P3.2、一端接地。P3.2就是外部中断0的输入脚INT0,这是硬件定死的,不能随便换口。
图1 Proteus仿真总览

初始化只做三件事,然后主程序就没事干了:
`asm
START: CLR LEDBUF ;清状态缓存
CLR LED ;上电默认灭
MOV TCON,#01H ;IT0=1,外部中断0下降沿触发
MOV IE,#81H ;EA=1,EX0=1
LJMP $ ;原地等待中断`
| 寄存器 | 值 | 含义 |
| TCON | 01H | IT0=1,INT0下降沿触发(写0则是低电平触发) |
| IE | 81H | 1000 0001B:EA=1、EX0=1 |
| 中断向量 | 03H | 外部中断0固定入口 |
| 触发脚 | P3.2 | INT0,按键按下产生下降沿 |
中断服务程序只有五行,但每行都有讲究:
`asm
INTERRUPT:
PUSH PSW ;保护现场
CPL LEDBUF ;状态字节取反
MOV C,LEDBUF ;最低位送进位位
MOV LED,C ;写回P1.0
POP PSW ;恢复现场
RETI`
为什么不直接写CPL P1.0?因为CPL LEDBUF操作的是30H这个字节,取反后最低位代表灯的亮灭,再通过进位位写到引脚。这样做的好处是状态存在RAM里,以后要扩展到8个灯,把LED换成P1、CPL LEDBUF直接作用在端口缓存上就行,逻辑不用重写。PUSH PSW / POP PSW 是中断里改寄存器时的标准动作——本程序只动了A和C,严格说PSW里的C位也在PSW中,所以保护PSW是必要的。
按键接INT0还有两个硬件细节:
| 细节 | 说明 |
| 上拉电阻 | P3口内部有弱上拉,仿真里可以直接接按键到地;实物建议外加10k上拉 |
| 消抖 | 下降沿触发只认一次跳变,机械抖动产生的多个下降沿会连续触发,实物要加104电容或软件消抖 |
| 触发方式 | 选下降沿(IT0=1),按住不放只触发一次;选低电平(IT0=0)会反复进中断 |
特别注意: 按键没反应,先确认按键是不是接在P3.2而不是P3.3(P3.3是INT1,向量在13H);灯亮灭乱跳,多半是机械抖动被当成多次下降沿,实物加电容或在中断里加延时确认;仿真里按住按键不放灯只翻转一次是正常现象(下降沿触发);如果改成低电平触发,按住不放灯会疯狂闪烁,这就是两种触发方式的区别。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

