IAP15F2K61S2 系列单片机提供了 14 个中断请求源,它们分别是:外部中断 0(INT0)、定时器 0 中断、外部中断 1(INT1)、定时器 1 中断、串口 1 中断、ADC 中断、低压检测(LVD)中断、CCP/PWM/PCA 中断、串口 2 中断、SPI 中断、外部中断 2(INT2)、外部中断 3(INT3)、定时器 2 中断,以及外部中断 4(INT4)。除外部中断 2(INT2)、外部中断 3(INT3)、定时器 2 中断和外部中断 4(INT4)固定是最低优先级中断外,其他的中断都具有两个中断优先级,可实现2 级中断服务程序嵌套。


部分中断源信息如表


1)中断允许寄存器 IE
IAP15F2K61S2 系列单片机 CPU 对中断源的开放或屏蔽,每一个中断源是否被允许中断,是由内部的中断允许寄存器 IE(IE 为特殊功能寄存器,它的字节地址为 A8H)控制的,其格式如

EA:CPU 的总中断允许控制位,EA=1,CPU 开放中断;EA=0,CPU 屏蔽所有的中断申请。
EA 的作用是使中断允许形成多级控制。即各中断源首先受 EA 控制;其次还受各中断源自己的中
断允许控制位控制。
ELVD:低压检测中断允许位,ELVD=1,允许低压检测中断;ELVD=0,禁止低压检测中断。
EADC:ADC 中断允许位,EADC=1,允许 ADC 中断;EADC=0,禁止 ADC 中断。
ES:串行口 1 中断允许位,ES=1,允许串行口 1 中断;ES=0,禁止串行口 1 中断。
ET1:定时/计数器 T1 的溢出中断允许位,ET1=1,允许 T1 中断;ET1=0,禁止 T1 中断。
EX1:外部中断 1 中断允许位,EX1=1,允许外部中断 1 中断;EX1=0,禁止外部中断 1 中断。
ET0:T0 的溢出中断允许位,ET0=1 允许 T0 中断;ET0=0 禁止 T0 中断。
EX0:外部中断 0 中断允许位,EX0=1,允许外部中断 0 中断;EX0=0,禁止外部中断 0 中断。
2)中断优先级控制寄存器 IP
STC15 系列单片机通过设置特殊功能寄存器(IP 和 IP2)中的相应位,可将部分中断设有两
个中断优先级,并设有两条基本规则:
(1)低优先级中断可被高优先级中断所中断,反之不能。
(2)任何一种中断(不管是高级还是低级),一旦得到响应,就不会再被它的同级中断所中断。
中断优先级控制寄存器 IP 的格式如表

PT1:定时器 1 中断优先级控制位。
当 PT1=0 时,定时器 1 中断为最低优先级中断(优先级 0); 当 PT1=1 时,定时器 1 中断为最高优先级中断(优先级 1)。
PX1:外部中断 1 优先级控制位。
当 PX1=0 时,外部中断 1 为最低优先级中断(优先级 0); 当 PX1=1 时,外部中断 1 为最高优先级中断(优先级 1)。
PT0:定时器 0 中断优先级控制位。
当 PT0=0 时,定时器 0 中断为最低优先级中断(优先级 0); 当 PT0=1 时,定时器 0 中断为最高优先级中断(优先级 1)。
PX0:外部中断 0 优先级控制位。
当 PX0=0 时,外部中断 0 为最低优先级中断(优先级 0); 当 PX0=1 时,外部中断 0 为最高优先级中断(优先级 1)。
3)定时器/计数器控制寄存器 TCON
TCON 为定时器/计数器 T0 和 T1 的控制寄存器,同时也锁存 T0 和 T1 溢出中断源和外部请求中断源等,TCON 格式如表

