单片机笔记
中断系统
工作原理
功能描述
终止当前进行的事件,去处理突发需及时处理的事件,处理完还要返回原事件.
中断符函数
void ISR() interupt n
中断符函数与普通函数区别
- 普通函数: 在主函数中需要时即可调用.
- 中断符函数: 由中断系统来控制跳转, 不允许在主函数中调用 由硬件系统控制跳转和返回, 均自动完成
采用中断方式的优势
如没有中断系统, 单片机大量时间可能会浪费在查询是否有服务请求的定时查询操作上, 即不论是否有服务请求, 都必须去查询.
采用中断技术完全消除查询方式的等待, 大大提高单片机工作效率和定时性.
中断的一般概念
- 中断响应过程: 由中断管理系统处理突发事件的过程.
- 中断源: 中断管理系统能够处理的突发事件.
- 中断请求: 中断源向CPU提出的处理请求.
- 中断服务函数(ISR): 针对中断请求提供服务的函数.
- 中断嵌套: 在中断服务中执行更高级别的中断服务.
AT89C51中断系统结构
有5个中断请求源
- 外部中断0(INT0) 中断标志位IE0
- 定时器中断(T0) 中断标志位TF0
- 外部中断1(NT1I) 中断标志位TF1
- 定时器1中断(T1) 中断标志位IE1
- 串行口中断 有两个中断标志位TI, RI分别代表发送和接收中断
中断管理系统介于CPU和外设之间
中断优先级
终端系统先处理高优先级事件, 8051单片机仅有两个优先级(高优先级, 低优先级), 即可实现两级的中断嵌套.
可通过软件手段设置5个中断源的优先级
AT89C51中断系统结构
中断标志位->中断允许位控制中断信号允许or禁止->优先级控制
- TCON中断标志位: IE0, TF0, IE1, TF1, TI, RI (1: 有请求, 0: 无请求) 硬件系统自动设置
- IE中断允许位:EX0, ET0, EX1, ET1, ES EA总允许位 (1: 允许, 0: 禁止) 软件可设置
- IP优先级设置: PX0, PT0, PX1, PT1, PS (1: 高优先级, 0: 低优先级)
中断请求标志寄存器
TCON寄存器(IE0, TF0, IE1, TF1)
TCON为定时器/计数器的控制寄存器, 字节地址为88H
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
ICON | TF1 | TR1 | TF0 | TR0 | IET | IT1 | IE0 | IT0 | 位地址 | 8FH | – | 8DH | – | 8BH | 8AH | 89H | 88H |
- IT0: 选择外部中断请求0, 0为下降沿触发方式, 0为低电平触发.
- IT1: 选择外部中断请求1, 触发方式选择与IT0类似.
SCON寄存器(TI, RI)
SCON为串行口控制寄存器, 字节地址为98H.
串行口的发送中断和接收中断的中断请求标志T1和R1
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
SCON | – | – | – | – | – | – | T1 | R1 | 位地址 | – | – | – | – | – | – | 99H | 98H |
- T1 : 发送中断请求标志位. 串口每发送完一帧串行数据后, 硬件自动置"1". 必须在中断服务程序中用软件对T1标志清"0"
- R1: 接收中断请求标志位. 串口接收完一个数据帧, 硬件自动置"1". 必须在中断服务程序中用软件对R1标志清"0"
中断允许寄存器IE
各中断源开放或屏蔽, 是由片内中断允许寄存器IE控制, IE字节地址为A8H, 可进行位寻址
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
IE | EA | – | – | ES | ET1 | EX1 | ET0 | EX0 | 位地址 | AFH | – | – | ACH | ABH | AAH | A9H | A8H |
IE中各位的功能
- EA: 中断允许总开关控制位
- ES: 串行口中断允许位
- ET1: 定时器/计数器T1溢出中断允许位
- EX1: 外部中断1中断允许位
- ET0: 定时器/计数器T0溢出中断允许位
- EX0: 外部中断0中断允许位
中断优先级寄存器IP
各中断源的中断优先级关系, 可归纳为下面两条基本规则:
- 低优先级可被高优先级中断, 高优先级不能被低优先级中断.
- 任何一种中断(不管是高级还是低级)一旦得到响应, 不会被它的同级中断源所中断.
AT89C51片内有一个中断优先级寄存器IP, 字节地址为B8H, 可位寻址.
只要用程序改变其内容, 即可进行各中断源优先级设置.
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|
IP | – | – | – | PS | PT1 | PX1 | PT0 | PX0 | 位地址 | – | – | – | BCH | BBH | BAH | B9H | B8H |
同级中断的查询次序
在同时收到几个同优先级的中断请求时, 哪一个中断请求能有线得到响应, 取决于内部查询顺序.
这相当于在同一个优先级还存在另一辅助优先级
查询次序(由高到低)
- 外部中断0
- T0溢出中断
- 外部中断1
- T1溢出中断
- 串行口中断
若IP = 0x06(0110), 进行优先级排序
高优先级: PT0, PX1; PT0 > PX1
低优先级: PX0, PT1, 串行口; PX0 > PT1 > 串行口
中断函数
中断服务函数一般形式为:
函数类型 函数名() interupt n using m
关键字interrupt后面的n是中断号, 对于8051单片机, n的取值为0-4, 编译器从(8 * n + 3)处产生中断向量.
AT89C51内部RAM中可使用4个工作寄存器区. 每个工作寄存器区包括8个工作寄存器(R0-R7).
关键字using后面的m用来选择4个工作寄存器区. using是一选项, 如不选, 中断函数中的所有工作寄存器内容将被保存在堆栈中.
中断向量: 中断服务程序的入口地址
中断号 | 中断源 | 中断向量(ROM地址) |
---|
0 | 外部中断 | 0003H | 1 | 定时器0 | 000BH | 2 | 外部中断1 | 0013H | 3 | 定时器1 | 001BH | 4 | 串行口 | 0023H | 其他值 | 保留 | 8 * n + 3 | 特殊:复位 | 非中断源 | 0000H |
习题一
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define OUT P0
uchar i;
void delay(uint t);
int main(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
void INT0_ISR interrupt 0 using 1
{
i++;
if (i > 9)
{
i = 0;
}
OUT = sng[i];
}
while(1)
{
}
return 0;
}
|