8051单片机中断

本文概述

  • 8051微控制器中的中断类型
  • 8051单片机的中断结构
  • 中断使能(IE)寄存器
  • 中断优先级寄存器(IP)
  • 8051中的中断编程
这是子程序调用, 由微控制器给出, 它要求其他一些具有较高优先级的程序来获取系统总线, 而不是当前正在运行的程序中发生中断。
【8051单片机中断】中断提供了一种方法来推迟或延迟当前进程, 执行子例程任务, 然后再次重新启动标准程序。
8051微控制器中的中断类型 让我们看一下8051单片机中的五个中断源:
  • 定时器0溢出中断-TF0
  • 外部硬件中断-INT0
  • 定时器1溢出中断-TF1
  • 外部硬件中断-INT1
  • 串行通讯中断-RI / TI
定时器和串行中断由微控制器内部产生, 而外部中断则由与微控制器外部连接的其他接口设备或开关产生。这些外部中断可以是电平触发或边沿触发。
当发生中断时, 微控制器执行中断服务程序。因此存储器位置对应于中断使能它。考虑下面的中断向量表中所示的与存储器位置相对应的中断。
8051单片机中断

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

文章图片
所有中断都可以通过某些特殊功能寄存器来设置或清除, 该特殊功能寄存器也称为中断使能(IE), 这完全取决于优先级, 该优先级是通过使用中断优先级寄存器执行的。
中断使能(IE)寄存器 IE寄存器用于启用和禁用中断。这是一个位可寻址的寄存器, 其中必须将EA值设置为1才能使能中断。该寄存器中的各个位使能特定的中断, 如定时器, 串行和外部输入。考虑下面的IE寄存器, 该位对应于1激活中断而0禁用中断。
8051单片机中断

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

文章图片
8051中的中断编程 定时器中断编程
:在微控制器中, 定时器1和定时器0中断由时间寄存器位TF0和TF1产生。此计时器中断通过C代码进行的编程涉及:
  • 选择TMOD寄存器的配置及其操作模式。
  • 启用IE寄存器和其中的相应定时器位。
  • 通过使用适当的操作模式选择并加载TLx和THx的初始值。
  • 设置用于启动计时器的计时器运行位。
  • 编写计时器子例程, 并在子例程末尾清除TRx的值。
让我们看一下使用Timer0模型的计时器中断编程, 以使用中断方法使LED闪烁:
#include< reg51 .h> sbit Blink Led = P2^0; // LED is connected to port 2 Zeroth pin void timer0_ISR (void) interrupt 1 //interrupt no. 1 for Timer0 { Blink Led=~Blink Led; // Blink LED on interrupt TH0=0xFC; // loading initial values to timer TL0=0x66; } void main() { TMOD=0x0l; // mode 1 of Timer0 TH0 = 0xFC:// initial value is loaded to timer TL0 = 0x66: ET0 =1; // enable timer 0 interrupt TR0 = 1; // start timer while (1); // do nothing }

外部硬件中断编程
单片机8051由两个外部硬件中断组成:如上所述的INT0和INT1。这些中断在引脚3.2和3.3启用。它可以是电平触发或边沿触发。在电平触发中, 引脚3.2的低电平信号使能中断, 而引脚3.2的高电平至低电平跃迁使能边沿触发的中断。
让我们看看8051微控制器的可编程功能是:
  • 使能中断允许(IE)寄存器中外部中断的等效位。
  • 如果是电平触发, 则写适合该中断的子程序, 或者使能TCON寄存器中与边沿触发的中断相对应的位。
考虑边缘触发的外部硬件中断编程是:
void main() { IT0 = 1; // Configure interrupt 0 for falling edge on INT0 EXO = 1; // Enabling the EX0 interrupt EA =1; // Enabling the global interrupt flag } void ISR_ex0(void) interrupt 0 { < body of interrupt> }

串行通讯中断编程
在需要发送或接收数据时使用。由于一个中断位同时用于传输中断(TI)和接收方中断(RI)标志, 因此中断服务程序(ISR)必须检查这些标志以了解实际的中断。 RI和TI标志的逻辑或运算导致中断, 并且仅由软件清除即可。考虑串行通信中断编程中涉及的步骤:-
  • 配置中断使能寄存器以使能串行中断。
  • 配置SCON寄存器以执行传输和接收操作。
  • 使用适当的功能为给定的中断编写子例程。
让我们看一下使用串行中断通过9600波特率通过串行端口发送“ E”的程序:
void main() { TMOD = 0x20: TH1= 0xFD; // baud rate for 9600 bps SCON = 0x50; TR1=1; EA=l; whlle(l); } void ISR_Serial(void) interrupt 4 { if(TI==l) { SBUF= ?E?; TI=0; } else RI =0; }

    推荐阅读