首页 百科知识 中断服务程序应用设计

中断服务程序应用设计

时间:2022-10-22 百科知识 版权反馈
【摘要】:难点是单片机中断系统的结构和中断寄存器的设置,中断服务程序的编写。中断技术在实时多任务系统中,具有广泛的应用空间。完成中断服务程序后,CPU继续原来被打断的程序,这样的过程称为中断响应过程。如果新的中断请求是相同级别的或更低级别的,则CPU不予理睬,直到正在执行的中断服务程序运行完毕后才去响应新的中断请求。

第4章 AT89S52单片机中断系统

【教学目的】

在单片机系统中,中断是一个很重要的概念。本章主要学习AT89S52单片机的中断系统,理解中断的原理和过程,并能够正确地使用中断。

【教学要求】

本章要求理解中断的基本概念,掌握AT89S52单片机中断系统的结构,中断寄存器的设置和中断响应过程,能够编写简单的中断服务程序。

【重点难点】

本章重点是掌握中断技术和中断系统中断处理的全过程,熟悉中断请求、中断响应、中断服务的应用。难点是单片机中断系统的结构和中断寄存器的设置,中断服务程序的编写。

【知识要点】

本章的重要知识点有中断的基本概念、中断源和中断标志、中断允许控制、中断优先级控制、中断响应的过程、中断允许寄存器IE、中断优先级寄存器IP、TCON和SCON寄存器有关中断的作用和设置。

4.1 中断的基本概念

AT89S52单片机与外设之间的数据传输有以下三种方式:程序方式、中断方式、DMA方式。其中程序方式又分为无条件传送方式和条件传送方式两种方式。无条件传送方式通常用于简单外设,如LED显示器的控制。条件传送方式用于外设较少的情形,接口简单,但CPU效率低。在实时系统以及多个外设的系统中,采用中断传送方式。这种方式CPU利用率高,速度快。对于高速外设(如磁盘、高速A/D),中断方式仍不能满足数据传输速度的要求,需要采用DMA方式。在DMA方式中,外设接口直接与内存进行高速的数据传送,而不必经过CPU。

中断技术在实时多任务系统中,具有广泛的应用空间。中断技术实质上是一种资源共享技术,它允许多个任务共享相同的计算机资源,包括CPU、总线和存储器等。中断概念的出现,是计算机系统结构设计中的重大变革。

4.1.1 什么是中断

在讲中断之前,我们首先看一个生活中的现象。假设我们现在正在书房看书,这个时候有人敲门,于是我们起来去开门,接待来访的客人。等我们处理完这件事情后,又回到书房继续看书。这是我们生活中的“中断”现象,也就是说,在中断过程中,我们正常的工作过程被外部发生的事件打断了。

当CPU正在处理某项事务的时候,程序执行过程中,允许外部或内部事件通过硬件打断程序的执行,使其转向为处理外部或内部事件的中断服务程序中去。完成中断服务程序后,CPU继续原来被打断的程序,这样的过程称为中断响应过程。

4.1.2 中断的基本过程

研究我们生活中的中断,对于我们学习计算机的中断也很有好处,实际上计算机中的中断和我们生活中的中断有着相同的原理和过程。我们先看看中断的几个基本概念。

1.什么可以引起中断

生活中很多事件可以引起中断:有人按了门铃,电话铃响了,家里的闹钟响了,正在烧的水开了……诸如此类的事件,它们有一个共同的特点:打断了正常执行的程序。

在单片机系统中,我们把产生中断的请求源称为中断源,它是指引起中断发生的事件、设备、部件。中断源可以是外部设备,如打印机、键盘、鼠标等,它们与计算机进行输入/输出数据交换时需向CPU发出中断请求。当计算机用于实时控制时,被控的对象如电压、电流、湿度、压力流量和流速等超越上限或下限,开关或继电器的闭合、断开等都可以作为中断源来产生中断请求;当计算机发生掉电、计算溢出、除零等故障时,这些故障源也可用作中断源。

2.中断的嵌套与优先级处理

