【单片机】第六章 中断
第六章 中断
https://blog.csdn.net/chenjuan0530/article/details/71424143
https://blog.csdn.net/weixin_43548748/article/details/88054019?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6.queryctrv4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-6.queryctrv4&utm_relevant_index=13
中断的好处:
1.分时操作
2.实时响应
3.可靠性高
void main()
{
P1=0x55;//p1口初始值
EA=1;//全局中断开
EX0=1;//外部中断0开
IT0=0;//电平触发,一般写1
while(1)
{}
}
//外部中断程序
void interves(void) interrupt 0 using 1
{
P1=~P1//进入中断程序执行程序
//此时可以通过EA = 0指令暂时关掉中断
}
===========================================
6.1 单片机中断技术概述
-
中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并快速响应与及时处理。
-
如没有中断系统,单片机大量时间可能会浪费在查询是否有服务请求的定时查询操作上,即不论是否有服务请求,都必须去查询。
-
采用中断技术完全消除查询方式的等待,大大提高单片机工作效率和实时性。
6.2 AT89S52中断系统结构
-
跟8086不一样,AT89S52的中断系统有6个中断请求源(简称中断源),2个中断优先级,可实现2级中断服务程序嵌套。
-
每一中断源可用软件独立控制为允许中断或关闭中断状态;
-
每一个中断源的优先级均可用软件设置。
图6-2 AT89S52的中断系统结构
一、中断请求源(6个)
两个外部中断:
两个定时器/计数器中断请求:
(3)定时器/计数器T0计数溢出的中断请求,标志为TF0。
(4)定时器/计数器T1计数溢出的中断请求,标志为TF1。
串行口中断请求:
串行口中断请求,标志为发送中断TI或接收中断RI。
定时器/计数器T2的中断请求源
定时器/计数器T2的中断请求源,含有计数溢出(TF2)和“捕捉”(EXF2)两种中断请求标志,经或门共用一个中断向量。两种中断触发是由T2的两种不同工作方式决定的。
二、中断请求标志寄存器
6个中断请求源的中断请求标志分别由特殊功能寄存器TCON和SCON相应位锁存(见图6-2)。
1)TCON
-
这个寄存器的功能是什么?
为定时器/计数器的控制寄存器。说白了就是控制定时器的启、停,标志定时器溢出和中断情况。
-
几位的寄存器?
-
能够位寻址吗?地址是多少?
可以位寻址。字节地址为88H。D0为88H,到D7为8FH.
-
内部各位分别代表什么?
既包括定时器/计数器T0、T1溢出中断请求标志位TF0和TF1
也包括两个外部中断请求的标志位IE1与IE0
还包括两个外部中断请求源的中断触发方式选择位
TF1 :TF1=1表示T1有中断产生。(Timer Flag,定时器标志位)
当启动T1计数后,T1从初值开始加1计数,当最高位产生溢出时(产生中断),硬件 置TF1为“1”,向CPU申请中断,响应TF1中断时,TF1标志硬件自动清“0”,TF1也可由软件清“0”。
TR1 :TR1=1表示T1开始运行。(单片机中T0引脚,需要高低电平的驱动)
TF0 :TF0=1表示T0有中断产生。
TR0 :TR0=1表示T0开始运行。(单片机中T1引脚,需要高低电平的驱动)
IE1 :IE1=1表示INT1有中断产生。
IT1 :IT1=1表示INT1为下降沿触发,IT1=0表示INT1为低电平触发。
IE0 :IE0=1表示INT0有中断产生。
IT0 :IT0=1表示INT0为下降沿(负跳变)触发,IT0=0表示INT0为低电平触发。
-
如果复位后TCON是什么样的?
当AT89S52复位后,TCON被清“0”,6个中断源的中断请求标志均为0。
TR1(D6位)、TR0(D4位)这2位与中断系统无关,仅与定时器/计数器T1和T0有关,将在第7章定时器/计数器中介绍。
- SCON寄存器
-
这个寄存器的功能是什么?
串口控制寄存器,跟TCON 应该是差不多的功能。
-
几位的寄存器?
8位
-
能够位寻址吗?地址是多少?
字节地址为98H,可位寻址。
-
内部各位分别代表什么?
(1)TI—串口发送中断请求标志位。发送中断标志位。CPU将1字节的数据写入串口的发送缓冲器SBUF时,就启动一帧串行数据的发送,每发送完一帧串行数据,硬件使TI自动置“1”。CPU响应串口发送中断时,并不清除TI中断请求标志,TI标志必须在中断服务程序中用指令对其清“0”。
(2)RI—串行口接收中断请求标志位。接收中断标志位。在串口接收完一个串行数据帧,硬件自动使RI中断请求标志置“1”。CPU在响应串口接收中断时,RI标志并不清“0”,须在中断服务程序中用指令对RI清“0”。
3)定时器2的控制寄存器T2CON
-
这个寄存器的功能是什么?
控制定时器2
-
几位的寄存器?
8位
-
内部各位分别代表什么?
T2CON中的最高两位为定时器/计数器T2的中断请求标志位TF2和EXF2。
(1)TF2(D7):TF2=1表示T2有中断产生。当T2的计数器(TL2、TH2)计数计满溢出回0时,由内部硬件置位TF2(寄存器T2CON.7),向CPU发出中断请求。
但是当RCLK位或TCLK位为1时将不予置位。本标志位必须由软件清0。
(2)EXF2(D6):
- 当由引脚T2EX(P1.1脚)上的负跳变引起“捕捉”或“重新装载”且EXEN2位为1,则置位EXF2标志位(寄存器T2CON.6),向CPU发出中断请求。
- 上述两种中断请求,在满足中断响应条件时,CPU都将响应其中断请求,转向同一个中断向量地址进行中断处理。
- 因此,必须在T2的中断服务程序中对TF2和EXF2两个中断请求标志位进行查询,然后正确转入对应的中断处理程序。------------重要
- 中断结束后,中断请求标志位TF2或EXF2必须由软件清0。
三、中断允许与中断优先级的控制
中断允许(inter)
-
中断允许由什么寄存器控制?
IE(interrupt enable)
IE寄存器
各中断源开放或屏蔽,是由片内中断允许寄存器IE控制。
IE字节地址为A8H,可进行位寻址
-
IE对中断开放和关闭实现两级控制。两级控制就是有一个总的中断开关控制位EA(IE.7位)
EA:
=0,关中断,所有中断请求被屏蔽,CPU对任何中断请求都不接受;
=1,开中断,但5个中断源的中断请求是否允许,还要由IE中的低6位所对应的6个中断请求允许控制位的状态来决定(见图6-6)。
-
各位的功能。D7是总的中断,D5-D0顺序个中断
(1)EA—中断允许总开关控制位。
EA=0,所有的中断请求被屏蔽。 EA=1,所有的中断请求被开放。
(2)ES—串行口中断允许位。
ES=0,禁止串行口中断。 ES=1,允许串行口中断。
(3)ET1—定时器/计数器T1溢出中断允许位。
ET1=0,禁止T1溢出中断。 ET1=1,允许T1溢出中断。
(4)EX1—外部中断1中断允许位。
EX1=0,禁止外部中断1中断。 EX1=1,允许外部中断1中断。
(5)ET0—定时器/计数器T0的溢出中断允许位。
ET0=0,禁止T0溢出中断。
ET0=1,允许T0溢出中断。
(6)EX0—外部中断0中断允许位。
EX0=0,禁止外部中断0中断。
EX0=1,允许外部中断0中断。
(7)EX0——外部中断0中断允许位。
EX0=0,禁止外部中断0中断。
EX0=1,允许外部中断0中断。 -
复位时候,该寄存器会怎样?
AT89S52复位以后,IE被清“0”,所有的中断请求被禁止。
-
关于中断的例题
单片机复位后,若允许两个外中断源中断,并禁止其他中断源的中断请求,请编写设置IE的命令语句。
(1)采用对IE寄存器进行位操作。 { …… EA=1; //总中断允许 EX0=1; //允许外部中断0中断 EX1=1; //允许外部中断1中断 IT0=1; //设置外部中断0为跳沿触发 IT1=1; //设置外部中断1为跳沿触发 …… } 由于单片机复位后,IE寄存器各个位均为0,所以只需要把允许中断的中断源设置为1即可。 (2)采用对IE寄存器和TCON寄存器进行字节操作。 { …… IE=0x05; //允许两个外中断中断 TCON=0x05; //允许两个外中断均为跳沿触发 …… }
中断优先级
- 中断请求源有两个中断优先级,每一个中断请求源可由软件设置为高优先级中断或低优先级中断,也可实现两级中断嵌套。
- 所谓两级中断嵌套,就是AT89S52正在执行低优先级中断的服务程序时,可被高优先级中断请求所中断,待高优先级中断处理完毕后,再返回低优先级中断服务程序。
- 两级中断嵌套
(1)低优先级可被高优先级中断,高优先级不能被低优先级中断。
(2)任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它的同级中断源所中断。
-
AT89S52片内有一个中断优先级寄存器IP,字节地址为B8H,可位寻址。
中断优先级寄存器IP各位含义:
(1)PT2—T2中断优先级控制位
1—T2中断为高优先级;0—T2中断为低优先级
(2)PS—串行口中断优先级控制位,1—高级;0—低级。
(3)PT1—T1中断优先级控制位,1—高级;0—低级。
(4)PX1—外部中断1中断优先级控制位,1—高级;0—低级。
(5)PT0—T0中断优先级控制位,1—高级;0—低级。
(6)PX0—外部中断0中断优先级控制位,1—高级;0—低级。
-
复位后
AT89S52复位后,各中断源均为低优先级中断。IP内容为001
-
AT89S52的中断优先级结构
- 中断系统有两个不可寻址的“优先级激活触发器”,其中一个指示某高优先级中断正在执行,所有后来中断均被阻止;
- 另一个触发器指示某低优先级中断正在执行,所有同级中断都被阻止,但不阻断高优先级的中断请求。
-
例题
【例6-2】设置IP寄存器,使AT89S52的两个外中断请求为高优先级,其他中断源的中断请求为低优先级。
{ …… IP=0x05; …… }
四、响应中断的条件
中断总允许
有中断请求
中断允许
无同级或更高级中断正在被服务。
-
中断响应的过程
- 首先由硬件自动生成一条长调用指令“LCALL addr16”。即程序存储区中相应的中断入口地址。
例如,对于外部中断1的响应,硬件自动生成的长调用指令为:
LCALL 0013H-
生成LCALL指令后,紧接着就由CPU执行该指令。
-
首先将程序计数器PC内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序转向响应中断请求的中断入口地址。
各中断源服务程序入口地址是固定的,见表6-2。
其中两个中断入口间只相隔8字节,一般情况下难以安放一个完整的中断服务程序。
因此,通常总是在中断入口地址处放置一条无条件转移指令,使程序执行转向在其他地址存放的中断服务程序入口。
五、 外部中断的响应时间
-
外中断最短响应时间为3个机器周期。
其中中断请求标志位查询占1个机器周期,而这个机器周期恰好处于指令的最后一个机器周期。
在这个机器周期结束后,中断即被响应,CPU接着执行1条硬件子程序调用指令LCALL以转到相应的中断服务程序入口,这需要2个机器周期。
-
外部中断响应最长时间为8个机器周期。
这种情况发生在CPU进行中断标志查询时,刚好才开始执行RETI或访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断。
执行上述的RETI或访问IE或IP的指令,最长需要2个机器周期。而接着再执行1条指令,按最长的指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。再加上硬件子程序调用指令LCALL的执行,需要2个机器周期,所以,外部中断响应的最长时间为8个机器周期。
-
如已在处理同级或更高级中断,外部中断请求响应时间取决于正在执行的中断服务程序的处理时间,此情况下,响应时间无法计算。
-
这样,在单一中断系统里,AT89S52 对外部中断请求响应时间总是在3~8个机器周期间。
六、外部中断的触发方式选择
外部中断有两种触发方式:电平触发方式和跳沿触发方式。
-
电平触发方式
- 若外中断定义为电平触发方式,外部中断申请触发器状态随着 CPU 在每个机器周期采样到的外部中断输入引脚电平变化而变化,这能提高CPU对外部中断请求的响应速度。
- 当外部中断源被设定为电平触发方式时,在中断服务程序返回之前,外部中断请求输入必须无效(即外部中断请求输入已由低电平变为高电平),否则CPU返回主程序后会再次响应中断。
- 所以电平触发适合于外部中断以低电平输入且中断服务程序能清除外部中断请求源(即外部中断输入电平又变为高电平)的情况。
- 如何清除电平触发的外部中断请求源的电平信号,本章后将介绍。
-
跳沿触发方式
- 外部中断若定义为跳沿触发方式,外部中断申请触发器能锁存外部中断输入线上的负跳变。
- 即便是CPU暂时不能响应,中断请求标志也不会丢失。在这种方式下,如果相继连续两次采样,一个机器周期采样到外部中断输入为高,下一机器周期采样为低,则中断申请触发器置“1”,直到CPU响应此中断时,该标志才清“0”,这样就不会丢失中断,但输入的负脉冲宽度至少要保持1个机器周期(若晶振频率为6MHz,则为2s),才能被CPU采样到。
- 外部中断的跳沿触发方式适合于以负脉冲形式输入的外部中断请求。
七、中断请求的撤销
-
定时器/计数器T1、T0中断请求的撤销
定时器/计数器T1、T0中断的中断请求被响应后,硬件会自动把中断请求标志位(TF0或TF1)清“0”,因此定时器/计数器T1、T0中断请求是自动撤销的。
-
外部中断请求的撤销
(1)跳沿方式外部中断请求的撤销
- 中断请求撤销两项内容:中断标志位清“0”和外中断信号的撤销。
- 其中,中断标志位(IE0或IE1)清“0”是在中断响应后由硬件自动完成的。
- 而外中断请求信号的撤销,由于跳沿信号过后也就消失了,所以跳沿方式的外部中断请求也是自动撤销的。
(2)电平方式外中断请求撤销
- 中断请求标志自动撤销,但中断请求信号低电平可能继续存在,在以后的机器周期采样时,又会把已清“0”的IE0或IE1标志位重新置“1”。
- 要彻底解决电平方式外部中断请求撤销,除标志位清“0”之外,还需在中断响应后把中断请求信号输入引脚从低电平强制改变为高电平。为此,可增加图6-9所示电路。
- 由图6-9,D触发器锁存外来的中断请求低电平,并通过其输出端Q接到(INT0或INT1)。所以,增加的D触发器不影响中断请求。
- 中断响应后,为撤销中断请求,可利用D触发器直接置“1”SD端实现,即把SD端接AT89S51的P1.0。
- 因此,只要P1.0端输出一个负脉冲就可以使D触发器置“1”,从而就撤销低电平的中断请求信号。负脉冲可在中断服务程序中先P1.0置1,再让P1.0为0,再把P1.0置1。
-
串行口中断请求的撤销
- 只有标志位清“0”的问题。串行口中断标志位是TI和RI,但对这两个中断标志CPU不自动清“0”。
- 因为响应串口中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位来判定,然后才清除。
- 所以串口中断请求撤销只能使用软件在中断服务程序中把串行口中断标志位TI、RI清0。
-
定时器/计数器T2中断请求的撤销
定时器/计数器T2的中断请求包括两种:TF2和EXF2。
上述两种中断请求,在满足中断响应条件时,CPU都将响应其中断请求,转向同一个中断入口地址。
因此,必须在T2的中断函数中对TF2和EXF2两个中断请求标志位进行查询,然后正确转入对应的中断处理程序。
中断结束后,中断请求标志位TF2或EXF2必须由软件清0。
定时器/计数器T2中断请求的撤销只能使用软件的方法,在中断函数返回前完成。