1、中断介绍
我们先来举一个生活事例: 你打开火,烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。
对于单片机来讲,中断是指CPU在处理某一事件A时,发生了另一件事B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程中称为中断。
中段请求:
中断响应:
中断返回:
中断执行顺序是中断优先级。
单片机在执行程序时其程序流程图:
中断嵌套:类似递归。
优点:
分时操作:CPU 可以分时为多个 I/O 设备服务,提高了计算机的利用
实时响应:CPU 能够及时处理应用系统的随机事件,系统的实时性大大增
强
可靠性高:CPU 具有处理设备故障及掉电等突发性事件能力,从而使系统
可靠性提高。
2、中断结构及相关寄存器
STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断0(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。(注意:51 系列单片机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我们使用的都是基本的 5 个中断:INT0、INT1、定时器 0/1,串口中断)
学会查看芯片手册查看中断数量以及类型
学会查看中断数量类型以及中断优先级
中断连接的端口
2.1、内部结构框图:
IE:Interrupt enable
IP:Interrupt priority
EA:Enable all
EX:Enable exterior
ES:Enable serial
从该图中看出什么?
1、外部中断0 通过TCON寄存器中IT0控制位,采取下降沿中断(1)还是低电平中断(0)出现有效中断信号时,IE0请求标志位置1。IE寄存器中总中断EA打开,EX0外部中断允许位打开。PX0打开,传入CPU中断队列中。
2、定时器中断T0 通过TCON寄存器TF0,片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,IE寄存器中总中断打开ET0定时器中断允许打开。PX0打开,传入CPU中断队列。
3、RI或TI,串行口中断请求标志。当串行口接受完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位Ti,向CPU请求中断。
2.2、中断寄存器
IE:中断允许寄存器
EX0(IE.0):外部中断0允许位;
ET0(IE.1):定时/计数器T0中断允许位;
EX1(IE.2):外部中断1允许位;
ET1(IE.3):定时/计数器T1中断允许位;
ES(IE.4):串口中断允许位;
EA(IE.7):CPU中断允许(总允许)位。
TCON:中断请求标志寄存器
IT0(TCON.0):外部中断0触发方式控制位,当IT0 = 0时,为电平触发方式,当IT0 = 1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1):外部中断0中断请求标志位;
IT1(TCON.2):外部中断1触发方式控制位;
IE1(TCON.3):外部中断1中断请求标志位;
TF0(TCON.5):定时/计数器T0溢出中断请求标志位;
TF1(TCON.7):定时/计数器T1溢出中断请求标志位;
中断满足的条件以及使用
中断响应条件:
1、CPU中断(总中断EA)打开
2、有效中断请求信号
3、此处中断源的中断允许位为1
使用中断我们需要做什么?
1、你想使用的中断是哪个?选择相应的中断号 (有多个中断时,根据任务的优先级/根据中断做什么,选择中断号)
2、你所希望的触发条件是什么?
3、中断之后做什么
总结:1、中断初始化;2、中断所需实现功能
//以外部中断0为例子
EA = 1 //总中断打开
EX0 = 1 //外部中断0允许位打开
ITO = 0/1 //设置外部中断的触发方式,选择中断请求的是低电平还是下降沿中断
//中断服务函数
void int0() interrupt 0
{
//编写用户所需的功能代码
}
3、外部中断实验
实现功能:使用独立按键K3控制LED亮灭,K3连接外部中断0(p3.2)管教。
3.1、外部中断介绍
外部中断0和外部中断1
中断号
3.2、外部中断配置
//初始化
void exti_init()
{
EA = 1; //总中断打开
EX0 = 1; //外部中断0开关打开
IT0 = 1; //设置外部中断0的触发方式
}
void int0()interrupt 0
{
if (KEY3 == 1)
{
LED1 = !LED1;
}
}
3.3、硬件设计
3.4、软件设计
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//定义LED1端口
LED1 = P2^0;
//K3按键端口
K3 = P3^2;
//延时函数,按键消抖用,最好用定时器处理
void delay()
{}
//外部中断0初始化
void exti0_init()
{
EA = 1 //IE寄存器中总中断EA打开
EX0 = 1 //IE寄存器中外部中断0 EX0打开
IT0 = 1 //外部中断0的触发方式 下降沿触发
}
void main()
{
exti0_init();
while (1)
{
}
}
void int0() interrupt 0
{
delay()
if (KEY3 == 1)
{
LED1 = !LED;
}
}
3.5、面试问题
单片机没有操作系统,中断处理函数不能有输入参数也不能有函数返回。
1、什么是中断?
当程序A正在执行时,(谁检测到了中断信号)检测到有效中断信号(中断请求),CPU会执行程序B,CPU执行完程序B后(中断服务),返回中断请求处的位置(中断返回),这个过程叫中断。
2、中断响应执行流程?
优先执行高优先级的中断
3、中断的触发方式
外部中断有低电平和下降沿两种方式。
低电平:
下降沿:
4、中断优先级有哪些?
外部中断0
定时/计数器0
外部中断1
定时/计数器1
串口中断
5、写一个中断服务需要注意哪些?
1、中断初始化时,要确定相关寄存器中的中断开关打开
2、中断函数不能有输入参数和函数返回,以及中断号
6、哪些函数不能在中断中使用?
使用硬件资源的函数 比如printf
使用全局内存分配表 比如malloc free
7、中断和异常的区别
产生源不同,中断是硬件资源触发,异常是CPU发出的
中断时异步的,可以随时触发,异常是由CPU发出的,跟时钟频率同步
中断是在中断上下文处理,异常是在进程上下文处理。文章来源:https://www.toymoban.com/news/detail-446688.html
8、什么叫不可重入函数?
可重入函数:可以被中断的函数
不可重入函数:
1、 函数体内使用了静态(static)数据结构
2、 函数体内调用malloc或者free函数
3、 函数体内调用I/O函数文章来源地址https://www.toymoban.com/news/detail-446688.html
9、中断和轮询哪个效率高?怎么决定是采用中断方式还是采用轮询方式去实现驱动?不会
到了这里,关于51单片机中断系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!