51单片机中断系统

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发出的,跟时钟频率同步
中断是在中断上下文处理,异常是在进程上下文处理。

8、什么叫不可重入函数?

可重入函数:可以被中断的函数
不可重入函数:
1、 函数体内使用了静态(static)数据结构
2、 函数体内调用malloc或者free函数
3、 函数体内调用I/O函数

9、中断和轮询哪个效率高?怎么决定是采用中断方式还是采用轮询方式去实现驱动?不会

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值