在keil中利用汇编语言以及AT89S52实现手动扩展外部中断INT0、INT1,当INT0产生中断时,使LED 亮、灭闪烁4 次;当INT1产生中断时,使LED 由右向左轮流显示,一次亮两个,循环4次。
时间: 2024-12-20 20:17:09 浏览: 11
在Keil C51集成开发环境中,使用汇编语言和AT89S52单片机扩展INT0和INT1外部中断功能,首先需要设置中断向量表,并编写中断服务程序(ISR)来处理中断事件。
1. **设置中断向量表**:
INT0和INT1的中断向量在低地址区域,你可以使用`ORG`指令来定位它们。例如:
```assembly
ORG 0x00 // INT0中断向量
JMP EXTI0_ISR
ORG 0x02 // INT1中断向量
JMP EXTI1_ISR
```
2. **编写中断服务程序**:
- 对于INT0中断:
```assembly
EXTI0_ISR:
MOV P2, #0xFF ; LED初始化为高电平(关闭)
MOV R7, #4 ; 设置闪烁次数
CLR IE ; 清除中断允许标志
LOOP:
MOV P2, #0 ; 开始第一个LED
DJNZ R7, LOOP ; LED闪烁,减一,直到完成4次
MOV P2, #0xFF ; LED关闭
DJNZ R7, LOOP ; 等待一段时间再切换到下一个LED状态
RETI ; 返回主程序
```
- 对于INT1中断:
```assembly
EXTI1_ISR:
MOV R6, #2 ; 设置LED数组长度
MOV R5, #0 ; 初始化当前LED位置
MOV P2, #0 ; LED初始状态为关
CLR IE ; 清除中断允许标志
LOOP1:
MOV P2, #1<<R5 ; 显示点亮的LED
DJNZ R6, LOOP1 ; 从右向左移动一位
MOV P2, #0 ; 关闭当前LED
INC R5 ; 移动到下一个LED
DJNZ R5, LOOP1 ; 循环直到所有LED都显示一次
RETI ; 返回主程序
```
3. **在主程序中配置中断**:
在主程序中,你需要启用中断并设置中断触发条件。对于INT0和INT1:
```assembly
SETB ES ; 启用总中断
SETB EA ; 开启CPU中断
SETB IT0 ; 开启INT0中断
SETB EX1 ; 开启INT1中断
```
并确保在适当的时间调用适当的中断入口地址:
```assembly
AJMP $+2 ; 跳转到INT0 ISR (假设在前两字节)
AJMP $+4 ; 跳转到INT1 ISR (假设在后两字节)
```
阅读全文