TF1:T1 溢出中断标志。T1 被允许计数以后,从初值开始加 1 计数。当产生溢出时由硬件置“1”TF1,向 CPU 请求中断,一直保持到 CPU 响应中断时,才由硬件清零(也可由查询软件清零)。
TR1:定时器 1 的运行控制位。
TF0:T0 溢出中断标志。T0 被允许计数以后,从初值开始加 1 计数,当产生溢出时,由硬件置“1”TF0,向 CPU 请求中断,一直保持 CPU 响应该中断时,才由硬件清零(也可由查询软件清零)。
TR0:定时器 0 的运行控制位。
IE1:外部中断 1(INT1/P3.3)中断请求标志。IE1=1,外部中断向 CPU 请求中断,当 CPU响应该中断时由硬件清零 IE1。
IT1:外部中断 1 中断源类型选择位。IT1=0,INT1/P3.3 引脚上的上升沿或下降沿信号均可触发外部中断 1。IT1=1,外部中断 1 为下降沿触发方式。
IE0:外部中断 0(INT0/P3.2)中断请求标志。IE0=1,外部中断 0 向 CPU 请求中断,当 CPU响应外部中断时,由硬件清零 IE0。
IT0:外部中断 0 中断源类型选择位。IT0=0,INT0/P3.2 引脚上的上升沿或下降沿均可触发外部中断 0。IT0=1,外部中断 0 为下降沿触发方式。
中断函数的一般形式为:

void 函数名() [interrupt n] [using m]

关键字 interrupt 后面的 n 是中断号,编译器从 8n+3 处产生中断入口地址,具体的中断号 n和中断向量取决于所采用的中断源,其中外部中断 0 的中断号为 0。
关键字 using 专门用来选择单片机中不同的工作寄存器组。using 后面的 m 是一个 0~3 的常整数,分别选中 4 个不同的工作寄存器组。定义中断函数时 using 是一个选项,如果不用该选项,则由编译器自动选择一个寄存器组进行绝对寄存器组访问。
应该特别注意,在任何情况下都不能直接调用中断函数,因为它不能进行参数传递,也没有返回值。
外部中断程序设计案例

    // 使用程序前,将跳线 J5 调整为 BTN 模式(2、3 引脚短接使第一列按键一端接地)
    // 将跳线 J13 调整为 IO 模式(2、3 引脚短接使 U25 或非门输入信号 WR 接地)
    // 按下 P32-INT0 引脚对应的按键 S5,L1 状态翻转
    // 按下 P33-INT1 引脚对应的按键 S4,L2 状态翻转
    #include "reg52.h"
    unsigned char ucLed;
    // 关闭外设
    void Cls_Peripheral(void)
    {
        P0 = 0xFF;
        P2 = P2 & 0x1F | 0x80; // P27~P25 清零,再定位 Y4C
        P2 &= 0x1F; // P27~P25 清零
        P0 = 0;
        P2 = P2 & 0x1F | 0xA0; // P27~P25 清零,再定位 Y5C
        P2 &= 0x1F; // P27~P25 清零
    }
    // 系统初始化
    void Sys_Init(void)
    {
        EX0 = 1;
        IT0 = 1; // 边沿触发方式(下降沿)
        EX1 = 1;
        IT1 = 1; // 边沿触发方式(下降沿)
        EA = 1; // 开启总中断
    }

    // 主函数
    void main(void)
    {
        Cls_Peripheral();
        Sys_Init();
        while(1);
    }
    //外部中断 0 中断服务函数
    void isr_intr_0(void) interrupt 0
    {
        ucLed ^= 1;
        P0 = ~ucLed;
        P2 = P2 & 0x1F | 0x80; // P27~P25 清零,再定位 Y4C
        P2 &= 0x1F; // P27~P25 清零
    }
    //外部中断 1 中断服务函数
    void isr_intr_1(void) interrupt 2
    {
        ucLed ^= 2;
        P0 = ~ucLed;
        P2 = P2 & 0x1F | 0x80; // P27~P25 清零,再定位 Y4C
        P2 &= 0x1F; // P27~P25 清零
    }