51单片机0号与1号外部中断实例

中断的概念

CPU在处理某一事件A时,发生了另外一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工做,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,函数

再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。spa

我第一眼看见这东西,感受跟函数嵌套调用的过程特别像。code

中断容许控制

CPU对中断系统全部中断以及某个中断源的开放和屏蔽是由中断容许寄存器IE控制的blog

EX0(IE.0),外部中断0容许位;事件

ET0(IE.1),定时/计数器T0中断容许位;it

EX1(IE.2),外部中断1容许位;class

ET1(IE.3),定时/计数器T1中断容许位;请求

ES(IE.4),串行口中断容许位;程序

EA (IE.7), CPU中断容许(总容许)位im

中断请求标志

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溢出中断请求标志位。

中断优先级原则

CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。

正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。

正在进行的低优先级中断服务,能被高优先级中断请求所中断

中断响应条件

中断源有中断请求;

此中断源的中断容许位为1;

CPU开中断(即EA=1)。

以上三条同时知足时,CPU才有可能响应中断

之外部中断0为例

 主程序中须要有如下代码:

EA=1;//打开总中断开关

EX0=1;//开外部中断0

IT0=0/1;//设置外部中断的触发方式(  0为低电平, 1为降低沿 )

 

接下来。咱们用K3独立按键,控制led的状态翻转

#include <reg52.h>
/************ 0号中断控制led灯状态翻转 ***********/

sbit LED = P0^0;
sbit k3 = P3^2; //0号中断

typedef unsigned int u16;
typedef unsigned char u8;

void delay( u16 i ){
    while( i-- );
}

void int0_init(){  //开启0号外部中断的条件
    EA = 1;  //总中断开关
    EX0 = 1;    //容许外部中断0
    IT0 = 1;    //外部中断0的触发方式
}

void trigger_int0() interrupt 0{
    delay( 1100 );
    if( k3 == 0 ) { //k3按下
        LED = ~LED;        
    }
}

void main(){
    int0_init();
    while( 1 );
}

 

接线: 用杜邦线链接K3与P3的2脚。P0的0脚链接LED的排针。interrupt 0 这个0指的是中断号

 

下例用k4按键,处理1号外部中断。相应的连线也要作出调整:

 

#include <reg52.h>
/************ 1号中断控制led灯状态翻转 ***********/

sbit LED = P0^0;
sbit k4 = P3^3; //1号中断

typedef unsigned int u16;
typedef unsigned char u8;

void delay( u16 i ){
    while( i-- );
}

void int1_init(){  //开启1号外部中断的条件
    EA = 1;  //总中断开关
    EX1 = 1;    //容许外部中断1
    IT1 = 1;    //外部中断1的触发方式
}

void trigger_int1() interrupt 2{
    delay( 1100 );
    if( k4 == 0 ) { //k3按下
        LED = ~LED;        
    }
}

void main(){
    int1_init();
    while( 1 );
}
相关文章
相关标签/搜索