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

📄 perfect111.c

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

/*-------------------------------------  中断初始化   -------------------------------------*/
void INTInit(void)
{						
	EA=1;										  //开总中断
	IT0=1;										  //INTO边沿触发
	EX1=1;										  //开INT1中断
	IT1=1;										  //INT1边沿触发
	Clock0_Init();                 				  //初始化时钟中断0
	TMOD=0x11;									  //T0/T1定时方式1
	ET0=0x01;      							      //开T0中断
	ET1=0x01;     								  //开T1中断
	PT1=1;										  //T1中断最高级
	PT0=0;
	PX0=0;
	PX1=0;
}

/*******************************************************************************************\
**									   中断处理程序                                        **
\*******************************************************************************************/

/*-----------------------------------   外部中断0  ----------------------------------------*\

	外部中断0有两个功能
	(1)作为菜单选择的Next键
	(2)作为测速的计数器

\*-----------------------------------------------------------------------------------------*/

void SpeedINT(void) interrupt 0 			  //中断INT0
{
	if (StartSelectModeAndSpeed==True)		  //如果模式和速度还没有选择完毕,则此中断作为Next键
		Next=True;									
	if (Running==True)						  //如果模式和速度已经选择完毕,则此中断作为测速中断
		SpeedCount++;
	if (ChoosingDisplay==True)				  //如果是在选择要显示的内容
		Next=True;	 	 	
}
/*-----------------------------------   外部中断1  ----------------------------------------*\

	外部中断1有两个功能
	(1)作为菜单选择的确定键/返回键
	(2)控速

\*-----------------------------------------------------------------------------------------*/
void CtrSpeedINT(void) interrupt 2   		  //控速中断INT1
{			      
	
	if (StartSelectModeAndSpeed==True)		  //如果模式和速度还没有选择完毕,则此中断作为确定键
	{
		if (IsSelectingMode==True)			  //模式选择标志
				ModeSelected=True;
		if (IsSelectingSpeed==True)			  //速度选择标志
				SpeedSelected=True;
	}

	if (Running==True)						  //如果模式和速度选择已经完毕,则此中断作为控速中断
	{
		if (Area0==0)						  //经过第一条铁线(即起跑线),开始计时,开始测速
		{
			EX0=1;
			Clock1_Init();
	 		P31=0;							  //过起跑线,背光灭
		}
		if (Area0==1)
			LowSpeedArea1StartTime=(char)PassTime;          //读取进入第一个低速区的时刻
		if (Area0==2)
			LowSpeedArea1EndTime=(char)PassTime;	        //读取离开第一个低速区的时刻,也就是进入高速区的时刻
		if (Area0==3)
			HighSpeedAreaEndTime=(char)PassTime;			//读取离开高速区的时刻,也就是进入第二个低速区的时刻
		if (Area0==4)
			LowSpeedArea2EndTime=(char)PassTime;            //读取离开第二个低速去的时刻
		
		if(AutoMode==1)			  					        //自动型
			{  
			   PassLine++;
			   switch(PassLine)
			   {case 5  :PassLineID=1;break;
			    case 10 :PassLineID=2;break;
				default :PassLineID=PassLineID;break;
			   }
			   			} 	 
		 else										  
		  {	   if(AutoMode==2)
		        {	Area0++;
					if (Area0==4)
					  T024Change=61536;
				    if (Area0==6)
					  EX1=0;
		      	} 
			   else
				{
					if (SelectedMode==Line)				  //直线型
					{
						Thx0=Thx[Area0++];
						Tlx0=Tlx[Area1++];
						if (Area0==6)
							EX1=0;
					}
					else								  //S型
					{	Nocurve++;
					    Round++;
					  if(Roundid==1&&Round==2)
					    {Round++;Roundid=0;}
					    Back=0;
						Back0=0;
						EX1=0;
				    }
				 }
		  }
				IE1=0;
	}
	if (AutoDisplay==True)
	{
		GoToChoosingDisplay=True;
	}
	if (ChoosingDisplay==True)
	{
		SelectedShow=True;
		SelectedReturn=True;
		Selected=True;
	}
}
/*--------------------------------------   T0中断  ----------------------------------------*\

	T0中断用来输出方波以控制速度

\*-----------------------------------------------------------------------------------------*/
 void Time0INT(void) interrupt 1                 //T0中断  输出方波20H
{  
	if(AutoMode==1)
    {
	    IsT0INT*=-1;
	    switch(PassLine)
	    { 
		   case 2  :PrepareDistance=Distance;break;
	       case 3  :FirstAreaRate=(Distance-PrepareDistance)/12;break;
		   case	4  :SecondAreaRate=(Distance-PrepareDistance-FirstDistance)/2;break;
		   case 5  :ThirdAreaRate=(Distance-PrepareDistance-FirstDistance-SecondDistance)/12;break;
		   default :break;
	    } 
	    switch(PassLineID)
	    {   
		   case 0  :{ if(IsT0INT==1)
				    	 {TR0=0x01;TH0=0xe8;TL0=0x78;}	       //5ms
			       	  else
				  	     {TR0=0x01;TH0=0xb1;TL0=0xe0;}	       //20ms
					}break;
		   case 1  :break;
		   case 2  :{AutoMode=2;SelectedMode=Line;Area0=Area1=0;PassTime=0;Distance=0;flag=0;
		             TR0=0x01;TH0=0xf4;TL0=0x48;
		            }break;
		   default :break;
	    }
	}
	else
	{
		   if (SelectedMode==Line)
			{
				IsT0INT*=-1;
			    if (Area0<5)	
				{  
					if(IsT0INT==1)
					   { 
					   	  if(AutoMode==2)
					      {switch(Area0)
						    {
							 case 0 :{TR0=0x01;TH0=0xd8;TL0=0xf0;	   //10ms
							         }break;
							 case 1 :{TR0=0x01;TH0=0xd8;TL0=0xf0;	   //10ms
							         }break;
							 case 2 :{if(RateID==1)
							            {T024Change-=100;
										 TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
										 TL0=(char)(T024Change & 0x00ff);
										}  
									  else
									    { T024Change+=100;
										 TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
										 TL0=(char)(T024Change & 0x00ff);
										 }  
									 }break;
							 case 3	:{if(RateID==1)
							            { T03Change-=100;
										 TR0=0x01;TH0=(char)((T03Change & 0xff00)>>8);
										 TL0=(char)(T03Change & 0x00ff);
										}  
									  else
									    { T03Change+=100;
										 TR0=0x01;TH0=(char)((T03Change & 0xff00)>>8);
										 TL0=(char)(T03Change & 0x00ff);
										}  
							         }break;
							 case 4	:{if(RateID==1)
							            {T024Change-=100;
										 TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
										 TL0=(char)(T024Change & 0x00ff);}  
									  else
									    {T024Change+=100;
										 TR0=0x01;TH0=(char)((T024Change & 0xff00)>>8);
										 TL0=(char)(T024Change & 0x00ff);}  
									 }break;
							 default :break;
							}
						  }
					     else
						  Clock0_Init();
					   }
				 	else
				    {
				   		TR0=0x01;       				  //启动T0
				    	TH0=Thx1;						  //定时初值
				    	TL0=Tlx1;						    
				    } 
				}
				else
				    if(Area0==5) 
					  {  if(IsT0INT==1)
				    	   Clock0_Init();	     
			       	     else
				  	       {TR0=0x01;TH0=Thx1;TL0=Tlx1;}         //20ms
					   }
					 else
					  IsT0INT=-1;
			}
			else
			{ 	
				IsT0INT2*=-1;
			    if(IsT0INT2==1)
				  	{TR0=0x01;TH0=0xd8;TL0=0xf0;}	       //10ms
				else
				  	{TR0=0x01;TH0=0xb1;TL0=0xe0;}	       //20ms
				Back++;
				if(Back>=90)
				    Back0=126;
				
				if((Nocurve<2)&&(Back0>0)&&Back!=0)
			    {  
					if(Back0<=120)
				    Roundid=1;
				  	Back0--;
				}
				if(Back0==1&&Backid==1)
				    flag=6;
				if((Nocurve>=2)&&Back>=350)
					{Stop=1;IsT0INT2=-1;}
				if(Stop==1)
				    flag=6;
				  	  		  
			}
	}	
	TF0=0;	
}												 
/*-----------------------------------     T1中断   ----------------------------------------*\
	T1中断用来定时
\*-----------------------------------------------------------------------------------------*/
void Time1INT(void) interrupt 3                     //T1中断  实时显示时间
{
	Clock1_Init();
	Time1INTCount++;						 
	if (Time1INTCount == 10)					    //500ms扫描一次
	{
		PassTime+=0.5;								//计算时间
		Speed=SpeedCount/4*CircleLength;			//计算瞬时速度
		Distance+=Speed;							//计算距离						
		SpeedCount=0;
		IsT1INT=1;
		if (Area0>6)
			P03=0;
		Time1INTCount=0;	
	}
	TF1=0;	
}

