8051中断系统

说明

前置知识:中断


中断源

8051中断.png

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

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

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

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

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

编号 中断源 入口地址
0 外部中断 0 0003H
1 定时计数器 0 000BH
2 外部中断 1 0013H
3 定时计数器 1 001BH
4 串行口中断 0023H

相关的特殊功能寄存器

内部定时计数器 TCON

8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
TF1 TR1 TF0 TR0 IE1 IT1 TE0 IT0
T1 溢出标志 T1 运行控制 T0 溢出标志 T0 运行控制 外部中断 INT1中断标志位 INT1 外部中断触发方式控制位 外部中断INT0中断标志位 INT1 外部中断触发方式控制位

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

串行口控制器 SCON

9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0 SM1 SM2 REN TB8 RB8 TI RI
发送中断标志 接收中断标志

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

IP 寄存器 B8H
可以位寻址

PS PT1 PX1 PT0 PX0

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

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

中断处理过程

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

1. 中断响应

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

2. 中断处理

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

3. 中断返回

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

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

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

把断点地址取出,送回到程序计数器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
{
    // 中断服务程序的代码
}

设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 电平触发
由高电平到低电平时,到达低电平时触发中断,一直保持中断,直到电平到高电平回到主程序