蓝桥杯基础学习记录——中断系统

这节小蜜蜂老师讲了两个办法,一个是将中断后要执行的命令放在中断服务函数里,一个是设置一个状态值state初始化为0,当出现中断时,state 值变为1,执行相应的命令。

第二种方法的部分代码如下:

void ServiceINT0() interrupt 0//中断服务函数
{
state=1;
}
void LEDINT()
{
	if(state==1)
	{
	L8=0;
	Delay(60000);
	Delay(60000);
	Delay(60000);
	Delay(60000);	
	Delay(60000);

	L8=1;
		state=0;
	}
	
}
void main()
{
	init_INT0();
	while(1)
	{
		working();
        LEDINT();
	}
}

但是在实际的应用中,发现这种方法只能在出现中断时,改变state的值,然后继续执行原命令(闪烁L1),在执行完后再点亮L8。

同时,按照中断的原理来看,L8点亮的时候可能出现在L1亮的时候也可能出现在L1熄灭的时候,但如果采用第二种设置状态值的方法,就只会在一种情况下点亮L8,具体情况只需要看working()函数里L1最后的状态即可。

这是因为,中断服务函数中的即为中断后需要执行的命令,这个方法运行时,中断后执行的命令就是将状态值state变为1,变完了又去执行原操作闪烁L1,等到working函数执行完了,接着执行主函数中排在working函数后面的LEDINT函数。

虽然小蜜蜂老师说中断服务函数最好简单点,但为了确保程序的正确性,还是采用第一种将中断后要执行的命令直接放入到中断服务函数中比较稳妥。

#include <REGX52.H>

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


void SELECT_HC138(unsigned char n)
{
  switch(n)
	{
		case 4:
  P2=(P2&0x1f)|0x80;
    break;
		case 5:
  P2=(P2&0x1f)|0xa0;
    break;
		case 6:
  P2=(P2&0x1f)|0xc0;
    break;
		case 7:
  P2=(P2&0x1f)|0xe0;
	  break;

	}
}
void Delay(unsigned int t)
	{
		while(t--);
		while(t--);
		
  }
void working()
{
		SELECT_HC138(4);	
		L1=0;
	  Delay(60000);	
		L1=1;
	  Delay(60000);
}
//==========================
void init_INT0()//初始化中断
{
	IT0=1;//外部中断触发标志
	EX0=1;
	EA=1;
}

void ServiceINT0() interrupt 0//中断服务函数
{
	L8=0;
	Delay(60000);
	Delay(60000);
	Delay(60000);
	Delay(60000);	
	Delay(60000);
	L8=1;
}

void main()
{
	init_INT0();
	while(1)
	{
		working();

	}
}

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值