外部中断0和1
外部中断原理
外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
外部中断1:(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。
编程原理(外部中断0)
- 首先我们对中断允许控制寄存器IE赋值,打开中断总开关,令EA=1.
- 然后我们还需要打开外部中断0的开关,令EX0=1
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。 - 最后再对中断请求标志TCON寄存器赋值,我们可以选择的外部中断0的触发方式有两种,一种是低电平触发方式,一种是下降沿的触发方式。如果选择低电平触发,则令IT0=0,如果选择下降沿触发,则令IT0=1。
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为低电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
4.完成以上过程就完成了对中断系统的初始化 ,然后需要编程中断服务函数。格式如下:
void init0() interrupt 0 using m
{
函数体
}
函数名(自定):init0
0:外部中断0的中断标号
m:寄存器组
在实际编程中using m 可省去
代码实现
通过独立按键来控制第一个led灯的亮灭
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led1=P2^0;
sbit K3=P3^2;//通过独立按键触发外部中断0
void intint0()//外部中断初始化
{
EA=1;
EX0=1;
IT0=1;
}
void delay(u16 i)//延时函数
{
while(i--);
}
void main()
{
intint0();//在主函数中调用初始化外部中断0
while(1);
}
void int0() interrupt 0 //中断服务函数
{
delay(1000);//延时消抖
if(K3==0)
{
led1=~led1;//是第一个led灯状态反转
}
}