内容概要
本章介绍MCS-51片内中断系统的硬件结构和工作原理。
7.1.1 MCS-51中断技术概述
在单片机系统中,中断技术主要用于实时监测与控制,也就是要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应并及时处理。这些工作就是由单片机片内的中断系统来实现的。下图显示了单片机对外围设备中断服务请求的整个中断响应和处理过程。
7.1.2 MCS-51中断系统结构
中断系统结构如图7-2所示。共有5个中断请求源(简称中断源),2个中断优先级,可实现2级中断服务程序嵌套。每一中断源可用软件独立地控制为允许中断或关中断状态;每一中断源的中断优先级别均可用软件来设置。
由图7-2可见,中断系统共有5个中断请求源,它们是: (1)INT0*—外部中断请求0,中断请求信号由引脚输入,中断请求标志为IE0。 (2) INT1*—外部中断请求1,中断请求信号由引脚输入,中断请求标志为IE1。 (3)定时器/计数器T0计数溢出发出的中断请求,中断请求标志为TF0。 (4)定时器/计数器T1计数溢出发出的中断请求,中断请求标志为TF1。 (5)串行口中断请求,中断请求标志为发送中断TI或接收中断RI。
一 、 中断请求标志寄存器
5个中断请求源的中断请求标志分别由特殊功能寄存器TCON和SCON的相应位锁存
1.TCON寄存器
为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。该寄存器中既包括T0和T1的溢出中断请求标志位TF0和TF1,也包括了两个外部中断请求的标志位IE1与IE0,此外还包括了两个外部中断请求源的中断触发方式选择位。特殊功能寄存器TCON的格式如图所示。 TCON寄存器中与中断系统有关的各标志位的功能如下: (1)TF1—片内定时器/计数器T1的溢出中断请求标志位。 当启动T1计数后,定时器/计数器T1从初值开始加1计数,当最高位产生溢出时,由硬件使TF1置“1”,向CPU申请中断。CPU响应TF1中断时,TF1标志由硬件自动清“0”,TF1也可由软件清“0”。 (2)TF0—片内定时器/计数器T0的溢出中断请求标志位,功能与TF1类似。 (3)IE1—外部中断请求1的中断请求标志位。 (4)IE0—外部中断请求0的中断请求标志位,其功能与IE1类似。 (5)IT1—选择外部中断请求1为跳沿触发方式还是电平触发方式。 IT1=0,为电平触发方式,加到INT1引脚上的外部中断请求输入信号为低电平有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。 IT1=1,为跳沿触发方式,加到INT1引脚上的外部中断请求输入信号电平从高到低的负跳变有效,并把IE1置“1”。转向中断服务程序时,则由硬件自动把IE1清“0”。 (6)IT0—选择外部中断请求0为跳沿触发方式还是电平触发方式,其意义与IT1类似。 当MCS-51复位后,TCON被清“0”,5个中断源的中断请求标志均为0。 TR1(D6位)、TR0(D4位)这2位与中断系统无关,仅与定时器/计数器T1和T0有关,将在第6章介绍。
2. SCON寄存器
SCON为串行口控制寄存器,字节地址为98H,可位寻址。SCON的低二位锁存串行口的发送中断和接收中断的中断请求标志TI和RI,其格式如图7-4所示。 SCON中各标志位的功能如下: (1)TI—串行口的发送中断请求标志位 CPU将一个字节的数据写入串行口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据后,硬件使TI自动置“1”。 CPU响应串行口发送中断时,并不清除TI中断请求标志,TI标志必须在中断服务程序中用指令对其清“0”。 (2)RI—串行口接收中断请求标志位 在串行口接收完一个串行数据帧,硬件自动使RI中断请求标志置“1”。CPU在响应串行口接收中断时,RI标志并不清“0”,必须在中断服务程序中用指令对RI清“0”。
二、 中断允许与中断优先级的控制
实现中断允许控制和中断优先级控制分别由特殊功能寄存器区中的中断允许寄存器IE和中断优先级寄存器IP来实现的。下面介绍这两个特殊功能寄存器。
1. 中断允许寄存器IE
51单片机的CPU对各中断源的开放或屏蔽,是由片内的中断允许寄存器IE控制的。IE的字节地址为A8H,可进行位寻址,其格式如图7-5所示。 (2)ES—串行口中断允许位 ES=0,禁止串行口中断。 ES=1,允许串行口中断。 (3)ET1—定时器/计数器T1的溢出中断允许位 ET1=0,禁止T1溢出中断。 ET1=1,允许T1溢出中断。 (4)EX1—外部中断1中断允许位 EX1=0,禁止外部中断1中断。 EX1=1,允许外部中断1中断 (5)ET0—定时器/计数器T0的溢出中断允许位 ET0=0,禁止T0溢出中断。 ET0=1,允许T0溢出中断。 (6)EX0—外部中断0中断允许位 EX0=0,禁止外部中断0中断。 EX0=1,允许外部中断0中断。 注意:MCS-51复位以后,IE被清“0”,所有的中断请求被禁止。IE中与各个中断源相应的位可用指令置“1”或清“0”,即可允许或禁止各中断源的中断申请。若使某一个中断源被允许中断,除了IE相应的位被置“1”外,还必须使EA位置“1”。
2. 中断优先级寄存器IP
中断请求源有两个中断优先级,每一中断请求源可由软件设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。
7.1.3 中断响应与处理
1. 响应中断请求的条件
一个中断源的中断请求被响应,必须满足以下必要条件: (1)总中断允许开关接通,即IE寄存器中的中断总允许位EA=1。 (2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。 (3)该中断源的中断允许位=1,即该中断被允许。 (4)无同级或更高级中断正在被服务。 中断响应就是CPU对中断源提出的中断请求的接受。当CPU查询到有效中断请求时,在满足上述条件时,紧接着就进行中断响应。 中断响应的主要过程:首先由硬件自动生成一条长调用指令“LCALL addr16”。这里的addr16就是程序存储区中相应的中断入口地址。例如,对于外部中断1的响应,硬件自动生成的长调用指令为LCALL 0013H。生成LCALL指令后,紧接着就由CPU执行该指令。首先将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。各中断源服务程序的入口地址是固定的,如表7-2所示。 其中两个中断入口间只相隔8字节,一般情况下难以安放一个完整的中断服务程序。因此,通常总是在中断入口地址处放置一条无条件转移指令,使程序执行转向在其他地址存放的中断服务程序入口。 中断响应是有条件的,并不是查询到的所有中断请求都能被立即响应,当遇到下列三种情况之一时,中断响应被封锁: (1)CPU正在处理同级或更高优先级的中断。因为当一个中断被响应时,要把对应的中断优先级状态触发器置“1”(该触发器指出CPU所处理的中断优先级别),从而封锁了低级中断请求和同级中断请求。 (2)所查询的机器周期不是当前正在执行指令的最后一个机器周期。设定这个限制的目的是只有在当前指令执行完毕后,才能进行中断响应,以确保当前指令执行的完整性。 (3)正在执行的指令是RETI或是访问IE或IP的指令。因为按照MCS-51中断系统的规定,在执行完这些指令后,需要再执行完一条指令,才能响应新的中断请求。 如果存在上述三种情况之一,CPU将丢弃中断查询结果,不能对中断进行响应。
2. 外部中断的响应时间
在设计者使用外部中断时,有时需考虑从外部中断请求有效(外部中断请求标志置“1”)到转向中断入口地址所需要的响应时间。 下面来讨论这个问题。 外部中断的最短响应时间为3个机器周期。 其中中断请求标志位查询占1个机器周期,而这个机器周期恰好处于指令的最后一个机器周期。在这个机器周期结束后,中断即被响应,CPU接着执行一条硬件子程序调用指令LCALL以转到相应的中断服务程序入口,这需要2个机器周期。 外部中断响应的最长时间为8个机器周期。 这种情况发生在CPU进行中断标志查询时,刚好才开始执行RETI或访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断。执行上述的RETI或访问IE或IP的指令,最长需要2个机器周期。而接着再执行一条指令,我们按最长的指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。再加上硬件子程序调用指令LCALL的执行,需要2个机器周期,所以,外部中断响应的最长时间为8个机器周期。
3. 外部中断的触发方式选择
外部中断有两种触发方式:电平触发方式和跳沿触发方式
(1 ) 电平触发方式
若外部中断定义为电平触发方式,外部中断申请触发器的状态随着CPU在每个机器周期采样到的外部中断输入引脚的电平变化而变化,这能提高CPU对外部中断请求的响应速度。当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效(即外部中断请求输入已由低电平变为高电平),否则CPU返回主程序后会再次响应中断。所以电平触发方式适合于外部中断以低电平输入且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。如何清除电平触发方式的外部中断请求源的电平信号,将在本章的后面介绍。
(2 ) 跳沿触发方式
外部中断若定义为跳沿触发方式,外部中断申请触发器能锁存外部中断输入线上的负跳变。即便是CPU暂时不能响应,中断请求标志也不会丢失。在这种方式下,如果相继连续两次采样,一个机器周期采样到外部中断输入为高,下一个机器周期采样为低,则中断申请触发器置“1”,直到CPU响应此中断时,该标志才清“0”。这样就不会丢失中断,但输入的负脉冲宽度至少保持12个时钟周期(若晶振频率为6MHz,则为2?s),才能被CPU采样到。外部中断的跳沿触发方式适合于以负脉冲形式输入的外部中断请求。
4.中断请求的撤销
某个中断请求被响应后,就存在着一个中断请求的撤销问题。下面按中断请求源的类型分别说明中断请求的撤销。
(1) 定时器/计数器中断请求的撤销
定时器/计数器中断的中断请求被响应后,硬件会自动把中断请求标志位(TF0或TF1)清“0”,因此定时器/计数器中断请求是自动撤销的。
(2) 外部中断请求的撤销
(1)跳沿方式外部中断请求的撤销
跳沿方式的外部中断请求的撤销,包括两项内容:中断标志位清“0” 和 外中断信号的撤销。其中,中断标志位(IE0或IE1)清“0”是在中断响应后由硬件自动完成的。而外中断请求信号的撤销,由于跳沿信号过后也就消失了,所以跳沿方式的外部中断请求也是自动撤销的。
(2)电平方式外部中断请求的撤销
对于电平方式外部中断请求的撤销,中断请求标志的撤销是自动的,但中断请求信号的低电平可能继续存在,在以后的机器周期采样时,又会把已清“0”的IE0或IE1标志位重新置“1”。为此,要彻底解决电平方式外部中断请求的撤销,除了标志位清“0”之外,必要时还需在中断响应后把中断请求信号输入引脚从低电平强制改变为高电平。
(3)串行口中断请求的撤销
串行口中断请求的撤销只有标志位清“0”的问题。串行口中断的标志位是TI和RI,但对这两个中断标志CPU不进行自动清“0”。因为在响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行口中断请求的撤销只能使用软件的方法,在中断服务程序中进行,即使用软件在中断服务程序中把串行口中断标志位TI、RI清0。
7.1.4 中断服务程序设计与应用
1.中断初始化 首先要将51单片机中断系统初始化,所谓中断系统初始化,就是指用户对中断控制的相关特殊功能寄存器中各有关控制位进行赋值。其步骤为: 开启中断开关——设置IE寄存器的值。 比如启动IT0外部中断,汇编语言MOV IE,#81H;C语言格式是IE=0X81。就是把IE寄存器中的EA与EX0设为1。 设定所用中断源的中断优先级——设定IP寄存器的值。 比如要提高 的优先级, IP=0X04。就是把PT0=1。 中断信号的设定——设置TCON寄存器的值。 2. 中断处理服务函数 一般形式为: 函数类型 函数名(形式参数表) interrupt n using n 关键字interrupt后面的 n是中断号,对于51单片机,n的取值为0~4,编译器从8×n+3处产生中断向量。 MCS-51单片机在内部RAM中可使用4个工作寄存器区,每个工作寄存器区包含8个工作寄存器(R0~R7)。 C51扩展了一个关键字using,using后面的n专门用来选择MCS-51的4个不同的工作寄存器区。using是一个选项,如果不选用该项,中断函数中的所有工作寄存器的内容将被保存到堆栈中。
|