📜  8051微控制器中的嵌入式系统中断

📅  最后修改于: 2021-01-01 02:52:16             🧑  作者: Mango

8051单片机中断

这是一个子程序调用,由微控制器给出,它要求其他一些具有较高优先级的程序来获取系统总线,而不是当前正在运行的程序中发生中断。

中断提供了一种方法来推迟或延迟当前进程,执行子例程任务,然后再次重新启动标准程序。

8051微控制器中的中断类型

让我们看看8051微控制器中的五个中断源:

  • 定时器0溢出中断-TF0
  • 外部硬件中断-INT0
  • 定时器1溢出中断-TF1
  • 外部硬件中断-INT1
  • 串行通讯中断-RI / TI

定时器和串行中断由微控制器内部产生,而外部中断由与微控制器外部连接的附加接口设备或开关产生。这些外部中断可以是电平触发或边沿触发。

当发生中断时,微控制器执行中断服务程序。因此,存储器位置对应于中断使能它。考虑下面的中断向量表中所示的与存储器位置相对应的中断。

8051单片机的中断结构

“复位”后,所有中断均被禁用,因此,所有中断均由软件启用。从所有五个中断中,如果任何一个或所有中断被激活,这将设置相应的中断标志,如图所示,该标志与8051微控制器的中断结构相对应:

所有中断都可以通过某些特殊功能寄存器来设置或清除,该特殊函数寄存器也称为中断使能(IE),它完全取决于优先级,该优先级是通过使用中断优先级寄存器执行的。

中断使能(IE)寄存器

IE寄存器用于启用和禁用中断。这是一个位可寻址的寄存器,其中必须将EA值设置为1才能使能中断。该寄存器中的各个位使能特定的中断,如定时器,串行和外部输入。考虑下面的IE寄存器,该位对应于1激活中断而0禁用中断。

中断优先级寄存器(IP)

如图所示,使用IP寄存器可以通过清除或设置中断优先级(IP)寄存器中的单个位来更改中断的优先级。它允许低优先级中断可以中断高优先级中断,但它通过使用另一个低优先级中断来禁止中断。如果未对中断的优先级进行编程,则微控制器以预定义的方式执行指令,其顺序为INT0,TF0,INT1,TF1和SI。

8051中的中断编程

  • 定时器中断编程:在微控制器中,定时器1和定时器0中断由时间寄存器位TF0和TF1产生。此计时器中断通过C代码进行的编程涉及:
    • 选择TMOD寄存器的配置及其操作模式。
    • 启用IE寄存器和其中的相应定时器位。
    • 通过使用适当的操作模式选择并加载TLx和THx的初始值。
    • 设置用于启动计时器的计时器运行位。
    • 编写计时器子例程,并在子例程末尾清除TRx的值。

    让我们看一下使用Timer0模型的计时器中断编程,以使用中断方法使LED闪烁:

    1. #include <   reg51 .h >    
    2. 比特闪烁指示灯= P2 ^ 0; // LED连接到端口2的零引脚
    3. void timer0_ISR(void)中断1 //中断号定时器0为1
    4. {
    5. 闪烁指示灯=〜闪烁指示灯; //中断时闪烁LED
    6. TH0 = 0xFC ; //将初始值加载到计时器
    7. TL0 = 0x66 ;
    8. }
    9. 无效main()
    10. {
    11. TMOD = 0x0l ; // Timer0的模式1
    12. TH0 = 0xFC ://初始值已加载到计时器
    13. TL0 = 0x66
    14. ET0 = 1 ; //使能定时器0中断
    15. TR0 = 1 ; //启动计时器
    16. 而(1); // 没做什么
    17. }

  • 外部硬件中断编程
  • 单片机8051由两个外部硬件中断组成:如上所述的INT0和INT1。这些中断在引脚3.2和3.3启用。它可以是电平触发或边沿触发。在电平触发中,引脚3.2的低电平信号使能中断,而引脚3.2的高电平至低电平跃迁使能边沿触发的中断。

    让我们看看8051微控制器的可编程功能是:

    • 使能中断允许(IE)寄存器中外部中断的等效位。
    • 如果是电平触发,则写入适合该中断的子程序,或者使能TCON寄存器中与边沿触发的中断相对应的位。

    考虑边缘触发的外部硬件中断编程是:

    1. 无效main()
    2. {
    3. IT0 = 1 ; //将中断0配置为INT0的下降沿
    4. EXO = 1 ; //启用EX0中断
    5. EA = 1 ; //启用全局中断标志
    6. }
    7. ISR_ex0(无效)中断0
    8. {
    9. <中断主体>   
    10. }

  • 串行通信中断编程当需要发送或接收数据时使用。由于传输中断(TI)和接收方中断(RI)标志都使用了一个中断位,因此中断服务程序(ISR)必须检查这些标志以了解实际的中断。 RI和TI标志的逻辑或运算导致中断,并且仅由软件清除即可。考虑串行通信中断编程中涉及的步骤:-
    • 配置中断使能寄存器以使能串行中断。
    • 配置SCON寄存器以执行传输和接收操作。
    • 为给定的中断编写一个具有适当函数的子程序。
  • 让我们看一下使用串行中断通过9600波特率通过串行端口发送“ E”的程序:

    1. 无效main()
    2. {
    3. TMOD = 0x20
    4. TH1 = 0xFD ; // 9600 bps的波特率
    5. SCON = 0x50 ;
    6. TR1 = 1;
    7. EA = 1 ;
    8. whlle(l);
    9. }
    10. ISR_Serial(void)中断4
    11. {
    12. 如果( TI == l)
    13. {
    14. SBUF =?E ?;
    15. TI = 0 ;
    16. }
    17. 其他
    18. RI = 0 ;
    19. }