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

📄 trafficlight.c

📁 yige jiao tong deng xiao xi tong ,bao kuo c chengxu he dianlutu,yong KEIL he PROTUES dakai.
💻 C
字号:
#include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */
#include <reg51.h>

//定义各任务
#define INIT             0
#define TIME_RUN         1	   
#define TIME_DISPLAY	 2
#define KEY_SCAN         3
#define KEY_DEAL         4
#define CON_LIGHT        5



//定义各个键值
#define URGENCY1         0
#define URGENCY2         1
#define URGENCY3         2
#define SETYELLOW        3
#define SCHOS            4
#define TIMEADD          5
#define TIMEDEL      	 6

#define MDCHOS           8  
#define PTIMEADD         9
#define PTIMEDEL  	     10
#define PTIMEBACK		 11
#define TDISPCHOS        12
#define TDISPBACK        13

#define URGBACK			 15


//定义所有灯亮灭状态
#define S0_0         0x2A
#define S0_1         0x3A
#define S1           0x1A
#define S2           0x3C
#define S3			 0x09
#define S4_0		 0xD1
#define S4_1 		 0x51	//1'2'5 on
#define S5			 0x51   //1'2   on 
#define S6           0x61
#define S7			 0x79
#define S8			 0x39	//URG1
#define S9			 0xD1   //URG2  1'2   on
#define S10 		 0x2A	//URG3
#define S11			 0xe4  	//SETYELLOW



#define uchar unsigned char
#define uint  unsigned int




uchar numcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar key;
uchar clock;		     //use in TIME_RUN,TIME_DISPLAY,SCHOS
uchar timecount;    //use in TIME_RUN,CON_LIGHT
uchar disptime;	   //use in TDISPCHOS,TIME_DISPLAY
uchar buf[3];     //time
uchar buf1[10];	 //use in urgency

uchar keepewcanwalk;
uchar keepewwalk;
uchar keepewtright;
uchar keepewyellow;
uchar keepewtleft;

uchar keepnscanwalk;
uchar keepnswalk;
uchar keepnstright;
uchar keepnsyellow;
uchar keepnstleft;

sbit  DA     = P0^4;
sbit  EW6    = P3^6;
sbit  NS5    = P3^7;
sbit  TIM10  = P3^0;
sbit  TIM1   = P3^1;


uchar stopsta;
/*
	stopsta = 0--Clock Run
	stopsta = 1--Clock Stop
*/
uchar ns5sta;
/*
	ns5sta = 0--NS5 off
	ns5sta = 1--NS5 on
*/
uchar ew6sta;
/*
	ew6sta = 0--EW6 off
	ew6sta = 1--EW6	on
*/
uchar timesta;
/*	   use in TIME_RUN,CON_LIGHT
	timesta = 0--ewwalk
	timesta = 1--ewtright
	timesta = 2--ewyellow
	timesta = 3--ewtleft
	timesta = 4--nswalk
	timesta = 5--nstright
	timesta = 6--nsyellow
	timesta = 7--nstleft
*/
uchar dispsta;
/*	 use in TIME_DISPLAY ,TDISPCHOS	,SCHOS
	dispsta = 0--dispdat = clock
	dispsta = 1--dispdat = disptime
*/
uchar disptimesta;
/*	  use in TDISPCHOS
	disptimesta = 0--ewwalk
	disptimesta = 1--ewtright
	disptimesta = 2--ewyellow
	disptimesta = 3--ewtleft
	disptimesta = 4--nswalk
	disptimesta = 5--nstright
	disptimesta = 6--nsyellow
	disptimesta = 7--nstleft
*/
uchar lightsta;
/*  use in CON_LIGHT,KEY_DEAL
	lightsta = 0--CON_LIGHT
	lightsta = 1--CON_LIGHT
*/


struct  Time_Struc 
{
   uchar  ewwalk;
   uchar  ewtright;
   uchar  ewyellow;
   uchar  ewtleft;
   uchar  ewgreen;
   uchar  ewcanwalk;

