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

📄 main.c

📁 为2007年全国大学生电子设计大赛
💻 C
字号:
#include "hardware.h"
#include	"SPCE061V004.H"
#include "s480.h"
#include	"SPCE061.H"
unsigned int uiOutput=0x0000;
unsigned int Stat=0x0000;
unsigned int uiIutput=0x0f00;
unsigned int TimeCount=0x000;
unsigned int Blance=208;
unsigned int Signal=0;
main()
{ 	
*P_IOB_Dir|=0xF000;  				//IOB12-15 OutPut			   
*P_IOB_Dir&=0xF0FF;  				//IOB8-11  InPut
*P_IOB_Attrib|=0xF000;				//IOB12-15高电平输出
*P_IOB_Attrib&=0xF0FF;				//IOB8-11 低电平输入	 
*P_IOB_Data&=0x0FFF;                 //IOB12-15 初始化0
*P_IOB_Data|=0x0F00;				//IOB 8-11初始化1 			
	if(!((*P_IOB_Data&0x0f00)==0x0F00))						
		Play(0);
	IrqInit();  		
	while(1)						 
	{      
			*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 						
			Up();
			PingHeng();
			Down();
			Back();						 			
	}	
	        }//主函数结束		
	Up()				//IOB12-15口控制小车前进  小车开始前进
{	
	TimeCount=0x000;
	*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 
	*P_IOB_Data|=0x0F00;				//初始化传感器的输入信号口为全高电平
	while(1)
  {			 
	Time();	
	*P_Watchdog_Clear =C_WDTCLR;	
		uiIutput=*P_IOB_Data;
		
	if((uiIutput&0x0f00)==0x0f00)
		 Stat=0x0000;//1111后退
	else if((uiIutput&0x0f00)==0x0d00)	
		Stat=0x0020;//1101前进直走
	else if((uiIutput&0x0f00)==0x0b00)
		Stat=0x0010;//1011前进左转
	else if((uiIutput&0x0f00)==0x0e00)	
		Stat=0x0002;//1110前进右转
	else if((uiIutput&0x0f00)==0x0900)
		Stat=0x0010;//1001左边两个检测到前进左转
	else if((uiIutput&0x0f00)==0x0c00)
		Stat=0x0002;//1100右边两个检测到前进右转
	else if((uiIutput&0x0f00)==0x0800)
		Stat=0x0001;//全检测到黑线停止计时开始进入平衡调节模块		
	else 
		Stat=0x0004;//后退
		*P_IOB_Data&=0x0FFF;
		 Time(); 		 		
	if(Stat==0x0000)		
	{	
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 
		*P_IOB_Data|=0x2000;			
	}
	else if(Stat==0x0020)	//前进直走
	{	
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 
		*P_IOB_Data|=0x1000;		
	}	
	else if(Stat==0x0010)	//输出0101前进左转
	{
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 	
		*P_IOB_Data|=0x5000;	
	}
	else if(Stat==0x0002)	//输出1001前进右转
	{
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 	
		*P_IOB_Data|=0x9000;	
	}
	else if(Stat==0x0001)
	{
		Time();
		break;
	}
  }						//跳出前进程序转去执行后退程序				
			
}			 	
		PingHeng()
	{				
		TimeCount=0;
		Time();
		 while(1){ 
				Time();
						if(TimeCount>=40){
							LedShow(0040);
							break;}
						*P_Watchdog_Clear =C_WDTCLR;
						*P_IOB_Data&=0x0fff;				
						 if(ADmain()>=(Blance+4)){	  						 											 			                               
	                                     *P_IOB_Data|=0x1000; //超过平衡点后退;                                 	                                   		                                     	 					                   
						               }
						  else if((Blance-4)>=ADmain())      {	  	
	                                     *P_IOB_Data|=0x2000; //未超过平衡点前进;
						  				}
						  	else if(ADmain()==Blance+3){
						  				*P_IOB_Data|=0x1000;
						  				Delay(1);
						  				*P_IOB_Data&=0x0fff;
						  				Delay(2);
						  	}
						  	else if(ADmain()==Blance-3){
						  				*P_IOB_Data|=0x2000;
						  				Delay(1);
						  				*P_IOB_Data&=0x0fff;
						  				Delay(2);
						  	}								  							
						  	else if(ADmain()==Blance+2)
						  		{
						  			*P_IOB_Data|=0x1000;
						  			Delay(1);
						  			*P_IOB_Data&=0x0fff;
						  			Delay(4);
						  		}
						  		else if(ADmain()==Blance-2)
						  		{
						  			*P_IOB_Data|=0x2000;
						  			Delay(1);
						  			*P_IOB_Data&=0x0fff;
						  			Delay(4);
						  		}
						  		else if(ADmain()==(Blance+1)){
						  			*P_IOB_Data|=0x1000;
						  			Delay(1);
						  			*P_IOB_Data&=0x0fff;
						  			Delay(8);
						  		}	
						  		else if(ADmain()==(Blance-1)){
						  			*P_IOB_Data|=0x2000;
						  			Delay(1);
						  			*P_IOB_Data&=0x0fff;
						  			Delay(8);
						  		}	
						  		else if	 (ADmain()==Blance){
									*P_IOB_Data&=0x0fff;
									Delay(16);						  		
						  		}				  										  			             	
					
	}	//循环进入平衡调节模块	
}	//平衡调节函数结束		 
				
		//平衡调节结束开始下坡
  //循环结束
  Down()
{
  TimeCount=0;//下坡时间记录
while(1)
  {		  
		Time();	 	 		
		*P_Watchdog_Clear =C_WDTCLR;	
		uiIutput=*P_IOB_Data;
		
	if((uiIutput&0x0f00)==0x0f00)
		 Stat=0x0000;//1111停止
	else if((uiIutput&0x0f00)==0x0d00)	
		Stat=0x0020;//1101前进直走
	else if((uiIutput&0x0f00)==0x0b00)
		Stat=0x0010;//1011前进左转
	else if((uiIutput&0x0f00)==0x0e00)	
		Stat=0x0002;//1110前进右转
	else if((uiIutput&0x0f00)==0x0900)
		Stat=0x0010;//1001左边两个检测到前进左转
	else if((uiIutput&0x0f00)==0x0c00)
		Stat=0x0002;//1100右边两个检测到前进右转	
	else
		Stat=0x0004;//后退
		*P_IOB_Data&=0x0FFF;
		 Time(); 		 		
	if(Stat==0x0000)		//后退
	{	
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 
		*P_IOB_Data|=0x2000;			
	}
	else if(Stat==0x0020)	//前进直走
	{	
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 
		*P_IOB_Data|=0x1000;		
	}	
	else if(Stat==0x0010)	//输出0101前进左转
	{
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 	
		*P_IOB_Data|=0x5000;	
	}
	else if(Stat==0x0002)	//输出1001前进右转
	{
		//*P_IOB_Data&=0x0FFF;                 //IOB12-15 作为电机控制端口初始化0	 	
		*P_IOB_Data|=0x9000;	
	}
	else 					//if(Stat==0x0004)停5秒
	{	
		*P_IOB_Data&=0x0fff;						
		Play(1);			//播放5秒的录音提示返回
		IrqInit();
		break;				//跳出前进程序转去执行后退程序						
	}
 }
}							//小车前进函数结束							
	//IrqInit();//开计时中断
	 //TimeCount=0;;						
	Back()				//开始返回 IOB8-11控制后退
	{
		//	IrqInit();
			TimeCount=0;
				
		*P_IOB_Data&=0x0FFF;//IOB12-15 作为电机控制端口初始化0	 
		*P_IOB_Data|=0x00F0;//初始化传感器的输入信号口为全高电平
		while(1)
  {
        Time();
		*P_Watchdog_Clear =C_WDTCLR;	
		uiIutput=*P_IOB_Data;
			
	if((uiIutput&0x00F0)==0x00D0)
		 Stat=0x0000;		//后传感器1101 后退
	else if((uiIutput&0x00F0)==0x00f0)
		 Stat=0x0000;		//后传感器1111 后退
	//else if((uiIutput&0x0F00)==0x0D00)	倒退时碰到全为高电平的情况下出轨全未检测到 未写入代码
	//	Stat=0x0000;
	else if((uiIutput&0x00F0)==0x00B0)
		Stat=0x0010;		//1011后退左转
	else if((uiIutput&0x00F0)==0x00E0)	
		Stat=0x0002;		//1110后退右转
	else if((uiIutput&0x00F0)==0x0090)
		Stat=0x0010;		//1001左边两个检测到后退左转
	else if((uiIutput&0x00F0)==0x00C0)
		Stat=0x0002;		//1100右边两个检测到后退右转	
	else if((uiIutput&0x00F0)==0x0080)		
		Stat=0x0004;		//1000三个全检测到 回到A点停止
	else 
		Stat=0x0000;	
		*P_IOB_Data&=0x0FFF;
		Time();
	if(Stat==0x0000)
	{
		*P_IOB_Data|=0x2000;//后退	
	}
	
	//else if(Stat==0x0020)	//前进直走
	//{	*P_IOB_Data|=0x1000;
	//	Delay(1);	}	
	
	else if(Stat==0x0010)	//输出0110后退左转
	{
		*P_IOB_Data|=0x6000;
	}
	else if	(Stat==0x0002)				//输出1010后退右转
	{ 	
		*P_IOB_Data|=0xA000;
	}
		else 	//回到A点停止
	{
		*P_IOB_Data&=0x0fff;
	//	__asm ("FIQ ON");
		Play(2);				//小车返回播放提示音
		while(1){*P_IOB_Data&=0x0fff;			
			*P_Watchdog_Clear =C_WDTCLR;}	//程序终点
	}

  }	
}	
void Delay(unsigned int Time)
	{	
		unsigned int Count;
		unsigned int uiCount;
		for(Count = 0;Count<Time; Count++)
		{			
			for(uiCount = 0;uiCount <2200; uiCount++)
			{
			*P_Watchdog_Clear = 0x0001;//清看门狗操作
			
			}
		}
	}	
void	IrqInit()//计时程序控制设置						
	{	
		TimeCount=0;
		*P_INT_Ctrl=C_IRQ1_TMA;				//Open Interrupt
	__asm("INT OFF");									
	
	*P_TimerA_Ctrl=C_SourceA_1+C_SourceB_1024Hz; 	//TimerA:1024Hz
	*P_TimerA_Data=0xFBFF;				 			//1Second   
	//计时设置完
	}	
 void Time()
	{			
		//计时
		if(*P_INT_Ctrl&C_IRQ1_TMA)
		{			 
			*P_INT_Clear=C_IRQ1_TMA;         		//clear INT flag
			TimeCount++;	 			//计时			        			
		}
		LedShow(TimeCount);				//显示时间		
	}

⌨️ 快捷键说明

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