个性化阅读
专注于IT技术分析

8051单片机中断

本文概述

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

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


8051微控制器中的中断类型

让我们看一下8051单片机中的五个中断源:

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

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

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

8051微控制器1的中断

8051单片机的中断结构

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

8051微控制器2的中断

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

中断使能(IE)寄存器

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

8051微控制器3中的中断

中断优先级寄存器(IP)

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

8051微控制器中的中断4

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; 
}
赞(1)
未经允许不得转载:srcmini » 8051单片机中断

评论 抢沙发

评论前必须登录!