05:中断


1、当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
2、通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
3、C51单片机有8个中断请求源:

在这里插入图片描述

1、定时器T0中断

在这里插入图片描述

如图:中断也需要配置寄存器,一共有2种寄存器,第一种位中断控制寄存器(IE和XICON),第二种为优先级控制寄存器。这里我们只学习定时器T0的一个中断。
要使用定时器T0中断:

ET0 = 1; ET0为定时器T0的中断开关,为1时打开中断
EA = 1;  EA为中断源的总开关。

1.1、定时器中断触发

  • 当定的时间到了后,就开始触发中断,去执行中断函数里面的程序。
  • 如果中断执行完后,还需要过一段时间继续执行中断,则需要在中断函数里面重新定时。
  • 那么怎样才知道哪个函数是中断函数喃?— 查询中断号(不同中断源产生的中断号不同)。
    在这里插入图片描述

1.2、案例:通过定时器T0中断来实现灯间隔1s亮灭

#include <REGX52.H>

sbit LED1 = P3^7;
int cnt = 0;

void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0_interrupt_Init(void)//定时器T0中断初始化
{
	ET0 = 1;
	EA = 1;
}

void main(void)
{ 
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();//打开定时器T0
	Timer0_interrupt_Init();//打开定时器T0中断
	while(1)
	{
		
	 }
}

/*定义中断函数*/
void Timer0Hander() interrupt 1
{
	TF0 = 0;//软件清零
	TL0 = 0x00; //重新定时
	TH0 = 0xDC;
	cnt++;
	if(cnt == 100)//数100次,相当于1s
	{
		cnt = 0;
		LED1 = !LED1;
	}
}
  • 当中断开启时,每隔10ms就跳出主函数,执行中断函数里面的程序。
  • 定时的第一个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 1,灯还是灭
  • 定时的第二个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 2,灯还是灭
  • 定时的第100个10ms到了,执行中断函数,重新给定时器计时10ms,cnt = 100,灯变亮

这样就实现了间隔1s的亮灭。

2、外部中断

如上图所示,51单片机的外部中断一共有4种,他们分别为INT0~INT3。他们都被单片机公司规定在那个引脚上面了。在这里插入图片描述

例如:要使用外部中断0只能在P3.2引脚,要使用外部中断1只能在P3.3引脚。
要使用外部中断0:

EX0 = 1; 外部中断0的开关
EA = 1; 中断总开关

2.1、外部中断的触发

在这里插入图片描述

  • 如图外部中断有2种触发方式,下降沿/低电平触发。
  • 当外部中断0打开后,然后使用低电平触发。当给引脚P3.2一个低电平时,就触发了中断,然后单片机跳出主程序,执行中断函数里面的程序。

2.2、案例:使用外部中断0通过震动传感器控制LED1的亮灭

#include <REGX52.H>

sbit LED1    =   P3^7; //LED1连接P3.7口
sbit vibrate =   P3^2; //震动传感器连接P3.2口

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void EX0_Init()
{
	//外部中断0初始化
	EX0 = 1;
	EA = 1;
	//让低电平触发
	IT0 = 0;
}

int main(void)
{
	LED1 = 1;//先让灯灭
	EX0_Init();
	while(1)
	{
	
	}
	
}

void EX0_Handler() interrupt 0//定义中断函数
{
	LED1 = 0;
	Delay1000ms();
	LED1 = 1;
}

当产生震动时,给引脚P3.2口输入一个低电平,触发中断,执行中断函数里面的内容。LED1灯亮1s然后熄灭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值