问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机外部中断详解与实例

创作时间:
作者:
@小白创作中心

51单片机外部中断详解与实例

引用
CSDN
1.
https://m.blog.csdn.net/BUG_MeDe/article/details/145807820

1,引入

CPU收到中断请求,将主函数中的事情停下来,转而执行中断处理函数中的事情。51单片机有5个中断源,包括2个外部中断(INT0/INT1)、2个定时器中断(T0/T1)和一个串口中断。

系统通过中断号来区分这些中断,并且中断有优先级,可以通过软件控制。高优先级的中断可以抢占低优先级的中断,当两个相同优先级的中断同时到来时,CPU会根据系统中的中断查询顺序来处理。

2,51单片机中断

51单片机的5个中断源如下:

  • IE寄存器:中断控制寄存器,EA是总中断使能位,EX0、ET0、EX1、ET1、ES等是其他5个中断的使能位。
  • IP寄存器:用于设置中断优先级。

对于外部中断INT0和INT1:

  1. INT0连接到P3.2管脚,INT1连接到P3.3管脚。
  2. IT0寄存器控制中断触发方式:IT0 = 1时为下降沿触发,IT0 = 0时为低电平触发。
  3. 当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)会被置1,向CPU申请中断。

3,中断相关的寄存器

要开启某个中断,需要将对应的寄存器设置为1,并开启总中断。例如,要使能外部中断INT0,需要设置EX0 = 1,EA = 1,并设置触发方式(IT0 = 1表示下降沿触发)。

4,外部中断INT0程序

下面是一个使用外部中断控制LED亮灭的程序示例:

#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;
#define DC_RUNING_TIME 1000

void delay_10us(u16 time)
{
    while(time--);
}

void delay_ms(ms)
{
    u16 i,j;
    for(i=ms;i>0;i--)
        for(j=110;j>0;j--);
}

void init_exti0()
{
    // 初始化外部中断0
    IT0 = 1;  // 下降沿触发
    EX0 = 1;
    EA = 1;   
}

void init_exti1()
{
    // 初始化外部中断0
    IT1 = 1;  // 下降沿触发使能
    EX1 = 1;  // 启用外部中断1
    EA = 1;   // 开启中断
}

//interrupt 是一个关键字,表示 51 单片机中断。后面的“0”是中断号
void exti0_run() interrupt 0
{
    delay_10us(DC_RUNING_TIME);
    if(KEY3 == 0)
    {
        LED1 = !LED1;   
    }
}

void exti1_run() interrupt 2
{
    delay_10us(DC_RUNING_TIME);
    if(KEY4 == 0)
    {
        LED2 = !LED2;   
    }
}

void main()
{
    init_exti0();
    init_exti1();
    while(1);
}  

5,总结

CPU要正常响应中断需要满足以下三个条件:

  1. 中断源有中断请求
  2. 此中断源的中断允许位为 1
  3. CPU打开了总中断(即 EA=1)

本文原文来自CSDN。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号