在 51 单片机(如 STC51 系列)中,中断允许寄存器 IE
起着关键作用,它用于控制各个中断源的中断允许或禁止状态。下面将详细介绍中断允许寄存器 IE
。
1. 寄存器概述
中断允许寄存器 IE
是一个可位寻址的特殊功能寄存器,其字节地址为 0xA8。通过对 IE
寄存器的不同位进行操作,可以分别控制全局中断以及各个具体中断源的开启和关闭。
2. 寄存器位定义及功能
IE
寄存器共有 8 位,各位的具体定义和功能如下:
位序号 | 位符号 | 功能描述 |
---|---|---|
D7 | EA | 全局中断允许位。当 EA = 1 时,CPU 开放中断,即允许响应各个使能的中断源发出的中断请求;当 EA = 0 时,CPU 禁止所有中断,无论其他中断允许位的状态如何,所有中断源的中断请求都不会被响应。 |
D6 | - | 保留位,在标准 51 单片机中该位无实际用途,用户程序一般不应对其进行操作。 |
D5 | ET2 | 定时器 / 计数器 2 中断允许位(仅在 52 子系列单片机中有此位)。当 ET2 = 1 时,允许定时器 / 计数器 2 产生的中断请求;当 ET2 = 0 时,禁止定时器 / 计数器 2 的中断。 |
D4 | ES | 串行口中断允许位。当 ES = 1 时,允许串行口(UART)产生的接收或发送中断请求;当 ES = 0 时,禁止串行口的中断。 |
D3 | ET1 | 定时器 / 计数器 1 中断允许位。当 ET1 = 1 时,允许定时器 / 计数器 1 溢出时产生的中断请求;当 ET1 = 0 时,禁止定时器 / 计数器 1 的中断。 |
D2 | EX1 | 外部中断 1 允许位。当 EX1 = 1 时,允许外部中断 1(INT1 引脚)产生的中断请求;当 EX1 = 0 时,禁止外部中断 1 的中断。 |
D1 | ET0 | 定时器 / 计数器 0 中断允许位。当 ET0 = 1 时,允许定时器 / 计数器 0 溢出时产生的中断请求;当 ET0 = 0 时,禁止定时器 / 计数器 0 的中断。 |
D0 | EX0 | 外部中断 0 允许位。当 EX0 = 1 时,允许外部中断 0(INT0 引脚)产生的中断请求;当 EX0 = 0 时,禁止外部中断 0 的中断。 |
3. 编程示例
以下是一个简单的示例代码,展示了如何使用 IE
寄存器来使能定时器 0 中断和外部中断 0:
#include <reg52.h>// 定时器 0 中断服务函数
void timer0_isr() interrupt 1 {// 定时器 0 中断处理代码// 例如,翻转 P1.0 引脚的电平P1 ^= 0x01;
}// 外部中断 0 中断服务函数
void ext0_isr() interrupt 0 {// 外部中断 0 中断处理代码// 例如,点亮 P1.1 引脚连接的 LEDP1 |= 0x02;
}void main() {// 配置定时器 0 为模式 1(16 位定时器)TMOD |= 0x01;// 设置定时器 0 初值,定时约 1msTH0 = 0xFC;TL0 = 0x18;// 启动定时器 0TR0 = 1;// 设置外部中断 0 为边沿触发方式IT0 = 1;// 使能定时器 0 中断ET0 = 1;// 使能外部中断 0EX0 = 1;// 全局中断使能EA = 1;while (1) {// 主循环代码}
}
4. 注意事项
- 全局中断控制:
EA
位是中断控制的总开关,只有当EA = 1
时,其他中断允许位的设置才会生效。如果EA = 0
,则所有中断源的中断请求都将被屏蔽。 - 位操作的灵活性:由于
IE
寄存器可位寻址,在编程时可以直接对单个位进行操作,如ET0 = 1;
或EX1 = 0;
,这样可以提高代码的可读性和可维护性。 - 不同单片机型号差异:对于一些增强型 51 单片机或不同的子系列,可能会有额外的中断源和对应的中断允许位,使用时需要参考相应的芯片手册。