目录
前言
在上一篇文章中,简略地介绍了流水灯的实现,利用的是软件调用——通过指令,调用子程序,实现的。那么还有没有其他的方法实现流水灯呢?接下来介绍中断系统,利用中断实现流水灯。
一、中断系统介绍(简略版)
1.1 中断的概念
-
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
-
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
-
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。
可以通过图片理解:
形象地解释为:你正在打电动(主程序),这时候杰哥敲门进来想要和你一起打电动(中断请求),你不想跟杰哥分享,便暂停游戏(中断当前程序),起来把杰哥请出去,关上房间门(执行中断处理程序),接着继续打电动(中断返回)。
1.2 中断源
引起CPU中断的根源,称为中断源。即:中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。
1.2.1 中断源的种类
51的中断系统共有5个中断源
- 外部中断0(INT0):由P3.2引脚输入的中断请求信号。
- 外部中断1(INT1):由P3.3引脚输入的中断请求信号。
- 定时器T0中断(T0):由定时器/计数器T0的定时、计数溢出产生的中断请求。
- 定时器T1中断(T0):由定时器/计数器T1的定时、计数溢出产生的中断请求。
- 串行口中断(ES):由串行数据发生完成(TI)或串行数据接收完成(RI)产生的中断请求
1.2.2 中断地址入口
下面是5个中断源的中断地址入口:
中断源 | 中断入口地址 |
外部中断0 | 0003H |
定时器T0 | 000BH |
外部中断1 | 0013H |
定时器T1 | 001BH |
串行口中断ES | 0023H |
记忆中断地址入口:定时器的入口地址都与B有关,外中断的入口地址都与3有关,而串行口中断ES的入口地址最大为0023H,与0有关的中断(外中断0,定时器0)的入口地址都比与1有关的中断(外中断1,定时器1)入口地址小,同时外中断的入口地址又比定时器的入口地址小,所以可以将5个中断源的中断地址记忆为:外中断——定时器——外中断——定时器——串行口中断,再进一步(0比1小):外中断0——定时器0——外中断1——定时器1——串行口中断ES;定时器的入口地址都与B有关,外中断的入口地址都与3有关,按上面顺序是从小到大的地址:外中断0(0003H)——定时器0(000BH)——外中断1(0013H)——定时器1(001BH)——串行口中断ES(0023H)。
1.3 51单片机的中断系统的结构
- (P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
- TF0(TCON.5),单片机内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,TF0=1,并向CPU申请中断。
- RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时TI=1,向CPU申请中断。
二、中断允许控制位
2.1 中断请求标志位
2.1.1 TCON寄存器
位: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
各标志位功能如下:
- TF0——定时器T0的溢出中断请求标志位。溢出时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
- TR0——定时器/计数器0的启动控制。功能详见定时器知识。
- IE0——外部中断0的中断请求标志位。触发中断时由硬件置1,即开始发送中断请求;单片机响应中断后,重新由硬件清0。
- IT0——外部中断0的触发方式选择位。令它为1,则对应引脚为下降沿触发中断;令它为0,则对应引脚为低电平触发方式。
- TF1、TR1,IE1、IT1则为定时器1、外部中断1的相关标志位,功能与上述相同。
2.1.2 SCON寄存器
位: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地址:98H | SMD | SM1 | SM2 | REN | TB8 | RB8 | T1 | R1 |
各标志位功能如下:
- TI——串行口发送完成中断请求标志位。串行口发送数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
- RI——串行口接收完成中断请求标志位。串行口接收数据后,TI位被硬件置1;单片机响应串行口中断后,必须在服务程序中将TI手动清0。
2.2 中断控制
2.2.1 中断允许寄存器IE
位: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地址:A8H | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
各位的功能如下:
- EA——总中断允许控制位。用来开启或屏蔽所有的中断请求,令它为1,则开放中断请求,可以响应中断;令它为0,则屏蔽所有中断请求。
- ES——串行口中断允许控制位。为1时开放串行口中断请求,为0时屏蔽。
- ET1——定时器/计数器T1中断允许控制位。为1时开放TI的中断请求,为0时屏蔽。
- EX1——外部中断1中断允许控制位。为1时开放外部中断1的中断请求,为0时屏蔽。
- ET0、EX0则为T0、外部中断0的中断允许控制位。功能与上述相同。
2.2.2 中断优先级寄存器IR
位: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节地址:B8H | - | - | - | PS | PT1 | PX1 | PT0 | PX0 |
各位的功能如下:
- PS——串行口中断优先级控制位。
- PT1——TI中断优先级控制位。
- PX1——外部中断1中断优先级控制位。
- PT0、PX0则为T0、外部中断0的中断优先级控制位。功能与上述相同。
2.3 中断优先级别 (中断源)
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
外中断0 | IE0 | 0003H | 高 |
定时器0 | TF0 | 000BH | | |
外中断1 | IE1 | 0013H | | |
定时器1 | TF1 | 001BH | | |
串行口中断ES | RI或RI | 0023H | 低 |
2.4 中断响应的条件
中断响应的条件:
- 中断源发出有效的中断请求,相应的中断请求标志位被置1;
- 中断允许寄存器IE中的EA=1;
- 相应中断源的中断请求被开放,即IE中相应位被置1
以上三条同时满足,CPU才有可能响应中断
三、手动版流水灯控制实现
在上一篇文章中利用软件调用实现了自动版流水灯,其代码如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P2,#11111111B
MOV A,#0FEH
MOV P2,A
LIGHT:
ACALL DELAY
MOV P2,A
SJMP LIGHT
DELAY:
RL A
MOV R3,#10
RF: MOV R4,#200
LF: MOV R5,#250
DJNZ R5,$
DJNZ R4,LF
DJNZ R3,RF
RET
END
用另外一种方式:外中断的方式,即将软件调用的子程序内容放到中断服务子程序中,同时的设置外中断的入口地址,开外中断:
- 中断请求标志位被置1——SETB IT0
- 中断允许寄存器IE中的EA=1——SETB EA
- 相应中断源的中断请求被开放——SETB EX0
代码如下:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT_0
ORG 0030H
MAIN:
SETB EA
SETB EX0
SETB IT0
MOV P2,#11111111B
MOV A,#0FEH
LIGHT:
MOV P2,A
SJMP LIGHT
INT_0:
RL A
RETI
END
总结
以上就是今天要讲的内容,本文仅仅简单介绍了使用中断实现手动版流水灯,具体实现根据实际情况而定。