假设存在这样一种现象:我们正在看书,电话铃响了,同时又有人按了门铃,我们该先做那样呢?如果你正在等一个很重要的电话,你一般不会去理会门铃的。而反之,你正在等一个重要的客人,则可能就不会去理会电话了。这个时候,我们处理外部事情就有一个先后顺序,这个先后顺序就是中断的优先级。如果这个时候,外部没有这两种事情发生(即不等电话,也不是等人上门),我们就会按照正常的习惯去处理事情,这里存在一个优先级的问题。

优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断正在处理,又有一个中断发生的情况。比如你正接电话,有人按门铃的情况;或你正开门与人交谈,又有电话响了的情况,这就是中断的嵌套。如果此时的中断是允许嵌套的,则计算机正在执行一个中断服务程序时,又发生了另一个优先级比它高的中断源请求,此时计算机就会停止执行原来的中断服务子程序,转而去处理优先级更高的中断请求,待处理完后再转回来执行原来的低级中断服务程序,这个过程就是计算机中的中断嵌套。

一般计算机系统允许有多个中断源,当几个中断源同时向CPU发出中断请求,希望占用系统资源,而计算机只能响应若干中断源中的一个中断请求时,最终究竟响应哪一个中断请求源?一般情况下CPU会优先处理最紧急的中断请求,计算机必须根据中断源的轻重缓急进行排队,这就必须给每个中断源的中断请求赋予一个中断优先级,以反映每个中断源的中断请求响应的优先程度。单片机系统通常有多个中断源,经常会出现多个中断源同时申请中断的情况。但是CPU在每一个时刻,只能执行一个中断,此时,CPU将会根据中断源的重要程度执行中断。程序开发人员在程序设计的过程中需要根据任务的重要顺序安排一个中断响应的优先顺序,中断源的这种优先顺序常被称为中断优先级别,通常最重要的任务或者事件的级别最高,然后依次降级排列。

当多个中断源同时申请中断时,CPU会首先响应优先级最高的中断请求,在优先级最高的中断处理完成之后,再响应级别较低的中断。当CPU正在处理某个中断时,若出现了更高级的新的中断请求,CPU应能停止正在进行的中断处理,转去处理更高优先级的中断。这种挂起正在处理的中断而转去响应更高级别的中断称中断嵌套。如果新的中断请求是相同级别的或更低级别的,则CPU不予理睬,直到正在执行的中断服务程序运行完毕后才去响应新的中断请求。中断嵌套如图4-1所示。

图4-1 中断嵌套示意图

3.中断的响应过程

当有外部事件产生,打断了正常的程序,就会进入中断。我们继续看我们生活中的例子。我们在看书的时候产生中断,在进入中断之前我们通常会记住现在正在看书的页码,或者我们会把我们看到的页折叠起来,或拿一个书签放在相应位置,然后去处理不同的事情(因为处理完了,我们还要回来继续看书)。如果这个时候电话铃响了我们要到放电话的地方去,如果门铃响我们要到门那边去。这表明,不同的中断,我们要在不同的地点处理,而这个地点通常是固定的。计算机中也是采用的这种方法,每个中断产生后都到一个固定的地方去找处理这个中断的程序。如图4-1所示,假设当前中断服务程序执行的地址为K,那么中断执行前首先要保存下面将执行的指令的地址,这里的地址为K+1(注意,这里始终是下一条指令的地址,也就是我们要记住的地址是现在已经看过页的下面页),以便处理完中断后回到原来的地方继续往下执行程序。

具体地说,中断响应可以分为以下几个步骤进行。

(1)保护断点。保存下一条将要执行的指令的地址,就是把这个地址送入堆栈。

(2)寻找中断入口。中断入口地址又称为中断矢量。根据8个不同的中断源所产生的中断,查找相应中断服务程序的入口地址,这个时候计算机的程序计数器PC就指向中断服务程序所在的地址。以上工作是由计算机自动完成的,与程序的设计无关。在这8个入口地址处存放有中断处理程序(这是程序编写时放在那儿的,如果没把中断程序放在那儿,就错了,中断程序就不能被执行到)。

(3)执行中断处理程序。这个时候程序计数器PC就逐条执行中断服务程序,直到程序执行完成为止。

