中断允许寄存器-Interrupt Enable Register
要使用单片机的中断系统,通常要设置两个与其相关的寄存器:中断允许 和 中断优先级 寄存器
中断允许寄存器(IE: Interrupt Enable),用来设定各中断源的打开和关闭,字节地址为 A8H,可进行位寻址;
中断优先级寄存器(IP: Interrupt Priority),用来设置中断源的优先级别,字节地址为 B8H,可进行位寻址。
中断允许寄存器 | ||||||||
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位地址 | AFH | AEH | ADH | ACH | ABH | AAH | A9H | A8H |
位符号 | EA | / | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
寄存器的字节地址取值于该寄存器最低位的地址;
单片机复位后,各中断位的值将被置 0 ;
无效位的值将被忽略,所以下面示例中的 IE 可以取值 0xC2 或者 0x82。
位名称 | 开关值 | ||
允许 | 禁止 | ||
EA | 中断总开关 | 1 | 0 |
ET2 | T2 中断允许 | 1 | 0 |
ES | 串行中断允许 | 1 | 0 |
ET1 | T1 中断允许 | 1 | 0 |
EX1 | INT1 中断允许 | 1 | 0 |
ET0 | T0 中断允许 | 1 | 0 |
EX0 | INT0 中断允许 | 1 | 0 |
假如我们要使用内部中断 T0 来处理某些任务时,只需要如下编码即可。
void main(void)
{
IE = 0x82;//10000010B
}
void t0_interr() interrupt 1
{
//TODO
}
以上为统一设置中断允许寄存器各个位的值,也可以分别设置各个位,效果是一样的。
void main(void)
{
EA = 1;//允许中断
ET0 = 1;//允许 T0 中断
}
void t0_interr() interrupt 1
{
//TODO
}
中断优先级寄存器 | ||||||||
位序号 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位地址 | BFH | BEH | BDH | BCH | BBH | BAH | B9H | B8H |
位符号 | / | / | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
位名称 | 优先值 | |||
高 | 低 | |||
PT2 | T2 中断优先选择位 | 1 | 0 | |
PS | 串口 TI/RI 中断优先选择位 | 1 | 0 | |
PT1 | T1 中断优先选择位 | 1 | 0 | |
PX1 | INT1 中断优先选择位 | 1 | 0 | |
PT0 | T0 中断优先选择位 | 1 | 0 | |
PX0 | INT0 中断优先选择位 | 1 | 0 |
假如要提高 T0 中断和 INT0 中断的优先级,其编码如下:
void main(void)
{
IE = 0x83;//10000010B
IP = 0x03;//00000011B
}
void int0_interr() interrupt 0
{
//TODO
}
void t0_interr() interrupt 1
{
//TODO
}
也可以单独设置,如下:
void main(void)
{
EA = 1;//允许中断
ET0 = 1;//允许 T0 中断
INT0 = 1;//允许外部 INT0 中断
PT0 = 1;//提高 T0 中断优先级
PX0 = 1;//提高 INT0 中断优先级
}
void int0_interr() interrupt 0
{
//TODO
}
void t0_interr() interrupt 1
{
//TODO
}
如果两个相同优先级的中断源同时发出中断申请,则将按照默认自然优先级高低执行任务。如上,因为外部中断 INT0 的自然优先级高于 T0 中断的自然优先级,所以当这两个相同级别的中断源同时申请是,将先响应外部 INT0 中断。
优先级只有高/低两个状态,所以最多可以实现二级中断嵌套。
《中断允许寄存器-Interrupt Enable Register》 由 CRAFTOUR.COM 采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际 许可协议进行许可。