MCS-51中断系统:5个中断源(2个外部中断、2个定时器、1个串口)、2个优先级
中断相关概念
中断:当CPU正在处理某件事时,MCU 外部或内部发生紧急事件,请求CPU立即处理。因此,CPU暂时挂起当前的工作,转入处理紧急情况,处理完成后,返回到上次中断的地方,继续原来的工作。
中断过程
中断发生:CPU正在处理一个事件A的同时,另一个事件B发生,需要CPU快速处理;
中断响应和中断服务:CPU暂时中断当前工作,转入处理事件B(B的优先级高于A);
中断返回:CPU处理完事件B后,会返回到事件A被中断的地方继续处理事件A;
中断源(中断请求源):可以向CPU发出中断请求的组件。
中断系统结构
外部中断0和1:低电平或脉冲下降沿时产生中断请求;
定时器/计数器0和1:当计数值由FF变为00时产生中断请求; (计时功能:计数脉冲来自片内;计数功能:计数脉冲来自片外);
串口:发送或接收1字节数据时产生中断请求;
中断控制
4个特殊功能寄存器实现中断控制: • 中断使能寄存器IE • 中断优先级寄存器IP • 定时器/计数器和外部中断控制寄存器TCON • 串口控制寄存器SCON
中断使能寄存器 IE
EA 中断使能主控制位。 0 禁止,1 允许。
ES串行中断使能控制位。 0 禁止,1 允许。
ET1 定时器计数器1 中断使能控制位。 0 禁止,1 允许。
EX1 外部中断1使能控制位。 0 禁止,1 允许。
ET0 定时器计数器0 中断使能控制位。 0 禁止,1 允许。
EX0 外部中断0 使能控制位。 0 禁止,1 允许。
中断优先级寄存器 IP
PX0 外部中断0优先级控制位。1为高,0为低
PT0是定时器中断0的优先级控制位。1为高,0为低
PX1外部中断1优先级控制位。1为高,0为低
PT1定时器中断0优先级控制位。1为高,0为低
PS串行中断优先级控制位。 1 为高,0 为低
串口控制寄存器SCON
TI:串口发送中断标志。响应中断时,用软件清除TI标志
RI:串口接收中断标志。响应中断时,用软件清除RI标志
定时器/计数器控制寄存器 TCON
外部中断触发模式位 IT0、IT1 (ITx)
ITx=0低电平触发,IEx响应中断后不会自动清0。 ITx=1脉冲下降沿触发,IEx响应中断后会自动清0。
外部中断请求0/1的中断请求标志位IE0和IE1
定时器/计数器 T0/T1 溢出中断请求标志 TF0/TF1(TFx)
开始T0/T1计数后,从初始值开始加1,直到最高位溢出,硬件将TFx设置为“1”,并向CPU请求中断。响应中断后TFx自动清0;
TR0、TR1与中断无关,只与定时器/计数器T0/T1有关;
中断响应
中断响应是CPU对中断源发出的中断请求的响应。
中断响应条件
CPU开启中断,即中断使能寄存器IE中的中断使能通用控制位EA=1;中断源发出中断请求;中断源的中断使能位为1;没有相同级别或更高优先级的中断正在执行;
中断响应流程
硬件根据中断源类型自动生成长调用指令LCALLaddr16。 CPU 执行LCALL addr16。
中断响应时间
响应时间在3~8个机器周期内;最短响应时间:查询中断请求标志位(T)+LCALL(2T);
中断响应流程
将相应的优先级状态触发器设置为1(阻止后续同级或更低级别的中断)并执行硬件LCALL指令(将PC压入堆栈并将中断服务程序的入口地址发送给PC)。执行中断服务程序 PS:编写中断服务程序。注:中断服务程序入口存储指令LJMP或AJMP;现场保护和现场恢复。
中断返回
最后一条命令是RETI,功能是:
将断点从堆栈中弹出到PC,CPU将从原来的断点处继续执行,将相应的优先级状态触发清除为0,恢复原来的工作状态
8051中断编程
中断服务程序基本流程
关闭中断:为了防止此时更高级别的中断进入,现场保护的执行过程不会被中断。
现场保护:所谓现场是指中断时单片机内某些寄存器和存储单元中的数据或状态。为了防止中断服务程序的执行破坏这些数据或状态,以免影响中断返回后主程序的运行,需要将它们送入堆栈存储。
打开中断:允许更高级别的中断进入。这样,中断处理过程除了场景保护和场景恢复外,仍然允许中断嵌套功能。
中断处理
关闭中断:为了防止此时更高级别的中断进入,现场恢复的执行过程不会被打断。
现场恢复:中断处理完成后,返回主程序之前,将保存的现场内容从堆栈中弹出,恢复那些寄存器和存储单元中原来的内容
打开中断:允许更高级别的中断进入。场景恢复后,仍然允许中断嵌套函数。
中断返回:必须是返回指令RETI。 CPU执行完这条指令后,将响应中断时设置为“1”的优先级状态触发器清为“0”,然后将栈顶的两字节断点地址从堆栈中弹出并将其发送到程序计数器PC。 ,弹出的第一个字节发送到PCH,第二个字节发送到PCL,CPU从断点处重新执行被中断的主程序。
示例
ORG 0000H ;程序开始 LJMP START ;= LJMP 1000HORG 0003H ;外部中断0入口地址
LJMP INTORG 1000H;主程序入口START:MOV P1,#0AAH; #0AAH=10101010BSETB EX0;允许外部中断 0SETB PX0;设置外部中断0为高优先级SETB IT0;设置外部中断0为脉冲下降沿触发SETB EA;打开中断SJMP$;原地跳跃,等待中断
INT:CLR EA;关闭PUSH PSW中断;现场保护 PUSH ACC ; SETB EA;打开中断
CPL A ;累加器 A 按位取反 MOV P1, A ;将累加器 A 的值发送到 P1端口
CLR EA;关闭POP ACC中断;现场保护POP PSW; SETB EA;打开中断RETI;```
-->