(4)中断返回。执行完中断指令后,需要把原来保存在堆栈里面的地址返回来,这个时候程序计数器PC就重新指向原来的主程序,继续执行原来的程序。

正是由于中断机制,单片机才能有条不紊地“同时”完成多个任务,中断机制实质上帮助我们提高并发“处理”的能力。它也能给计算机系统带来同样的好处:如在键盘按下的时候会得到一个中断信号,CPU就不必死守着等待键盘输入了;如果硬盘读写完成后发送一个中断信号,CPU就可以集中进行任务的调用了——无论是我们键盘输入的速度,还是读写存储介质的磁头,跟CPU的处理速度相比,都太慢了。没有中断机制,我们只能按照正常的顺序完成我们的任务,就不会具备并行处理能力。

跟人相似,CPU也一样要面对纷繁复杂的局面——现实中的意外是无处不在的——有可能是用户等得不耐烦,猛敲键盘;有可能是运算中碰到了0作除数;还有可能网卡突然接收到了一个新的数据包。这些都需要CPU具体情况具体分析,要么马上处理,要么暂缓响应,要么置之不理。无论如何应对,都需要CPU暂停“手头”的工作,拿出一种对策,只有在响应之后,方能回头完成先前的使命,“把一本书彻底读完!”

4.1.3 AT89S52单片机中断系统

AT89S52单片机的中断系统共有8个中断源,6个中断矢量,两级中断优先级,可实现两级中断服务程序嵌套,通过软件来屏蔽或允许相应的中断请求。每一个中断源可以编程为高优先级中断或低优先级中断,允许或禁止向CPU申请中断。中断系统的特殊功能寄存器有中断允许寄存器IE、中断优先级寄存器IP等。

图4-2为AT89S52单片机的中断系统结构示意图。AT89S52有两个外部中断源INT0、INT1,每一个中断源对应一个中断矢量;串口通信有接收和发送两个中断源,经过一个或门,公用同一个中断矢量;定时器/计数器0、定时器/计数器1的溢出中断源对应两个中断矢量;定时/计数器2有计数溢出和捕获两种中断源,经或门共用一个中断矢量。

图4-2 中断系统结构示意图

(1)来自P3.2引脚上的外部中断请求(外部中断0),低电平或下降沿(从高到低)有效,通过设置IT0的值可将外部中断0设置为低电平触发或下降沿触发,IT0=0时,为电平触发方式,当引脚上出现低电平时就向CPU申请中断;IT0=1时,为跳变触发方式,当引脚上出现负跳变时,置位TCON.1的IE0中断请求标志位,向CPU申请中断。CPU在每个机器周期的S5P2状态采样IE0标志位,当条件满足,则响应中断请求。

(2)来自P3.3引脚上的外部中断请求(外部中断1),低电平或下降沿有效。其功能与操作同

(3)T0片内定时器/计数器0溢出(TF0)中断请求。定时/计数器0无论内部定时或对外部事件T0计数,当计数器(TH0、TL0)计数溢出,置位TCON.5的TF0中断请求标志位。CPU在每个机器周期的S5P2状态时采样TF0标志位,当条件满足时CPU响应中断请求,转向对应的中断矢量,执行该中断服务程序,并由硬件自动将TF0标志位清0。

(4)T1片内定时器/计数器1溢出(TF1)中断请求。其功能和操作类似定时/计数器0。其中断请求标志位为TCON.7的TF1。

(5)T2片内定时器/计数器2溢出中断请求。定时器2可以被寄存器T2CON中的TF2 和EXF2的或逻辑触发。程序进入中断服务后,这些标志位都可以由硬件清0。定时器2有两种不同的工作方式。

定时/计数器方式。当定时/计数器方式的计数器(TH2、TL2)计数满后溢出,置位中断请求标志位(T2CON.7)TF2,向CPU请求中断处理。

“捕获”方式。当外部输入端口T2EX发生从1→0下降沿时,亦将置位T2CON.6的中断请求标志位EXF2,向CPU请求中断处理。

(6)串行口中断。片内串行口完成一帧发送或接收,置位中断请求源TI或RI。当完成一串行帧的接收/发送时分别置位串行通信控制寄存器SCON中的RI/TI中断请求标志位,当条件满足时CPU响应中断请求。

