单片机速通教程
单片机中断原理及相关设置

🏠 首页 《无线电》杂志 2001年 🔗 第5期 🔗 第27页 分类:电脑与单片机 🔗 滕世进 🔗, 姚启红 🔗

为了帮助读者对本期教程的理解,在讲述“用AT89C51实现自设定时间控制”一文之前,先讲一下单片机的中断原理及其分类,以及本教程所述系统中用到的中断方式的设置。

一、中断的定义

单片机的中断是为处理异常情况和特殊情况而设的。比如系统睡眠状态唤醒、掉电后的重要信息转存等。当系统运行当前程序时,有突发事件或其他中断条件发生,系统即中断当前操作,转去处理突发事件或其他异常或特殊事件的任务。而当处理完这些任务后,又重新返回当前程序继续执行,这种运行方式就叫中断运行方式。这种中断可以多级嵌套,按照任务的轻重缓急,先后有序、有条不紊地运行,从而保证控制系统的可靠性。51系列单片机的中断有好多种,定时中断是其中的一种,当程序将中断打开后,单片机的计时器即开始独立工作,而当前的程序可继续运行。当计时时间一到,单片机在中断控制逻辑的控制之下,立即进入中断程序,去处理中断任务。当利用定时器/计数器0实现中断且当中断发生时,程序控制器会立刻跳转至000BH处去执行程序。我们把000BH单元叫做定时器/计数器0的中断服务程序入口处,中断程序从这里开始安放。以前我们讲过从000BH至003AH这48个存储单元有特殊用途,指的就是这种作用。这48个单元分成6个区,每区8个字节,是专门用来安放中断程序的。一般的中断程序8个字节是不够的,因此,在这个区一般安置转移指令,来引导系统进入中断程序,而中断程序则在其他空间安放。

计算机的中断思想,源于人们对客观事物内在规律的认识。在人的思维和行为之中,中断的运行方式是无处不在的。战争年代的兵工厂,它的主要工作是制造武器弹药。如果敌机来袭,工人们必须暂时放下手中的工作,拿起武器去退敌,这便是弹药生产工序的一种中断。工人们在拿起武器参与战斗之前,应该拔掉电源,记住当前工序的进程。战斗结束返回工厂后,要与战前工序相衔接,要接通电源,恢复生产线的运转。同样的,计算机发生中断后,也要将被中断程序的断点以及运行过程中的状态等关键数据保存起来,这称之为保护现场。等进入中断程序,完成中断服务后,将保存的关键数据再提取出来,送回原来的位置,然后返回被中断的程序,使被中断的程序按原样连接起来,这称之为恢复现场。事实上,中断过程中是可能再发生中断的,如上述例子中,假设在战斗过程中,某战斗小组的弹药箱附近突然起火,如不扑救,弹药就会爆炸,这样,该小组必须中断战斗,进行救火。这种中断再次被中断的情形,称之为中断嵌套。中断嵌套是有章可循的。首先将各种中断分成不同的优先级,按照优先级高低的次序,决定中断先后顺序。也就是说,当几种中断同时发生,计算机首先响应高优先级的中断,而在中断嵌套的处理中,低优先级的中断可以被高优先级的中断所中断,反之则不然。

二、中断控制寄存器及相关设置

为了使CPU具备中断功能,其内部设计有相应的硬件资源,其构成主要是各种控制寄存器,而这些控制寄存器中的内容大部分又是可以用程序来修改的,这就能使系统按照程序的设计而具备灵活的中断功能。


1.允许中断寄存器
允许中断寄存器可实现总中断允许和对各种中断进行分别允许控制功能,该寄存器记作IE,其地址是A8H。IE寄存器各位定义如图1所示。其中最高位EA为总允许位。若EA=0,禁止一切中断;第2位ET0为定时器/计数器0中断允许位。本期教程中的时间控制系统就是采用定时器/计数器0来实现中断服务的,所以,第2位ET0要设置为“1”。如指令 MOV IE,#82H,其执行结果就是使送进IE中的数为“1000 0010B”,这样,IE中的EA位和ET0位为“1”,总中断被允许,定时器/计数器0的中断被允许,于是系统就可以用定时器/计数器0来实现定时中断服务了。

图1
图1 🔍原图 (425×69)

