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

📄 xhj.c

📁 用单片机实现的道路交通灯设计
💻 C
📖 第 1 页 / 共 2 页
字号:
   else if(time<=temp+BPGT+BPGS)
   state=9;
   else if(time<=temp+BPGT+BPGS+RT)
   state=10;
   else if(time<=temp+BPGT+BPGS+RT+AGT)
   state=11;
   else if(time<=temp+BPGT+BPGS+RT+AGT+AGS)
   state=12;  
   else if(time<=temp+BPGT+BPGS+RT+AGT+AGS+AYT)
   state=13;  
   else 
   state=0;



}

void control(void)
  {   COMA=AOUT[state];
      COMB=BOUT[state];
      if(state==2)
	  			if(s_flag)
				{COMA=AOUT[state];
				}
				else
                {COMA=0xFE;
				}
      
      else if(state==5)
   	  			if(s_flag)
				{COMB=BOUT[state];
				}
				else
                {COMB=BOUT[state]|0x04;
				}
	  else if(state==9)
   	  			if(s_flag)
				{COMB=BOUT[state];
				}
				else
                {COMB=0xFE;
				}
	  else if(state==12)
	  			if(s_flag)
				{COMA=AOUT[state];
				}
				else
                {COMA=AOUT[state]|0x04;
				}
      
      
  }


void main(void) // 主程序 
{

uchar i,j;
initsiu();
init();

while(1) //主程序循环 
	{ 
Alltime=APGT+APGS+RT+BGT+BGS+BYT+RT+BPGT+BPGS+RT+AGT+AGS+AYT+RT;

if((XBYTE[0x8000+0x0A]&0x80)!=0){
	t_hour=XBYTE[0x8000+0x04];
	t_minute=XBYTE[0x8000+0x02];
	t_second=XBYTE[0x8000+0x00];
	}  


	a=tab[t_hour/10];b=tab[t_hour%10];c=tab[t_minute/10];d=tab[t_minute%10];
    display();
	display1();



	switch (zxfa)
       {
        case 0:
		     
	 		   i=inkey();	
				if(i!=0x7f)
				{
				switch (i)
  			           {
 			           case 0x7E:   //1键
			 		   check();
					   
		   			   if(set_flag)
					   set();
					   else if(settime_flag)
					   settime();
					   
					   break;

						case 0x7D:	//2键
			
					//	break;		
						
											
						case 0x7B:	//3键
			
					//	break;	
									
						case 0x77:	//4键
			
						//break;

						case 0x6F:	//5键
					j=200;
					do{	
						a=tab[AGT/10];b=tab[AGT%10];c=tab[BGT/10];d=tab[BGT%10];
    					display();

						}while(j--);

					
						break;

						case 0x5F:	//6键
					j=250;
					do{	
						a=tab[8];b=tab[0];c=tab[3];d=tab[1];
    					display();
						}while(j--);
						break;


					    case 0x3f:	 //7键

						break;
             			}
     			 }
  

	
				break;
			case 1:	
	            
  					i=inkey();	
					if(i==0x3f)
						{	
						
								state++;
								  	if(state==14)
								state=0;

						}


			
				break;
			case 2:
	 		    	i=inkey();	
					if(i==0x3f)
						{state_man++;
						  	if(state_man==4)
							state_man=0;
						}

			 
				break;
				}
	    

		



	

	} 
} 









void display()
  {
  ///////////显示///////   
    P1=a;	
  	P3_0=0;
    P3_1=0;
    P3_4=0;
    P3_5=1;    
	Delay(2);
    P1=0xff;
   
    P1=b;	
	P3_0=0;
    P3_1=0;
    P3_4=1;
    P3_5=0;
	Delay(2);
    P1=0xff;

    
    P1=c;	
	P3_0=0;
    P3_1=1;
    P3_4=0;
    P3_5=0;
	Delay(2);
    P1=0xff;

    P1=d;	
	P3_0=1;
    P3_1=0;
    P3_4=0;
    P3_5=0;
	Delay(2);
    alloff();

	 display1();
	


  }


