玖:中断系统的原理与应用

基本概念

1、什么是“中断”?
顾名思义,中断就是中断当前工作去处理一些临时发生的时间,处理完后,则继续原工作过程。例如:你在看书,电话响了,你在书上做好记号后去接电话,接完之后再原记号处继续往下看书。
2、51单片机也需要“中断”?
通常单片机中只有一个CPU,但却要应对诸如:运行程序、数据输入、数据输出、以及特殊情况处理等多项任务,为此单片机必须具备中断处理的功能,以应对特殊情况的紧急处理。
3、“中断过程”是怎样的?
中断的目的是为了暂停主程序的运行,先去执行中断服务程序,其功能是为了提高CPU工作效率。在中断源提出中断请求后,处理器执行完当前指令便进行中断响应,一旦中断服务程序执行完毕后,仍须返回到主程序被中断处(断点处)继续执行原先程序,其过程如图所示

这里写图片描述

4、谁能“中断”51单片机?
中断源:能引发中断的来源称为中断源。
51单片机一共支持5个中断源(2个外部中断源,3个内部中断源),这些中断源分别是:
(1)外部中断请求0,由INT0(P3.2引脚)输入。
(2)外部中断请求1,由INT1(P3.3引脚)输入。
(3)片内定时/计数器0溢出中断(T0)请求。
(4)片内定时/计数器0溢出中断(T1)请求。
(5)片内串行口发送/接收中断请求。

5、“中断源”同时来临,怎么办?
中断优先级:处理中断源的优先顺序称为中断优先级

51单片机将优先级整个划分为2个大等级:高优先级和低优先级。高优先级的中断先响应,等高优先级的中断响应完之后才响应低优先级的中断,高低优先级的分配可通过IP寄存器来设置。
当多个中断都分配为同一个优先等级,并且发生中断时,由查询电路来确定最终优先级。
对于同一优先级,单片机对其中断次序安排如下:外部中断0>定时/计数器T0>外部中断1>定时/计数器T1>串行口。
6、“中断源”的信号可否屏蔽?
51单片机是可以屏蔽中断信号的。有总开关和分开关。
这里写图片描述

7、中断响应可否嵌套?
高优先级中断是可以打断低优先级的中断处理过程。
这里写图片描述

8、每个“中断”响应程序放在哪里呢?

51单片机给每个中断安排了一个唯一的中断入口地址。

中断源的入口地址表

中断源
入口地址
外部中断0(INT0)
0003H
定时/计数器0
000BH
外部中断1(INT1)
0013H
定时/计数器1
001BH
串行口中断
0023H

51中断的使用

★★★中断允许寄存器(IE)

D7
D6
D5
D4
D3
D2
D1
D0
EA
ES
ET1
EX1
ET0
EX0
![这里写图片描述](https://img-blog.youkuaiyun.com/20180705231013334?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3MDE3NTQ1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) EA:中断总开关位。EA = 1,开中断;EA = 0,禁止所有中断。(分开关类似)

★★★中断优先级寄存器(IP)

D7
D6
D5
D4
D3
D2
D1
D0
PS
PT1
PX1
PT0
PX0
对应中断源
对应中断源
对应中断源
串行口
定时器1
外部中断1
定时器0
外部中断0
以上表格中,若某位=1,则该对应的中断源设置为高优先级;若该位=0,则该对应的中断源设置为低优先级。 **★★★各中断源的标志位** **TCON**
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TF0
IE1
IT1
IE0
IT0
T1计数溢出
T0计数溢出
外部中断1
外部中断0

SCON

D7
D6
D5
D4
D3
D2
D1
D0
TI
RI
发送完毕
接收完毕

IT0、IT1:外部中断0、1触发方式选择位,由软件设置。1:下降沿触发方式;0:低电平触发方式
IE0、IE1:外部中断0、1请求标志位。当外部中断0、1依据触发方式满足产生中断请求是,由硬件置位。
RI :串行口接收中断请求标志位。当串行口接收完一帧数据后请求中断时,由硬件置位(RI=1)。RI必须由软件清0。
TI:串行口发送中断请求标志位。当串行口发送完一帧数据后请求中断时,由硬件置位(TI=1)。TI必须由软件清0。

(1)中断初始化
中断系统的初始化:在为某个中断源编写中断服务程序前,首先应在主程序中对中断系统进行初始化,初始化步骤应包括:
1)软件清除相应中断源的中断标志位,以消除以前中断标志对现在的影响。
2)默认或设置中断优先级。
3)其他设置:若为外部中断,应设置是电平触发方式还是下降沿触发方式;若为定时/计数器中断,应将定时/计数初值送入寄存器THx、TLx中。
4)打开相应中断源的分开关和总开关EA。
(2)中断服务程序的预先安排
汇编语言要哟昂到ORG伪指令和JMP跳转指令,C语言要用到关键字interrupt。
中断服务程序入口地址设置