2.优先级控制寄存器
前面讲过,计算机的中断有多种,也就是说有多个中断源。AT89C51就设有外部中断0、定时器/计数器0溢出、外部中断1、定时器/计数器1溢出和串行口等5个中断源。这些中断源的优先级由优先级控制寄存器IP决定。IP寄存器的地址是B8H,各位定义见图2。其中的哪一位为“1”,相应的中断就被设定为高优先级。本期教程的“自设定时间控制系统”只采用了一种中断,就是利用定时器/计数器0,实现计时中断。因此,只将IP寄存器的第2 位PT0置“1”即可。如MOV IP,#02H,使送向IP的立即数为“0000 0010B”,结果只有PT0位为“1”,其他位皆为“0”,因而定时器/计数器0的中断为高优先级,其他中断为低优先级。由此,我们了解了中断允许的设置和定时器/计数器0的选择及优先级的设定。下面谈一下对定时器/计数器0工作状态、方式的选择以及定时开启和关闭等控制的设定。控制定时器/计数器0工作的寄存器有两个,一个是模式选择寄存器TMOD,一个是控制寄存器TCON。

图2
图2 🔍原图 (425×66)

3.模式选择寄存器
模式选择寄存器各位定义如图3所示。其中高四位控制定时器/计数器1的工作模式,低四位控制定时器/计数器0的工作模式。本案例教程采用定时器/计数器0进行定时中断服务,所以,只对TMOD寄存器的低四位进行设置。就低四位而言,其M0和M1两位可定义模式(00)0、模式(01)1、模式(10)2、模式(11)3等4种工作模式;C/T位为计数、定时方式选择位。此位为“1”,设置为计数方式,此位为“0”,设置为定时方式;GATE为选通门控制位,此位为“0”时,定时器/计数器0被选通。由于本期教程所述系统选用定时器/计数器0以定时方式工作于模式2状态下,所以,将TMOD寄存器的第2位M1置成“1”,其他位皆置成0即可。如 MOV TMOD,#02H,即能完成上述设置。

图3
图3 🔍原图 (425×61)

4.定时器/计数器控制寄存器
定时器/计数器控制寄存器TCON是完成中断触发方式的确定和定时、计数开启与关闭等控制的寄存器,各位定义见图4,其中第5位TR0是控制定时器/计数器0的开启与关闭的。此位为“1”,定时器/计数器0定时或计数开始,此位为“0”,定时器/计数器0定时或计数停止。此位必须用软件来修改。指令SETB TR0即能开启定时器/计数器0,指令CLR TR0即能关闭定时器/计数器0。TCON的第6位TF0为定时器/计数器0的计数或定时溢出标志位,溢出时此位被置位,定时器/计数器0向CPU申请中断。进入中断服务后,此位被硬件自动清除。因此,TF0不须用软件来修改,编程时不用考虑。

图4
图4 🔍原图 (425×63)

前文讲,我们选择定时器/计数器0工作于模式2状态之下,下面讲一下模式2的工作过程。在此模式下,16位定时器/计数器0被分成独立的高字节计数器TH0和低字节计数器TL0,并且又将它们配置成一个可以自动重装载的8位计数器。结构示意图见图5。选择模式2工作,计数是在TL0中完成的。当TL0计数产生溢出(其中的值由#FFH再进位至#00H)时,不但能向CPU提供中断标志信号,而且还能将TH0中的数据重新装载到TL0中,而TH0中的数据不变。这样,TL0就可以在已装载的数据的基础上进行计数,直至溢出产生中断标志信号,再重复上述过程。定时器/计数器0的定时是通过累计机器周期数来实现的,即每增加一个机器周期,TL0中的数值都要加1,一旦溢出即发出中断信号。本期教程所述系统采用6MHz晶振,每个机器周期为2μs,如果TL0自#00H开始计数,至#FFH时,计时时间为512μs。所以,每次发生中断的最大时间间隔是512μs。定时器/计数器0工作在模式2下,为我们灵活地改变中断定时时间提供了手段。例如:我们在TH0中先装入重装载值#06H,那么重装载后TL0便自#06H开始,按每个机器周期增1计数,溢出时间便为500μs。若执行指令 MOV TH0,#18H,使TH0中的装载值为#18H,则TL0的定时时间为464μs(即(256-24)×2μs)。

图5
图5 🔍原图 (425×215)

(滕世进 姚启红)