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

📄 perfect111.c

📁 智能车控制,基于c51,LCD显示,带模式选择功能,可选择直线,S线,全自动模式,统计运行情况
💻 C
📖 第 1 页 / 共 4 页
字号:
					Next=False;									

				while(1)
				{
					if (Next==True)					  //如果再一次按下Next键,则跳出
						break;
					if (SpeedSelected==True)		  //如果按下确定键,则设置速度为High,并跳出
					{
						
						Thx[0]=0xe0;Tlx[0]=0xc0;	  //8ms
				    	Thx[1]=0xe0;Tlx[1]=0xc0;	  //8ms
					    Thx[2]=0x63;Tlx[2]=0xc0;	  //40ms
					    Thx[3]=0xec;Tlx[3]=0x78;	  //5ms
						Thx[4]=0xec;Tlx[4]=0x78; 	  //5ms
						SelectedSpeed=High;
						break;
					}				
				}			
			}
	
			if (SpeedSelected==True)				  //按下了确定键,退出速度选择
			{
				IsSelectingSpeed=False;
				break;
			}
	
			if (Next==True)							  //再一次按下了Next键,则循环速度选择
			{
				Next=False;
				continue;
			}
	
		}
	}

	StartSelectModeAndSpeed=False;                    //标志模式选择和速度选择完毕
	
	Delay(150);										  //防止按钮抖动产生毛刺电平

	Running=True;
	Delay(50);
	WriteCmd(LCD_CLS);

	
	/*-------------------------  显示所选择的模式和速度方案  -------------------------*/
	if (SelectedMode==Line)
	{	
		DisplayString(0x0,0," Choosen Mode is");
		DisplayString(0x0,1,"      Line      ");
		Delay(150);
		WriteCmd(LCD_CLS);
	}
	if (SelectedMode==Curve)
	{
		
		DisplayString(0x0,0," Choosen Mode is");
		DisplayString(0x0,1,"      Curve     ");
		Delay(150);
		WriteCmd(LCD_CLS);
	}
	if (AutoMode==1)
	{
		DisplayString(0x0,0," Choosen Mode is");
		DisplayString(0x0,1,"    AutoMode    ");
		Delay(150);
		WriteCmd(LCD_CLS);
	}				  

	if (SelectedMode==Line)
	{
		if (SelectedSpeed==Normal)
		{
			DisplayString(0x0,0,"Choosen Speed is");
			DisplayString(0x0,1,"     Normal     ");
			Delay(150);
			WriteCmd(LCD_CLS);
		}
	
		if (SelectedSpeed==Low)
		{
			DisplayString(0x0,0,"Choosen Speed is");
			DisplayString(0x0,1,"       Low      ");
			Delay(150);
			WriteCmd(LCD_CLS);
		}
	
		if (SelectedSpeed==High)
		{
			DisplayString(0x0,0,"Choosen Speed is");
			DisplayString(0x0,1,"      High      ");
			Delay(150);
			WriteCmd(LCD_CLS);
		}
	}

	
	
	INTInit();										//初始化所有中断
	/*-----------------------------  开始起跑 ------------------------------------*/

	/*-----------------------------  倒计时3秒 -----------------------------------*/
	DisplayString(0x0,0,"Left Times To Go");
	while (ReadyToGo--)
    {
		DisplaySingleChar(0x7,1,ReadyToGo+0x30);
		DisplaySingleChar(0x09,1,'s');
		Delay(300);		
	}
	WriteCmd(LCD_CLS);
	DisplayString(0x05,0,"Go!!!");
	Delay(100);
	WriteCmd(LCD_CLS);
	DisplayString(0x0,0,"   Running...   ");
	DisplayString(0x0,1,"Designed by 3202");

	
	if (SelectedMode==Line&&AutoMode!=1)
		flag=Area0;
	else
	    flag=1;
	
	while(flag<5)
	{  	
		if(AutoMode==1)										   //自动型
	    {
			switch(PassLineID)
		    { 
			   case 0  :{ 
		   				if(IsT0INT==1)
				   	      {P01=P02=P04=0;P03=1;}	      
			       	  	else
				  	      {P01=P02=P03=P04=0;}	       
						}break;
			   case 1  :{
			             P01=P02=P03=0;P04=1;
			            }break;
			   case 2  :{ 
					     P01=P02=P04=0;P03=1;	      
			            }break;
			   default :break;
		    } 
		}
	   else
	   {			
			if(SelectedMode==Line) 								//直线型  
		    {	 if(AutoMode==2)
			      {	 flag=Area0;
					  if(IsT0INT==1)	
					      {P03=1;P04=0;P01=P02=0;}
		          	  else 
				      	  {P03=0;P04=0;P01=P02=0;}
					  if(IsT1INT==1)
					     {SurveyDistance=Distance-SurveyDistance;
						  if(Area0==2)
						 	{if((SurveyDistance/0.5)>FirstAreaRate)
							   RateID=0;
							 else
						 	   RateID=1;
							 }
					       if(Area0==3)
							 { if(SurveyDistance/0.5>SecondAreaRate)
								 RateID=0;
							   else
							 	 RateID=1;
				     		  }
						   if(Area0==4)
							  {if((SurveyDistance/0.5)>ThirdAreaRate)
							     RateID=0;
							   else
						 	     RateID=1;
							 }
							SurveyDistance=Distance;
							IsT1INT=0;
						  }
				  }
				 else
				  {
					  flag=Area0;
					  if(IsT0INT==1)	
					      {P03=1;P04=0;P01=P02=0;}
		          	  else 
				      	  {P03=0;P04=0;P01=P02=0;}
				   }
		    }
		   	else									   
		    {  													 //S型
		       	  if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0)
			      { 
				  	  if(Backid==1)
				   	  {P01=1;P02=0;P03=0;P04=1;}
					  else
					  {P01=0;P02=1;P03=0;P04=1;}
				      Back=1; 	   
		          }	  
				  else
			      {
				  	  if(Round==0)
					  {
					  	   if(IsT0INT2==1)
						        {P01=0;P02=0;P03=1;P04=0;}
	    				   else
						        {P01=0;P02=0;P03=0;P04=0;}
				      }
					  else  
				
	                       {
						   		EX1=1;
					 	   		if(Round%2)
		                   		{  
						  			if(IsT0INT2==1)
						        	{P01=1;P02=0;P03=1;P04=0;Backid=1;}
	    				        	else
							        {P01=1;P02=0;P03=0;P04=0;}
						   		}
			               		else
						   		{
						   			if(IsT0INT2==1)
			                     	{P01=0;P02=1;P03=1;P04=0;Backid=0;}
							   		else
							    	{P01=0;P02=1;P03=0;P04=0;}
						        }
				           } 
					   }
		          }  
		    }			
		}
		
		
	}
	//补中断路程,加上最后一次中断缺失的路程
	Speed=SpeedCount/4*CircleLength;			  //计算瞬时速度
	Distance+=Speed;							  //计算距离						
	SpeedCount=0;
	while(Area0<6&&SelectedMode==Line)
	  {	 if(IsT0INT==1)	
		   {P03=1;P04=0;P01=P02=0;}
		 else 
		   {P03=0;P04=0;P01=P02=0;}	    
	  }
	P04=1;P03=0;P01=P02=0;Delay(90);
	P03=0;P04=0;								  //行程结束,小车停止
	P31=1; 										  //行程结束,背光开
	ET0=0x0;      							      //关T0中断
	ET1=0x0;     								  //关T1中断
	EX1=0x01;									  //开INT1中断
	Running=False;
	
	
	AutoDisplay=True;							  //默认情况下直线模式会自动显示高低速区域经过的时间
	WriteCmd(LCD_CLS);
	
	/*--------------------------- 小车跑完,开始显示信息-------------------------------*\

	  说明: 小车跑完之后,如果之前选择的是Line模式或者AutoMode模式,LCD会自动循环显示第
	  		 一个低速区、高速区以及第二个低速区的通过时间,以检查是否满足设计要求。

			 在循环显示这三个信息时,只要你按一下确定键,LCD会进入菜单选择,在菜单选择里
			 你可以查看另外三个信息,即全程所花的时间CostTime,全程平均速度AVGSpeed以及
			 全程所走过的路程TotalDistance。

			 如果之前选择的是Curve模式,那么LCD会直接进入菜单选择让你查看CostTime、AVGS
			 -peed以及TotalDistance三个信息,而不会显示低速区和高速区的通过时间,因为在
			 Curve模式下是没有低速区和高速区的。

	\*---------------------------------------------------------------------------------*/
	
	
	/*------------------------  显示低速区、高速区的通过时间 --------------------------*/
	GoToChoosingDisplay=False;
	if (SelectedMode==Line)						//Line或者AutoMode模式下才显示
	{
		while(1)
		{
			if (GoToChoosingDisplay==True)
				break;
			WriteCmd(LCD_CLS);
			DisplayString(0,0," LowSpeedArea1  ");
			DisplayString(0,1," Costed ");
			DisplaySingleChar(0x0C,1,'s');
			LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime;
			DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);
			if (LowSpeedArea1PassTime > 9)    		 //通过低速区的时间超过10s
				DisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);
			Delay(400);
				
			if (GoToChoosingDisplay==True)
			 	break;
			WriteCmd(LCD_CLS);
			DisplayString(0,0," HighSpeedArea ");
			DisplayString(0,1," Costed ");
			DisplaySingleChar(0x0C,1,'s');
			HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime;
			DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);
			if ( HighSpeedAreaPassTime> 9)	 		//通过高速区的时间超过10s
				DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);
			Delay(400);

			if (GoToChoosingDisplay==True)
				break;
			WriteCmd(LCD_CLS);
			DisplayString(0,0," LowSpeedArea2 ");
			DisplayString(0,1," Costed ");
			DisplaySingleChar(0x0C,1,'s');
			LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime;
			DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);
			if ( LowSpeedArea2PassTime> 9)	 		//通过第二个低速区的时间超过10s
				DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);	
			Delay(400);

		}
	}
	
	AutoDisplay=False;

	/*----------------  菜单选择你想要看的内容--总时间、总路程以及平均速度  --------------*/
	ChoosingDisplay=True;								  
	WriteCmd(LCD_CLS);

	SelectedShow=False;									//防止之前中断对按钮的影响
	SelectedReturn=False;
	Selected=False;
	Next=False;


	while(1)
	{
		if (NextTimes>=3)								//说明是按Next键到菜单选项尽头才返回的
		{
			NextTimes=0;						       	//这样不显示主菜单的提示信息
			Next=False;									//修改过的
			WriteCmd(LCD_CLS);
			DisplayString(0x0,0,"   Costed Time  ");
			DisplayString(0x0,1,"Next        Show");

			Delay(120);									//检测按键抖动并消除
			if (Next==True)
				Next=False;									
		}
		else											
		{
			NextTimes=0;
			WriteCmd(LCD_CLS);
			DisplayString(0x0,0," Now Choose what");     //首次显示主菜单或者是按返回键返回的
			DisplayString(0x0,1," you want to see");	 //这样就显示主菜单的提示信息
			Delay(250);

			if (SelectedShow==True)						 //检测按键抖动并消除
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}

			WriteCmd(LCD_CLS);
			DisplayString(0x0,0,"   Costed Time  ");
			DisplayString(0x0,1,"Next        Show");
			Delay(120);										
		}

    /*------------------------------------第一次按键--------------------------------------*/
		
		/*不断检测确定键和Next键*/
		while(1)
		{
			if (Next==True)
				break;
			if (SelectedShow==True)
				break;
		}

		/*按下了确定键,显示第一个选项的内容*/
		if (SelectedShow==True)	  
		{
			SelectedShow=False;
			SelectedReturn=False;
			Selected=False;
			WriteCmd(LCD_CLS);
			DisplayString(0,0,"Costed Time is");				   
			DisplayTime();
			DisplayString(0x0A,1,"s");
			ReturnSelection=True; 					//按下了确定键,那么这个时候开启返回键的功能                
			AVGSpeedShow=False;		

			Delay(120);								//检测按键抖动并消除
			if (SelectedShow==True)				    
			{
				SelectedShow=False;
				SelectedReturn=False;
				Selected=False;
			}
		}

		/**按下了Next键,则显示第二个选项*/
		if (Next==True)								//按下Next键,显示AVGSpeed菜单项
		{
			NextTimes++;
			Next=False;
			WriteCmd(LCD_CLS);
			DisplayString(0x0,0,"    AVGSpeed    ");
			DisplayString(0x0,1,"Next        Show");					
			ReturnMain=False;
			ReturnSelection=False;			       //按下了Next键,那么这个时候关闭返回键的功能
			AVGSpeedShow=True;					   //表明AVGSpeed选项已经显示过了

			Delay(120);							   //检测按键抖动并消除
			if (Next==True)
				Next=False;							
		}

	/*------------------------------------第二次按键--------------------------------------*/

		/*显示第一个选项的内容后又不断检测返回键(确定键)和Next键*/
		while(1)
		{
			if (Next==True)
				break;
			if (Selected==True)

⌨️ 快捷键说明

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