MCS-51中断系统:5个中断源(两个外部中断, 两个定时器, 一个串口),2个优先级
中断相关概念
中断:当CPU正在处理某件事情时,单片机外部或内部发生的某一紧急事件请求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;
没有同级或者高级的优先级中断正在执行;
中断响应的过程
由硬件根据中断源的类型自动生成一条长调用指令LCALL addr16。
CPU执行LCALL addr16。
中断响应的时间
响应时间在3~8个机器周期之内;
最短响应时间:查询中断请求标志位(T)+LCALL(2T);
中断响应的过程
将相应优先级状态触发器置1(阻断后来同级或低级中断 )
执行硬件LCALL指令(PC入栈,中断服务程序入口址送PC)
执行中断服务程序
PS:编写中断服务程序注意:中断服务程序入口存放指令LJMP或AJMP;现场保护与现场恢复。
中断返回
最后指令为RETI,功能为:
将断点从堆栈弹送PC,CPU从原断点继续执行
将相应优先级状态触发器清0,恢复原来工作状态
8051中断程序设计
中断服务程序基本流程
1. 关中断:为了防止此时有高一级的中断进入,以免现场保护的执行过程被中断。
2. 现场保护:所谓现场是指中断时刻单片机中某些寄存器和存储器单元中的数据或状态。为了不让中断服务程序的执行破坏这数据或状态,以免中断返回后影响主程序的运行,需要将他们送入堆栈保存起来。
3. 开中断:为了允许有更高级的中断进入。这样一来,除了现场保护和现场恢复外,中断处理的过程仍允许中断嵌套的功能。
4. 中断处理
5. 关中断:为了防止此时有高一级的中断进入,以免现场恢复的执行过程被中断。
6. 现场恢复:中断处理结束后,在返回主程序前,把保存的现场的内容从堆栈中弹出,以恢复那些寄存器和存储单元中的原有内容
7. 开中断:为了允许有更高级的中断进入。现场恢复后,仍允许中断嵌套的功能。
8. 中断返回:必须是返回指令RETI。CPU执行完这条指令后,把响应中断时所置“1”的优先级状态触发器清“0”,然后从堆栈中弹出栈顶上的两个字节的断点地址送到程序计数器PC,弹出的第一个字节送入PCH,第二个字节送入PCL,CPU从断点处重新执行被中断的主程序。
实例
ORG 0000H ;程序开始
LJMP START ;= LJMP 1000H
ORG 0003H ;外部中断0入口地址
LJMP INT
ORG 1000H ;主程序入口
START: MOV P1, #0AAH ; #0AAH=10101010B
SETB EX0 ;允许外部中断0
SETB 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 ;
```
本文转自:博客园 - Ryanjie,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:https://www.cnblogs.com/ryanjan/p/8719295.html