写在前面:本节主要学习51单片机中一个重要的单元---中断系统,这部分一定要认真学习,因为这部分没学好,就不能说学会了51单片机。本节介绍中断概念,中断系统的结构,中断相关的寄存器以及中断的使用,利用外部中断实现独立按键对LED亮灭控制。
一、中断介绍
1.1中断的概念
中断是指在CPU工作时,打断当前某个正常进行的工作,而去处理其他突发事件,等处理完突发事件后返回原来被打断地方接着继续刚才的工作。
举例:当你在学习的时候,热水器正在烧水 ,当水壶发出水开的声音;此时,你停下学习的动作,立即去关掉火,并且将热水灌回暖瓶,你又继续回去学习;这个过程就是发生了一次中断。
对于单片机来说,中断是指CPU正在处理某个事件A,发生了另一件事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU处理事件B完成后,再回到原来的事件A(断点)继续执行,这一过程称之为中断。
引起中断的根源称为中断源。在CPU中存在多个中断源,当几个中断源同时向CPU请求中断时,就存在一个CPU优先响应哪一个中断源。即规定每一个中断源有一个优先级别,CPU总是先响应优先级别高的中断请求。
中断的开启与关闭、设置启用哪一个中断都是由单片机内部一些特殊功能的寄存器来决定的,就如同IO操作,也是操作IO口寄存器实现相关的功能。
1.2中断系统的结构
在51单片机中,一定有5个基本的中断源,即外部中断0(INT0)、外部中断1(INT1)、定时/计数器0中断(T0)、定时/计数器1(T1)中断以及串口中断(UART),这也是我们经常使用的5个中断。有的单片机的中断为8个,额外增加两个外部中断,一个定时\计数器中断。
这些中断源均有两个中断优先级可供选择,可实现两级中断服务程序的嵌套。下图为51单片机均有的5个中断的中断系统结构示意图:
如上图所示:一个中断的产生与中断允许寄存器(IE)、中断优先级寄存器(IP)相关。
中断允许寄存器(IE):寄存器中的每一位对应着不同的中断源,每一位均有用户软件设置“允许”或“禁止”,相当于每一个中断源的开关。此外,在IE的最高位是一个总开关,欲使某个中断源允许中断IE的最高位需=1;
中断优先级寄存器(IP):该寄存器的每一位也对应着不同的中断源,其复位清0,会将对应中断优先级设为最低优先级,而置1将把对应的中断优先级设置为高优先级。
所谓的中断源,就是引起中断的事件;
1、(INT0):对应的是P3.2引脚的外部中断0,可由(TCON.0)选择其为低电平有效还是下降沿有效;当CPU检测到P3.2引脚时出现有效中断信息时,向CPU申请中断。
2、(INT1):对应的是P3.3引脚的外部中断0,可由(TCON.1)选择其为低电平有效还是下降沿有效;当CPU检测到P3.3引脚时出现有效中断信息时,向CPU申请中断。
3、T0:对应的是P3.4引脚;TF0(TCON.5)片内定时/计数器T0溢出中断标志位,当定时/计数器T0发生溢出时,置位TF0,向CPU申请中断。
4、T1:对应的是P3.5引脚;TF1(TCON.7)片内定时/计数器T0溢出中断标志位,当定时/计数器T1发生溢出时,置位TF1,向CPU申请中断。
5、RXD 和 TXD: 对应的是 P3.0 和 P3.1 口的附加功能,RI(SCON.0)或 TI (SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI 或 当串行口发送完一帧串行数据时置位 TI,向 CPU 申请。
1.3 中断相关寄存器
1.3.1中断允许寄存器(IE)
作用:CPU 对中断系统所有中断以及某个中断源的开放和关闭是由中断允许寄存器 IE 控制的。
其中:EA:CPU总允许,总开关位;
ES:串口中断允许位;
ET1:定时/计数器T1中断允许位;
EX1:外部中断1允许位;
ET0:定时/计数器T0中断允许位;
EX0:外部中断0允许位;
1.3.2定时/计数器控制计数器(TCON)
作用:主要用于控制两个定时/计数器溢出中断标志以及外部中断请求标志。
TF1:定时/计数器T1溢出中断请求标志位;
TF0:定时/计数器T0溢出中断请求标志位;
IE1:外部中断1中断请求标志位;
IT1:外部中断1触发方式标志位;
IE0:外部中断0中断请求标志位;
IT0: 外部中断0触发方式标志位;
1.3.3中断优先级(IP)
PS:串口中断优先级控制位;
PT1:定时/计数器T1中断优先级控制位;
PX1:外部中断1优先级控制位;
PT0:定时/计数器T0中断优先级控制位;
PX0:外部中断0优先级控制位;
若是同一种优先级,其顺序由中断系统的硬件确定。
串口控制寄存器(SCON)在后面的博客中介绍;
1.4中断的使用
CPU如何才能响应中断呢?
中断响应的条件有三个:1、中断源要有中断请求;2、中断允许位打开;3、中断总开关打开。
面对上面的三个中断条件,在使用中断时,我们需要考虑:使用哪种中断?其触发条件?希望中断干什么?以外部中断0为例;
主程序需要的中断代码:
EA=1;//打开中断总开关;
EX0=1;//打开外部中断0;
IT0=0;//设置外部中断的触发方式;
中断服务函数:
void int0() interrupt 0 // int0 是函数名,可自定义;interrupt 是一个关键字,表示 51 单片机中断,后面的“0”是中断号,外部中断 0 中断号为0.
{
//编写用户所需的功能代码
}
位寻址指的是这个寄存器中各位值可以直接调用
如:可位寻址的IE中有八位EA - ET2 ES ET1 EX1 ET0 EX0可以直接用ET2=1来操作;
不可位寻址的TMOD只能用TMOD=0x00来控制其中的各位。
不可以未开控制其中的某一位,不可以单独赋值给某一位。
二、外部中断实验
利用中断系统实现:独立按键控制LED灯的亮灭,独立按键K3连接的是外部中断0的引脚。
2.1外部中断配置
上面我们讲过,要让51单片机发生中断,必须满足3个条件,1、中断源有中断请求;2、对应中断源的中断打开;3、中断总开关(CPU开中断)。
外部中断0的配置应为:
EA=1;//打开中断总开关;
EX0=1;//打开外部中断0;
IT0=1;//设置外部中断的触发方式;
因为独立按键的一端是接地的,所以只要按下按键,对应的IO口就会被拉低,此处采用的是下降沿触发方式,即IT0=1;
2.2硬件设置
本实验用到的硬件资源为:
独立按键K3与LED(D1);
电路图如下:2
2.3源码分享
#include <REGX52.H>//包含51头文件
sbit LED1=P2^0;//定义LED1
sbit key=P3^2;//定义独立按键3
/*******************************************************************************
* 函 数 名 Delayms()
* 函数功能 : 进行延迟xms;
* 输 入 : xms
* 输 出 : 无
*******************************************************************************/
void Delayms(xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/*******************************************************************************
* 函 数 名 : exti0_init
* 函数功能 : 外部中断 0 配置函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0_init()
{
IT0=1;//跳变沿触发方式(下降沿)
EX0=1;//打开 INT0 的中断允许
EA=1;//打开总中断
}
void main()
{
exti0_init();//外部中断0配置
while(1)
{
}
}
/*******************************************************************************
* 函 数 名 : exti0() interrupt 0
* 函数功能 : 外部中断0 中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void exti0() interrupt 0 //外部中断0中断函数
{
Delayms(10);//消斗
if(key==0)//再次判断K3键是否按下
LED1=!LED1;//LED1状态翻转
}
2.4实验现象
外部中断0
总结:在此,我们将51单片机的中断概念,中断系统的结构,中断相关的寄存器以及中断的使用介绍完毕。并且利用外部中断做了独立按键控制LED灯亮灭的实验。大家学习完后一定要动作自己做一做,这样才能达到更好的掌握效果。
创作不易,还请大家多多点赞支持!!!