AT89S52单片机还有中断控制寄存器IE和中断优先级控制寄存器IP。IE用于确定各中断是允许还是禁止,IP用于定义各中断源的中断优先级,用户通过设置其状态来管理中断系统。

4.2 中断控制

4.2.1 中断允许寄存器IE

计算机中的中断一般有两类:非屏蔽中断和可屏蔽中断。对于非屏蔽中断,用户不能屏蔽,一旦有中断申请,CPU必须响应和执行,具有较高的中断优先级别。对于可屏蔽中断,用户可以通过软件方法来控制是否允许中断执行。CPU对中断源的开放或中断屏蔽的控制是通过中断允许寄存器IE设置的,IE既可按字节地址寻址(其字节地址为A8H),又可按位寻址。AT89S52单片机中的6个中断矢量都是可屏蔽中断,通过对IE的某些位置位和清0,允许或禁止某个中断,当对IE的EA位清0时,屏蔽全部中断源。IE中的各标志位功能如表4-1所示。

表4-1 IE中的中断请求标志位

IE中的各标志位定义如下:

EA(IE.7):CPU中断允许标志。EA=0,CPU禁止所有中断,即CPU屏蔽所有的中断请求;EA=1,CPU开放中断。但每个中断源的中断请求是允许还是被禁止,还需由各自的允许位确定(见D5~D0位说明)。

ET2(IE.5):定时器/计数器2溢出或捕获中断响应控制位。若ET2=0,则禁止中断响应;ET2=1为允许中断响应。

ES(IE.4):串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

ET1(IE.3):定时器/计数器1(T1)的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

EX1(IE.2):外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。

ET0(IE.1):定时器/计数器0(T0)的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX0(IE.0):外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

中断允许寄存器中各相应位的状态,可根据要求用指令置位或清0,从而实现该中断源允许中断或禁止中断。IE复位值是00H,即总中断开关关闭,禁止所有中断。单片机在响应中断后不能自动关中断,若想禁止中断嵌套,必须用软件关闭。软件关闭可以用字节寻址也可位寻址。

例:开放外部中断0。

字节操作:

  MOV  IE,#81H

或 MOV  0A8H,#81H

位操作:

  SETB EA

  SETB EX0

4.2.2 AT89S52的优先级寄存器IP

AT89S52单片机的中断系统提供两个中断优先级,对于每一个中断请求源都可以编程为高优先级中断源或低优先级中断源,以便实现两级中断嵌套。中断优先级是由片内的中断优先级寄存器IP(特殊功能寄存器)控制的。IP寄存器字节地址位B8H,可以位寻址,IP寄存器的格式如表4-2所示。

表4-2 IP寄存器中优先级标志

中断优先级寄存器IP各标志位的定义如下:

PT2(IP.5):定时器/计数器2的中断优先级设置位。PT2=1,定时器/计数器2的中断定义为高优先级中断源;PT2=0,定时器/计数器2的中断定义为低优先级中断源。

PS(IP.4):串行口中断优先级控制位。PS=1,串行口定义为高优先级中断源;PS=0,串行口定义为低优先级中断源。

PT1(IP.3):T1中断优先级控制位。PT1=1,定时器/计数器1定义为高优先级中断源;PT1=0,定时器/计数器1定义为低优先级中断源。

PX1(IP.2):外部中断1中断优先级控制位。PX1=1,外部中断1定义为高优先级中断源;PX1=0,外部中断1定义为低优先级中断源。

PT0(IP.1):定时器/计数器0(T0)中断优先级控制位,功能同PT1。

PX0(IP.0):外部中断0中断优先级控制位,功能同PX1。

中断优先级控制寄存器IP中的各个控制位都可由编程来置位或复位(用位操作指令或字节操作指令),单片机复位后IP中各位均为0,各个中断源均为低优先级中断源。AT89S52中断系统具有两级优先级(由IP寄存器把各个中断源的优先级分为高优先级和低优先级),它们遵循下列两条基本规则:

(1)低优先级中断源可被高优先级中断源所中断,而高优先级中断源不能被任何中断源所中断;

