一、单片机中断系统1、基本特点
有5个固定的中断源,其中3个在片内,2个在片外,它们在程序存储器ROM中都分别有各自固定的中断入口地址,由此进入中断服务程序(ISR);这5个固定的中断源都分别有两级中断优先级:高优先级和低优先级;可形成中断嵌套;有2个特殊功能寄存器用于中断控制的编程(IE和IP);对于8052单片机来说,增加了第三个中断源:定时器/计数器T2的中断;
外部中断源:
(1)、外部中断0:INT0,由P3.2(12号引脚)口引入,低电平或下降沿触发;
(2)、外部中断1:INT1,由P3.3(13号引脚)口引入,低电平或下降沿触发;
这两个外部中断的控制位锁存在定时器/计数器的工作状态控制寄存器TCON的低4位;
内部中断源:
(1)、定时器/计数器T0中断:由T0的计数寄存器TH0/TL0的值在溢出回0时触发;
(2)、定时器/计数器T1中断:由T1的计数寄存器TH1/TL1的值在溢出回0时触发;
(3)、串口中断RI/TI:串行口中断,由串行口在完成1帧字符的接收(RI)/发送(TI)时触发;
这三个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中;
2、中断系统的结构
如图:
二、中断控制寄存器
1、中断允许控制寄存器IE(A8H)
中断允许控制寄存器IE存储在特殊功能寄存器区,字节地址是A8H,位地址从低到高依次是A8H,A9H,AAH,ABH,ACH,ADH,AFH;
寄存器IE控制着CPU对中断源总的开放或禁止,以及对每个中断源的开放或禁止;
IE的格式如图:
2、中断优先级控制寄存器IP(B8H)
中断优先级控制寄存器IP存储在特殊功能寄存器区,字节地址是B8H,位地址从低到高依次是B8H,B9H,BAH,BBH,BCH,BDH,BEH,BFH;
IP用来锁存优先级的控制位,即:设定中断源属于两级中断中的哪一级;
(1)、中断优先级的响应:系统复位之后,IP的低5位全部被清0,并将所有中断源设置为低优先级中断;如果几个具有相同优先级的中断源同时向CPU申请中断,那么,哪一个中断源优先得到中断服务,这一点取决于这些中断源在CPU内部登记的排队序号(就是中断序号);CPU通过内部硬件查询登记的中断序号,按自然优先级逐个响应各个中断请求;中断源在CPU内部登记的中断序号是由硬件自动形成的,无需人工手动生成,其顺序如下:INT0-->T0-->INT1-->T1-->RI/TI;
IP的格式如图:
三、中断响应
1、响应过程:
下列任何一种情况存在时,中断申请将被封锁;
(1)、CPU当前正在执行一个同级或高一级的中断服务程序;
(2)、CPU当前正在执行的那条指令还没有执行完;
(3)、CPU当前正在执行的指令是RETI指令或这是对IE/IP寄存器进行读写操作的指令,执行这些指令之后,至少还要再执行一条指令才会响应中断;
2、中断入口地址:
中断得到响应后,自动清除中断请求标志(对于串口中断请求标志,要用软件来清0),由硬件自动将程序计数器PC的内容(断点地址)压入堆栈保护,然后将对应的中断矢量(中断入口地址)装入程序计数器PC, 使程序转到中断服务程序中执行并完成响应的中断服务;
各个中断源在程序存储器ROM中的中断入口地址和中断序号如下表所示:
四、C51中断程序
1、中断服务程序的格式:
返回值类型 中断函数名([参数表]) [模式] [重入] interrupt <中断序号n> [using m] //n∈[0,31],m∈[0,3],m和n不允许是表达式;
{
//中断处理函数的实现代码
}
对于中断服务程序来说,函数不能有返回值和参数,所以,返回值类型和参数类型均写成void;
Keil C51使用特定的编译器指令分配寄存器组;当前工作寄存器组由PSW中的RS1和RS0两位设置,两个位共有4个值[0,3],用using指定,;using关键字只能用于声明终端服务函数,它在中断服务函数入口处将当前寄存器组的值保存下来,并在中断服务函数中使用指定的寄存器组,在中断服务函数推出之前,恢复原寄存器组;
例如:
void isr_service(void) interrupt 4 using 2
{
//.....;
}
2、 编写中断服务函数时注意的事项:
A、若要在执行当前中断处理函数时禁止更高优先级的中断,可用软件方式先关闭CPU对中断的响应,在中断处理函数返回之前,再开放中断;
B、外部电平触发的中断信号不会被锁存.若在外部电平出现时被中断屏蔽,而在中断识别之前,电平消失,则它被完全忽略---中断处理本身不能锁存外部电平请求;
C、INT0、T0、INT1、T1的中断标志在CPU响应中断之后被自动清0,但是串口中断标志RI/TI和T2的中断标志TF2不会自动被清0,必须在软件中手工地清0,否则会立即产生重复中断,程序陷入死循环;对于串口中断,通常还要判断是RI还是TI中断;
D、为了提高中断响应的实时性,中断服务程序应尽量简短,并避免使用复杂的变量类型及算术运算;通常在中断服务程序中使用一些标志,由主程序或相应背景程序根据标志做响应的处理;