void Clock0_Init(void)
{
	TR0=0x01;       							 //启动T0
	TH0=Thx0;								     //定时初值
	TL0=Tlx0;

}
void Clock1_Init(void) 
{
	TR1=0x01;      							     //启动T1
	TH1=0x3C;									 //定时初值-50ms中断一次
	TL1=0x0B0;
}

/*******************************************************************************************\
**                                    LCD显示模块                                          **
\*******************************************************************************************/

/*-------------------------------------  显示时间  ----------------------------------------*/
void DisplayTime(void)
{
	char PassTime1=0x30;
	char PassTime2=0x30;
	char PassTime3=0x30;
	char PassTime4=0x30;
	
	if ((int)(PassTime*100)<100)                  //时间未够1s
	{
		PassTime1+=0;      
		PassTime2+=(int)(PassTime*100)/10;
		PassTime3+=(int)(PassTime*100)%10;
	}
	else if ((int)(PassTime*100) > 100  && (int)(PassTime*100) < 1000) //够1s而未够10s
	{
		PassTime1+=(int)(PassTime*100)/100;
		PassTime2+=(int)(PassTime*100)/10%10;
		PassTime3+=(int)(PassTime*100)%10;
	}
	else
	{
		PassTime1+=(int)(PassTime*100)/1000;
		PassTime2+=(int)(PassTime*100)/100%10;
		PassTime3+=(int)(PassTime*100)/10%10;
		PassTime4+=(int)(PassTime*100)%10;
	}

	if ((int)(PassTime*100) < 1000)
	{	
		DisplaySingleChar(0x05,1,PassTime1);
		DisplaySingleChar(0x06,1,'.');
		DisplaySingleChar(0x07,1,PassTime2);
		DisplaySingleChar(0x08,1,PassTime3);
	}
	else
	{
		DisplaySingleChar(0x04,1,PassTime1);
		DisplaySingleChar(0x05,1,PassTime2);
		DisplaySingleChar(0x06,1,'.');
		DisplaySingleChar(0x07,1,PassTime3);
		DisplaySingleChar(0x08,1,PassTime4);
	}
	
	
}
/*------------------------------------ 显示平均速度 ----------------------------------------*/
void DisplayAVGSpeed(void)
{
	int Speed1=0x30;							//初始化为0的ASCII码
	int Speed2=0x30;
	int Speed3=0x30;

	if ((int)(Distance/PassTime*100)< 100)
	{
		Speed1+=0;
		Speed2+=(int)(Distance/PassTime*100)/10;
		Speed3+=(int)(Distance/PassTime*100)%10;
	}
	else
	{
		Speed1+=(int)(Distance/PassTime*100)/100;
		Speed2+=(int)(Distance/PassTime*100)/10%10;
		Speed3+=(int)(Distance/PassTime*100)%10;
	}

	DisplaySingleChar(0x05,1,Speed1);
	DisplaySingleChar(0x06,1,'.');
	DisplaySingleChar(0x07,1,Speed2);
	DisplaySingleChar(0x08,1,Speed3);
}
/*-------------------------------------  显示路程  ----------------------------------------*/

