错题笔记:中断是中断源来了 主程序先暂停然后去执行中断程序动作,执行完后,保留此状态;又回到主函数。

查看代码
 #include<reg51.h>
sbit LED1=P1^3;
sbit LED2=P3^5;
sbit LED3=P3^6;
sbit LED4=P3^7;
void blink();
void JT();
void PMD();
//执行动作
void main(){
	EX0=1;
	EA=1;
	IT0=1;//边沿触发
	while(1);
}			 
//外部中断0
void alter()interrupt 0{
	static unsigned char N=0;
	N++;
	if(N==1)
	PMD();
	else if(N==2)
	JT();
	else if(N==3)
	blink();
	else if(N==4)
	{
	LED1=LED2=LED3=LED4=1;N=0;
	}
}
//定义函数
void delay(unsigned int xms){
	while(xms>0)xms--;
}
void PMD() 
{	
	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响
	LED1=0;;
	delay(20000);
	LED2=0;LED1=1;
	delay(20000);
	LED3=0;LED2=1;
	delay(20000);
	LED4=0;LED3=1;
	delay(20000);
}

void JT()
{
	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响
	LED1=LED2=0;
	delay(20000);
	LED1=LED2=1;
	delay(20000);
	LED3=LED4=0;
	delay(20000);
}

void blink()
{
	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响
	delay(10000);
	LED1=LED2=LED3=LED4=0;
	delay(10000);
}

外部中断0实现3种模式,会发现跑一次后就暂停了 不动了。因为中断动作执行完后 系统是保存当时那刻状态,然后继续执行回到主函数。

解决方法:
把各动作放在主函数,中断程序就作个计数的功能就好了

查看代码
#include<reg51.h>

sbit LED1=P1^3;

sbit LED2=P3^5;

sbit LED3=P3^6;

sbit LED4=P3^7;
char N=0;
void blink();

void JT();

void PMD();

//执行动作

void main(){

	EX0=1;

	EA=1;

	IT0=1;//边沿触发

	while(1){
        if(N==1)

	PMD();

	else if(N==2)

	JT();

	else if(N==3)

	blink();
    else if(N==4)
	{
	LED1=LED2=LED3=LED4=1;N=0;
	}
   }

}			 

//外部中断0
void alter()interrupt 0{
    N++;
}

//定义函数

void delay(unsigned int xms){

	while(xms--;)

}

void PMD() 

{	

	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响

	LED1=0;;

	delay(20000);

	LED2=0;LED1=1;

	delay(20000);

	LED3=0;LED2=1;

	delay(20000);

	LED4=0;LED3=1;

	delay(20000);

}

void JT()

{

	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响

	LED1=LED2=0;

	delay(20000);

	LED1=LED2=1;

	delay(20000);

	LED3=LED4=0;

	delay(20000);

}

void blink()

{

	LED1=LED2=LED3=LED4=1; //先全灭 避免互相影响

	delay(10000);

	LED1=LED2=LED3=LED4=0;

	delay(10000);

}

 

posted @ 2022-10-03 22:32  iZJ"Qq4577105  阅读(70)  评论(0编辑  收藏  举报