(2)一种中断源(不管是高优先级或低优先级)一旦得到响应,与它同级的中断源不能再中断它。

为了实现上述两条规则,中断系统内部包含两个不可寻址的优先级状态触发器。其中一个用来指示某个高优先级的中断源正在得到服务,并阻止所有其他中断的响应;另一个触发器则指出某低优先级的中断源正在得到服务,所有同级的中断都被阻止,但不阻止高优先级中断源。当同时收到几个同一优先级的中断时,响应哪一个中断源取决于内部查询顺序。其优先级排列如表4-3所示。

表4-3 中断优先顺序

例:设置中断优先级寄存器IP的值,使T0、T1、T2的优先级别最高,其他中断级别低。

字节操作:

  MOV   IP,#2AH

或 MOV   0B8H,#2AH

位操作:

  SETB  PT0

  SETB  PT1

  SETB  PT2

  CLR   PX0

  CLR   PX1

  CLR   PS

4.3 AT89S52单片机中断过程

AT89S52单片机中断分为四个阶段:中断采样、中断查询、中断响应、中断返回。执行中断时,必须满足以下三个条件:

(1)中断源有中断申请;

(2)此中断源的中断允许位为1;

(3)CPU开中断,即总开关EA=1。

CPU采样中断标志后,在下一个机器周期对采样到的中断进行查询。如果在前一个机器周期有中断标志,将会按照中断的优先级别进行中断,程序计数器PC转入相应的中断服务程序执行中断。在满足下列条件时才响应中断:

(1)无同级或更高级中断正在服务;

(2)当前指令周期已经结束;

(3)若现行指令为RETI或访问IE、IP指令时,该指令以及紧接着的下一条指令也执行完成。

1.中断采样

中断采样针对外部中断请求信号而言,在 S5P2对相应引脚采样,根据其电平状态高/低,判断相应的中断请求。

IT0/1=0 ,设定电平触发方式,低电平有效。外部中断请求引脚为低电平,表示有中断请求。引脚的低电平状态应该保持两个机器周期。

IT0/1=1 ,设定脉冲触发方式,负脉冲有效。相邻机器周期采样的引脚的状态为先高后低,表明外部中断引脚有中断请求,高低电平均应持续一个机器周期。

2.中断查询

在每个机器周期的S5P2后,由硬件自动地去查询相应的中断标志位,先查询高级中断,再查询低级中断,同级中断按内部中断优先级顺序查询。如果查询到有中断标志位为1,则表明有中断请求发生,接着从相邻的下一个机器周期的S1状态开始进行中断响应。

由于中断请求是随机发生的,CPU无法预先得知,因此中断查询要在指令执行的每个机器周期中不停地重复执行。

3.中断响应

CPU响应中断时,先置位相应的优先级激活触发器,封锁同级和低级的中断。然后程序根据中断源的类别,在硬件的控制下转向相应的中断入口单元,执行中断服务程序。

硬件调用中断服务程序时,把程序计数器PC的内容压入堆栈(但不能自动保存程序状态字PSW的内容),硬件自动插入一条AJMP指令,程序计数器跳转至中断服务程序的入口地址。AT89S52单片机中6个中断源的入口地址是固定的,不能改动。中断服务程序的入口地址如表4-4所示。

表4-4 中断服务程序入口地址

在上表中,各中断入口地址占用8个字节,一般情况下不能存放一个完整的中断服务程序。在程序设计过程中,通常安排一条无条件转移指令,使得程序转向所存放的存储器中的地址。中断响应的过程如图4-3所示。

图4-3 中断响应过程

上图中,外部中断0 的入口地址为0003H,外部中断0的中断服务子程序的程序结构如下:

ORG  0000H

AJMP  MAIN

ORG  0003H    ;外部中断0的溢出中断入口地址

AJMP  INT0     ;跳转至中断服务程序的存放地址

中断服务子程序一般包括两部分内容,一是保护和恢复现场,二是处理中断源的请求。中断服务程序中要使用与主程序有关的寄存器,CPU在中断之前要保护这些寄存器的内容,即要保护现场,而在中断返回时又要使它们恢复原值,即恢复现场。