   uchar  nswalk;
   uchar  nstright;
   uchar  nsyellow;
   uchar  nstleft;
   uchar  nsgreen;
   uchar  nscanwalk;
}Time;




void job0 (void) _task_ INIT 
 {     
 
 	  Time.ewwalk   = 10;
	  Time.ewtright = 5;
	  Time.ewyellow = 2;
	  Time.ewtleft  = 5;
	  Time.ewcanwalk= 6;
	               
	  Time.nswalk   = 10;
	  Time.nstright = 5;
	  Time.nsyellow = 2;
	  Time.nstleft  = 5;
	  Time.nscanwalk= 6;

	  keepewcanwalk = 6;
	  keepewwalk    = 10;
	  keepewtright  = 5;
	  keepewyellow  = 2;
	  keepewtleft   = 5;

	  keepnscanwalk = 6;
 	  keepnswalk    = 10;
	  keepnstright  = 5;
	  keepnsyellow  = 2;
	  keepnstleft   = 5;
	  

	  key       = 18;
	  stopsta   = 0;
	  timesta   = 0;
	  clock     = 10;
	  timecount = 10;
	  disptime  = 0;
	  dispsta   = 0;
	  disptimesta = 0;
	  ns5sta    = 0;
	  ew6sta    = 0;
	  lightsta  = 0;

      
      os_create_task (TIME_RUN);      
      os_create_task (TIME_DISPLAY);              
      os_create_task (KEY_SCAN);
      os_create_task (KEY_DEAL);
      os_create_task (CON_LIGHT);  
	  os_delete_task (INIT);
 }




void job1 (void) _task_ TIME_RUN
{            
    while(1)
    {
		 if(stopsta==0)
		 {	
    	 	os_wait (K_IVL,92,0);
 
		 	 clock -- ;    	 
	     	if(clock==0)
			  {
			  	timesta++;
				if(timesta>=8)
				   timesta = 0;
				   os_wait(K_IVL,10,0);
				clock = timecount;
			   }
		 }
		 else 
		    os_wait(K_IVL,5,0);
	 }
}


 void job2 (void) _task_  TIME_DISPLAY
{                  
  uchar i,j,dispdat;

  while(1)
     {

	 	   if(dispsta==0)
			 	dispdat = clock;
		   else
			    dispdat = disptime; 	
    	   buf[1] = numcode[dispdat/10];
	       buf[2] = numcode[dispdat%10];
		  


		   if(ns5sta==0&&ew6sta==0)
		   	  {	
			    for(i=1;i<=2;i++)
		         {
					P1 = buf[i];
		  		    P3 = i;
		  		    for(j=0;j<20;j++)
		  		            ;
		  		    P1 = 0x00;
				 }
			  }
			else if(ns5sta==1&&ew6sta==0)
			  {	
			    for(i=1;i<=2;i++)
		         {
					P1 = buf[i];
		  		    P3 = i+128;
		  		    for(j=0;j<20;j++)
		  		            ;
		  		    P1 = 0x00;
				 }
			  } 
			else if(ns5sta==0&&ew6sta==1)
			  {	
			    for(i=1;i<=2;i++)
		         {
					P1 = buf[i];
		  		    P3 = i+64;
		  		    for(j=0;j<20;j++)
		  		            ;
		  		    P1 = 0x00;
				 }
			  } 
			else
			  {	
			    for(i=1;i<=2;i++)
		         {
					P1 = buf[i];
		  		    P3 = i+192;
		  		    for(j=0;j<20;j++)
		  		            ;
		  		    P1 = 0x00;
				 }
			  }			   
	}
}   



 void job3 (void) _task_  KEY_SCAN

{	   
	while(1)
	 {
	     os_wait (K_IVL,10,0);
	     if(DA==1)
		 {
	       	 key = P0&0x0f ;
			 os_send_signal(KEY_DEAL);
		 }
      }	      	         	      
}   	      	   	



