51单片机学习之中断系统
概念基础
什么是中断
当你正在看动漫时,突然手机来电话了,你暂停动漫,去接电话,在接电话的时候,又有人敲门,你暂时放下电话,去开门。我们可以把看动漫当作在执行主程序,那么电话就是中断源,电话铃响了就是中断请求,暂停动漫即是现场保护,接电话就是中断响应,有敲门声就是更高一级的中断请求,去开门则是中断嵌套,把门打开继续接电话就是中断返回,电话OK后继续看动漫则是现场恢复。
内核与外设之间的主要交互方式有两种轮询和中断,轮询工作效率极低,而且不具有响应紧急事件的功能;中断系统则使内核具备了应对突发事件的能力。
中断既然可以处理紧急事件,也就是不知道中断什么时候发生,所以每个中断都需要一个中断入口地址,即为中断向量,这样的话,无论中断什么时候发生,它都有一个确定的程序执行初始点。中断响应之后,执行的那段程序称之为中断服务函数,顾名思义它是专门为这个中断服务的。
51单片机的中断系统
80C51的中断系统有5个中断源 (忽略定时/计数器2) ,2个优先级,可实现二级中断嵌套。
中断源 | 中断标志 | 中断向量(地址) | 优先级 | 序号(C语言) |
---|---|---|---|---|
外部中断0 INT0 | IE0 | 0003H | 1 | 0 |
定时/计数器0 T0 | TF0 | 000BH | 2 | 1 |
外部中断1 INT1 | IE1 | 0013H | 3 | 2 |
定时/计数器1 T1 | TF1 | 001BH | 4 | 3 |
串口中断 | RI/TI | 0023H | 5 | 4 |
从前面的介绍我们可以知道,不管主程序执行到什么地方,只要外部中断0产生请求,内核就要响应该中断,就回到0003H这个地址去执行代码。如果使用汇编语言,则要记住每个中断源对应的地址;C语言则需要记住序号即可。
中断控制
4个特殊功能寄存器来实施中断控制:
- 中断允许寄存器 IE (Interrupt Enable )
- 中断优先级寄存器 IP ( Interrupt Priority )
- 定时/计数器及外部中断控制寄存器 TCON
- 串口控制寄存器 SCON
中断响应条件:
- 中断源有中断请求
- 此中断源的中断允许位为1
- CPU中断允许位为1
中断允许寄存器 IE
位序 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
名称 | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
控制位(0禁止,1允许) | 总开关 | 串口 | 定时器1 | 外部中断1 | 定时器0 | 外部中断0 | ||
位地址 | AFH | ACH | ABH | AAH | A9H | A8H |
中断优先级寄存器 IP
位序 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | |
---|---|---|---|---|---|---|---|---|
名称 | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
优先级控制位(0低,1高) | 串口 | 定时器1 | 外部中断1 | 定时器0 | 外部中断0 | |||
位地址 | BCH | BBH | BAH | B9H | B8H |
定时/计数器的控制寄存器 TCON
位序 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
位名称 | TF1 | TR1 | TF0 | TR0 | IE0 | IT1 | IE0 | IT0 |
- TF1:定时/计数器T1溢出中断请求位(0:无中断请求,1:有中断请求)
- TR1:定时/计数器T1启动位(0:停止定时/计数器,1:启动定时/计数器)
- TF0:定时/计数器T0溢出中断请求位
- TR0:定时/计数器T0启动位
- IE1:外部中断1请求标志位
- IT1:外部中断1触发方式控制位(0:低电平触发,1:下降沿触发)
- IE0:外部中断0请求标志位
- IT0:外部中断0触发方式控制位(0:低电平触发,1:下降沿触发)
下降沿:
电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。
串行口控制寄存器 SCON
位序 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
位名称 | - | - | - | - | - | - | TI | RI |
- TI:串行接口发送完成中断请求标志位( 响应中断时需手动软件清除)
- RI:串行接口接收完成中断请求标志位( 响应中断时需手动软件清除)
一次中断的完整步骤
中断请求
中断事件一旦发生,中断源提交中断请求(将中断标志位置为1),欲请求CPU暂停目前的工作,转向为该中断作专项服务;
中断使能
虽然中断源提交了中断请求,但是能否得到CPU的响应,还要取决于该中断请求能否通过若干的关卡送达CPU(中断使能位为1,关卡放行),关卡有两类:
- 此中断源的中断允许位
- 全局中断允许位
中断响应
如果一路通畅,则CPU响应该中断请求,记录断点,跳转到中断服务程序。对于INT和TMR中断,中断响应时中断标志位会被硬件自动清零。
中断处理
对中断源进行有针对性的服务;
中断返回
返回到主程序断点处,继续执行主程序;
1,3,5由硬件自动完成,2,4由用户编程完成。中断响应条件为1,2同时满足。
程序代码
1 |
|
首先设置P1管脚连接的排灯为后四个灯亮,把各个卡点开启(如外部中断1 和 全局中断),IT1(P3.3)设置触发方式为下降沿,之后可以将引脚P3.3与P3.6(按键)连接,如此一来就可以通过按键来触发中断;
当按键按下松手时即是一个下降沿,此时会触发中断,执行中断服务函数,转变为前四个灯亮。