【C51自学笔记】中断系统

中断

中断概念与中断触发:

中断的概念:

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。

引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统。

结构:

中断嵌套:在中断中再次响应一个中断。

引起CPU中断的根源,称为中断源。

TNT0、TNT1:外部中断0,外部中断1。各含两种触发方式。

T0,T1:定时器0,定时器1

RX、TX:串口中断

IE:中断开关

  • EX0,EX1 ET0 ET1 ES :每个中断源自己的开关
  • ​​​​​​EA:总中断开关

TCON中的IT0 IT1:两种触发方式:低电平有效或延下降沿有效

 

中断源:

​​​​​​

(这里仅讲外部中断的触发,定时器与串口的触发放在定时器和串口通信中)

1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

 

中断号:优先级越高,中断号越小 (0 1 2 3 4)

中断允许控制:

       CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

vEX0(IE.0),外部中断0允许位;

vET0(IE.1),定时/计数器T0中断允许位;

vEX1(IE.2),外部中断0允许位;

vET1(IE.3),定时/计数器T1中断允许位;

vESIE.4),串行口中断允许位;

vEA (IE.7)CPU中断允许(总允许)位。

上述位:1:允许  0:禁止

中断请求标志:

​​​​​​

(可手动控制中断请求的标志,例如: IT0= 0 下降沿方式无效 低电平触发才有用)

vIT0TCON.0),外部中断0触发方式控制位。

        当IT0=0时,为电平触发方式。

        当IT0=1时,为边沿触发方式(下降沿有效)。

vIE0TCON.1),外部中断0中断请求标志位。

vIT1TCON.2),外部中断1触发方式控制位。

vIE1TCON.3),外部中断1中断请求标志位。

vTF0TCON.5),定时/计数器T0溢出中断请求标志位。

vTF1TCON.7),定时/计数器T1溢出中断请求标志位。      

中断优先级:

原则:

vCPU同时接收到几个中断时,首先响应优先级别最高的中断请求

v正在进行的中断过程不能被新的同级或低优先级的中断请求所中断

v正在进行的低优先级中断服务,能被高优先级中断请求所中断​​​​​​

为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。

中断处理过程:

v 中断源有中断请求;

v 此中断源的中断允许位为1

v CPU开中断(即EA=1)。

如何使用中断:

v你想使用的中断是哪个?选择相应的中断号;(中断号对应中断的方式)​​​​​​

v你所希望的触发条件是什么?(下降沿 低电平)​​​​​​

v你希望在中断之后干什么?(写入函数中)

注意:

EA=1//开:总中断开关

EX0=1//开:外部中断0

IT0=0/1//设置外部中断的触发方式

中断服务函数:​​​​​​

void   fun_name   ()  interrupt   0  {​​​​​​

}

应用:

 #include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int 

sbit led0=P0^0;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

void delay_50ms(uint t)
{
	uint j;
	for(;t>0;t--)
	for(j=6245;j>0;j--);
}

void main()
{
	uchar i;

	EA=1;	 //开总中断开关
	EX0=1;	 //打开外部中断0开关
	IT0=1;	 //触发方式设置

	while(1)
	{
		for(i=0;i<10;i++)//数码管在自己跳动
		{
			P1=smg_du[i];
			delay_50ms(10);
		}
	}
} 
//中断怎么触发的:P3^2引脚低电平
//查电路图得:KEY1 按键被按下实现P32低电平
void int0 () interrupt 0//中断触发结果:led0被点亮
{
	led0=0;
	delay_50ms(20);
	led0=1;
}

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/81154804