void job4 (void) _task_  KEY_DEAL
{
  uchar i,ssta,mdsta,psta;
  i       = 0;	
  ssta    = 0;		   //1--4dwalk,2--4dtright,3--4dyellow,4--4dtleft
  mdsta   = 0;       //1--ewgreen,2--nsgreen
  psta    = 0;		   //0--4dcanwalk+,1--4dtright+

   while(1)
   {	   
   			os_wait(K_IVL,10,0);
	        os_wait(K_SIG,0,0);

		if(key==URGENCY1)
			  {
			   	  stopsta = 1;
				  lightsta = 1;
				  ew6sta = 0;
				  P2 = S8;
				  i++;
				  if(i>=10)
				   {
				   	  i = i-5;	
				   }
				  buf1[i] = 1;
			   }
		if(key==URGENCY2)
			  {
			   	  stopsta = 1;
				  lightsta = 1;
				  P2 = S9;
				  ew6sta = 0;
				  i++;
				  if(i>=10)
				   {
				   	  i = i-5;	
				   }
				  buf1[i] = 2;
			   }
		 if(key==URGENCY3)
			  {
			   	  stopsta = 1;
				  lightsta = 1;
				  P2 = S10;
				  ns5sta = 0;
				  ew6sta = 0;
				  i++;
				  if(i>=10)
				   {
				   	  i = i-5;	
				   }
				  buf1[i] = 3;
			   }
		 if(key==SETYELLOW)
			  {
			   	  stopsta = 1;
				  lightsta = 1;
				  os_wait(K_IVL,10,0);
				  P2 = S11;
				  ew6sta = 1;
				  i++;
				  if(i>=10)
				   {
				   	  i = i-5;	
				   }
				  buf1[i] = 4;
			   }
		  if(key==URGBACK)
			  {
			     i--;
			  	if(i!=0)
				 {
				   switch(buf1[i])
				    {case 1:P2 = S8;
							ns5sta = 0;
							ew6sta = 0;
							
							break;
					 case 2:P2 = S9;
							ns5sta = 0;
							ew6sta = 0;
							break;
					 case 3:P2 = S10;
							ns5sta = 0;
							ew6sta = 0;
							break;
					 case 4:P2 = S11;
							ew6sta = 1;
							ns5sta = 0;
							break;	
					}
				  }
			 else
			   {
			   		ew6sta  = 0;
					ns5sta  = 0;
					stopsta = 0;
					lightsta = 0;
					key     = 18;
			   }
		   }


	    if(key==TDISPCHOS)
		  {
		  	  disptimesta++;
			  dispsta = 1;
			  if(disptimesta>=8)
			    {
					disptimesta = 0;
					dispsta = 0;
					key = 18;
				}
		  }
		 switch(disptimesta)
		   {case 0:disptime = keepewwalk;
		   			break;
			case 1:disptime = keepewtright;
					break;
			case 2:disptime = keepewyellow;
					break;
			case 3:disptime = keepewtleft;
				  	break;
			case 4:disptime = keepnswalk;
				    break;
			case 5:disptime = keepnstright;
					break;
			case 6:disptime = keepnsyellow;
					break;
			case 7:disptime = keepnstleft;
					break;
		   }
		  if(key==TDISPBACK)
		    {
				dispsta = 0;
				disptimesta = 0;
				key = 18;
			}


	   	if(key==SCHOS)
		   {
		   		ssta++;
				stopsta = 1;
				lightsta = 1;
				dispsta = 1;
				if(ssta>=5)
				{
					ssta = 0;
					stopsta = 0;
					dispsta = 0;
					lightsta = 0;
					key = 18;
					keepewcanwalk = Time.ewcanwalk;
	 				keepewwalk    = Time.ewwalk;
	 				keepewtright  = Time.ewtright;
					keepewyellow  = Time.ewyellow;
	 				keepewtleft   = Time.ewtleft;

	 				keepnscanwalk = Time.nscanwalk;
 	 				keepnswalk    = Time.nswalk;
	 				keepnstright  = Time.nstright;
	 				keepnsyellow  = Time.nsyellow;
	  				keepnstleft   = Time.nstleft;
				}
		   }
		 switch(ssta)
		    {case 1:disptime = Time.ewwalk;
			   		P2 = S0_0;
					if(key==TIMEADD)
						{
						   Time.ewcanwalk++;
						   Time.nscanwalk++;
						   Time.ewwalk++;
						   Time.nswalk++;
						   if(Time.ewcanwalk>=95)
						     {
							    Time.ewcanwalk = 10;
						        Time.nscanwalk = 10;
								Time.ewwalk    = 14;
								Time.nswalk    = 14;
							 }
						}
					if(key==TIMEDEL)
					    {
						   Time.ewcanwalk--;
						   Time.nscanwalk--;
						   Time.ewwalk--;
						   Time.nswalk--;
						   if(Time.ewcanwalk==0)
						     {
							   	Time.ewcanwalk = 1;
						        Time.nscanwalk = 1;
								Time.ewwalk    = 5;
								Time.nswalk    = 5;
							 }
						}
					  break;
			  case 2:disptime = Time.ewtright;
			   		 P2 = S1;
					if(key==TIMEADD)
						{
						   Time.ewtright++;
						   Time.nstright++;
						   if(Time.ewtright>=99)
						     {
							    Time.ewtright = 10;
						        Time.nstright = 10;
							 }
						}
					if(key==TIMEDEL)
					    {
						   Time.ewtright--;
						   Time.nstright--;
						   if(Time.ewtright==0)
						     {
							   	Time.ewtright = 1;
						        Time.nstright = 1;
							 }
						}
					 break;
			  case 3:disptime = Time.ewyellow;
			   		 P2 = S2;
					if(key==TIMEADD)
						{
						   Time.ewyellow++;
						   Time.nsyellow++;
						   if(Time.ewyellow>=99)
						     {
							    Time.ewyellow = 10;
						        Time.nsyellow = 10;
							 }
						}
					if(key==TIMEDEL)
					    {
						   Time.ewyellow--;
						   Time.nsyellow--;
						   if(Time.ewyellow==0)
						     {
							   	Time.ewyellow = 1;
						        Time.nsyellow = 1;
							 }
						}
					 break;
			  case 4:disptime = Time.ewtleft;
			   		 P2 = S3;
					if(key==TIMEADD)
						{
						   Time.ewtleft++;
						   Time.nstleft++;
						   if(Time.ewtleft>=99)
						     {
							    Time.ewtleft = 10;
						        Time.nstleft = 10;
							 }
						}
					if(key==TIMEDEL)
					    {
						   Time.ewtleft--;
						   Time.nstleft--;
						   if(Time.ewtleft==0)
						     {
							   	Time.ewtleft = 1;
						        Time.nstleft = 1;
							 }
						}
					 break;
			}


		  if(key==MDCHOS)
		    {
				mdsta++;
				stopsta = 1;
				lightsta = 1;
				dispsta = 1;
			    ns5sta = 0;
				if(mdsta>=3)
				  {
				  	  mdsta = 0;
					  stopsta = 0;
					  dispsta = 0;
					  lightsta = 0;
					  key  = 18;	
				  }
			}
		   switch(mdsta)
		     {case 1:disptime = Time.ewcanwalk+Time.ewtright+4;
			         P2 = S10;
					 if(key==PTIMEADD)
					   {
					   		if(psta==0)
							  {
							  	  Time.ewcanwalk++;
								  psta = 1;
								  if(Time.ewcanwalk>=95)
										Time.ewcanwalk = 90;
							  }	 
							else
							  {
							  	   Time.ewtright++;
								   psta = 0;
								   if(Time.ewtright>=99)
								         Time.ewtright = 97;
							  }
					   }
					 if(key==PTIMEDEL)
					    {
							if(psta==0)
							  {
							  	  Time.ewcanwalk--;
								  psta = 1;
								  if(Time.ewcanwalk==0xff)
								   		Time.ewcanwalk = 0;
							  }
							else
							  {
							  	   Time.ewtright--;
								   psta = 0;
								   if(Time.ewtright==0xff)
								        Time.ewtright = 0;
							  }
						}
					  break;
			  case 2:disptime = Time.nscanwalk+Time.nstright+4;
			  		 P2 = S9;
					 if(key==PTIMEADD)
					   {
					   		if(psta==0)
							  {
							  	  Time.nscanwalk++;
								  psta = 1;
								  if(Time.nscanwalk>=95)
										Time.nscanwalk = 90;
							  }	 
							else
							  {
							  	   Time.nstright++;
								   psta = 0;
								   if(Time.nstright>=99)
								         Time.nstright = 97;
							  }
					   }
					 if(key==PTIMEDEL)
					    {
							if(psta==0)
							  {
							  	  Time.nscanwalk--;
								  psta = 1;
								  if(Time.nscanwalk==0xff)
								   		Time.nscanwalk = 0;
							  }
							else
							  {
							  	   Time.nstright--;
								   psta = 0;
								   if(Time.nstright==0xff)
								        Time.nstright = 0;
							  }
						}
			  		 break;	
			 }
		   if(key==PTIMEBACK)
		      {
			  	    Time.ewcanwalk = keepewcanwalk;
	 				Time.ewwalk    = keepewwalk;
	 				Time.ewtright  = keepewtright;
					Time.ewyellow  = keepewyellow;
	 				Time.ewtleft   = keepewtleft;

	 				Time.nscanwalk = keepnscanwalk;
 	 				Time.nswalk    = keepnswalk;
	 				Time.nstright  = keepnstright;
	 				Time.nsyellow  = keepnsyellow;
	  				Time.nstleft   = keepnstleft;
					
					key = 18;	
			  }

		
     }
}  	     


