⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xinhaodeng.c

📁 不错的交通灯控制程序。实现十字路口交通灯功能
💻 C
字号:
#include <AT89X51.h>
void display(unsigned int A,unsigned int B);//数码管显示控制函数
void delay10ms();
void status();
void status1();
void status2();
void status3();
void status4();
void status5();
void status6();
void status7();
void xhd();//信号灯控制函数
unsigned int na;//a道信号灯显示时间
unsigned int nb;//b道信号灯显示时间
unsigned char flag;//1s到状态标志
unsigned int count;
unsigned int sum;
unsigned char state;//灯状态标志
unsigned char old_state;//灯中断前状态标志
unsigned char	old_sum;
unsigned char	old_na;
unsigned char	old_nb;
unsigned char spstate0;//特殊状态标志
unsigned char spstate1;
main()
{flag=0;
 count=0;
 P1=0xff;
 P0=0xff;
 TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
ETI=1;
TR1=1;
 TR0=1;
 EX0=1;
 EX1=1;
 state = 0;
spstate0 = 0;
spstate1=0;
 xhd();
}


//........中断函数.........//
T0_srv() interrupt 1 using 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 count++;
 if(count==20)
 {count=0;
  flag=1;
 }
}

int0_srv() interrupt 0 using 2
{unsigned int i;
 for(i=0;i<10000;i++);
 if(P3_2==0)
 {	if (spstate0 == 1)
	{
	}
	else
	{	spstate0 = 1;
        spstate1 = 1;//紧急状态下不可过街
		old_state =  state;//保存中断前的状态
		old_sum = sum;
		old_na = na;
		old_nb = nb;

		state = 5;
		sum = 5;
	 	na=5;
		nb=5;
	}
 }
}

int1_srv() interrupt 2 using 3
{unsigned int i;
 for(i=0;i<10000;i++);
 if(P3_3==0)
 {	if (spstate1 == 1)
	{
	}
	else
	{	spstate1 = 1;
		state = 7;
		sum = 5;
	 	na=5;
		nb=5;
}
 }
}

 //.........子函数.........//
void xhd()
{
 while(1)
 {status();  
 }
}
 
void status()
{ 		switch(state)
		{	case 0: sum = 30 ; na =30; nb=35; state = 1;break;
			case 1:status1();break;
			case 2:status2();break;
   			case 3:status3();break;
   			case 4:status4();break;
   			case 5:status5();break;
   			case 6:status6();break;
   			case 7:status7();break;
	  	}

	   	if (flag == 1)
		{	sum--;
	   		na--;
   			nb--;
			flag = 0;
		}
  		display(na,nb);

}

void status1()
{ P1=0xdb;
  spstate1=1;
  if (sum == 0)//A绿30s到
  {	state = 2;	
	sum = 5;
    na = 5;
	nb = 5;
spstate1=0;
  }
}

void status2()
{P1=0xdd;
  if (sum == 0)
  {	state = 3;	
	sum = 15;
 	na=20;
	nb=15;
  }
}

void status3()
{P1=0xf6;
  if (sum == 0)
  {	state = 4;	
	sum = 5;
 	na=5;
	nb=5;
  }
}

void status4()
{P1=0xee;
  if (sum == 0)
  {	state = 0;	
  }
}

void status5()
{	P1=0xed;
  if (sum == 0)
  {	state = 6;	
	sum = 20;
 	na=20;
	nb=20;
  }
}

void status6()
{P1=0xde;
  if (sum == 0)
  {	state =  old_state;//恢复中断前的状态
	sum = old_sum;
	na = old_na;
	nb = old_nb;
	spstate0 = 0;//一次紧急状态结束后,允许第二次紧急状态情况发生
	spstate1 = 0;//紧急状态结束后,可以过街
  }	
}


void status7()
{P1=0xee;
  if(sum==0)
  { state = 0;
    spstate1 = 0;
  }
}

void display(unsigned int A,unsigned int B)
{
  P0=A%10+0x70;
  delay10ms();
  
  P0=A/10+0xB0;
  delay10ms();
  
  P0=B%10+0xD0;
  delay10ms();
  
  P0=B/10+0xE0;
  delay10ms();
 }
 void delay10ms()
 {unsigned int i;
  unsigned int j;
  for(i=2;i>0;i--)
   for(j=248;j>0;j--);
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -