编写中断初始化程序,允许外部中断0,外部中断1,定时器t0溢出中断,串口中断,外部中断1的触发方式为低电平触发且使计数器/定时器t0溢出中断为高优先级中断
时间: 2024-09-20 17:07:09 浏览: 85
在C51或类似嵌入式开发环境中,中断初始化通常涉及设置中断向量表、开启中断源、指定中断处理程序以及设置中断优先级。以下是一个基本的中断初始化示例,假设我们正在使用AT89S52这样的单片机:
```c
#include <reg52.h>
void init_interrupts(void) // 中断初始化函数
{
// 允许所有需要的中断
EINT = 1 << EX0 | 1 << EX1 | 1 << EA | 1 << ET0; // EX0, EX1是外部中断,EA是全局中断使能,ET0是定时器T0中断
// 设置中断优先级
SCON = 0b00000110; // 串口1设置为方式1,允许接收和发送,高优先级
IT0 = 1; // T0溢出中断启用,高优先级
IP = 0b10001010; // EX1设置为低电平触发,IP寄存器中对应位置1表示高优先级
// 设置中断向量
TI = 0; // 清除TI标志,防止无意义的中断响应
TR0 = 0; // 关闭定时器T0
ET0 = 1; // 启动定时器T0中断
EX0 = 0x01; // EX0中断向量地址,通常位于0x01处
EX1 = 0x02; // EX1中断向量地址,通常位于0x02处
}
__interrupt void _extint0() __attribute__((vector(0))) // 处理外部中断0
{
// 外部中断0的处理代码
}
__interrupt void _extint1() __attribute__((vector(1))) // 处理外部中断1
{
// 外部中断1的处理代码,因为是低电平触发,所以在这里等待下降沿
while(PIN_1 == 1); // 监听PIN_1变为低电平时才进入中断
// ... 处理代码 ...
}
__interrupt void _timer0 Overflow() // 处理定时器T0溢出中断
{
// 定时器T0溢出中断的处理代码
}
int main()
{
init_interrupts();
// 主程序入口...
return 0;
}
```
在这个例子中,外部中断0和1的中断处理函数分别为`_extint0()` 和 `_extint1()`,T0溢出中断则由`_timer0 Overflow()` 函数处理。
阅读全文