51单片机外部中断

51单片机有4个外部中断(传统51单片机只有外部中断0、外部中断1,而外部中断2、外部中断3是增强型的一些51单片机特有的,增加的一些外设)

外部中断0(INT0)外部中断1(INT1)外部中断2(INT2)和外部中断3(INT3)既可低电平

触发,也下降沿触发。请求四个外部中断的标志位是位于寄存器TCON中的IE0/TCON.1

IE1/TCON.3IE2/XICON.2IE3/XICON.5

外部中断一般通过输入口来实现,若为IO口,则只有设为输入时其中断功能才会开启;若为输出口,则外部中断功能将自动关闭(ATMEL的ATiny系列存在一些例外,输出口时也能触发中断功能)。

TCON寄存器中的IT0/TCON.0IT1/TCON.2、IT2/XICON.0和IT3/XICON.4决定了外部中断0、

1、2和3是低电平触发方式还是下降沿触发方式。

当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统

中断优先级控制寄存器IP/XICONIPH

一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。

以上所述可归纳为下面两条基本规则: 

低优先级中断可被高优先级中断所中断,反之不能。

任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断。

STC89C51RC/RD+系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、

定时器0中断、外部中断1(INT1)、定时器1中断、串口(UART)中断、定时器2中断、外部中断2(INT2)、外部中断3(INT3)。所有的中断都具有4个中断优先级。

与中断相关寄存器

外部中断在使用过程中,需要进行一系列的操作和设置。首先,需要确定外部中断引脚的连接和配置。这可以通过前面提到的使用外部中断检测下降沿的变化来进行检测。在这种情况下,可以通过配置外部中断引脚为下降沿触发的模式来实现。然后,需要编写中断处理程序,也称为中断服务子程序(ISR)。中断处理程序是在中断发生时被调用的一段代码,用于处理中断事件。中断处理程序应该包含处理中断事件的代码逻辑,如读取外部中断的状态和执行相应的操作。最后,需要在主程序中启用相应的中断,并设置中断优先级和中断使能位,以确保在中断发生时,处理器能够正确地响应和处理中断事件。总而言之,外部中断的使用过程包括连接和配置引脚、编写中断处程序、设置中断优先级和使能位等步骤。

由以下原理图可知,外部中断0连接引脚为P3.2;外部中断1连接引脚为P3.3

中断系统结构:

1.引起CPU中断的根源,称为中断源(中断源有外部触发,定时器中断两种形式)。

2.中断请求是由中断源向CPU提出的。

3.CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。

51单片机外部中断有两种触发方式:低电平触发和下降沿触发

以外部中断0为例,当 IT0 = 1 时为下降沿触发方式;当IT0 = 0 时为低电平触发方式

寄存器位:

这些都是寄存器位的命名,不需要了解太多,能够知道哪个寄存器位对应哪个中断即可,如:IE0对应外部中断0

中断开关和总开关:

左边是中断号的开关,用哪个就闭合哪个,比如使用外部中断0,那么就要设置EX0 = 1,使用外部中断1,那么就要设置EX1 = 1;右边是总中断开关,不管你用哪个中断,都需要打开总开关,也就是 EA = 1;

中断的优先级别设置:

以外部中断0为例:PX0 = 1 时为高优先级;PX0 = 0 时为低优先级

同时触发时,单片机会优先执行高优先级的中断。 如果只用一个中断,可以不进行设置,默认为 PX0 = 0 

外部中断使用例程:

#include <REGX52.H>
#include <INTRINS.H>

void Int0_Init()    //外部中断函数初始化  子程序                  
{   
    IT0= 0;        //外部中断0设为低电平触发 // 1则为下降沿触发
    IE0=0;        //中断标志位触发
    EX0= 1;        //打开外部中断0
    EA= 1;        //打开总中断开关 
    IT0= 0;        //外部中断0设为低电平触发 // 1则为下降沿触发
    PX0=0;        //中断优先级
}

void main()
{
    P1 = 0xFF;          //LED初始化 默认全部熄灭

    Int0_Init();      //调用外部中断初始化程序,让它等待条件触发

    if(P3_4==0)            //若中心的板子第一个独立按键按下
    {
        P3_2=0;            //将外部中断0所接引脚连接,外部中断0连接P3_2;外部中断1连接P3_3;
    }

    if(P3_4==1)
    {
        P3_2=1;
    }
    
}

void Int0() interrupt 0       //满足触发条件进来执行该中断程序
{
    P1 = 0x00;               //LED全部点亮。中断内容执行完后会退出中断
}

外部中断函数初始化主要程序代码:

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值