在中断服务程序开始,就需要保护现场,由PUSH入栈;在中断服务程序最后,由POP出栈。入栈、出栈的顺序相反,数目相同,PUSH和POP必须成对出现。下面是一个在中断服务程序中保护现场和恢复现场的实例。设在执行中断服务程序时需要保护ACC、DPTR、PSW内容,其程序如下:

INTT0:   PUSH  ACC

      PUSH  DPH

      PUSH  DPL

      PUSH  PSW

      中断源服务

      POP   PSW

      POP   DPL

      POP   DPH

      POP   ACC

      RETI

4.中断返回

中断服务程序的最后一条指令必须是中断返回指令RETI。CPU执行完这条指令后,把响应中断时所置位的优先级激活触发器清0,然后从堆栈中弹出两个字节内容(断点地址)装入程序计数器PC中,CPU就从原来被中断处重新执行被中断的程序。

5.中断的响应时间

中断响应时间是指从查询中断请求标志位开始到转向中断矢量地址所需的机器周期数。响应中断的时间依中断请求发生的情况不同有长有短,因此,AT89S52单片机发生中断的时间根据中断类型和中断执行的方式不同而不同。

外部中断的电平在每个机器周期的S5P2时被采样并锁存到IE0和IE1中,这个置入到IE0和IE1的状态在下一个机器周期才被查询电路查询。如果产生了一个中断请求,而且满足响应的条件,CPU响应中断,查询中断请求标志位,同时这个周期恰好是指令的最后一个周期,则在这个机器周期结束后,中断请求被CPU 响应,产生一条硬件自动生成的长调用指令LCALL,使CPU转到相应的服务程序入口。这条指令需两个机器周期,故最少需3个机器周期。

若在中断查询时正好开始执行RET、RETI或访问IE、IP,则需当前指令完成后再继续执行一条指令,才进行中断响应。RET、RETI需要2个机器周期,LCALL需要2个机器周期,MUL、DIV指令需要4个机器周期,因此完成相应操作共需要8个机器周期。

因此,在系统中只有一个中断源的情况下,响应时间总是在3个机器周期到8个机器周期之间。

4.4 中断的撤除

CPU响应某中断请求后,在中断返回前,应该撤除该中断请求,否则会引起另一次中断而发生错误。根据中断方式的不同,中断的撤除可以分为定时器/计数器中断请求的撤除、外部中断请求的撤除、串口中断请求的撤除。

4.4.1 定时器/计数器T0/T1中断的撤除

定时器/计数器T0/T1的外部中断请求,在CPU响应中断后,由内部硬件自动清除中断标志TF0和TF1,无需采取其他措施。详见第5章相关内容。

4.4.2 外部中断请求的撤除

对于跳变触发方式的外部中断,在CPU相应中断后,由内部硬件自动清除中断标志IE0和IE1。

对于电平触发方式的外部中断请求的撤除,情况则不同,仅仅依靠清除中断标志并不能彻底解决中断请求的撤除问题。在电平触发方式下,外部中断标志IE0、IE1靠CPU检测上的低电平置位。CPU响应中断后,中断标志位IE0、IE1自动置0,此时如果外部中断没有及时撤除的低电平,那么就会不断申请中断,造成错误。因此,电平触发方式的外部中断请求的撤除必须使上的低电平在中断响应后把中断请求输入端从低电平强制改为高电平。撤除中断请求的电路方案如图4-4所示。

图4-4 电平方式外部中断请求的撤销电路

上图中,用D触发器锁存外部中断请求低电平,通过触发器输出端Q送INT0,所以增加的D触发器对外部中断请求没有影响。中断响应后,为了撤销低电平引起的中断请求,可利用D触发器的直接置位端SD来实现。AT89S52的一根I/O口线P1.0控制SD端。只要在SD端输入一个负脉冲(P1.0初始状态为1),即可使D触发器置1,从而撤销了低电平的中断请求信号,所需负脉冲可以通过在中断服务程序中增加以下两条指令得到:

SETB P1.0  ;P1.0置1

CLR P1.0  ;P1.0置0

所以,电平方式下外部中断请求信号的撤除,要通过硬件和软件的配合来解决。

4.4.3 串行口中断请求的撤除