void DisplayDistance(void)
{
	int Distance1=0x30;
	int Distance2=0x30;
	int Distance3=0x30;
	int Distance4=0x30;

	if ((int)(Distance*100) < 100)
	{
		Distance1+=0;
		Distance2+=(int)(Distance*100)/10;
		Distance3+=(int)(Distance*100)%10;
	}
	else if ((int)(Distance*100) > 100  && (int)(Distance*100) < 1000)
	{
		Distance1+=(int)(Distance*100)/100;
		Distance2+=(int)(Distance*100)/10%10;
		Distance3+=(int)(Distance*100)%10;
	}
	else
	{
		Distance1+=(int)(Distance*100)/1000;
		Distance2+=(int)(Distance*100)/100%10;
		Distance3+=(int)(Distance*100)/10%10;
		Distance4+=(int)(Distance*100)%10;
	}
	

	if ((int)(Distance*100) < 1000)
	{	
		DisplaySingleChar(0x05,1,Distance1);
		DisplaySingleChar(0x06,1,'.');
		DisplaySingleChar(0x07,1,Distance2);
		DisplaySingleChar(0x08,1,Distance3);
	}
	else
	{
		DisplaySingleChar(0x04,1,Distance1);
		DisplaySingleChar(0x05,1,Distance2);
		DisplaySingleChar(0x06,1,'.');
		DisplaySingleChar(0x07,1,Distance3);
		DisplaySingleChar(0x08,1,Distance4);
	}
}

⌨️ 快捷键说明

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