51单片机一共有两个外部中断源。
IE0的置位与否与IT0有关,当IT0=1时,下降沿触发也就是说当INT0由高到低时IE0将被硬件置1,
执行完中断,遇到RETI自动清0,但不影响INT0的状态。当IT0=0时,当CPU检测到连续两个周期的INT0低电平时IE0置1,
中断结束时遇到RETI自动将IE0清0,之后如果INT0仍然为低电平,且长度超过两个机器周期,
那么将重新将IE0置1申请中断。
/**
* 文件名称:外部中断实验
* 实验目的:1.掌握51单片机外部中断相关寄存器的配置方法和触发方式
* 程序说明:1.使用程序前,将跳线J2调整为BTN模式(独立按键)
* 将跳线J13调整为IO模式
* 2.按下P3.2-INT0引脚对应的按键S5,LED1状态反转
* 3.按下P3.3-INT1引脚对应的按键S4, LED2状态反转
*/
#include <reg52.h>
sbit LED1 = P0^0;
sbit LED2 = P0^1;
void configExtInt0();//外部中断0对应引脚P3^2
void configExtInt1();//外部中断1对应引脚P3^3
void main() {
configExtInt0();
configExtInt1();
while (1);
}
void configExtInt0() {
IT0 = 1;//选择为下降沿触发方式(为1代表下降沿触发,为0代表低电平触发)
EA = 1; //使能总中断
EX0 = 1;//使能外部中断0
}
void configExtInt1() {
IT1 = 1; //选择为下降沿触发方式
EA = 1; //使能总中断
EX1 = 1;//使能外部中断1
}
//外部中断0中断服务函数
void extInt0ISR() interrupt 0 {
P2 = ((P2 & 0x1F) | 0x80);
LED1 = ~LED1;
P2 &= 0x1F;
}
//外部中断1中断服务函数
void extInt1ISR() interrupt 2 {
P2 = ((P2 & 0x1F) | 0x80);
LED2 = ~LED2;
P2 &= 0x1F;
}