外部中断简介
前一篇详细介绍了51 单片机的中断系统,这里再简单回顾一下 。 当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,要求 CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示 CPU 中断的请求源称为中断源。
STC89C5X 系列单片机提供了 4 个外部中断:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)。本文使用外部中断 O(INTO)。INT0 对应 P3.2 口的附加功能,可由 IT0(TCON.0)选择其为低电平有效还是下降沿有效。当 CPU 检测到 P3.2 引脚上出现有效的中断信号时,中断标志 IE0(TCON.1)置 1,向 CPU 申请中断。外部中断结构图,如下所示:
由上图可知,CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE 控制的。外部中断 0 允许位是EX0(IE.0),外部中断 0 中断请求标志位是IE0(TCON.1),触发方式控制位为IT0(TCON.0), 当 IT0=0 时,为低电平触发方式。 当 IT0=1 时,为边沿触发方式(下降沿有效)。
因为独立按键一端是共地的,当按下后对应单片机 IO 口被拉低,而默认单片机 IO 口是高电平,这样就有一个下降沿过程,所以通常使用外部中断都是配置为下降沿触发,即 IT0=1; 通常在编写程序时将外部中断的配置放到一个自定义函数内,便于管理维护,如下所示:
void EXIT0_INIT(void)
{
IT0=1;//选择下降沿触发有效
EX0=1;//打开INT0的中断允许位
EA=1;//打开总开关
}
当触发中断后即会进入中断服务函数,外部中断 0 中断服务函数如下:
void exti0() interrupt 0 //外部中断 0 中断函数
{
//执行所需的功能
}
其中 exti0 是自定义的函数名,interrupt 是一个关键字,表示 51 单片机中断。后面的“0”是中断号,外部中断 0 中断号为 0,如果是外部中断 1,则中断号为 2,这个可参考“51中断系统” 的内容。
硬件部分
使用到硬件资源如下:
- 独立按键
- LED
将 K3 键连接在单片机 P3.2 口(外部中断 0),K4 按键连接在 P3.3 口(外部中断 1)。 D1 指示灯连接在单片机 P2.0 口,如图所示:
软件部分
首先定义 K3 键与 LED1 的控制管脚,然后定义外部中断 0 配置函数 exit0_init:开启总中断、外部中断 0 功能,设置外部中断 0 为下降沿触发。
因为配置外部中断 0 下降沿触发,当有按键按下,产生了一个下降沿,触发中断,即会进入对应中断服务函数执行相应的功能程序,LED 的控制在中断函数内完成,
源代码:
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义LED1管脚
sbit LED1=P2^0;
//定义独立按键K3控制脚
sbit KEY3=P3^2;
void EXIT0_INIT(void)
{
IT0=1;//选择下降沿触发有效
EX0=1;//打开INT0的中断允许位
EA=1;//打开总开关
}
void delay_10us(u16 ten_us)//延时函数,ten_us=1时,大约延时10us
{
while(ten_us--);
}
void main()
{
exit0_init();//外部中断0配置
/*此时单片机在执行程序时,程序一直在无限循环中,当按键KEY3按下,产生了一个降沿,触发中断
中断源向 CPU 请求中断,去执行中断程序exit0(),LED1状态翻转之后,又回到主函数
等待下一次触发中断,因为LED1是状态翻转,所以再次按下就是LED灯灭了*/
while(1)
{
}
}
void exit0() interrupt 0 //外部中断0中断函数
{
delay_10us(1000);//消抖
if(KEY3==0) //再次判断K3键是否按下
LED1=!LED1;//LED1状态翻转
}
外部中断 1 的使用与外部中断 0 是一样的,更改一下外部中断 0 配置为外部中断1的配置,在将中断函数的中断号改为2即可,这里就不再重复。
现象
当按下 K3 键,D1 指 示灯亮,再次按下 K3 键,D1 指示灯灭,如此循环。