小知识点:
1.为什么要引入中断原因
一个高速主机和一个低速外设连接时,效率极低,低速外设工作时无端占用大量CPU时间。一个高速主机和多个低速外设连接时,高速主机无法进行多任务并行处理。
2.中断系统结构
断点即中断源
引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务,转去处理发生中断请求的事件,对此事件处理完后,再回到被中断的地方(即断点)继续处理原来的事务,称为中断返回。实现上述中断功能的部件称为中断系统。
80C51有5个中断源,2个优先级,可实现二级中断嵌套。
3.中断的优点
分时操作:CPU可以分时为多个外设服务,提高了计算机的利用率;
实时响应:CPU能够及时处理应用系统的随机时间,系统的实时性大大增强;
可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统的可靠性提高。
4.中断的几个环节
①中断源
②中断请求
③开放中断
④保护现场
⑤中断服务
⑥恢复现场
⑦中断返回
5.中断允许控制
CPU对中断系统所有的中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 | IE |
EX0(IE.0)]:外部中断0允许位;
ET0(IE.1):定时/计数器TO中断允许位;
EX1(IE.2):外部中断0允许位;
ET1(IE.3):定时/计数器T1中断允许位;
ES (IE.4):串行口中断允许位;
EA (IE.7):CPU中断允许(总允许)位。
6.定时器/计数器控制寄存器TCON
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | TF1 | TR1 | TF0 | TR0 | TE1 | IT1 | IE0 | IT0 |
■IT0和IT1是设置外部中断的触发方式。
■当其为0时,为低电平触发方式
■当其为1时,为负跳变触发方式。
■IE0和IE1是外部中断标志位
■其他的是定时/计数器的控制。
■TF0和TF1是定时器的中断标志。
■TR1和TR0是打开相应的定时器
7.中断优先级控制
每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字节地址:B8H | PT2 | PS | PT1 | PX1 | PT0 | PX0 | IP |
中断编号
〇PX0 (IP.0):外部中断0优先级设定位;
①PT0 (IP.1):定时/计数器T0优先级设定位;
②PX1 (IP.2):外部中断1优先级设定位;
③PT1 (IP.3):定时/计数器T1优先级设定位;
④PS (IP.4) :串行口优先级设定位;
PT2 (IP.5):定时/计数器T2优先级设定位。
8.优先级问题
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
---|---|---|---|
外部中断0(#INT0) | IE0 | 0003H | 高 |
定时/计数器0(T0) | TF0 | 000BH | 次高 |
外部中断1(#INT1) | IE1 | 0013H | 低 |
定时/计数器1(T1) | TF1 | 001B | 次低 |
串行口 | RI或TI | 0023H | 最低 |
9.中断响应条件:
1.中断源有中断请求;
2.此中断源的中断允许位为1;
3.CPU开中断(即EA=1)
三者条件必须同时满足
10.一次中断过程的完整步骤:
1、中断请求:中断事件旦发生, 中断源就提交中断请求(将中断标志位置1),欲请求CPU暂时放下目前的工作转向为该中断作专项服务。
2、中断使能:虽然中断源提交了中断请求,但是,能否得到CPU的响应,还要取决于该中断请求能否通过若干关卡送达CPU(中断使能位等于1,关卡放行),这些关卡有以下两类:此中断源的中断允许位;
全局中断允许位。
3、中断响应:如果一路放行,则CPU响应该中断请求,记录断点,跳转到中断服务程序。对于INT和TMR中断,中断响应时中断标志位会被硬件自动清零。
4、中断处理:对中断源进行有针对性的服务。
5、中断返回:返回到主程序断点处,继续执行主程序。
1、3、5由硬件自动完成。2、4是用户编程完成。
中断响应条件为1、2同时满足。
11.中断请求标记的置位和清除
外部中断
下降沿触发方式条件下,在产生中断请求时由硬件置位(置1)中断请求标记,当CPU响应中断时由硬件清除(清0)。电平触发方式条件下,中断请求标记由外部中断源控制。具体是:当CPU检测到INT引脚上出现低电平时,中断标志IE由硬件置位,INT引脚上出现高电平时,中断标志IE由硬件清除。
定时器中断
计数溢出时由硬件置位中断请求标记,当CPU响应中断由硬件清除。
串口中断
当串行口接收完一帧数据后请求中断,由硬件置位中断请求标记RI,RI必须由软件清除。当串行口发送完一帧数据后请求中断,由硬件置位中断请求标记TI,TI必须由软件清除。
12.中断服务函数
void 函数名()interrupt中断编号
{
;
}
中断具体实现代码
1.外部中断低电平触发
代码
/*外部中断低电平触发
效果:P3.2中断后,P1口接的LED灯前后四位状态调换*/
#include<reg51.h>
#include"delay.h"
void main()
{
P1=0x0f;
EX0=1; //INT0中断允许
EA=1; //开总中断
IT0=0; //触发方式为低电平触发
while(1);
}
void low()interrupt 0
{
P1=~P1;
/*
优化增加延时
delay(200);
*/
}
电路原理图
仿真结果若按键按下持续给低电平,则八个LED灯全亮,当按键松开后才会改变状态,与所想结果不符。因此可进行优化。
在中断函数的执行程序中增加延时函数,可看到持续低电平时,左右四个灯并不是全亮,而是在不停的改变状态。
2.外部中断下降沿触发
代码
/*外部中断下降沿触发
效果:按下按键,触发P3.3中断
P1口接的LED灯前后四位状态调换*/
#include<reg51.h>
void main()
{
P1=0x0f;
EX1=1; //INT1中断允许
EA=1; //开总中断
IT1=1; //触发方式为下降沿触发
while(1);
}
void jump_low() interrupt 2
{
P1=~P1;
}
电路原理图
电路图与低电平触发方式基本一样。只是将按键接到P3.3INT1中断上。
总结
经过这次中断的仿真练习,可见下降沿触发方式比低电平触发方式更加可靠,虽然按键在按的过程中可能会有抖动,但在中断中,这种情况并不能通过延时消除,但是呢,在中断中,它会自己判断必须是一个很明显的下降沿才会认为是一次中断。