首页 理论教育 外部中断0的触发方式与优先级

外部中断0的触发方式与优先级

时间:2026-01-23 理论教育 姚姚 版权反馈
【摘要】:上述0和1所对应的触发方式为传统8051单片机的外部中断0触发方式选择。当CPU响应外部中断时,IE0会被硬件自动清零。2)1——外部中断0为高优先级。

明显地,我们可以使用外部中断0(INT0)或外部中断1(INT1)作为外部突发、紧急信号的输入口。对STC15F2K60S2单片机而言,对应的引脚如图4-3所示。因此,这个外部突发信号可以接在23脚(对应P3.2/INT0)或24脚(对应P3.3/INT1)上,这里假定使用外部中断0。

图示

图4-3 外部中断0和外部中断1引脚分布

4.2.3.1 相关寄存器

在前面学习中,我们一再强调,单片机内部有多个功能部件,每个功能部件都有相应的特殊功能寄存器,用户必须准确地把握这些寄存器的功能,并加以合理配置与操作,这样才能玩转这些功能模块。要使用外部中断0——INT0,请读者再次阅读图4-2,可以看出从左到右,相关的“特殊功能寄存器”如下。

1.IT0——外部中断0的触发方式选择

1)0——电平方式,低电平触发。这种方式一旦检测到有效低电平即刻产生中断标志(IE0),及时清除电平信号,否则将引起重复或多次中断。

2)1——边沿方式,下降沿触发。这种方式一旦检测到下降沿,即刻产生中断标志(IE0)。

上述0和1所对应的触发方式为传统8051单片机的外部中断0触发方式选择。对STC15F2K60S2而言,当IT0=0时,允许边沿触发,即无论上升沿还是下降沿都将触发外部中断请求,IE0自动设为1。当IT0=1时,为下降沿触发方式,当检测到有效的下降沿,IE0自动设为1。这一点是STC厂家对传统8051单片机的改进之处。请读者使用时务必注意。

2.IE0——外部中断0中断请求标志

1)0——无外部中断0的中断请求。

2)1——有外部中断0的中断请求。当CPU响应外部中断时,IE0会被硬件自动清零。也就是说,用户无需软件对其实施清零操作。

3.EX0——外部中断0允许位

1)0——禁止外部中断0。即使外部中断0请求标志IE0为1,也没用。

2)1——允许外部中断0。

4.EA——总中断允许控制位

1)0——关闭中断,CPU屏蔽所有中断申请,“一律不予受理”。

2)1——开放总中断。

事实上,8051单片机的中断系统为两级控制方式,即每个中断源可独立开放与屏蔽,还有一个总中断允许开关,控制着所有中断源的中断允许或屏蔽。因此,若开放了所有独立的中断允许,且有相应的中断请求标志,但如果总中断允许位为0(即关闭),那么有可能发生中断吗?

5.PX0——外部中断0优先级设置

1)0——外部中断0为低优先级。

2)1——外部中断0为高优先级。

上述所介绍的都是外部中断0的相关“位”,它们都是特殊功能寄存器的个别位,请读者打开<reg51.h>头文件,出现的界面如图4-4所示。

图示

图4-4 外部中断0的相关寄存器

阅读图4-3,可以看出外部中断0涉及特殊功能寄存器主要有如下三个。

1)TCON——相关位:IE0和IT0。(https://www.xing528.com)

2)IE——相关位:EA和EX0。

3)IP——相关位:PX0。

上述三个特殊功能寄存器,都是可以“位寻址”的,因此当用户包含了头文件(#include<reg51.h>)之后,就可以使用“字节操作”方式,直接设置TCON、IE、IP三个特殊功能寄存器来操作外部中断0,也可以使用“位操作”方式,设置相应的控制位来操作外部中断0。

4.2.3.2 外部中断0的初始化

学习了外部中断0的相关特殊功能寄存器,现在就可以来使用外部中断0了。我们要做的其实是对外部中断0进行“初始化”,配置相关寄存器,使其按我们期望的方式工作。这里我们使用直观的“位操作”方式初始化外部中断0,如图4-5所示。

图示

图4-5 外部中断0初始化

动一动

1.请读者查阅相关资料对外部中断1进行初始化操作,要求:下降沿触发,外部中断1为低优先级,开放外部中断1中断,同时开放总中断。

2.请使用“字节操作”方式,初始化外部中断0,完成图4-5所示的初始化功能。

4.2.3.3 外部中断0的中断服务函数

如果只是完成“LED闪烁5次”,相信这已不是一件难事,相应的显示函数如图4-6所示。

图示

图4-6 LED闪烁5次

图4-6所示的函数是一个普通的子函数,它是外部中断0要处理的紧急事务。问题来了:如何让单片机知道上述显示函数是单片机要处理的紧急事务,而非一般事务呢?答案是:给这个函数添加一个特殊的“标记”。

目前为止,我们认识了主函数main、用户自己定义的各种子函数,但这些都无法用来体现“中断”这一特殊身份。用来处理中断事务的函数称为中断服务函数,在其函数后面添加“interrupt n”来标识其“身份”。8051单片机的5个中断服务函数声明样式如图4-7所示。

图示

图4-7 中断服务函数声明

需要特别说明的是:

1)中断服务函数的函数名与其他子函数一样,都是用户自己定义的,用户可以自行修改。

2)中断服务函数一般都定义为无输入参数void,同时也无返回值类型void的函数。

3)区分是否中断服务函数以及对应是哪个中断源引起的中断服务,关键在于interrupt n。换句话说,interrupt n是相应中断服务函数的“唯一身份标识”。请读者千万不要写错序号,否则将无法达到预期效果,甚至是致命的错误。举个例子,假定你编写外部中断0服务函数voidINT0_ISR(void),无论是没有后缀interrupt 0还是将interrupt 0中的0改成其他数字,都将使voidINT0_ISR(void)不再是外部中断0的中断服务函数。

可见,关键字“interrupt 0”是外部中断0服务函数的唯一标识。不论函数名如何修改,只要在函数后面添加“interrupt 0”,该函数就是外部中断0的中断服务函数。这样,添加了“interrupt 0”的图4-6普通子函数,摇身一变成了外部中断0的“中断服务函数”,如图4-8所示。请读者务必深刻领悟这点。

图示

图4-8 外部中断0服务函数示例

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