Bootstrap

【蓝桥杯03】——外部中断

一般来说,51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:
外部中断0:INT0 ——中断号:0
定时/计数器0:TF0 ——中断号:1
外部中断1:INT1 ——中断号:2
定时/计数器1:TF1 ——中断号:3
串口中断:RI/TI ——中断号:4

在CT107D单片机综合训练平台,使用独立按键,由原理图可知,S5按键接到P32/INT0,S4按键接到P33/INT1。
编程实现,函数working()使L1闪烁,使用外部中断功能,按键S5按下会点亮L8并闪烁,一段时间过后熄灭,L1继续闪烁。

#include <STC15F2K60S2.H>
#include <intrins.h>
void Delay1000ms();	
void RINT0();
void selectHC(unsigned char select);
void working();
void service();

sbit beer=P0^6;
sbit L1=P0^0;
sbit L8=P0^7;

int bag=0;  //中断标志位,中断响应时候置1,再有相应的函数去执行
void main()
{
	selectHC(5);
	beer=0; P2=P2&0x1f;P0=0xff;
	RINT0();
	while(1)
	{
		working();
		service();
  }
}	

//L1闪烁工作函数
void working()
{
	selectHC(4);
	L1=0;
	Delay1000ms();	
  L1=1;
	Delay1000ms();	
	
}

//外部中断0初始化函数
void RINT0()
{
	IT0=0;
	EX0=1;
	EA=1;
}

//中断服务函数
void serviceINT0() interrupt 0
{
	bag=1;   //外部中断尽量让里面指向的内容少一点,优化代码
}
 
void service()
{
	if(bag==1)
	{
		L8=0;
		Delay1000ms();	
		L8=1;
		Delay1000ms();	
  }
}

//寄存器选择函数
void selectHC(unsigned char select)
{
	switch(select)
	{
		case 4:P2=(P2&0x1f)|0x80; break;  //选择LED灯  寄存器
		case 5:P2=(P2&0x1f)|0xA0; break;  //选择蜂鸣器,继电器
		case 6:P2=(P2&0x1f)|0xC0; break;  //选择数码管位选
		case 7:P2=(P2&0x1f)|0xE0; break;  //选择数码管段选
  }
}

//延时函数
void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
;