引言
在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们将使用两种不同的方式来实现这一功能:一种是在中断服务函数中直接进行延时,另一种是在中断服务函数中设置标志变量,在主循环中进行延时。
硬件连接
首先,我们需要将J5处的跳帽接到2~3引脚,这样S5按键将连接到P32/INT0,S4按键将连接到P33/INT1。这样,当按下S5按键时,P32引脚将产生一个下降沿信号,触发外部中断0。
代码实现
1. 直接在中断服务函数中延时
在这种方式中,我们将在中断服务函数中直接进行延时操作。以下是完整的代码实现:
#include <REGX52.H>
sbit L1 = P0^1; // 定义L1指示灯
sbit L8 = P0^7; // 定义L8指示灯
void SeletcHC573()
{
P2 = (P2 & 0x1f) | 0x80; // 选择HC573锁存器
}
void Delay(unsigned int t)
{
while(t--); // 简单的延时函数
}
void working()
{
SeletcHC573();
L1 = 0; // 点亮L1
Delay(60000); // 延时
L1 = 1; // 熄灭L1
Delay(60000); // 延时
}
void Init_INT0()
{
IT0 = 1; // 设置INT0为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 使能总中断
}
void ServiceINT0() interrupt 0
{
L8 = 0; // 点亮L8
Delay(60000); // 延时
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1; // 熄灭L8
}
void main()
{
Init_INT0(); // 初始化外部中断0
while(1)
{
working(); // 主循环中不断调用working函数
}
}
![](https://i-blog.csdnimg.cn/direct/7e1e32081ebc4b72a33ff11cd0c87d81.png)
2. 在中断服务函数中设置标志变量,在主循环中延时
在这种方式中,我们将在中断服务函数中设置一个标志变量,然后在主循环中根据这个标志变量来控制L8的亮灭。以下是完整的代码实现:
#include <REGX52.H>
sbit L1 = P0^1; // 定义L1指示灯
sbit L8 = P0^7; // 定义L8指示灯
void SeletcHC573()
{
P2 = (P2 & 0x1f) | 0x80; // 选择HC573锁存器
}
void Delay(unsigned int t)
{
while(t--); // 简单的延时函数
}
void working()
{
SeletcHC573();
L1 = 0; // 点亮L1
Delay(60000); // 延时
L1 = 1; // 熄灭L1
Delay(60000); // 延时
}
void Init_INT0()
{
IT0 = 1; // 设置INT0为下降沿触发
EX0 = 1; // 使能外部中断0
EA = 1; // 使能总中断
}
unsigned char stat_int = 0; // 定义中断标志变量
void ServiceINT0() interrupt 0
{
stat_int = 1; // 设置中断标志变量
}
void LEDINT()
{
if(stat_int == 1)
{
L8 = 0; // 点亮L8
Delay(60000); // 延时
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1; // 熄灭L8
}
stat_int = 0; // 清除中断标志变量
}
void main()
{
Init_INT0(); // 初始化外部中断0
while(1)
{
working(); // 主循环中不断调用working函数
LEDINT(); // 检查中断标志变量并控制L8
}
}
![](https://i-blog.csdnimg.cn/direct/ee9d93671fe64190b2e9cdc5a597a1ae.png)
代码解析
1. 直接在中断服务函数中延时
-
SeletcHC573():选择HC573锁存器,确保P0口的输出能够控制LED。
-
Delay():一个简单的延时函数,通过循环递减来实现延时。
-
working():控制L1指示灯不断闪烁。
-
Init_INT0():初始化外部中断0,设置为下降沿触发,并使能中断。
-
ServiceINT0():中断服务函数,当按下S5按键时,进入该函数,点亮L8并进行延时后熄灭。
2. 在中断服务函数中设置标志变量,在主循环中延时
-
stat_int:定义一个全局变量作为中断标志。
-
ServiceINT0() :中断服务函数,当按下S5按键时,设置
stat_int
为1。 -
LEDINT() :在主循环中检查
stat_int
,如果为1,则点亮L8并进行延时后熄灭,最后清除stat_int
。
总结
本文详细介绍了如何在CT107D单片机综合训练平台上使用外部中断来控制LED灯的闪烁。我们通过两种不同的方式实现了这一功能:一种是在中断服务函数中直接进行延时,另一种是在中断服务函数中设置标志变量,在主循环中进行延时。这两种方式各有优缺点,第一种方式简单直接,但可能会影响主循环的执行;第二种方式更加灵活,能够更好地处理复杂的任务。