前言
本篇文章是参考《单片机原理及应用(c语言版)第2版》杨居义·编著教材编写的笔记
认识单片机的中断系统
中断的概念
中断的作用
单片机的中断系统的基本组成
中断请求(IRQ):当中断源触发时,它会向单片机发出中断请求信号,要求暂停当前程序的执行并转去处理中断。
中断向量:每种终端源都有一种对应的中断向量号,指向该中断源的服务程序入口地址,中断向量通常保存自强中断向量表中。中断向量是一个指针表,每一个中断源有一个唯一的入口地址,处理器通过查找向量表来找到对应的服务程序。
中断控制寄存器:中断控制寄存器用于控制中断的启用、禁止、优先级等。它可以使得程序选择性地启用或禁用某些中断,设置中断的优先级,并且在发生中断时,确定是否触发中断响应。
中断服务程序(ISR, Interrupt Service
Routine):每个中断源都对应一个中断服务程序。中断服务程序用于处理该中断源引发的事件,如读取外部数据、清除中断标志等。中断服务程序是由程序员预先编写的特定代码,通常会执行一系列操作来处理中断事件。
80C51 中断系统具有五个中断源,它们是:
外部中断 0(INT0):该中断源是通过外部引脚 P3.2 触发的,可以由外部信号(如按键、传感器等)触发。外部中断 0 可以响应低电平触发或下降沿触发,具体取决于相应控制寄存器(如 TCON)的配置。
外部中断 1(INT1):该中断源是通过外部引脚 P3.3 触发的,类似于外部中断 0。外部中断 1 也可以响应低电平触发或下降沿触发,具体同样由控制寄存器(如 TCON)决定。
定时器 0 中断(Timer0):该中断源是由定时器 0(T0)溢出引发的。定时器 0 工作在定时器或计数器模式下,当定时器溢出时,会触发该中断。它常用于周期性任务的执行。
定时器 1 中断(Timer1):该中断源是由定时器 1(T1)溢出引发的。定时器 1 也有类似定时器 0 的功能,通常用于更复杂的时间控制或计数任务。
串行通信中断(Serial Interrupt):该中断源是由串行通信的接收或发送事件触发的。当串行接收到数据或完成发送时,会触发串行中断。这个中断通常用于串行数据通信的处理。
80C51 中断系统具有两个优先级,它们是:高优先级和低优先级。
这两个优先级通过中断优先级控制寄存器 IP 和 IE(中断使能寄存器)进行设置和管理。
高优先级(High Priority)
高优先级的中断源会在低优先级的中断源未响应时被立即响应。即使低优先级中断正在处理中,高优先级中断会抢占并立即处理中断请求。高优先级的中断包括外部中断 0、定时器 0 中断、外部中断 1 和定时器 1 中断。
低优先级(Low Priority)
低优先级的中断会在高优先级中断未处理完之前被挂起,直到高优先级中断处理完毕才会响应低优先级中断。串行通信中断(Serial Interrupt)通常是一个低优先级的中断。
80C51 中断系统具有四个寄存器,它们是:
TCON(定时器控制寄存器)
TCON 寄存器控制定时器和外部中断的启动、停止及相关状态。它包含了溢出标志位、启动控制位和外部中断触发方式等。
TCON 的位说明:
TF0:定时器 0 溢出标志位
TF1:定时器 1 溢出标志位
TR0:定时器 0 启动控制位
TR1:定时器 1 启动控制位
IE0:外部中断 0 标志位
IE1:外部中断 1 标志位
IT0:外部中断 0 触发方式
IT1:外部中断 1 触发方式
SCON(串行控制寄存器)
SCON 是 80C51 单片机用于控制串行通信的寄存器。它包含了控制串行通信的相关配置位,包括波特率、数据格式、启用串行口等功能。
SCON 的位说明:
TI(发送中断标志):该位为 1 时,表示串行口发送完成,可以准备下一次发送。如果该位为 0,则表示串行口正在发送数据。
RI(接收中断标志):该位为 1 时,表示串行口接收到数据,可以读取接收到的字符。如果该位为 0,则表示串行口未接收到数据。
80C51 中断系统具有四个寄存器,它们是:
IE(中断使能寄存器)
该寄存器用于控制各个中断源的使能状态。通过设置相应的位,可以启用或禁用外部中断、定时器中断、串行中断等。
IE 的位说明:
EA:全局中断使能位(1 为启用所有中断,0 为禁用所有中断)
ES:串行通信中断使能
ET1:定时器 1 中断使能
EX1:外部中断 1 使能
ET0:定时器 0 中断使能
EX0:外部中断 0 使能
IP(中断优先级寄存器)
该寄存器用于设置中断源的优先级。80C51 单片机具有两级中断优先级,可以通过此寄存器设定哪些中断为高优先级,哪些为低优先级。
IP 的位说明:
IP0:外部中断 0 优先级
IP1:定时器 0 中断优先级
IP2:外部中断 1 优先级
IP3:定时器 1 中断优先级
IP4:串行通信中断优先级
实践案例
TCON— 定时器 / 计数器控制寄存器
IE1 / IE0:外部中断 1/0 标志。I Ei = 1,外部中断 1/0 向 CPU 申请中断。
RI:串行接收中断标志 在串行口允许接收时,每接收完一个串行帧,硬件将使 RI 置位。
C 语言编写中断服务函数的格式如下:
函数类型 函数名 (形式参数列表) [interrupt n] [using m]
其中,interrupt 后面的 n 是中断编号,取值为 0~4;using 中的 m 表示使用的工作寄存器组号(如不声明,则默认用第 0 组)。
例如,定时器 T0 的中断服务函数可以用如下方法编写:
Void Time0 (Void) interrupt 1 using 0
// 定时器 T0 的中断服务函数,T0 的中断编号为 1,使用
第 0 组工作寄存器
{
…… // 中断服务程序
}
80C51 外部中断扩展
单片机仅有两个外部中断输入端。
可用两种方法扩展:
定时器 T0、T1。(工作在计数方式下)
中断和查询结合。
用定时器作外部中断源
例:将定时器 T0 扩展为外部中断源。
解:将定时器 T0 设定为方式 2(自动恢复计数初值),
TH0 和 TF0 的初值均设置为 FFH,允许 T0 中断,CPU 开放中断,
源程序如下:
TMOD=0x06;
TH0=0xff;
TL0=0xff;
TR0=1;
ET0=1;
EA=1;
…
T0 引脚每输入一个负跳变,TF0 都会置 1,向 CPU 请求中断,T0 引脚相当于边沿触发的外部中断源输入线。
中断和查询相结合
{
unsigned char i;
P1 = 0xff; // 读 P1 口引脚前先全部置 1
i = P1; // 在 P1 口引脚状态读入变量 i
i &= 0x0f; // 采用与操作屏蔽掉 i 的高 4 位
Switch (i)
}
case 0x01: exint0(); break; /调用函数 exint0 (),EXINTT0 中断服务,此处省略/
case 0x02: exint1(); break; /调用函数 exint1 (),EXINTT1 中断服务,此处省略/
case 0x04: exint2(); break; /调用函数 exint2 (),EXINTT2 中断服务,此处省略/
case 0x08: exint3(); break; /调用函数 exint3 (),EXINTT3 中断服务,此处省略/
Default: break;
}
中断系统的应用
实践案例
👇👇👇更多技术资料👇👇👇
一点通推荐
分享💬点赞👍在看❤️
以“三点”行动支持!每天中午11点28分