中断

中断源

8051中断.png

要想使用中断 要打开源允许和总允许 EA 总中断允许位

  • 1 开放所有中断
  • 0 禁止所有中断

中断源还有相应的中断允许位

  • 1 允许相应中断源的中断
  • 0 禁止相应中断源的中断

5 个中断请求源: INT0 外部中断 0 请求,通过P3.2引脚输入 INT1 外部中断 1 请求,通过P3.3引脚输入 由 P3口引脚触发,低电平有效 用于响应外部事件,如按钮按下、传感器信号等

T0 定时器 0 溢出中断请求
T1 定时器 1 溢出中断请求 定时器溢出时触发 用于定时和周期性事件

TXD/RXD 串行口中断请求
串口发送完成(TX)或接收到数据(RX)时触发 用于8051串口通信的数据处理

编号中断源入口地址
0外部中断 00003H
1定时计数器 0000BH
2外部中断 10013H
3定时计数器 1001BH
4串行口中断0023H

相关的特殊功能寄存器

内部定时计数器 TCON

8FH8EH8DH8CH8BH8AH89H88H
TF1TR1TF0TR0IE1IT1TE0IT0
T1 溢出标志T1 运行控制T0 溢出标志T0 运行控制外部中断 INT1中断标志位INT1 外部中断触发方式控制位外部中断INT0中断标志位INT1 外部中断触发方式控制位
  • IT1=0 电平触发方式
  • IT1=1 下降沿触发方式

TF0 TF1 定时器 0 或 1 的溢出,在响应中断后自动清零 IE0 IE1 边沿激活的外部中断CPU在响应中断后,硬件自动清除有关的中断请求标志

串行口控制器 SCON

9FH9EH9DH9CH9BH9AH99H98H
SM0SM1SM2RENTB8RB8TIRI
发送中断标志接收中断标志

TI RI 需要软件清零,做好下一次发送准备

IP 寄存器 B8H 可以位寻址

PSPT1PX1PT0PX0

51 单片机有两个中断优先级——高级和低级

专用寄存器 IP 为中断优先级寄存器,用户可用软件设定

  • 相应位为 1,对应的中断源被设置为高优先级,
  • 相应位为 0,对应的中断源被设置为低优先级 系统复位时,均为低优先级

中断处理过程

中断响应、中断处理和中断返回

1. 中断响应

Interrupt Response 当一个中断事件发生时,如键盘按下、网络数据到达等,硬件设备会发送一个中断信号给处理器。 处理器接收到中断信号后,会进行中断响应

  • 识别中断源:确定是哪个设备或事件引起的中断。
  • 保护现场:保存当前程序执行的关键状态,如程序计数器(PC)、寄存器等,以便之后可以恢复执行。

2. 中断处理

Interrupt Handling 中断服务程序从中断子程序入口地址开始执行, 处理器会跳转到对应的中断服务程序 根据中断的类型执行相应的操作 直到返回指令 RETI 为止

3. 中断返回

Interrupt Return 中断返回是指中断服务完后,计算机返回到原来暂停的位置(即断点),继续执行原来的程序。

恢复现场: 执行 RETI 之前,通常需要恢复这些寄存器的原始状态(通过 POP 指令)。

RETI Return from Interrupt 专用于中断服务的指令

把断点地址取出,送回到程序计数器PC中去。 另外,它还通知中断系统已完成中断处理,将清除优先级状态触发器

  • 结束中断: RETI 指令通常在中断服务程序(ISR)的最后执行,用于告诉处理器中断服务已经完成。
  • 返回主程序: RETI 指令会从堆栈中弹出之前保存的程序计数器(PC)和其他可能的状态信息,将控制权返回给中断发生前的程序。

中断程序

ISR Interrupt Service Routine

汇编语言中断服务程序编写

使用时,通常在这些入口地址处存放一条跳转指令,使程序跳转到用户安排的中断服务程序起始地址上去

ORG 0000H   ;程序起始地址
AJMP MAIN   ;跳转到主程序
ORG 000BH   ;定时器0中断入口
AJMP INT0   ;跳转到T0中断服务子程序中
MAIN: 
	{code}
INT0:
    PUSH ACC 
    PUSH DPH 
    PUSH DPL   
    PUSH ...   ;PUSH保护现场
	{ISR}      ;中断服务子程序
	POP ...    ;恢复现场
	POP DPL 
	POP DPH 
	POP ACC
	
	RETI       ;中断返回
END

C51 中断服务程序编写

void FunctionName(void) interrupt n using nn
{
    // 中断服务程序的代码
}
  • n 为对应中断源的编号
  • ~~- using nn nn:0~3 选择当前中断服务程序使用的寄存器组,一般忽略 当前工作寄存器组由 PSW 的两位设置

设T0工作在模式2,定时时间为500us,fosc=6MHz。编程实现其定时功能。定时时间到,P1.0取反。

#include<reg51.h>
sbit P1_0=P1^0;   //千万不要漏掉这条指令
void Timer0ISR(void) interrupt 1 
	{
	   P1_0=!P1_0;
	}
	
void main(void)
{
	TMOD=0x02;  //定时器0 模式2
	TH0=0x06;
	TL0=0x06;
	EA=1;       //总中断允许
	ET0=1;      //源中断允许
	TR0=1;     //配置完成后,再启动定时器
	while(1)
	{}
}

外中断的触发方式

IT0 IT1 置 1 边沿触发 由高电平到低电平时,下降沿触发,中断一次后回到主程序

置 0 电平触发 由高电平到低电平时,到达低电平时触发中断,一直保持中断,直到电平到高电平回到主程序