中断系统
📔前言
今天复习📚了以下中断系统与定时器,复习中也到一些知识有了更加深入的理解💪下面分两篇文章梳理😝一下51单片机的中断系统和定时器
🔣概念
中断与中断系统
- 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
- 当中央处理器CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断 。实现这种功能的部件称为中断系统 ,请示CPU中断的请求源称为中断源。
中断的优先级
中断的优先级别与中断嵌套
- 微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别 。CPU总是先响应优先级别最高的中断请求。
- 当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够皙停对原来中断源的程序服务,转而去处理级别更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
51单片机中断优先级的四条原则
- CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。
- 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。
- 正在进行的低优先级中断服务,能被高优先级中断请求所中断。
- 当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
为了实现上述后两条原则,二级中断的中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。
STC89C52系列单片机中断系统具有四个优先级。由低到高分别为优先级0、优先级1、优先级2、优先级3。
STC89C52的中断资源
-
具有8个中断源。 INT0 (外部中断0)、Timer0 (定时器0中断)、INT1 (外部中断1)、Timer1 (定时器1中断)、UART (串口中断)、Timer2 (定时器2中断)、INT2 (外部中断2)、INT3(外部中断3)
-
具有四个优先级。由低到高分别为优先级0、优先级1、优先级2、优先级3。
-
中断号:
- 注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等
STC89C52的中断系统结构
中断结构
中断触发条件
STC89C52的中断相关寄存器
- 寄存器是连接软硬件的媒介
- 在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式
- 寄存器相当于一个复杂机器的"操作按钮"
中断允许寄存器IE和XICON
- 简单说就是中断的开关
- EA 为总开关 ET0 为定时/计数器0的开关 ,ES 为串行口中断开关,EX0 为外部中断0的开关
- 置1表示打开 ;置0表示关闭
- 因为TSC89C52有8个中断源,还有还有两个中断源的开关在辅助中断控制寄存器XICON
定时/计数器中断控制寄存器TCON
- IT0 控制外部中断0的触发方式【置0:为低电平触发方式;置1为下降沿触发方式】
- IE0 为外部中断0中断请求标志位 【硬件置1,硬件置0,可查询】
- TF0 为定时/计数器0中断请求标志位【硬件置1,硬件置0,可查询】
还有优先级别的相关寄存器这里就不写了,数据手册里面写得非常清楚
中断相应条件
- 中断源有中断请求;【硬件将中断请求标志位置1】
- 此中断源的中断允许位为1;【中断开关打开】
- CPU开中断(即EA=1);【中断总开关打开】
实验:外部中断0控制LED状态
让 LED 1~7实现流水灯 而K3控制 LED 8的状态
c
#include <REGX52.H>
sbit K3=P3^2;
sbit LED=P2^7;
void delay(unsigned int i) //延时函数,i=1,大约延时10us
{
while(i--);
}
void INT0_Init() //外部中断0初始化
{
IT0=1; //设置为下降沿触发方式
EX0=1; //打开INT0的中断允许
EA=1; //打开总中断开关
}
void main()
{
INT0_Init();
while(1)
{
P2_0 = 0;
delay(50000);
P2_0 = 1;
P2_1 = 0;
delay(50000);
P2_1 = 1;
P2_2 = 0;
delay(50000);
P2_2 = 1;
P2_3 = 0;
delay(50000);
P2_3 = 1;
P2_4 = 0;
delay(50000);
P2_4 = 1;
P2_5 = 0;
delay(50000);
P2_5 = 1;
P2_6 = 0;
delay(50000);
P2_6 = 1;
}
}
void INT0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(K3==0)
{
LED=~LED;
}
}