uchar inkey(void)
     	{
	

   uchar jjj,keydat;


       
      	P1 = 0xFF;	
		P3_3=0;
      	keydat = P1;//读入键值
		P3_3=1;
      	keydat = keydat & 0x7f;					
      	if (keydat != 0x7f)	//有键输入
		{
      		_nop_();
      		_nop_();
			P3_3=0;
      		jjj = P1;	//再读,去抖动
			P3_3=1;
      		jjj = jjj & 0x7f;
      		if (jjj != keydat)
      			keydat = 0x7f;
      		
      	
		
			do 
      			{
				P3_3=0;
      			jjj = P1;
				P3_3=1;
      			jjj = jjj & 0x7F;
              display();
             
      			}		//等待键松手
      		while (jjj != 0x7F);
      		}
	


		return (keydat);
      
     	}
void Delay (unsigned int count)//长延时
{         
unsigned char i; 
while (count) 
{
  i = 100;
  while (i > 0) i--;
  count--;
    }
}



void init(void)
{

uint j=500;

state=0;
set_state=0;

set_state_max=26;
state_man=0;


AYS_flag=0;
BYS_flag=0;

second_flag=1;
time=0;

AYS_time=0;
BYS_time=0;

j=250;
do{
   a=b=c=d=0x01;
    display();
	t_hour=XBYTE[0x8000+0x04];
	t_minute=XBYTE[0x8000+0x02];
	t_second=XBYTE[0x8000+0x00];
}while(j--);  






if(AGT==0&&APGT==0&&APGS==0&&AGS==0&&AYT==0&&BGT==0&&BPGT==0&&BPGS==0&&BGS==0&&BYT==0)
{
RT=5;
APGT=20;
APGS=5; 
AGS=5; 
AYT=5;
AYS=2;

AGT=20; 
//RT=5;
BPGT=20;
BPGS=5; 
BGS=5; 
BYT=5; 
BYS=1;

BGT=20;






XBYTE[0x8000+0x0B]=0x86;
XBYTE[0x8000+0x0A]=0xA0;
XBYTE[0x8000+0x0A]=0x20;
XBYTE[0x8000+0x0B]=0x06;

j=250;
do{
 a=0XFD;b=0x73;c=0X61;d=0XFD;
 display();

}while(j--);  


}

if(B10==0|B19!=23|B29!=59)
{A10=00; A20=00;
A11=30; A21=25;
A12=45; A22=35;
A13=50; A23=40;
A14=45; A24=35;
A15=35; A25=30;
A16=45; A26=35;
A17=50; A27=40;
A18=40; A28=30;
A19=00; A29=00;

B10=6; B20=0;
B11=7; B21=20;
B12=8;  B22=40;
B13=11; B23=30;
B14=12; B24=30;
B15=13; B25=45;
B16=17; B26=30;
B17=18; B27=45;
B18=22; B28=0;
B19=23; B29=59;
}

 COMA =0xff;
 COMB =0xff;

 s_flag=0;
 _nop_();
 _nop_();
 
 _nop_();
 _nop_();

j=250;
do{
 a=0XFD;b=0xE1;c=0X61;d=0XFD;
 display();
	t_hour=XBYTE[0x8000+0x04];
	t_minute=XBYTE[0x8000+0x02];
	t_second=XBYTE[0x8000+0x00];
}while(j--);  


start_flag=1;
}
void alloff(void)
  {P1=0xff;
   P3_0=0;
   P3_1=0;
   P3_4=0;
   P3_5=0;
  }


  