AT89S52进入串行口中断服务程序后常需要对它们进行检测,以测定串行口发生了接收中断还是发送中断。TI和RI是串行口中断的标志位(见SCON),中断系统不能自动将它们撤除,为防止CPU再次响应这类中断,只能用软件的方法,在中断服务程序中用如下指令将它们撤除,详见第6章内容。

CLR  TI       ;撤除发送中断

CLR  RI       ;撤除接收中断若采用字节型指令,则可使用如下指令:

ANL  SCON,#0FCH   ;撤除发送和接收中断

4.5 多个外部中断源系统设计

在AT89S52单片机中,只有两个外部中断请求输入端INT0和INT1。而实际应用系统中往往会出现两个以上的外部中断源,因此必须对外部中断源进行扩展。其方法主要有:用定时器/计数器T0、T1扩展;采用中断和查询相结合的方法扩展;用串行口的中断扩展;用优先权编码器扩展等方法。这里重点介绍前两种方法。

4.5.1 用定时器/计数器作为中断源

AT89S52单片机的3个定时器/计数器T0、T1、T2(具体内容将在下一章介绍),如在T0、T1在某些应用中不被使用,则它们的中断可作为外部中断请求使用。此时可把他们作为计数方式,计数初值一般设定为满量程(即定时器的最大计数值),则它们的计数输入端P3.4或P3.5引脚上发生负跳变时,T0或T1计数器就加l,产生溢出中断。利用此特性,可以把P3.4、P3.5作为外部中断请求输入线,而计数器的溢出中断作为外部中断请求标志。

设T0为方式2(自动装入常数)外部计数方式,时间常数为0FFH,允许中断,CPU开放中断。其初始化程序为:

ORG  0000H     ;跳到初始化程序

MOV  TMOD,#06H  ;T0为方式2,计数器方式工作

MOV  TL0,#0FFH  ;计数初值为满量程

MOV  TH0,#0FFH  ;计数初值为满量程

SETB TR0      ;置TR0为1,启动T0

MOV  IE,#82H   ;置中断允许,IE中的EA位为1,ET0位为1

当接在P3.4引脚上的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0被置1,向CPU发出中断请求。同时TH0的内容自动送入TL0,使TL0恢复初始值0FFH。这样,P3.4引脚上的每次负跳变都将TF0置位1,向CPU发出中断请求,CPU响应中断请求时,程序计数器PC转到000BH执行外部中断服务程序,此时P3.4相当于边沿触发的外中断源输入线。同理,也可以把P3.5引脚作类似的处理。

4.5.2 采用中断与查询相结合的方法

中断与查询相结合的方法是把系统中多个外部中断源按它们的重要程度进行排序,把其中最高级别的中断源接到MCS-51的一个外部中断源输入端(例如接到脚),其余的中断源用线“或”的方法连接到另一个外部中断输入端(例如接到),并同时接到一个I/O口,如图4-5所示接到P1口。中断请求由硬件电路产生,而中断源的识别由程序查询来处理,查询顺序由中断源的优先级决定。图4-5为五个外部中断源的连接电路,其中设备1~4经OC门与连接,并连接到P1.0~P1.3,均采用电平触发方式。设备0为最高级中断源,单独作为外部中断0的输入信号。这种办法扩展比较简单,但是当外部中断扩展的数量较多时,查询的时间比较长,导致程序的执行效率较低。

图4-5 多个外部中断源系统设计

外部中断1的中断服务程序如下:

4.6 中断服务程序应用设计

中断服务程序是一种为中断源的特定事态要求服务的独立程序段,以中断返回指令RETI结束。在程序存储器中设置有6个固定的单元作为中断矢量,即是0003H、000BH、0013H、00lBH、0023H及002BH单元,中断过程如图4-6所示。

图4-6 中断处理过程示意图

中断响应最突出的特点是它的随机性。下面针对中断服务程序编写中的几个问题进行说明。

4.6.1 保护断点和现场、恢复断点和现场

中断服务程序和子程序一样,在调用和返回时,也有一个保护断点和现场、恢复断点和现场的问题。

在中断响应过程中,断点的保护主要由硬件电路自动实现。它将断点压入堆栈,再将中断服务程序的入口地址送入程序计数器PC,使程序转向中断服务程序,即为中断源的请求服务。

