制作英文网站多少钱企业展示型网站建设方案
引言
在单片机开发中,外部中断是一个非常重要的功能,它可以让单片机在检测到外部信号变化时立即做出响应。本文将详细介绍如何在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函数
     }
 }

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
     }
 }

代码解析
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灯的闪烁。我们通过两种不同的方式实现了这一功能:一种是在中断服务函数中直接进行延时,另一种是在中断服务函数中设置标志变量,在主循环中进行延时。这两种方式各有优缺点,第一种方式简单直接,但可能会影响主循环的执行;第二种方式更加灵活,能够更好地处理复杂的任务。