void int0() interrupt 0 using 1 
{  bit jjj,keydat;
	
      	keydat = P3_2;	//读入键值
			_nop_();
      		_nop_();
      
      	if (keydat != 1)	//有键输入
		{
      		_nop_();
      		_nop_();
			_nop_();
      		_nop_();
      		jjj = P3_2;	//再读,去抖动
      	
      		if (jjj == keydat)
      		zxfa++;
			   if(zxfa==3)
			     {zxfa=0;
				 time=0;
				 }
      		
      		}

 
}

void settime(void)
    {uchar set_h,set_m,key;

XBYTE[0x8000+0x0B]=0x86;//停止
second_flag=0;
set_h=t_hour;
set_m=t_minute;
do
	{
        key=inkey();
		switch (key)
             {
            case 0x7E:            
			break;
		    case 0x7D:
			set_h++;
			if(set_h>=24)
			set_h=0;
			break;
		    case 0x7B:							
			if(set_h<=0)
			set_h=23;
			else
            set_h--;
			break;
	        case 0x77:				
			set_m++;
			if(set_m>=60)
			set_m=0;
			break;
		    case 0x6f:				
			
			if(set_m<=0)
			set_m=59;
			else
            set_m--;
			break;

					
			case 0x5F:	
			t_hour=XBYTE[0x8000+0x04]=set_h;
			t_minute=XBYTE[0x8000+0x02]=set_m;
 		    t_second=XBYTE[0x8000+0x00]=0;
			XBYTE[0x8000+0x0B]=0x06;//启动时间  
       	    second_flag=1;
		
		    return;
			 break;
            }

        a=tab[set_h/10];b=tab[set_h%10];c=tab[set_m/10];d=tab[set_m%10];
		display();
	}while(1);


	
	}


	void display1(void)
	{alloff();
	if(s_flag&&second_flag)
		{
		P1_0=0;
		P3_0=0;
		P3_1=0;
		P3_4=1;
		P3_5=0;

		}
		else
		{
		P1_0=1;
		P3_0=0;
		P3_1=0;
		P3_4=0;
		P3_5=0;
		}
		Delay(1);

		alloff();
	
		switch (zxfa)
       {
        case 0:
	 		  P1_0=0;
				P3_0=0;
				P3_1=0;
				P3_4=0;
				P3_5=1;
	
				break;
			case 1:		 	
  			P1_0=0;
				P3_0=1;
				P3_1=0;
				P3_4=0;
				P3_5=0;
	
			
				break;
			case 2:
	 		    			
			  P1_0=0;
				P3_0=0;
				P3_1=1;
				P3_4=0;
				P3_5=0;
			
				break;
				}
	    	Delay(1);

			alloff();
	}
void check(void)
   {uchar m1,m2,key;
   set_flag=0;
   settime_flag=0;
    m1=55;
	m2=55;

	do
	{

    a=tab[m1/10];b=tab[m1%10];c=tab[m2/10];d=tab[m2%10];
	display();
    key=inkey();
		switch (key)
             {
            case 0x7E:
			if(m1==80&&m2==31)
			settime_flag=1;
			return;			   
			break;	
			case 0x5F:	
			if(m1==80&&m2==31)
			set_flag=1;
			 return;
			 break;
		    case 0x7D:
			m1++;	
			break;
		    case 0x7B:				
			m1--;
			break;
	        case 0x77:				
			m2++;
			break;
		    case 0x6f:				
			m2--;
			break;
            }	
	}while(1);
   }

void initsiu(void)	//初始化单片机
	{
	TMOD=0x11;	//定时器1:gate=0->TR1=1开始计数,C/T=0->对内部计数,模式1->16位计数
	TH0=0Xd4;
	TL0=0X98;
	ET0=1;		//打开定时器0中断
	ET1=0;		//关闭定时器1中断

	IT0=1; //外中断跳变产生中断 
    EX0=1; 
 

	TR0=1;		//打开计数器0
	TR1=0;		//关闭计数器1
	EA=1;		//总中断允许

	start_flag=0;

 COMA =0xff;
 COMB =0xff;
	}

⌨️ 快捷键说明

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