蓝桥杯单片机组-08中断系统与外部中断

本文详细介绍了51单片机的中断服务函数,包括中断向量的概念,以及如何在51单片机上设置外部中断(如S5和S4按键)并实现外部中断响应时L8指示灯的延时控制。通过两种方式演示了如何在中断服务函数中处理中断请求,确保L1指示灯的正常闪烁不会受到干扰。
摘要由CSDN通过智能技术生成

概念

中断服务函数:内核响应中断后执行的相应的程序,每一个中断对应一个中断服务函数。

中断向量:中断服务程序的入口地址。每一个中断源对应一个固定的入口地址。

一般来说,51单片机有5个中断源,分2个优先级,从高到低依次为:外部中断0、定时/计数器0、外部中断1、定时/计数器1、串口中断。

中断源中断号中断级别
外部中断0         INT0interrupt 0最高
定时器0中断     T0interrupt11
外部中断1        INT1interrupt22
定时器1中断     T1interrupt33
串口中断          Tx/Rxinterrupt44

关于中断服务函数的编写:

    一般情况下,中断的处理函数有两个:中断初始化函数、中断服务函数

    中断服务函数的格式为:

    void  函数名( )  interrupt  中断号

    例如:void InitTimer0()    void ServiceTimer0() interrupt 1()

              void Init_INT0()     void Service_INT0() interrupt 0()

要求

在单片机综合训练平台上,首先将J5处的跳帽接到2~3引脚,即S5按键接到P32/INT0,S4按键接到P33/INT1

1.定义一个Working()函数,使L1指示灯不断闪烁。

2.将P32引脚定义成外部中断功能,按S5就会产生外部中断触发信号。

3.在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭,该功能用两种方式实现:1-直接在中断服务函数中延时。2-在中断服务函数中标志变量,在外部执行延时。

电路图:

代码

方式一

方式一:直接在中断服务函数中延时(L8点亮时,L1可能处于熄灭状态,可能处于点亮状态)

#include"reg52.h"
//1.定义一个Working()函数,使L1指示灯不断闪烁。
//2.将P32引脚定义成外部中断功能,按S5就会产生外部中断触发信号。
//3.在中断响应函数中,点亮L8指示灯,延时一段较长的时间后熄灭,该功能用两种方式实现:1-直接在中断服务函数中延时。2-在中断服务函数中标志变量,在外部执行延时。

//定义灯的引脚
sbit L1 = P0^0;
sbit L8 = P0^7;

void Delay(unsigned int t)
{
	while(t--);
	while(t--);
	while(t--);
}

//=======和LED连接的锁存器======
void SelectHC573()     
{
	P2 = (P2 & 0x1f) | 0x80;
}

//=======L1不断闪烁======
void Working()         
{
	SelectHC573();
	L1 = 0;
	Delay(60000);
	L1 = 1;
	Delay(60000);
}

//======================================
//中断部分,2个函数:初始化、服务函数

//=======外部中断0初始化函数======
void Init_INT0()
{
	IT0=1;  //下降沿触发
	EX0=1;  //打开INT0的中断允许
	EA=1;  //打开总中断
}	
//==========外部中断0服务函数======
void Service_INT0() interrupt 0      //INT0对应中断0
{
	L8=0;
	Delay(60000);
	Delay(60000);
	L8=1;
}
//======================================

void main()
{
	Init_INT0();     //中断初始化函数
	while(1)
	{
		Working();
	}
}

方式二 

 方式二:在中断服务函数中标志变量,在外部执行延时(L8点亮时,L1处于熄灭状态)

#include "reg52.h"
 
sbit L1=P0^0;
sbit L8=P0^7;
 
/*==========和LED灯连接的锁存==========*/
void Select_HC573()
{
	P2=(P2&0x1f)|0x80;
}
 
/*==========延时函数==========*/
void delay(unsigned int t)
{
	while(t--);
	while(t--);
	while(t--);
}
 
/*==========L1指示灯不断闪烁==========*/
void Working()
{
	Select_HC573();
	L1=0;
	delay(60000);
	L1=1;
	delay(60000);
}
 
/*==========外部中断0初始化函数==========*/
void Init_INT0()
{
	IT0=1;  //下降沿触发
	EX0=1;  //打开INT0的中断允许
	EA=1;  //打开总中断
}
 
/*==========外部中断0服务函数==========*/
unsigned char stat_int=0;       //中断标志变量
void Service_INT0() interrupt 0
{
	stat_int=1;
}
 
void LED_L8()
{
	if(stat_int==1)
	{
		L8=0;
		delay(60000);
		delay(60000);
		L8=1;
	}
	stat_int=0;
}
 
void main()
{
	Init_INT0();
	while(1)
	{
		Working();
		LED_L8();
	}
}

总结

1.如题:将P32引脚定义成外部中断功能。这需要看电路图,可知P32对应INT0。则需要写2个中断函数:

初始化+服务函数

注意服务函数后面是interrupt 0!

void Init_INT0()
{
	IT0=1;  //下降沿触发
	EX0=1;  //打开INT0的中断允许
	EA=1;  //打开总中断
}	
void Service_INT0() interrupt 0 
{

}

2.当原本执行的是闪烁灯,中断也是闪烁灯时。可使用方式二:在中断服务函数中标志变量,在外部执行延时,可有效避免同时点亮的情况。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值