中断源
服务程序名称(假设)
入口地址
汇编程序
C程序
外部中断0
INT0_i
0003H
ORG 0003H JMP INT0_i
INT0_i() interrupt 0
定时/计数器0
T0_i
000BH
ORG 000BH JMP T0_i
T0_i() interrupt 1
外部中断1
INT1_i
0013H
ORG 0013H JMP INT1_i
INT1_i() interrupt 2
定时/计数器1
T1_i
001BH
ORG 001BH JMP T1_i
T1_i() interrupt 3
串行口
COM_i
0023H
ORG 0023H JMP COM_i
COM_i() interrupt 4

(3)中断服务程序的预先安排

	ORG		OOOOH
	JMP 	Start	;跳转到主程序
	ORG		00BH
	JMP		T0_i	;跳转到T0中断服务程序处
	ORG		0030H
Start:			;主程序
	……
T0_i:			;T0的中断服务程序
	……
	RETI        ;中断返回
	END		

(4)中断返回
一旦某个中断请求得到响应,单片机必须把它的相应对应中断标志位清0,否则,单片机会因中断标志未能得到及时清除而重新相应同一中断请求,这是绝对不允许的。
1、外部中断标志的清除
当外部中断工作在电平触发方式下,外部中断标志IE0或IE1是依靠单片机检测其引脚INT0或INT1上为低电平而置位的。尽管RETI指令能使中断标志IE0或IE1自动清除成“0”状态,但无法改变引脚INT0或INT1上电平始终为低电平的事实,所以单机在运行过程中会再次检测到INT0或INT1引脚上的低电平而置位IE0或IE1。
2、串行口中断标志的清除
串行口有两个中断标志位TI和RI,硬件无法判别是哪个中断标志引发的中断请求,所以中断响应后,RETI指令无法自动清除中断标志,只能由软件清除。编程时应在中断服务程序的适当位置采用指令清除TI或RI。
#实验

汇编代码

******************************************************************/ 
*   【课程10】 ****中断系统的应用***********
*   【说  明】 ****使用T0定时1秒让LED灯闪烁一次	
*   【描  述】 ****使用T0定时1秒让LED灯闪烁一次,并通过按键来控制定时器的开启和关闭。
******************************************************************/ 
	    ORG 0000H
		JMP MAIN        ;跳到主程序
		ORG 000BH       
		JMP Timer0      ;跳到Timer0的中断服务程序

		ORG 0030H
Timer0:	MOV TH0,#3CH  ;定时器T0赋初值
		MOV TL0,#0B0H
		INC R3            ;R3保存N值
		MOV A,R3
		CJNE A,#19,L1	  ;A不等于19,则跳转到L1处
		CLR P2.7          ;P2.7=0,点亮D1灯
L1:		CJNE A,#20,L2     
		SETB P2.7         ;P2.7=1,熄灭D1灯
		MOV R3,#00H       ;N=0
L2:		RETI


MAIN:	MOV TMOD,#01H    ;定时器T0工作在方式1下
		MOV TH0,#3CH         ;T0赋初值
		MOV TL0,#0B0H
		SETB ET0             ;ET0=1,定时器t0中断允许
		SETB EA              ;开中断总开关
		SETB TR0             ;启动T0,开始定时
		MOV R3,#00H          ;R3保存N值,N=0

		CLR  20H            ;位地址20H处,保存标志量
LOOP:	JB   P3.2,$	     ;如果P3.2=1,则跳到自身处继续运行
		CALL DELAY
		JB   P3.2,LOOP
		JNB  P3.2,$
		JB   20H,L3
		SETB 20H
		CLR  TR0             ;关闭T0
		JMP  LOOP
L3:		CLR  20H
		SETB TR0             ;开启T0
		JMP  LOOP

DELAY:   MOV    R7,#0FFH
W1:      MOV    R6,#03FH
W2:      DJNZ   R6,W2
         DJNZ   R7,W1
RET
END

C代码

******************************************************************/	
*   【课程10】 ****中断系统的应用***********
*   【说  明】 ****使用T0定时1秒让LED灯闪烁一次		
*   【描  述】 ****使用T0定时1秒让LED灯闪烁一次,并通过按键来控制定时器的开启和关闭。
******************************************************************/

#include<reg51.h>		//51头文件,
#include <intrins.h>

//---------常用的两个宏定义-------------- 
#define uint8	unsigned char
#define uint16  unsigned int


sbit Key=P3^2;
sbit Led=P2^7;
uint8 num;			  //一秒的计数变量
uint8 flag;

/************************************
函数名:Timer0_I()
功能:中断服务程序
************************************/
void Timer0_I() interrupt 1
{
	TH0=0x3c;  		//重装初值
	TL0=0xb0;
	num++;   		//计时变量+1
	if(num==20)	{Led=~Led;  num=0;}
}
/************************************
函数名:main()
功能:主程序
************************************/
void main()
{
	TMOD=0x01;		//选择定时器0工作在定时方式1
	TH0=0x3c;		//定时50ms,装初值
	TL0=0xb0;
	ET0=1;  		//开启定时中断
	EA=1;			//开总中断
	TR0=1;			//开启定时器T0

	num=0;
	flag=0;
	while(1)
	{
		if(Key==0)   	//有键按下
		{
			if(flag==0)
			{flag=1;  TR0=0;}	//关闭定时器T0
			else
			{flag=0;  TR0=1;}	//开启定时器T0
		}	
	}
}	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值