返回顶部

【51单片机系列】C51中的外部中断

本文介绍了51单片机的外部中断,以及如何配置外部中断。

一、 外部中断介绍

STC89C5X系列单片机提供了4个外部中断:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。需要注意51系列单片机一定有基本的2个外部中断,但不全有4个中断,具体需要查看芯片手册,通常使用基本的2个外部中断:INT0和INT1。

外部中断结构图如下;

外部中断结构图

上图中INT0和INT1为外部中断0和外部中断1输入口。

① INT0对应的是P3.2口的附加功能,可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

② INT1对应的是P3.3口的附加功能,可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

要使外部中断0和外部中断1工作,需要使用到中断允许控制寄存器IE和中断请求标志寄存器TCON。

  • 中断允许控制寄存器IE

CPU对中断系统所有中断以及某个中断源的开放和屏蔽时由中断允许寄存器IE控制的。

中断允许控制寄存器

  • 中断请求标志位TCON

中断请求标志位

二、 外部中断配置

要让51单片机发生中断必须要满足以下3个条件,这3个条件的顺序可以任意:

① 中断源有中断请求;

② 此中断源的中断允许位为1;

③ CPU开中断,即EA=1;

比如配置外部中断0,对应的配置程序如下:

EA=1; // 打开总中断开关
EX0=1;  // 打开INT0
IT0=1;  // 设置外部中断触发方式

如果要配置外部中断1,对应的配置程序如下:

EA=1;  // 打开总中断开关
EX1=1;  // 打开INT1
IT1=1;  // 设置外部中断触发方式

三、外部中断使用示例

本示例要实现的功能是:使用独立按键K3控制LED亮灭,K3连接外部中断0(P3.2)管脚。

因为独立按键一端是共地的,当按下后对应单片机IO口被拉低,默认单片机IO口是高电平,这样就有一个下降沿过程,所以通常使用外部中断都是配置为下降沿触发,即IT0=1。

编写程序时通常将外部中断的配置放在一个自定义的函数内便于管理维护,如下:

void Int0Init()
{
    // 设置INT0
    IT0=1;  // 设置外部中断0触发方式为下降沿触发
    EX0=1;  // 打开外部中断0的中断允许
    EA=1; // 打开总中断允许
}

当触发中断后会进入中断服务函数,外部中断0中断服务函数如下所示:

void Int0() interrupt 0  // 外部中断0的中断函数
{
    // 执行所需的功能
}

使用proteus进行仿真设计,需要用到的资源有:独立按键模块、LED模块。设计如下:

外部中断0实验

软件设计如下:

/*
	实现功能:外部中断0使用,通过按键触发中断实现LED的亮灭
	[2023-12-13] zoya
*/

#include "reg52.h"

typedef unsigned int u16;
typedef unsigned long u32;

#define GPIO_LED	P2
sbit K3 = P3^2;

/*************************************************************************
* 函数名:		delayms
* 函数功能:	延时函数,单位:毫秒
* 输入:			i:延时的毫秒数,i=1表示1毫秒,i的取值不能超过65535
* 输出:			void
**************************************************************************/
void delayms(unsigned int i)
{
	u32 j = i*100;
	while(j--);
}

/*************************************************************************
* 函数名:		Int0Init
* 函数功能:	外部中断0初始化,以边沿方式触发中断
* 输入:			void
* 输出:			void
**************************************************************************/
void Int0Init()
{
	EA=1;  // 打开总中断允许
	EX0=1;  // 打开INT0中断允许
	IT0=1;  // 设置边沿触发中断
}

void main()
{
	Int0Init();  // 外部中断0初始化
	while(1);
}

/*************************************************************************
* 函数名:		Int0KeyPros
* 函数功能:	外部中断0服务函数,处理与P3.2接口连接的按键,当按键按下时,灯亮
* 输入:			void
* 输出:			void
**************************************************************************/
void Int0KeyPros() interrupt 0
{
	delayms(10);  // 延时消抖
	if(0 == K3)
	{
		GPIO_LED = ~GPIO_LED;
	}
}

仿真结果:

独立按键触发外部中断0控制LED亮灭

posted @ 2023-12-18 15:03  Zoya23  阅读(383)  评论(0编辑  收藏  举报