本讲将介绍8031单片机中断的概念、使用方法及应用。
中断的概念和使用
在程序运行中,出现了某种紧急事件,必须中止现行程序,转去处理此事件,然后再恢复原程序的运行;这个过程称为中断。在同时出现了几个紧急事件(中断请求)的情况下,首先处理(亦称响应)优先级高的中断请求,然后响应优先级低的中断请求。
8031单片机中的片内RAM里有4个特殊功能寄存器与中断有关,它们是中断源状态标志寄存器TCON(即定时/计数器控制寄存器)和SCON(即串行控制寄存器)、中断允许控制寄存器IE、中断优先级控制寄存器IP。下面分别介绍这些特殊功能寄存器中各位的意义。
i.中断源状态标志寄存器TCON。TCON的各位定义如下:

其中TF1、IF0、IE1和IE0等位分别为1T、0T、1INT-和0INT-等4个中断源的中断源状态标志位。当中断请求信号出现时,相应的中断源状态标志位被自动置1,直至单片机响应了中断才自动清零。IT1和IT0用来控制外部中断源1(1INT)-和外部中断源0(0INT-)的触发方式。当IT1(或IT0)=0时,1INT-(或0INT-)为电平触发方式。采用电平触发方式时,外部中断源的低电平必须保持到该中断被响应;中断响应完之前,要求该低电平必须被清除,否则又会产生一次中断。当IT1(或IT0)=1时,1INT-(或0INT-)被设置为边沿触发方式。当外部中断源出现一个机器周期的高电平和紧接着出现至少一个机器周期的低电平,该跳变才被确认,单片机响应该中断。IT1、IT0可由用户指定。例如希望外部中断源0INT-采用边沿触发方式,则可用指令SETB IT0来实现。
串行口的中断与特殊功能寄存器SCON有关,具体内容请见串行口一讲。
ii.中断允许寄存器IE。IE各位定义如下:

其中EA为总允许标志位。当EA=0时,禁止所有中断;当EA=1时,对每个中断请求是允许还是禁止分别由各个中断源的允许位决定。ES、ET1、EX1、ET0、EX0分别为串行口、1T、1INT-、0T、0INT-等 5个中断源的中断允许位。中断允许位为0时,禁止相应中断源产生的中断;当为1时,允许中断。
例如使中断源0T和1INT-均开放,即允许中断,则相应的中断允许控制字节为10000110,即86H。用指令MOVIE,#86H或SETB EA/SETB ET0/SETB EX1等3条指令可实现这个目的。
iii.中断优先级控制寄存器IP。IP各位定义如下:

