13.2.3 中断仿真

51系列单片机总共提供了5个中断源,包括两个定时中断源、两个外部中断源和1个串行中断源。部分增强型的单片机还提供了更多的中断源。当在KeilµVision3集成开发环境中建立项目并指定所使用的单片机型号后,在仿真调试模式中便可以加载该单片机的中断资源供仿真调试使用。

1.中断系统的仿真界面

不同单片机的中断系统略有区别,这里以Atmel公司的AT89S52单片机为例进行介绍。在KeilµVision3集成开发环境中,AT89S52中断系统的仿真界面如图13.19所示。

13.2.3 中断仿真 - 图1

图 13.19 中断系统的仿真界面

程序仿真执行的时候,在中断系统的仿真界面上,可以设置并实时显示中断系统的工作状态,以便于测试程序的执行情况。下面分别进行介绍。

仿真界面的中间以表格形式域显示中断向量的使用情况。具体含义如下。

❑“Int Source”列:表示中断源。

❑“Vector”列:表示中断源的入口地址。

❑“Mode”列:表示中断的触发方式。

❑“Req”列:表示中断请求标志。

❑“Ena”列:表示中断请求允许标志。

❑“Pri”列:表示中断优先级。

表中,各行表示AT89S52单片机支持的中断类型,包括3个外部中断、3个定时中断以及1个串行中断。具体含义如下。

❑“P3.2/Int0”:P3.2引脚的外部中断0。

❑“Timer0”:定时器/计数器T0中断。

❑“P3.3/Int1”:P3.3引脚的外部中断1。

❑“Timer1”:定时器/计数器T1中断。

❑“Serial Rcv”:串行接口接收中断。

❑“Serial Xmit”:串行接口发送中断。

❑“Timer2”:定时器/计数器T2中断。

❑“P1.1/T2EX”:P1.1引脚的外部中断。

“EA”为中断允许或禁止总控制位。当置EA为0时,单片机禁止所有中断,将不响应任何中断请求;当置EA为1时,单片机允许各个中断,此时还需要由其他各个中断标志位确定每个中断的允许或禁止。

当选择某一个中断源后,在“Selected Interrupt”区域显示了和所选择中断源相关的寄存器。区域其中的内容随所选择的中断源不同而有所变化,且可以根据仿真调试的需要手工赋值。

当所选择的为外部中断0或外部中断1的时候,“Selected Interrupt”区域显示项如下所示。

❑“IT0”或“IT1”:外部中断的中断触发方式控制位。

❑“IE0”或“ET1”:外部中断请求标志位。

❑“EX0”或“EX1”:外部中断允许/禁止标志位。

当所选择的为定时中断T0或定时中断T1的时候,“Selected Interrupt”区域显示项如下所示。

❑“TF0”或“TF1”:定时器/计数器的溢出标志位。

❑“ET0”或“ET1”:定时器/计数器的允许/禁止标志位。

当所选择的为串行中断的时候,“Selected Interrupt”区域显示项如下所示。

❑“RI”:串行接口的接收中断请求标志位。

❑“TI”:串行接口的发送中断请求标志位。

❑“ES”:串行中断允许/禁止标志位。

另外,“Pri”表示中断的优先级,选择各个中断源中都包含该项。

2.中断系统的仿真

51系列单片机的定时中断、外部中断以及串行中断等,均可以在KeilµVision3集成开发环境中进行仿真。这里以外部中断源和定时器T0中断的仿真操作为例进行介绍,其他的中断源可以采用同样的步骤来进行仿真操作。具体的仿真操作步骤如下。

(1)在KeilµVision3集成开发环境中,新建一个工程,并选择Atmel公司的AT89S52单片机。

(2)选择“File”→“New”命令,新建一个程序文件,并保存为*.C文件。在其中输入如下的程序源代码。


include<reg52.h>//头文件


void ISR0(void)interrupt 0//外部中断0服务例程


{

P1=P1+1;//P1端口递增


}


void T0ISR(void)interrupt 1//定时器T0中断响应函数


{

P0=P0-1;//P0端口递减

TL0=0x0C;//重置计数初值

TH0=0x0F0;

}


void ISR1(void)interrupt 2//外部中断1服务例程


{

P2=~P2;//P2端口反相


}

void main(void)//主函数


{

IP=0x05;//外部中断0和外部中断1设置为高优先级

IT0=1;//外部中断0为下降沿触发

IT1=1;//外部中断1为下降沿触发

EX0=1;//开EX0中断

EX1=1;//开EX1中断

TMOD=0x00;//设置定时器T0为模式0

TL0=0x0C;//初始化

TH0=0x0F0;

TR0=1;

ET0=1;

EA=1;//开中断

P0=0;//P0端口初始化为0

P1=0;//P1端口初始化为0

while(1)//主循环

{}}


在该程序中,分别定义了外部中断0和1的服务例程以及定时器T0的中断服务例程。在主函数中,将外部中断0和外部中断1设置为高优先级,并设置外部中断0和1为下降沿触发方式,然后打开相应的中断。同时设置了定时器T0为模式0,最后打开定时中断,并置EA=1开总中断。在主循环中不进行任何操作。当定时中断产生的时候,触发定时中断服务例程T0ISR,P0

端口递减;当figure_0366_0198(P3.2引脚)有负跳变时,触发中断服务例程ISR0,将P1端口递增;

当Ifigure_0366_0199(P3.3引脚)有负跳变时,将触发中断服务例程ISR1,置P2端口反向。

(3)选择“Debug”→“Start/Stop Debug Session”命令,进入程序仿真调试模式。

(4)选择“Peripherals”→“Interrupt”命令,打开中断仿真界面。

(5)选择“Peripherals”→“I/O-Ports”→“Port 0”命令,打开并行I/O端口P0的仿真界面。然后,依次打开P1、P2和P3的仿真界面。

(6)选择“Debug”→“Run”命令,程序便开始运行。此时,从中断仿真界面上可以看到外部中断0、外部中断1以及定时中断T0的设置。外部I/O端口P1初始化为0,P0端口数值在递减,如图13.20所示。

13.2.3 中断仿真 - 图4

图 13.20 程序仿真运行

(7)手工改变P3.2引脚的值触发外部中断0,此时,P1端口递增。同样,手工改变P3.3引脚的值触发外部中断1,P2端口反向。中断运行的结果如图13.21所示。

13.2.3 中断仿真 - 图5

图 13.21 中断运行结果

(8)选择“Debug”→“Stop Running”命令,便可以结束程序的仿真运行。

(9)选择“Debug”→“Start/Stop Debug Session”命令,可以退出程序仿真调试模式。

在仿真操作过程中,每一步中断操作均可以在中断仿真界面上看到相应的变化。同时,外部中断的触发也可以通过改变“IE0”和“IE1”的值来触发。