单片机中断系统
-
CPU在处理某一事件A时,发生了另一个事件B请求CPU迅速去处理(中断发生)。
-
CPU暂时中断当前的工作,转去处理事件B(中断相应和终端服务)。
-
待CPU将事件B处理完毕后,再回到原来的事件A被中断的地方继续处理事件A(中断返回)。
以上过程就成为 中断。
89C51/52 的中断系统有五个中断源(引起CPU终端的根源),两个优先级,可以实现二级中断嵌套(中断函数中又有一个中断函数)。
使用中断需要做什么
- 你想使用的中断是哪一个?选择相应的中断号;
- 你所希望的触发条件是什么?
- 你希望在中断中干什么?
中断源
单片机中有五种中断系统:
| 中断源符号 | 名称 | 中断引起的原因 | 中断号 |
|---|---|---|---|
/INT0 | 外部中断0 | P2.3引脚低电平或下降沿信号 | 0 |
T0 | 定时器0中断 | 定时/计数器0计数回0溢出 | 1 |
/INT0 | 外部中断1 | P3.3引脚低电平或下降沿信号 | 2 |
T1 | 定时器1中断 | 定时/计数器1计数回0溢出 | 3 |
TI/RI | 串行口中断 | 串行口通信完成一帧数据发送或接收引起中断 | 4 |
中断优先级
同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如下表所示:
| 中断源 | 中断标志 | 终端服务程序入口 | 优先级顺序 |
|---|---|---|---|
| 外部中断0 | IE0 | 0003H | 高 |
| 定时/计数器0 | TF0 | 000BH | ⬇ |
| 外部中断1 | IE1 | 0013H | ⬇ |
| 定时/计数器1(T1) | TF1 | 001BH | ⬇ |
| 串行口 | RI或TI | 0023H | 低 |
中断优先级的三条原则
- CPU 同时接收到几个中断时,首先相应优先级别最高的中断请求。
- 正在进行的中断过程不能被新的同级或者低优先级的中断请求所中断。
- 正在进行的低优先级终端服务,能被高优先级的中断请求所中断。
中断相应条件
- 中断源有中断请求;
- 此中断源的中断允许位为 1;
- CPU开中断(即:EA=1)。
以上三条同时满足时,CPU 才有可能响应中断。
外部中断书写格式
主程序中需要有一下代码:
EA=1; // 打开总中断开关
EX0=1; // 开外部中断 0
IT0=0/1 // 可以等于0或者等于1,等于0表示低电平触发,1 表示下降沿触发
中断服务函数
// 没有返回值的中断函数
void int0 () interrupt 0 using 1{
// do anything that you want
}
/*
interrupt 0 表示你的中断号(中断号是0时就是外部中断0)
using 1 是固定格式,也可以不写(省略)。
*/
下面的代码编写了一个中断案例,当按钮按下时,控制LED灯的亮灭。
#include <reg52.h>
sbit led = P2^0;
sbit k3 = P3^2;
void delay(u16 i){
while(i --);
}
// 初始化中断响应条件
void Int0Init(){
IT0 = 1;
// 下降沿触发
EX0 = 1;
EA = 1;
}
void main(){
Int0Init();
while(1);
}
// 中断函数
void Int0() interrupt 0{
delay(1000);
// 按下按钮后指示灯亮/灭
if(k3 == 0){
led = ~led;
}
}
外部中断 1
外部中断 1 的书写格式与外部中断 0 类似。
IT1 = 1;
// 下降沿触发
EX1 = 1;
EA = 1;
void Int1() interrupt 1{
// ...
}
定时器和计数器
51单片机有两组定时/计数器,因为既可以定时,又可以计数。
定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要 CPU 参与。
51单片机的定时/计数器是根据机器内部的时钟或者外部的脉冲信号对寄存器中的数据 加1。
有了定时/计数器之后,一些简单的重复加1的工作可以交给定时/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确的定时作用。因此 如果想要实现一个秒表或者时钟的话,可以使用单片机当中的定时/计数器。
CPU时序
- 振荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加振荡周期,由外部晶振所产生)
- 状态周期:2 个振荡周期为一个状态周期,用 S 表示。振荡周期又称 S 周期或时钟周期
- 机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期;
- 指令周期:完成一条指令所占用的全部时间,它以机器周期为单位。
例如:外部晶振为 12MHz 时,51 单片机相关周期的具体值为:
- 振荡周期 = 1/12us;
- 状态周期 = 1/6us(两个振荡周期为一个状态周期);
- 机器周期 = 1us(一个机器周期含 6 个状态周期);
- 指令周期 = 1~4us;
原理
定时/计数器的实质是加1计数器(16位),由高八位和第八位两个寄存器THX 和 TLX 组成。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、T1的启动和停止及设置溢出标志。
- TMOD:用于设置其工作方式(共八位,第四位用于 T0,高四位用于 T1);
- TCON:用于控制其启动和中断申请(共八位,高四位用于控制定时/计数器的启动和中断申请,第四位用于控制外部中断);
TMOD 中的八位中,有一个 GATE 门控位。GATE=0 时,用于控制定时器的启动是否受外部中断信号的影响。只要软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;GATE=1时,要用软件使TR0或TR1为1,同时外部中断引脚 INT0/1 也为高电平,才能启动定时/计数器工作。即:此时定时/计数器的启动条件加上了 INT0/1引脚为高电平这一条件。通常我们让 GATE=0。
TMOD 八位
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 字节地址:89H | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
TCON 八位
| 位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
每位的说明:
-
IE0/IE1:外部中断申请标志位(=0 没有外部中断申请,=1 表示有外部中断申请)。
-
IT0/IT1:外部中断请求的触发方式选择位(=0 表示在INT0/INT1端申请中断的信号低电平有效;=1 表示在INT0/INT1端申请中断的信号负跳变有效)。
TMOD 的八位中,有一个 C/T 定时/计数模式选择位,C/T=0 为定时模式,C/T=1 为技术模式。
M1M0:工作方式设置位,定时/计数器有四种工作方式:
| M1M0 | 工作方式 | 说明 |
|---|---|---|
| 00 | 方式0 | 13 位定时/计数器 |
| 01 | 方式1 | 16 位定时/计数器 |
| 10 | 方式2 | 8 位自动重装定时/计数器 |
| 11 | 方式3 | T0 分为两个独立的 8 位定时/计数器;T1 此方式停止计数 |