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

📄 m.c

📁 08山东电子电子竞赛智能小车程序基于PIC+红外+电子罗盘ourdev551262 包含源码
💻 C
字号:
#include "C_main.h"
//各段状态变量
unsigned char NoWState;
//BD DC各段时间
unsigned int16 ABTime;
unsigned int16 BDTime;
unsigned int16 DCTime; 

//骑线次数
unsigned char PassLine;

//临时变量
unsigned char tmp;

//已经检测到铁标志
int1 eorned;
//走S路线使用罗盘标志
int1 SroadNorth;

//起始阶段NowState
#define StartState 1


//========================================主函数======================================
void main()
{
//系统初始化
init_sys();

//初始化罗盘
init_spi();

//各段初始值
ABTime=24;
BDTime=6;
DCTime=5;

//开始NowState
NoWState=StartState;

//骑线标志
PassLine=0;
 //走S路线标志		
SroadNorth=0;

//===============================开机自检=============
//电磁铁检测
Iron(1);

//底盘光电开启
Butten_Detect=1;

LCDprintR(&frm_welcom,3,2);	

//设置用户原点
SetOrg(GetNorth());	

//蜂鸣器检测
beep(1);
delay_ms(10);
Beep(0);


//=========================================================	
//等待用户按键开始按下
while(input(Key)==1)
{
delay_ms(100);
LCD_setpos(3,3);
//显示电量
NowV=GetVol();
LCD_disp_valueInt16(NowV);
//获得各种传感器状态
GetSenser();
//显示罗盘
dispNorth();	
};
//等待用户按键抬起
while(input(Key)==0);
//==========================================================

//底盘光电关闭
Butten_Detect=0;

//电磁铁关闭
Iron(0);

//设置用户原点
SetOrg(GetNorth());	

//启动电机
PWM_Start();
//清屏
LCD_disp_CLS();
//前进
Left_along();

//显示正在进行第一段
LCD_setpos(4,3);
LCD_disp_Putchar('0');

//计时开始
Time_Start(0);


//=========================================主循环===============================
while(1)
{

//1秒时间计时
if (Time_update==1)
{
		LCD_setpos(4,2);
		LCD_disp_valueInt16(Time_Get());
		/*1S更新一次电压,显示PWM		
		LCD_setpos(0,2);
		LCD_disp_valueInt16(100-Left_Pwm);	
		LCD_setpos(6,2);
		LCD_disp_valueInt16(Right_Pwm);	
		*/	
		
}

//巡线堵转超时调整
if (TimeOut>9 && NoWState==8)
{
	TimeOut=0;
	PWM_SetDRC(1,2);
	PWM_SetDuty(99,99);
}

//罗盘读数
if (TimeUs>100)
{
	TimeUs=0;
	//电子罗盘走S路线
	dispNorth();
	if (SroadNorth==1)
	{
		if ( NorthRad>280 && NorthRad<300 )
		{	
			SroadNorth=0;
			NoWState=6;	
			LCD_setpos(4,3);
			
			LCD_disp_Putchar('L');	
			Left_along();	
		}
	}
}	

//一直扫描各传感器状态,并保存到状态变量	
GetSenser();

//走迷宫
if (LightUpdateS==1)
{
	switch(NoWState)
	{
//阶段一=====================================================
		case 1:
		Left_along();
		if(HS==1)
		{
		PWM_Stop();	
		CC_turnright90();
		delay_ms(450);
		while(Hs==1)
		{
			GetSenser();
		}
		PWM_Start();
		NoWState=2;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('1');
		}

		break;
		
//阶段二=====================================================		
		case 2:
		Left_along();
		if(HS==1)
		{
		PWM_Stop();	
		CC_turnright90();
		delay_ms(450);
		while(Hs==1)
		{
			GetSenser();
		}
		PWM_Start();
		NoWState=3;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('2');		
		}

		break;
//阶段三 =====================================================		
		case 3:
		Left_along();
		if(HS==1)
		{
		PWM_Stop();	
	
		CC_turnleft90();
		delay_ms(400);
		
		PWM_Start();
		NoWState=4;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('3');
		}

		break;

//阶段四 =====================================================			
		case 4:
		Left_along();
		
		if(HS==1)
		{
		PWM_Stop();	
		CC_turnleft90();
		
		//delay_ms(380);
		while(HS==1|| RS==0)
		{
		GetSenser();
		}
		PWM_Start();
		NoWState=5;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('4');
		//定时
		TimeUs=0;
		}
		
		break;
	
//走S缺口================================================================	
		case 5:
		
	if (RS==1)
	{
		PWM_SetDRC(2,1);
		PWM_SetDuty(90,90);	
		SroadNorth=0;		
	};
	if (RS==0)
	{	
		PWM_SetDRC(1,2);
		PWM_SetDuty(80,20);			
		SroadNorth=1;
	};
		
		if(HS==1)
		{
		NoWState=6;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('5');			
		SroadNorth=0;
		}
	
		
		break;

//S撞墙===================================================================
		case 6:
		//Left_along();
		Right_along();
		
		if(HS==1)
		{
		PWM_Stop();	
		CC_turnleft90();
		while(HS==1)
		{
		GetSenser();
		}

		//delay_ms(500);
		PWM_Start(); 
		NoWState=7;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('6');
		}
		break;

//走到B点停5秒=====================================================================
		case 7:
		Left_along();
		
		if(HS==1)
		{
		PWM_Stop();	
		
		CC_turnright90();
		delay_ms(400);
		
		while(LS==1 || HS==1)
		{
		GetSenser();
		}
		
		
		//延时五秒
		Time_Stop();
		CC_CarStop();
		ABTime=Time_Get();
		//显示AB段时间
		LCD_disp_CLS();
		LCDprintR(&frmAbtime,0,0);
		LCD_disp_valueInt16(ABTime);

		tmp=0;
		while(tmp!=25)
		{
		tmp++;
		Beep(1);	
		delay_ms(50);
		Beep(0);
		delay_ms(150);
		}
		LCD_disp_CLS();
		
		LCD_setpos(4,2);
		LCDprintR(&Blank,1,1);	
			
		//计时重新开始
		Time_Start(0);
		

		
		NoWState=8;	
		LCD_setpos(4,3);
		LCD_disp_Putchar('B');
		Butten_Detect=1;
		eorned=0;
		Iron(1);
		PWM_Start();
		//骑线标志
 		PassLine=0;
		}
		break;
		
		
//巡线检测==========================================================		
		case 8:		  
		if (BL==1 && BR==1)
		{
		    	PWM_SetDuty(25,20);	
				PWM_SetDRC(1,1);
		}		                                 
		else
		{
			//超时标志,正常情况下小车每隔几秒都要压线调整清超时标志
			TimeOut=0;	
			if (BR==0)
			{
				//右面压线说明已经基本骑到线上
				PassLine=2;
				PWM_SetDRC(1,2);
				PWM_SetDuty(99,99);
			
			}
			else if (BL==0 && PassLine==2 )
			{
				PWM_SetDRC(2,1);
				PWM_SetDuty(99,99);	
			};			
		
		}
			
		//检测到铁片显示
		if(ES==1 && eorned==0)
		{   
			Time_Stop();
			BDTime=Time_Get();	
			
			PWM_Stop();
			eorned=1;
			
		//显示BD段时间
		LCD_disp_CLS();
		LCDprintR(&frmBCtime,0,0);
		LCD_disp_valueInt16(BDTime);
				
		LCDprintR(&ERon,2,2);

		
			//延时三秒
			tmp=0;
			while(tmp!=20)
			{
			tmp++;
			Beep(1);	
			delay_ms(100);
			Beep(0);
			delay_ms(50);
			}
			//清超时
			TimeOut=0;
			LCD_disp_CLS();
			PWM_Start();
			Time_Start(0);
		};
		
		//检测到最终的墙壁停止
		if(HS==1)
		{
			Time_Stop();
			DCTime=Time_Get();
			PWM_Stop();
			Iron(0);
			Beep(1);	
			delay_ms(40);
			Beep(0);
			delay_ms(100);
			Beep(1);	
			delay_ms(40);
			Beep(0);
			
			LCD_setpos(4,3);
			LCD_disp_Putchar('C');
			
			LCD_disp_CLS();
			
			LCDprintR(&finish,2,0);
			
			LCD_setpos(3,1);
			LCD_disp_Putchar('A');
			LCD_disp_Putchar('B');
			LCD_disp_Putchar(':');
			LCD_disp_valueInt16(ABTime);
			LCD_disp_Putchar(' ');			
			LCD_setpos(3,2);
			LCD_disp_Putchar('B');
			LCD_disp_Putchar('D');
			LCD_disp_Putchar(':');
			LCD_disp_valueInt16(BDTime);
			LCD_disp_Putchar(' ');
			LCD_setpos(3,3);
			LCD_disp_Putchar('D');
			LCD_disp_Putchar('C');
			LCD_disp_Putchar(':');
			LCD_disp_valueInt16(DCTime);
			//停止
			while(1);

		}
			
		break;
	}
				
}//if light update




}//While

	


}

⌨️ 快捷键说明

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