1 概述
CPU执行主程序过程,随机接收到外设发来的中断请求,CPU可暂时中断当前正在执行的主程序,转到相应的中断服务子程序进行处理。处理完毕,再返回到原来的主程序(被中断之处),继续运行下去。可产生中断请求的设备或事件称为中断源。中断技术大大地提高了CPU的工作效率,能及时地响应和处理特殊事件。
2 MCS-51中断系统结构及相关寄存器
在中断系统中,引起中断的原因或产生中断申请的来源称为中断源,由中断源向CPU发出的请求中断信号称为中断请求信号。MCS-51中断系统结构示意图如图1所示。由图可见,MCS-51单片机内部有5个中断源,分别为INT0、T0、INT1、T1、串行口,本文着重介绍外部中断技术(INT0、INT1)。
图1 MCS-51中断系统内部结构示意图
2.1 定时器/计数器控制寄存器
TCON是一个8位特殊功能寄存器,其字节地址为88H,用于锁存T0、T1、INT0和INT1四个中断源的中断标志。本文只详细介绍与外部中断有关的标志位,具体如表1所示。
表1 定时器/计数器控制寄存器
(1)IE0:INT0的中断请求标志位。IE0=1时,外部中断0发出中断申请;IE0=0时,INT0的中断请求已被清除。
(2)IE1:INT1的中断请求标志位。IE1=1时,外部中断1发出中断申请;IE1=0时,INT1的中断请求已被清除。
(3)IT0:INT0中断触发方式控制位。当IT0=0时,为电平触发方式,低电平触发;当IT0=1时,为边沿触发方式,下降沿触发。
(4)IT1:INT1中断触发方式控制位。当IT1=0时,为电平触发方式,低电平触发;当IT0=1时,为边沿触发方式,下降沿触发。
若外部中断定义为电平触发方式,中断标志位的状态随CPU在每个机器周期采样到的外部中断输入引脚的电平变化而变化,这样能提高CPU对外部中断请求的响应速度。但外部中断源若有请求,必须把有效的低电平保持到请求获得响应时为止,不然就会漏掉;而在中断服务程序结束之前,中断源又必须撤消其有效的低电平,否则中断返回之后将再次产生中断。
若外部中断定义为边沿触发方式,在相继连续的两次采样中,一个周期采样到外部中断输入为高电平,下一个周期采样到为低电平,则在IE0或IE1中将锁存一个逻辑1。即便是CPU暂时不能响应,中断申请标志也不会丢失,直到CPU响应此中断时才清零。这样,为保证下降沿能被可靠地采样到,外中断引脚上的高低电平均至少要保持一个机器周期。
2.2 中断允许寄存器
IE是一个8位的特殊功能寄存器,其字节地址为A8H,用于控制中断的禁止与允许。本文只详细介绍与外部中断有关的标志位,具体如表2所示。
表2 中断允许寄存器
(1)EA:CPU中断总允许位。EA=1时,CPU允许中断;EA=0时,CPU禁止所有中断请求。
(2)EX0:外部中断0(INT0)中断允许位。EX0=1时,允许INT0中断;EX0=0时,禁止INT0中断。
(3)EX1:外部中断1(INT1)中断允许位。EX1=1时,允许INT1中断;EX0=0时,禁止INT1中断。
单片机复位后,IE被清0。控制中断的禁止与允许由用户程序设置IE的相应位是1或0,可通过相应的字节指令或位指令实现。
3 MCS-51中断处理过程
中断处理过程可分为三个阶段,即中断响应、中断处理和中断返回。在中断响应时,首先应在堆栈中保护主程序的断点地址,以便中断返回时,执行RETI指令能将断点地址从堆栈中弹出到PC,正确返回。
由此可见,CPU执行的中断服务程序如同子程序一样,因此又被称作中断服务子程序。但两者的区别在于,子程序是用LCALL指令来调用的,而中断服务子程序是通过中断请求实现的。所以,在中断服务子程序中也存在保护现场、恢复现场的问题。中断处理的大致流程如图2所示。
图2 中断处理的大致流程
中断源服务程序的入口地址是各中断源的中断服务子程序的执行首地址,CPU响应某中断源中断请求后,对应转到相应的入口地址去执行预先为该中断源编写的服务子程序。五个中断入口地址之间只相隔8个地址单元,中断服务程序较长时通常安排跳转指令到其他地址区域去。同时主程序通常安排在0030H之后开始。表3为各中断源服务程序的入口地址。
表3 各中断源服务程序的入口地址
编写中断程序时应注意:
(1)在中断矢量地址单元处放一条无条件转移指令(LJMP****H),使中断服务程序可灵活地安排在64KB程序存储器的任何空间。
(2)在中断服务程序中,用户应注意用软件保护现场,以免中断返回后丢失原寄存器、累加器中的信息。
(3)若要在执行当前中断程序时禁止更高优先级中断,可以先用软件关闭CPU中断或禁止某中断源中断,在中断返回前再开放中断。
4 Proteus电路图及程序设计
图3为74HC595的Proteus仿真电路图,用MCS-51的P2.0与LDE相连,用来指示正在进行中的断服务服务。MCS-51的P3.3引脚接一按钮,用来模拟中断源。
图3 MCS-51外部中断仿真电路图
本文的程序设计由主程序模块MAIN、中断服务子程序模块INTERRUPT组成,汇编程序代码如下:
5 仿真过程、效果及总结
(1)打开Keil2,选择ProjectNew Project命令,在弹出的Create New Project对话框中新建Keil项目ExInterrupt.uv2。
(2)选择CPU为ATMEL中的AT89C51单片机。
(3)编辑好源程序,编辑完成后保存。
(4)在Project Workspace窗口中,将ExInterrupt.asm文件加入到Source Group1中。
(5)在Project Workspace窗口中Target1文件夹上单击右键,在弹出的窗口中选择Output选项卡,并选中Create HEX File选项。
(6)在Keil菜单中选择Project Build Target选项,编译汇编程序,并产生HEX文件。
(7)将Keil产生HEX文件加载到Proteus ISIS绘制的硬件电路中。
图4 仿真效果图
图4为MCS-51外部中断控制仿真效果图,当按钮按下时产生脉冲下降沿从而触发中断事件,LED随即被点亮,再次按下按钮时LED熄灭。实现了本系统的仿真目的。中断系统是单片机控制系统的重要组成部分:实时控制、故障自动处理时往往用到中断系统,单片机与外部设备间传送数据及实现人机联系也常常采用中断方式。只有灵活运用中断技术才能设计出适应能力强、控制精度高的单片机测控系统。