
3.2 MCS-51单片机中断系统
单片机需要处理的任务按系统对实时性要求的不同可以分为两类。
一类任务对于实时性要求不严格,如彩灯的闪烁、显示器的内容更新、蜂鸣器的发声等。由于人的反应能力有限,因此对于这类任务的处理即使稍延迟一段时间(如20ms),系统的整体性能并未受到影响。

图3-1 MCS-51单片机中断处理过程
另一类任务对实时性的要求非常严格,如统计单位时间内的脉冲个数。如果单片机不能在相邻两个脉冲的时间间隔内做出反应,就会导致最终计数的错误。
对于实时性要求严格的系统,通常采用MCS-51单片机提供的中断功能。
中断的定义:中断是指单片机暂时停止执行当前的程序并跳转到相应的中断服务函数进行特殊、短暂的处理,待处理完中断服务函数后再返回到原程序的断点处。中断处理过程如图3-1所示。
3.2.1 中断源
中断源是指能够发出中断申请的来源。中断申请信号既可以自外部的器件发出,也可以由单片机内部的功能单元发出。
MCS-51单片机提供了5个中断源,如表3-1所示。5个中断源的中断标志位、标志位撤除方式(即将相应的中断标志位清零)各不相同。
表3-1 MCS-51单片机中断源

(1)外部中断0中断请求:外部中断请求信号由外部器件产生,从引脚(P3.2)引入,中断标志位为IE0(TCON.1)。当CPU检测到P3.2引脚出现有效的中断信号时(低电平或下降沿,可由软件设置)将IE0置1,向CPU申请中断。CPU响应中断后,由单片机内部硬件电路自动将IE0清零。
(2)外部中断1中断请求:外部中断请求信号由外部器件产生,从引脚(P3.3)引入,中断标志位为IE1(TCON.3)。当CPU检测到P3.3引脚出现有效的中断信号时(低电平或下降沿,可由软件设置)将IE1置1,向CPU申请中断。CPU响应中断后,由单片机内部硬件电路自动将IE1清零。
(3)片内定时器/计数器0(T0)溢出中断请求:由单片机内部的定时器/计数器产生,中断标志位为TF0(TCON.5)。当定时器/计数器T0发生定时时间到溢出或计数计满溢出时,将TF0置1并向CPU申请中断。TF0由硬件自动清零。
(4)片内定时器/计数器1(T1)溢出中断请求:由单片机内部的定时器/计数器产生,中断标志位为TF1(TCON.7)。当定时器/计数器T1发生定时时间到溢出或计数计满溢出时,将TF1置1并向CPU申请中断。TF1由硬件自动清零。
(5)片内串行口发送/接收中断请求:中断标志位分别为TI(SCON.1)和RI (SCON.0)。此中断请求分为两种情况:当串行口接收完一帧串行数据时,将RI置1,并向CPU请求中断;当串行口发送完一帧串行数据时,将TI置l并向CPU请求中断。单片机内部硬件电路不能自动将TI或RI清零,为防止CPU再次响应这类中断,应通过赋值语句将其撤除,即用下面两条命令:
RI=0; //撤除接收中断请求 TI=0; //撤除发送中断请求
3.2.2 与中断有关的特殊功能寄存器
MCS-51单片机中断系统结构图如图3-2所示。由图可知,MCS-51单片机中有TCON、SCON、IE和IP 4个专用寄存器用于中断控制,用户可以通过设置其状态来管理中断系统。
1.定时器/计数器控制寄存器TCON
该寄存器的低4位用于外部中断的控制,高4位用于定时器/计数器中断T0、T1的控制,各位所代表的含义如表3-2所示。

图3-2 MCS-51单片机中断系统结构
表3-2 TCON各位含义

(1)IT0(TCON.0):外部中断0触发方式控制位。当IT0=0时设置外部中断0为低电平触发方式;当IT0=1时设置外部中断0为边沿触发方式(下降沿有效)。可以用赋值语句对外部中断0的触发方式进行设置,例如:
IT0=1; //设定外部中断0为下降沿触发模式 IT0=0; //设定外部中断0为低电平触发模式
(2)IE0(TCON.1):外部中断0中断请求标志位。当有外部的中断请求时该位就会置1(由硬件完成),在CPU响应中断后,由硬件自动将IE0清零。
(3)IT1(TCON.2):外部中断1触发方式控制位,用途与IT0相同。
(4)IE1(TCON.3):外部中断1中断请求标志位,用途和IE0相同。
(5)TR0(TCON.4):定时器/计数器T0启停控制位,可由软件设置。
TR0=1; //启动定时器/计数器T0 TR0=0; //停止定时器/计数器T0
(6)TF0(TCON.5):定时器/计数器T0溢出中断请求标志位。当T0计数产生溢出时,由硬件置1,在CPU响应中断后,由硬件自动将其清零。
(7)TR1(TCON.6):定时器/计数器T1启停控制位,用途与TR0相同。
(8)TF1(TCON.7):定时器/计数器T1溢出中断请求标志位,用途与TF0相同。
2.串行口控制寄存器SCON
片内串行口完成接收或发送的中断请求信号RI和TI在串行口控制寄存器SCON中, SCON的高6位用于串行口工作方式设置和串行口发送/接收控制,RI和TI是其中的低两位。SCON各位的含义如表3-3所示。
表3-3 SCON各位含义