其中PS、PT1、PX1、PT0、PX0分别决定串行口、1T、1INT-、0T、0INT-等中断源是否为高优先级。当其中某位为1时,相应的中断源为高优先级;当为0时,相应的中断源为低优先级。高优先级的中断请求可以中断正在运行中的低优先级中断服务子程序,即中断优先级具有中断嵌套能力。同一优先级内,5个中断源优先级从高到低顺序为0INT-、0T、1INT-、1T、串行口。当有两个同级中断源同时发生中断请求时,单片机将按上述顺序响应中断,但在同优先级中不具有中断嵌套能力,即同级中断请求不能中断正在运行中的另一个同级中断的服务子程序。
归纳起来可以看到,8031单片机中断可分为片外、片内两部分。外部中断源产生的中断清来信号的状态反映在片内RAM的中断源状态标志寄存器TCON中。我们可以通过置中断允许控制寄存器IE来允许或禁止相应的的中断。程序运行后,8031单片机将不断检查TCON中的中断源状态标志位,再根据IE中内容决定允许还是禁止这些中断,并参考IP指示的中断优先级来响应中断。
8031单片机响应中断后,首先将断点地址及现场内容压入堆栈,然后跳转到5个中断源中相应的中断服务子程序入口地址。这些入口地址为0INT--0003H,0T-000BH,1INT--0013H,1T-001BH,串行口—0023H。一般地,在上述入口地址处安排一条绝对跳转指令,使程序跳转到真正的中断服务子程序。中断服务子程序最后安排一条中断返回指令RETI,中断服务子程序执行完后,弹出堆栈中的现场内容和断点地址,使程序返回到断点,继续运行原程序。
最后强调一下,中断现场内容的保护要由用户自己编程序实现。凡在中断服务子程序中有可能被破坏的寄存器信息数据均应入栈保护。
中断应用实验
[实验1]一个完整的中断及其嵌套实验。
利用外部中断源0INT-、1INT-实现中断,其中1INT-被设置为高优先级。开机执行主程序时,TD-I型机将显示3CH;当有低优先级中断0INT-产生时,TD-I型机将显示10秒钟的0FH然后返回;当有高优先级中断1INT-产生时,TD-I型机将显示2秒钟的F0H然后返回。实验程序如下:
ORG 0000H
START: LJMP MAIN;跳转到 MAIN主程序
0003H: LJMP INT 0,外部中断(0INT-)入口
0013H: LJMP INT 1;外部中断(1INT-)入口
ORG 0100H ;主程序
MAIN: MOV IE,#85H; 开放上述两中断源
SETB PX1(BAH);设置(1INT-)为高优先级
DISP: MOV P1,#3CH;显示3CH
SJMP DISP(rel:FBH);等待
ORG 0120H;(0INT-)中断服务子程序
INTO: MOV R5,#0AH;置循环初值
DE1: MOV P1,#0FH;显示0FH
LCALL DELAY;调用延时子程序
DJNZ R5,DE1(rel:F8H);循环10次,延时10秒
RETI;中断返回
ORG 0140H;1INT-中断服务子程序
INT1: Mov A,R5/POP A;R5内容入栈
MOV R5,#02H ;置循环初值
MOV P1,#F0H ;显示F0H
DE2; LCALL DELAY;调用延时子程序
DJNZ R5, DF2(rel;FBH);循环2次延时2秒
POP A/MOV R5,A;R5内容出栈
RETI;中断返回
为了取得0INT-、1INT-中断源信号,可在万次多用实验电路板上将一只10kΩ的电阻一端接+5V电源端,另一端分别接按键的一端和0INT-(或1INT-)端,这样一共需搭两条电路。请读者独立查出实验程序的机器码并键入TD-I型机中,然后执行。按动两个中断键可观查到两个不同的中断;按动低级中段0INT-键后紧接着按下高级中段1INT-键,会看到上面所述的中断嵌套现象。
[实验2]利用中断实现程序的单步运行。
如果外部中断源0INT-或1INT-平时通过一常闭开关一直接低电平,那么从8031单片机上电复位后就会一直处于中断状态。当按下常闭开关并马上松开,则会出现一个正脉冲,在正脉冲期间,系统退出中断,去执行主程序;执行完一条主程序指令后,系统将检查有无中断请求,如有则会根据IE、IP寄存器内容进行响应;由于正脉冲时间很短,执行一条指令后,系统一检查是低电平,则又进入中断。利用这一特点可实现程序的单步运行。实验程序如下:
ORG 0000H
START: LJMP MAIN;跳转到主程序
0003H: LJMP INT0;(0INT-)中断服务子程序入口
ORG 0030H;主程序
MAIN: SETB EA ;设置IE寄存器
SETB EX0 开放(0INT-)中断源
LOOP1: MOV A, #01H;(A)←01H
MOV A,#04H;(A)←04H
MOV A, #10H;(A)←10H
MOV A, #40H;(A)←40H
SJMP LOOP1;跳转到
ORG 0050H;(0INT-)中断服务子程序
INTO: MOV P1,A;显示A中内容
LOOP2: JNB 2P3,LOOP2;2P3=1才向下执行
LOOP3: JB 2P3, LOOP31 2P3=0才向下执行
RETI ;中断退回
接线可在万次多用实验板上进行。将一个10kΩ电阻一端接+5V电源,另一端分别接8031的2P3(即0INT-)端和常闭按键开关的一端,常闭开关的另一端接地。本实验中常闭开关完全可以用普通(常开)按键开关代替(为什么?提示:从中断服务子程序分析)。键入实验程序,按动开关可以观察到LED单一点亮,并随按键动作不断左跳。由于实验程序中没设置防键抖措施,所以有时按一下键,可能会由于键的抖动而执行几步程序。
[实验3]利用中断方式进行数据采集。
本实验中,我们利用电阻串接开关取高电平或低电平的办法来模仿A/D转换器。实验电路如附图所示。图中S1~S8用来置P1口各端的高、低电平状态。当置好一组数据后,按下S键发出中断请求,主机执行中断服务子程序读入这组数据,而在其它时间都在执行主程序。实验程序如下:

ORG 0000H
START: LJMP MAIN ;跳转到MAIN主程序
0003H: LJMP INT0;(0INT-)中断服务子程序入口
ORO 0030H;主程序
MAIN: SETB EA; 开放总中断
SETB EX0;开放(0INT-)中断
MOV DPTR, #0100H; 设地址指针
LOOP: SJMP LOOP;空循环
ORG 0050H;中断服务子程序
INTO: MOV A,P1;取数据
MOV X @DPTR,A;存入指定存储区
INC DPTR;地址加1
LOOP2: JNB 2P3, LOOP 2;等待高电平出现才向下执行
RETI;中断返回
按图连接好线路,查出实验程序的机器码并键入TD-I型机中,然后运行。你可拨动S1~S8和接S键存入几个数据,然后停止程序运行,利用手动编程电路检查0100H开始的存储区中,数据是否为刚才输入的。如不对则检查电路和程序。正确后可编一个程序,利用上述方法将程序机器码键入0100H开始的存储区,然后停止运行。在0000H安排一条长跳转指令LJMP 0100 H来执行新输入的程序。(周振安)