维普资讯 http://www.cqvip.com 单片机实用技术讲座(2) 第七讲 单片机的中断系统及其应用 ・严天峰・ Es:串行中断允许位。ES=1允许串口中断。ES=0时禁止。 ET1:定时器/计数器允许中断位。ET1=1。允许T1中断; ET1=0,中断禁止。 单片机中断系统的目的是使CPU更好地对外部或内部突发 事件做出及时响应。中断响应时CPU将暂停正在执行的主程序 而转向中断子程序,处理完毕后再回到原断点处继续执行主程 序。这个响应突发事件的过程就是中断。下面我们就具体介绍一 下中断的概念和基本用法 EX1:外部中断1允许中断位。EX1=1允许外部中断1; EX1=0时禁止。 89C51单片机的中断结构 在一个单片机应用系统中,引起中断的源头称为中断源。典 型的51系列单片机有5(或6个)中断源,中断源的人口地址为 A=8n+3,其中n=0~4(或5)。典型的89C51单片机有5个中 断源。表1为89C51单片机的中断类型和人口地址。中断的级别 ET0:定时器/计数器1、0允许中断位。作用同ET1。 EX0:外部中断0中断允许位,作用同EX1。 ET2:定时器/计数器T2中断允许位。(89C52类型单片机才 有)。 89C51单片机的中断优先级有二层,每一个中断源都可编程 为高优先级或低优先级,它由特殊功能寄存器IP所对应的位决 定。高优先级的中断源可在低优先级的中断服务程序中再次执 行中断。当系统复位时,IP寄存器的内容为零。如果CPU同时接 有先后之分,CPU可以优先选择最需要紧急处理的中断请求,处 表1 中断名称 中断原因 入口地址 n 外部中断0 P3.2引脚边沿触发或低电平触发 0003H O 定时器0中断 TO计数溢出 000BH 1 外部中断1 P3 3引脚边沿触发或低电平触发 000BH 2 定时器1中断 T1计数溢出 OO1BH 3 串行口中断 串行发送或接收标志置位 0023H 4 理完毕后 再响应级 收到二个不同优先级的中断请求时,将优先响应高优先级的中 断。IP寄存器的各位内容如下表: X【X f Pr2 I PS【PT1}PX1盯O PX0 别较低的 中断请 求,这种 中断响应 的先后次序,称为中断优先级。 对于89C52单片机,还有一个定时器2中断,人口地址为 A=8n(n=5)+3=43即002BH。中断方式的选择及标志由中断 PT2:定时器1、2中断优先级。PT2=1时为高优先级。 PS:串行口中断优先级,PS=1时为高优先级。 PT1:定时器1中断优先级,PT1=1时为高优先级。 PX1:外部中断1优先级,PX1=1时为高优先级。 PT0:定时器0中断优先级,PT0=1时为高优先级。 PX0:外部中断0优先级,PX0=1时为高优先级。 x、x:为保留位。 当中断源在IP寄存器所对应的标志位同为1或同为零时, 各中断源的优先顺序取决于CPU 部的查询次序。即同级别的 中断响应的顺序是:外部中断O一定时器O一外部中断1一定时 器1一串行口中断一定时器2(仅89C52)。 方式控制寄存器TCON决定。TCON是一个特殊功能寄存器,地 址为88H,可以位寻址。各位标志如下表: TF1 l TR1 TF0 TR0 IE1 IT I IE0 IT0 TF1:定时器/计数器T1溢出标志。当T1溢出时,由硬件自 动置1;当执行完中断程序后。由硬件清0。 TR1:定时器/计数器T1启动控制标志位。由软件设置或清 除。TR1=1时,启动T1;TR1=0,停止T1。 TF0:定时器/计数器TO溢出标志,功能同TF1。 CPU响应中断时,要将程序计数器Pc的内容压人堆栈,同 时要根据中断来源,按表1所示的人121地址转入相应的中断子程 序。中断服务子程序的最后一条指令是中断返回指令RETI,即从 堆栈取出被压人的Pc值,从而返回到主程序的断点处继续执行 原先的程序。 TR0:TO启动控制标志位,作用同TR1。 IE1:外部中断1请求标志位。当检测到INTI(P3.3引脚)上 有中断请求信号时,由硬件置1;待CPU响应后,由硬件清0。 IT1:外部中断1方式控制标志。IT1=0,当INT1(P3.3)引脚 在编制中断子程序时,首先应根据中断源的性质设定与中断 相关的寄存器的值,这些初始化的工作通常在主程序的开始进 行。初始化过程一般是这样的: 为低电平时触发外部中断1;IT1=1,当P3.3引脚检测到下降沿 信号时,触发外部中断1。 IE0和IT0为外部中断0的中断请求和方式控制标志,作用 同外部中断1。 对于89C51单片机,所有的中断都可以由软件选择开放。 CPU对每一个中断的禁止和允许,都是通过操作中断允许寄存器 IE进行的,IE寄存器地址是0A8H,各位标志如下: EA j ET2 I ES ET1 J EX1 i ET0 EX0 (1)在有多个中断源存在时,应根据中断的重要性,设定中断 优先级寄存器IP。 (2)设置中断允许寄存器IE,置EA=1,并根据中断来源置 位相应的标志位。 (3)设置中断控制寄存器TCON,对于外部中断0、1。要选择 中断触发方式标志IT0,IT1;对于定时器中断0、1.要启动中断控 制标志位TR0,TR1。下面我们就具体介绍一下外部中断0和外 部中断1的用法,至于定时器和串行中断的用法,将在以后的讲 座中涉及。 EA:单片机总中断允许/禁止标志。EA=1,允许开中断; EA=0,禁止中断。 电子世界2oo2年第9期 维普资讯 http://www.cqvip.com 外部中断O和外部中断1的程序设计 外部中断0和1的中断人口地址分别为0003H和001BH, 依照上面介绍的中断程序的编制方法,我们将外部中断程序的设 计归纳如下: 本例在中断子程序里置RS0:1,选择 表2 RS RS0 寄存器组 0 0 1 1 0 1 0 1 BANK0 BANK1 BANK2 BANK3 BANK1寄存器组,退出中断子程序前,置 RS0:0,即在主程序里仍选择BANK0寄存器 组。在做例1实验时,读者可通过仿真机全速 运行程序,当按下K3键(即P3.2为低电平 键时,4个发光二极管熄灭。 (1)设定优先级。在没有其它中断源存在时,可使用默认的 优先级,即外部中断0的优先级高于外部中断1。 (2)开中断。相应的指令为: EA:1;开总中断开关 时),应能观察到继电器动作和4个发光二极管闪烁;当释放K3 在以前的讲座中,我们曾提到集成调试环境IxV2内嵌了一 个单片机软件模拟仿真器,下面就针对例1介绍一下软件模拟仿 真具体的使用方法。 按以前讲座介绍的方法建立一个工程文件,并将例1的汇编 文件Int.asm填加到项目组里,编译通过后,选择Project/options for target’target1’,EXO:1或EXO:1;允许外部中断0或中断1 (3)设置中断触发方式。相应的指令为: IT0:1;或IT0:0 IT1:1;或IT1:0 在图1所示的窗口中选择use Simulator(使用 当IT0:1时,外部中断0选择下降沿信号触发方式,即当 P3.2引脚检测到从高到低的电平跳变时,才引起中断;当IT0:0 时,选择低电平触发方式,即只要检测到P3.2引脚为低电平,便 模拟仿真),按确定返回,这时IxV2将选择模拟仿真方式。点击 Debug菜单下的start/stop Debug session(开始/停止仿真)便可进 引起外部中断。如果P3.2引脚始终保持在低电平状态,CPU将 会反复响应外部中断。IT1的用法同IT0。下面我们举例说明。 例1 检测一个外部告警信号,当信号为低电平时,启动实 验板上的继电器,并使四个发光二极管全亮。 JDQ EQU PI.5 ORG 0000H AJMP MAIN ORG 0003H AJMP INT_O ORG OlOOH MAIN:MOV SP,#60H ① :开中断 SETB EA人模拟仿真方式,如图2所示。读者可按F11键单步调测程序,并 打开Peripherals菜单下的Interrupt(中断)和Potr3、Portl窗口来 CLR ITO;外部中断为低电平触发方式 SETB EXO;开外部中断0 START:SETB JDQ MOV PO.#0FFH 观察中断寄存器和端口电平的变化情况。本例选择低电平触发 方式,读者可依照图2,置P3.2为低电平,继续按F11单步执行 AJMP START :以下为中断子程序 INT INT :PUSH PSW SETB RSO CLR JDQ MOV P0.#10101010B JNB P3.2,S CLR RSO POP PSW RETI END 例1中,主程序主要完成对中断初始化参数的设置:在中断 子程序中,请读者注意几点:一是要对一些特殊功能寄存器入栈 保护,如例1中的PUSH PSw,以防止中断子程序对这些寄存器 进行修改;二是选择通用寄存器组。寄存器组的地址为00H~ 1FH,共32个字节,分成BANK0~BAK3四个寄存器组。每个寄 存器组由8个寄存器组成,分别为R0~R7,并通过程序状态字 ② 程序。这时将进入中断子程序并停在语句JNB P3.2,S处;如果将 P3.2重新置高,将退出中断子程序返回主程序。读者可在output windows(输出窗口)栏中键入P0和P1,这时可观察到P0、P1端 口的变化情况。例1中,由于外部中断0选择低电平触发方式,当 INT0即P3.2脚始终为低电平时,CPU将维持中断状态,读者可 以将语句JNB F3.2 S去掉,这时例1将反复响应中断。 PSw寄存器的RS1、RS0两位来选择当前使用的寄存器组,如表 2所示。 在中断子程序中,为防止中断程序对寄存器组内的寄存器改 动,一般要选择与主程序不同的寄存器组。单片机上电复位时, 默认的寄存器组为BANK0,即RS1=0,RS0=0。 v2内嵌的软件模拟仿真器可以完成大多数项目的工作, 33 电子世界2∞2年第9期 维普资讯 http://www.cqvip.com 对于没有硬件仿真器的读者,可以采用这种方便的开发方式。仿 (INT1)为低电平,执行外部中断1子程序。如果在主程序里置 真调试通过后,可以将生成的HEX格式的目标代码通过编程器 PX1:1,即设外部中断1的中断级别为高优先级,当外部中断0 写入到单片机中。在Keil 51编译环境中生成HEX目标代码需要 和外部中断1同时有中断源发生时,将首先执行外部中断1的程 在Project options for target’tergetl’中的output窗口栏中选中 序。读者可自行实验验证。 Create HEX File一栏,如图3所示。 以上我们介绍了通过 V2内嵌的模拟仿真软件调试中断的 例l中外部中断为低电平触发方式,如果在主程序里置 方法,下面再配合实验板举一个具体的例子。 IT0=1,这时外部中断为下降沿触发方式。即当P3.2引脚出现一 例3 六位LED初始显示6 6 6 6 6 6,当有外部中断信号产 个下降沿的信号,同时该信号高、低电平的保持时间至少为一个 生时,显示1 2 3 4 5 6,并来回循环。 机器周期时,将引发外部中断。读者可修改例1并通过模拟仿真 本例中应首先按例1方式在主程序里对于中断初始化参数 方式进行测试。测试时请注意,将例1中的P3.2引脚维持在低电 进行设置,并调用显示子程序。当按下K3即P3.2脚为低电平时 平时,并不会引发中断,只有当P3.2引脚出现下降沿信号时才 进入中断子程序,将显示缓存内容改为1、2、3、4、5、6后再次调用 会再次引发中断。以上我们介绍了一个中断源的产生过程,下面 显示子程序,同时改变各个LED位选通线的延时循环时间,这样 举一个有2个中断源的例子。 当按下K3键时,LED将显示1、2、3、4、5、6,并像跑马灯一样来回 循环。部分程序如下(在本刊的网站上给出了用Keil 51编译器编 译后的一些文件。其中.ASM:汇编格式的源程序文件;. v2: Keil 51集成调试环境trVision下的工程项目文件;.LST:Keil 51 A51宏汇编后产生的列表文件;.M51:连接定位器BI_51所生成 的列表文件;.OBJ:宏汇编后产生的目标文件;.HEX:宏汇编后 产生的INTEL格式的l6进制代码文件,可以将该文件用编程器 写入单片机或程序存储器)。 ★★★ :同例1 MAIN:SETB EA CLR IT0 SETB EX0 MOV 6EH.#06h ③ MOV 6DH.#06h MOV 6CH.#06h 例2 检测两个外部告警信号,当信号为低电平时,在外部 MOV 6BH.#O6h 中断0子程序,启动继电器,并使发光二极管闪烁,在外部中断l MOV 6AH.#O6h 子程序,释放继电器,并使发光二极管熄灭。 MOV 69H.#O6h ORG 0000H MOV 30H,#4 AJMP MAIN LCALL DIS ;调用显示子程序 ORG 0003H AJMP MAIN AJMP IN1 中断子程序 ORG 0013H INT一0:SETB RS0 AJMP INT 1 MOV 6EH.#O6h MAIN:SETB JDQ MOV 6DH.#O5h MOV PO.#OFFH MOV 6CH.#O4h SETB EA MOV 6BH.#O3h CLR I I MOV 6AH,#O2h CLR IT1 REP:MOV 30H,#100 69H删 辜 SETB EX0 LCALL DIS SETB EX1 JNB P3.2 REP HERE:AJMP HERE CLR RS0 ;外部中断0子程序 RE,n INT一0:CLR JDQ 显示子程序略 MOV PO.#10101010B 89C51单片机有两个外部中断源,如果要采集多个外部告警 RETI ;外部中断1子程序 信号时,可通过硬件扩展中断。如图4所示,利用Pl端口的两个 INT一1:SETB JDQ I/O口和一个“与门”,便可在INT0上产生2个外部中断信号。设 MOV PO.#OFFH 外部告警信号为低电平,当无外部告警信号时,由于Pl端口内部 RETI 有上拉电阻,平时“与门”输入信号为高电平,不引起中断。当告 END 警发生时,“与门”输入信号为低,INTO同时为低将导致中断发 用pN2模拟上述程序时,应先置P3.2引脚为低电平,执行 生。程序中应根据Pl_l、P1.0引脚状态来分别处理相应的中断 外部中断0子程序,接着恢复P3.2脚为高电平,并置P3.3脚 子程序。 电子世界2002年第9期