void job5 (void) _task_  CON_LIGHT
{
	while(1)
	{
	   if(stopsta==0)
	    {
		  os_wait (K_IVL,10,0);
		 switch(timesta)
		 {case 0:timecount = Time.ewcanwalk+2;
				 if(lightsta==0)
				 {
		 		 if(clock>=3)
				 	P2 = S0_0;
				 else if(clock<=2)
				  	P2 = S0_1; 
				 ns5sta = 0;
				 }
		 		 break;
		  case 1:timecount = Time.ewtright;
		  		 if(lightsta==0)
				 {
		  		 P2 = S1;
				 ns5sta = 0;
				 }
		  		 break;
		  case 2:timecount = Time.ewyellow;
		  		 if(lightsta==0)
				 {
		  		 P2 = S2;
				 ns5sta = 0;
				 }
		  		 break;
		  case 3:timecount = Time.ewtleft; 
		  		 if(lightsta==0)
				 {
		  		 P2 = S3;
				 ns5sta = 0;
				 }
		  		 break;	
		  case 4:timecount = Time.nscanwalk+2; 
		  		 if(lightsta==0)
				 {
		 		 if(clock>=3)
				 	P2 = S4_0;
				 else if(clock<=2)
				  	P2 = S4_1; 
				  ns5sta = 0;
				  }
		  		 break;	
		  case 5:timecount = Time.nstright;
		  		 if(lightsta==0)
				 {
		  		 P2 = S5;
				 ns5sta = 1;
				 }
		  		 break; 	
		  case 6:timecount = Time.nsyellow;
		  		 if(lightsta==0)
				 {
				 ns5sta = 0;
		  		 P2 = S6;
				 }
		  		 break; 	
		  case 7:timecount = Time.nstleft; 
		   		 if(lightsta==0)
				 {
		  		 P2 = S7;
				 ns5sta = 0;
				 }
		  		 break;		 		 		 		 	
		 }
	   }
	}
}




⌨️ 快捷键说明

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