所谓现场是指中断发生时单片机中存储单元、寄存器、特殊功能寄存器中的数据或标志位等。在AT89S52单片机中,现场一般包括累加器 A、工作寄存器 R0~R7以及程序状态字PSW等。现场保护一定要位于中断服务程序的前面,保护的方法可以有以下几种:

(1)通过堆栈操作指令PUSH direct;

(2)通过工作寄存器区的切换;

(3)通过单片机内部存储器单元暂存。

在结束中断服务程序返回断点处之前要恢复现场,与保护现场的方法相对应,恢复断点也是由硬件电路自动实现的。

4.6.2 对中断的控制

AT89S52单片机具有多级中断功能(即多重中断嵌套),为了不至于在保护现场或恢复现场时,由于CPU响应其他中断请求,而使现场破坏。一般规定,在保护和恢复现场时,CPU不响应外界的中断请求,即关中断。因此,在编写程序时,应在保护现场和恢复现场之前,关闭CPU中断;在保护现场和恢复现场之后,再根据需要使CPU开中断。

AT89S52单片机中,共有6个中断源,由相关的特殊功能寄存器TCON、T2CON、SCON、IE和IP进行管理和控制,在使用中断前,首先必须对使用到的特殊功能寄存器进行初始化,用软件对以下5个内容进行设置:

(1)中断服务程序入口地址的设定;

(2)某一中断源中断请求的允许与禁止;

(3)对于外部中断请求,还需进行触发方式的设定;

(4)各中断源优先级别的设定;

(5)CPU开中断与关中断。

中断程序一般包含中断控制程序和中断服务程序两部分。中断控制程序即中断初始化程序,一般不独立编写,而是包含在主程序中,根据上述的5点编写几条指令实现。

例1:试编写设置外部中断INT0和串行接口中断为高优先级,外部中断INT1为低优先级,屏蔽T0 和T1中断请求的初始化程序段。

解:根据题目要求,只要能将中断请求优先级寄存器IP的第0、4位置l,其余位置0,将中断请求允许寄存器的第0、2、4、7位置l,其余位置0就可以了。编程如下:

   ORG  0000H

   SJMP MAIN

   ORG  0003H

   LJMP INTR         ;设外部中断中断矢量

   ORG  0013H

   LJMP INT1INT       ;设外部中断中断矢量

   ORG  0023H

   LJMP SIOINT        ;设串行口中断矢量

   ORG  0030H

MAIN:…

   MOV IP,#00010001B    ;外部中断INT0和串行口中断为高优先级

   MOV IE,#10010101B    ;允许INT0、INT1、串行口中断,开CPU中断

例2:已知(B)=01H,要求采用边沿触发,低优先级,通过外部中断1,在中断服务中将B寄存器里的内容循环左移一位。

解:此例的实际意义是在INT1引脚接一个按钮开关到地,每按一下按钮就申请一次中断,中断服务依次点亮八盏灯中的一盏。如图4-7所示,P1.0~P1.7分别接LED0~LED7,P3.3(外部中断1INT1)引脚接一个按钮开关到地,每按一下按钮就申请一次中断,编写程序,依次点亮八盏灯中的一盏。

图4-7 单片机LED控制图

主程序如下:

【本章小结】

单片机中断系统具有广泛的应用价值。单片机的中断系统是一个难点,应该重点掌握和理解单片机的中断控制和中断过程,并可以从应用角度编写简单的单片机中断程序。

4.7 习题

1. 什么是中断?

2. MCS-51单片机的两个外部中断源有哪两种触发方式?不同触发方式下的中断请求标志是如何清0的?当采用电平触发时,对外部中断信号有什么要求?

3. CPU响应中断的条件是什么?响应中断后,CPU要进行哪些操作?

4. 某系统有3个外部中断源1、2、3,当某一中断源变为低电平时,便要求CPU进行处理,它们的优先处理次序由高到低依次为2号、3号、1号,中断处理程序的入口地址分别为2000H、2100H、2200H。试编写主程序及中断服务程序(转至相应的中断处理程序的入口即可)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