51单片机中断系统
CPU和外设之间的速度差异太大,CPU跑的太快了,外设追不上,机器的内部也可能出现突发事件。那怎么办?所以引入中断技术呀。
那什么是中断哇?
CPU和外设并行工作,有突发事件或者外设要给CPU请安的时候,外设就发一个信号给CPU,CPU就去见见外设见面完了CPU又回来干自己的事情。这个过程就是中断!
中断源?
中断申请的来源(就是说是哪一个外设发起了中断)中断优先级
万一有几个外设来找CPU,我们怎么办喃?那我们就给他门排个顺序,CPU先见排在前面的。这个顺序就是他的优先级。
那顺序咋个定喃? 那你要事先安排好咯!
中断源
C51一共有5个中断源(C52有6个)
中断源 | 名称 | 引脚 | 入口地址 |
---|---|---|---|
INT0 | 外部中断0 | P3.2 | 0003h |
INT1 | 外部中断1 | P3.3 | 0013h |
T0 | 0号定时器中断 | P3.4 | 000bh |
T1 | 1号定时器中断 | P3.5 | 001bh |
TI/RI | 串行口中断 | P3.1 TXD | 0023h |
中断控制有关寄存器
中断我们需要考虑几个方面
- 中断打开没
- 怎么触发中断
- 中断的启停
- 多个中断触发后如何响应
IE 中断的允许与禁止(地址A8h)
EA | ET2 | ES | ET1 | EX1 | ET0 | EX0 | |
---|---|---|---|---|---|---|---|
中断总开关 | 暂时不用 | T2 | 串行口TXD | T1 | int1 | T0 | int0 |
1开0关 | 暂时不用 | 1开0关 | 1开0关 | 1开0关 | 1开0关 | 1开0关 | 1开0关 |
TCON 中断的请求与外部中断的选择(地址88h)![这
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|---|---|---|---|---|---|---|
T1中断请求 | T1工作启停 | T0中断请求 | T0工作启停 | int1中断请求 | int1中断触发方式 | int0中断请求 | int0中断触发方式 |
1请求0无请求 | 1启动0停止 | 1请求0无请求 | 1启动0停止 | 1请求0无请求 | 1下降沿0低电平 | 1请求0无请求 | 1下降沿0低电平 |
IP 中断的优先管理(地址88h)
– | – | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
---|---|---|---|---|---|---|---|
– | – | T2 | 串行口 | T1 | int1 | T0 | int0 |
– | – | 1高0低 | 1高0低 | 1高0低 | 1高0低 | 1高0低 | 1高0低 |
中断过程
C51中断(和8086的区别):
- 不会自动保护标志寄存器PSW
- 不会自动保护现场
- 不会自动关中断
- 不会自动发送中断响应信号
什么时候不会响应中断呢?
- 当前指令没有结束
- 响应了同级或者高级中断
- 操作IE、IP中断控制寄存器
- 执行RETI(从中断服务程序返回、回复中断优先级状态触发器)指令
中断的撤除
- 对于T0、T1的溢出中断:CPU响应后,会硬件清除中断请求标志TF0、TF1(自动撤除)
- 对于边沿触发的int0、int1中断,自动撤除
- 低电平触发的int0、int1中断,需要在响应之后撤除中断请求
- 串行口和T2中断,没用硬件清除中断标志TI、RI、TF2和EXF2(不会自动撤除),需要软件清除!
C语言和汇编的中断
C语言中断函数定义
扫描二维码关注公众号,回复:
2165818 查看本文章
返回值 函数名(【参数】)[模式][再入]interrupt n[using m]
n | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
中断源编号 | int0 | T0 | int1 | T1 | 串行口 | T2 |
返回值:返回值
参数:形参 函数的输入
m : 选择工作的寄存器组
再入(reentrant): C51中普通函数不可递归调用,只有再入函数可以递归
#include<reg51.h>
unsigned char i=0;
int0() interrupt 2//中断函数
{
i++;//计算中断次数
}
main()//主函数
{
EA=1;//中断总开关
EX1=1//外部中断1 允许中断
IT1=1;//下降沿有效
}
ORG 0000H
AJMP MAIN
ORG 0013H ;中断子程序入口
AJMP COUNTING ;中断函数名
ORG 0030H
MAIN:
SETB EA ;中断总开关
SETB EX1 ;外部中断1 允许中断
SETB IT1 ;下降沿有效
HERE:AJMP HERE
COUNTING:
INC A ;a++
RETI
END