• 中断(全网最细!)


    什么是中断?

    中断是让单片机具有处理外部和内部随机发生事件实时处理的能力;

    中断提高了单片机处理外部或内部的能力;

    芯片在处理某一个A事件,发生了一件B事件,请求芯片(中断发生)去处理B事件,暂停原来做的A事件,转去处理B事件(中断服务),芯片处理完B事件,在回到事件A中断的地方在继续处理A事件(中断返回),这个过程叫中断。


    中断的结构

    有多少个中断?

    基于51单片机一般提供八个中断

    外部中断0 、 外部中断1 、 外部中断2 、 外部中断3 、

    定时器0、定时器1、定时器2、串口 八个中断请求源

    一般STC增强型 有八个

    但一般单片机都有5个中断  ,这是基础的

    重点学习这5个中断,后面多的都大差不差


    中断里有什么?

    TCON寄存器,控制外部中断是下降沿触发,还是低电平触发,触发之后中断标志位IE0自动化置为1,;

    IE外部中断寄存器设置,EX0中断的选择位

    EA 全局中断控制使能位

    IP设置中断的优先级

    中断寄存器

    (1) 中断允许控制 就是 IE 寄存器的某一位

    (2)中断请求标志 就是 TCON寄存器 8位的寄存器


    中断优先级?

    外部中断0---->定时器0---->外部中断1---->定时器1---->串口

    中断号

    中断响应条件?

    ①中断源有中断请求;
    ②此中断源的中断允许位为 1;
    ③CPU 开中断(即 EA=1)。

    若果设置的中断有问题,可以从这三个方面去查看


    中断配置

    中断的操作流程

    1、先要在外部中断设置是下降沿触发、还是低电压触发 在TCON寄存器中、触发之后中断标志IE0 自动置1

    2、外部中断允许位要打开

    3、EA总中断要开发

    4、设置中断优先级

    5、中断才会流入MCU

    中断0 初始化

    1. // 外部中断0配置初始化
    2. void exit0_init(void)
    3. {
    4. IT0 = 1; // 下降沿触发
    5. EX0 =1; // 中断允许位打开
    6. EA=1; // 总中断打开
    7. }

    中断0服务函数

    1. // 外部中断0服务函数 没有返回值
    2. void exit0() interrupt 0 // 0 是中断号
    3. {
    4. deplay_time(1000); // 消抖
    5. if(KEY3==0)
    6. {
    7. LED1=!LED1;
    8. }
    9. }

    void exit0()  interrupt 0    中断服务函数  0 是哪个中断号

    中断优点

    分时操作、实时响应、可靠性高

    分时操作: CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用率

    实时响应:CPU 能够及时处理应用系统的随机事件,系统的实时性大大增强

    可靠性高:CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高


    实验需求:

    用K3、K4按键使用中断,LED1灯按灭

    硬件图:

    编程设计:

    1. #include "reg52.h" // 头文件
    2. // char/int 重命名
    3. typedef unsigned char u8;
    4. typedef unsigned int u16;
    5. // 按键管脚
    6. sbit KEY3 = P3^2;
    7. sbit KEY4 = P3^3;
    8. sbit LED1 = P2^0;
    9. // 外部中断0配置初始化
    10. void exit0_init(void)
    11. {
    12. IT0 = 1; // 下降沿触发
    13. EX0 =1; // 中断允许位打开
    14. EA=1; // 总中断打开
    15. }
    16. // 外部中断1配置初始化
    17. void exit1_init(void)
    18. {
    19. IT1 = 1; // 下降沿触发
    20. EX1 =1; // 中断允许位打开
    21. EA=1; // 总中断打开
    22. }
    23. // 外部中断0服务函数 没有返回值
    24. void exit0() interrupt 0 // 0 是中断号
    25. {
    26. deplay_time(1000); // 消抖
    27. if(KEY3==0)
    28. {
    29. LED1=!LED1;
    30. }
    31. }
    32. // 外部中断1服务函数1 没有返回值
    33. void exit1() interrupt 2 // 0 是中断号
    34. {
    35. deplay_time(1000); // 消抖
    36. if(KEY4==0)
    37. {
    38. LED1=!LED1;
    39. }
    40. }

  • 相关阅读:
    【uniapp+vue3 】页面加载时根据不同角色设置导航栏标题
    HotSpot垃圾算法实现之枚举根节点和安全点安全区域
    【Pytorch】多维矩阵的加法
    每日五问(java)
    #成为 SQL 大师#groupby 中不能有聚合函数
    深度学习——图像分类(CIFAR-10)
    云原生FAQ
    使用高德开放平台显示指定的坐标点和线
    Python武器库开发-基础篇(四)
    代码随想录算法训练营第38天—动态规划06 | ● 完全背包 ● *518. 零钱兑换 II ● 377. 组合总和 Ⅳ
  • 原文地址:https://blog.csdn.net/m0_68021259/article/details/132762574