(1)RI:串行口接收中断请求标志位。RI=0表示没有串行口接收中断申请,RI=1表示有串行口接收中断申请(即完成一帧数据的接收)。中断系统不会自动撤除RI中断,必须由用户在中断服务程序中通过将RI清零来撤除,即RI=0。
(2)TI:串行口发送中断请求标志位。TI=0表示没有串行口发送中断申请,TI=1表示有串行口发送中断申请(即完成一帧数据的发送)。中断系统不会自动撤除TI中断,必须由用户在中断服务程序中通过将TI清零来撤除,即TI=0。
3.中断允许控制寄存器IE
在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许控制寄存器IE来控制的,其各位的含义如表3-4所示。
表3-4 IE各位含义

(1)EA:CPU总中断允许位。EA=0:关中断;EA=1:开中断。
(2)EX0:外部中断0中断允许位。EX0=1:允许外部中断0中断;EX0=0:禁止外部中断0中断。
(3)ET0:定时器/计数器T0中断允许位。ET0=1:允许T0中断;ET0=0:禁止T0中断。
(4)EX1:外部中断1中断允许位。EX1=1:允许外部中断1中断;EX1=0:禁止外部中断1中断。
(5)ET1:定时器/计数器T1中断允许位。ET1=1:允许T1中断;ET1=0:禁止T1中断。
(6)ES:串行口中断允许位。ES=1:允许串行口中断;ES=0:禁止串行口中断。
MCS-51单片机复位时,IE被清零,此时CPU关中断,各中断源的中断也都被屏蔽。若系统需要用中断方式进行事件处理,则在系统初始化程序中需要对IE编程。对IE编程时,不仅要开需要的中断,还要开CPU的中断。例如:
EA=1; //CPU开中断 EX1=1; //CPU中断已开,对EX1的操作有效,允许外部中断1中断
4.中断优先级寄存器IP
MCS-51单片机有两个中断优先级,可实现两级中断服务嵌套,每个中断源都可设定为高或低中断优先级。MCS-51中断系统对各中断源的中断优先级有一个统一的规定,称为自然优先级(也称为系统默认优先级),如表3-5所示。
表3-5 MCS-51单片机的自然中断优先级

MCS-51单片机的中断优先级采用了自然优先级和人工设置高、低优先级相结合的策略,中断处于同一级别时,由自然优先级确定。开机时每个中断都处于低优先级,中断优先级可以通过中断优先级寄存器IP中的相应位的状态来设定。IP中各位的含义如表3-6所示。
表3-6 IP各位含义

(1)PX0:外部中断0优先级设定位。
(2)PT0:定时器/计数器T0优先级设定位。
(3)PX1:外部中断1优先级设定位。
(4)PT1:定时器/计数器T1优先级设定位。
(5)PS:串行口优先级设定位。
若IP中某位设为1,相应的中断级别就设置成高优先级,否则就是低优先级。
3.2.3 中断服务函数的写法
MCS-51单片机各中断源的中断服务程序入口地址如表3-7所示。
表3-7 中断源入口地址

由表3-7可见,MCS-51单片机的每两个中断源的中断服务入口地址之间相差8字节的存储单元。一般来说,这8字节用来存储中断服务程序是不够的,因此,在使用汇编语言编程时,通常是在中断服务程序地址入口处放一条3字节的长转移指令(LJMP),但使用C语言编程时不必考虑此问题。
MCS-51编译器支持在C语言源程序中直接编写中断服务函数,使开发人员不必关心上述内容,对于简化单片机的中断服务程序编程有很大的帮助。
MCS-51的中断服务函数格式如下所示。
void 函数名() interrupt m (using n) { 中断服务程序内容 }
几点说明:
(1)中断函数不能返回任何值,所以最前面用void,后面紧跟函数名,函数名应反映其代表的功能。函数名要符合标识符的规则要求,即可由字母、数字和下划线组成,且必须以字母或下划线开头,但不能与C语言中的关键字相同;中断函数不带任何参数,所以函数名后面的小括号内为空。
(2)关键字interrupt后面的m代表中断号,是一个常量,取值范围是0~4。每个中断号都对应一个中断源,见表3-7,这个序号是编译器识别不同中断的唯一符号,因此在写中断服务程序时务必要写正确。
(3)关键字using后面的n代表中断函数将要选择使用的单片机内存中的哪一组工作寄存器,也是一个常量,取值范围是0~3。MCS-51编译器在编译程序时会自动分配工作寄存器组,因此最后这句通常省略不写,但读者以后若遇到这样的程序代码时要知道是什么意思。
一个简单的中断服务C程序写法如下。
void T1_time() interrupt 3 { TH1=(65536-10000)/256; TL1=(65536-10000)%256; }
上面这段代码是定时器T1的一个简单的中断服务函数,定时器T1的中断序号是3,因此要写成interrupt 3,中断服务程序的内容是给两个存放初值的寄存器TH1、TL1装入新值。