如何用C语言编写51单片机程序实现两个外部中断功能?其中一个中断使P2口所有流水灯亮3秒,另一个中断则让它们熄灭2秒。同时,确保在中断嵌套时,熄灭灯的中断优先级高于点亮灯的中断,请提供相应的C语言代码示例。
时间: 2024-11-30 20:13:40 浏览: 99
在51单片机上实现两个外部中断功能,我们需要利用定时器T0和中断控制寄存器INTCON来设置中断优先级,并结合P2口的端口映射来操作流水灯。下面是一个简单的示例,假设我们使用8051系列单片机,比如89S52:
首先,我们需要配置定时器T0作为计数器,用于定时灯的开关操作。这里使用模式2,16位自动装载计数。
```c
#include "reg52.h" // 包含必要的头文件
void timer0_init() {
TMOD = 0x02; // 设置T0工作于模式2
TH0 = 0xFD; // 计数值,3秒后溢出
TL0 = 0xFD;
ET0 = 1; // 开启T0溢出中断
}
void interrupt void Timer0 Overflow() __attribute__((interrupt("TIMER0"))) {
P2 = ~P2; // 点亮P2口所有LED(将低电平设为高电平)
}
```
接下来,设置外部中断1(INT1),用于熄灭灯,它的优先级更高。我们可以利用IE1的中断允许位和IP1的中断优先级设定位。
```c
// 使用中断向量1,即外部中断1(中断请求线1)
void interrupt void ExternalInt1() __attribute__((interrupt("EX1"))) {
if (TF1 == 0) { // 如果TF1未置位,说明有中断请求
TF1 = 1; // 清除中断标志
P2 = 0; // 熄灭P2口所有LED(将高电平设为低电平)
}
INTCON |= 0x04; // 临时提高INT0(外部中断0)的优先级,让INT1先处理
TI = 0; // 阻塞INT0中断,直到INT1处理完
INTCON &= ~0x04; // 恢复INT0的正常优先级
}
```
为了防止中断嵌套,当INT1触发时会暂时提高INT0的优先级,然后在内部清空TF1标志后恢复INT0的原始优先级。
记得在主循环里开启中断:
```c
void main(void) {
init(); // 初始化CPU和外设
timer0_init();
EA = 1; // 全局中断使能
ET1 = 1; // 开启外部中断1
while(1);
}
```
阅读全文