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

📄 +Ȧ

📁 迷官小车程序
💻
字号:
#ifndef _MIGONG_H_
#define _MIGONG_H_
#include "che.h"
#include "lcd1602.h"

uint i_l,i_r;
uint i_bai;
#define flag_stop 10
#define left_xun 0	    //左转的循环扫描次数
#define right_xun 0     //右转的循环扫描次数
#define qian_duo 80
#define xun_sure 10 

//uchar migong_s[30]={L,L,U,L,U,L,U,L,L,L,L,L,U,L,L,U,L,U,S,L,U,L,L};
//uchar f_mg_s=23,f_mg_e=0;
uchar migong_s[30]={0};
uchar f_mg_s=0,f_mg_e=0;
bit flag_end,flag_mg,flag_beep_en;

sbit beep = P3^5;

/*********************

*************************8**/
void migong_dispose(uchar dat)
{
	migong_s[f_mg_s] = dat;
	f_mg_s++;
	write_sfm2(2,13,f_mg_s); 
	delay_1ms(20);	
}

void migong_path() // 得到最最短路径
{
	static uchar value,i,j;
	f_mg_e = f_mg_s;
	if(migong_s[0] == U)
		i = 1;
	else 
		i = 0;
	while(1)
	{		
		if(migong_s[i] == U)
		{
			if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == L))
			{
				migong_s[i-1] = S;	
			}
			else if((migong_s[i-1] == S) && (migong_s[i] == U) && (migong_s[i+1] == L))
			{
				migong_s[i-1] = R;	
			}
			else if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == S))
			{
				migong_s[i-1] = R;	
			}
			else if((migong_s[i-1] == S) && (migong_s[i] == U) && (migong_s[i+1] == S))
			{
				migong_s[i-1] = U;	
			}
			else if((migong_s[i-1] == L) && (migong_s[i] == U) && (migong_s[i+1] == R))
			{
				migong_s[i-1] = U;	
			}
			else if((migong_s[i-1] == R) && (migong_s[i] == U) && (migong_s[i+1] == L))
			{
				migong_s[i-1] = U;	
			}
			else if((migong_s[i-1] == R) && (migong_s[i] == U) && (migong_s[i+1] == R))
			{
				migong_s[i-1] = S;	
			}
			
			for(value = i;value < f_mg_e;value++)
			{	
				migong_s[value] = migong_s[value + 2];		
			}  
			if((f_mg_e != 1) && (f_mg_e != 2))
				f_mg_e -= 2;
			migong_s[f_mg_e + 1] = migong_s[f_mg_e + 2]	= 8;  //清除最后两位			
			delay_1ms(20);			
			write_sfm2(2,11,i);
			if(i != 0)
				i --;
		}
		else 		
			i++;
		if(i > f_mg_s)
		{
			for(j=0;j<10;j++)
				write_sfm1(2,j,migong_s[j]);
			break;
		}
	}
	f_mg_e = 0;	
}

void migong_e_dispose()
{
	if(migong_s[f_mg_e] == S)
	{
		go();
	}
	else if(migong_s[f_mg_e] == U)
	{
		right_s_90_while();		//180();
	}
	else if(migong_s[f_mg_e] == L)
	{
		left_s_90_while();		//90();
	}
	else if(migong_s[f_mg_e] == R)
	{
		right_s_90_while();		//90();
	}		
	f_mg_e++;
}

/******************还原寻迹用的变量*****************/
void xunji_clear()
{
	x_ll = 1;
	x_l  = 1;
	x_z  = 1;
	x_r  = 1;
	x_rr = 1;	
    x_ll_value = 0;
    x_l_value = 0;
    x_z_value = 0;
    x_r_value = 0;
    x_rr_value = 0;

}

/******************过插路口时 用做计是那种路口的*****************/
void xun_shizi(uchar dat)
{
	uchar i;
	for(i=0;i<dat;i++)
	{
		if(xun_ll == 0)  
		{	
			x_ll_value++; 
			if(x_ll_value > xun_sure)
			{	
				x_ll  = 0;	
			}
		}
		else 
		{
			x_ll_value = 0; 
		}
		if(xun_l == 0)  
		{	
			x_l_value++; 
			if(x_l_value > xun_sure)
			{	
				x_l  = 0;
			}
		}
		else 
			x_l_value = 0; 
		if(xun_z == 0)  
		{	
			x_z_value++; 
			if(x_z_value > xun_sure)
			{	
				x_z  = 0;
			}
		}
		else 
			x_z_value = 0; 
		if(xun_r == 0)  
		{	
			x_r_value++; 
			if(x_r_value > xun_sure)
			{	
				x_r  = 0;	
			}
		}
		else 
			x_r_value = 0; 
		if(xun_rr == 0)  
		{	
			x_rr_value++; 
			if(x_rr_value > xun_sure)
			{	
				x_rr = 0;	
			}
		}
		else 
			x_rr_value = 0; 	
	}
}

/******************延时 用做能缠上5个寻迹传感器都能过了黑线得到正确的状态值*****************/
void time0_yanshi()
{
	if((x_rr == 0) || (x_ll == 0))
	{
		TR0 = 1;		
	}
	if((x_rr == 1) && (x_ll == 1))
	{
		time_value = 0;
		flag_100ms = 0;
		TR0 = 0;
	}
}

// 白线为 1   黑线为 0
void xunji_zhixian()
{		
	xun_shizi(1);	
	if((xun_ll==1) && (xun_l==1) && (xun_z==0) && (xun_r==1) && (xun_rr==1))
	{
		go();	  //小车前进
		che_zt = c_11011;
	}			
	if(((xun_ll==1) && (xun_l==1) && (xun_z==0) && (xun_r==0) && (xun_rr==1)) ||
	   ((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==0) && (xun_rr==1)) ||
	   ((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==0) && (xun_rr==0)) ||
	   ((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==0)))	   
	{
		right();
		che_zt = c_11001;	
	}
	if(((xun_ll==1) && (xun_l==0) && (xun_z==0) && (xun_r==1) && (xun_rr==1)) ||
	   ((xun_ll==1) && (xun_l==0) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) ||
	   ((xun_ll==0) && (xun_l==0) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) ||
	   ((xun_ll==0) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)))	   
	{
		left();
		che_zt = c_10011;
	}
} 


void xunji_bai()
{
	if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) 
	{	
		if(che_zt == c_11001)
			go();
		else if(che_zt == c_10011)
			go();
		else 
			go();
//		beep = 0;
		i_bai++;
		if(i_bai > 1300)
		{
			delay_1ms(1);	
//			beep = 1;
			if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) 
			{
//				if(che_zt == c_11011)
//				{
//					back();   
//					delay_1ms(1);
//				}
				if(che_zt == c_11001)
					left();
				else if(che_zt == c_10011)
					right();
				else 
					back();
				delay_1ms(1);
				migong_dispose(U);	
				right_s_90_while();		//180	 aaa
			}
		}	
	}
	else 
		i_bai = 0;
}

// 白线为 1   黑线为 0
void xunji()
{
/*********--------------左手法则-------------------*********/	
	if((x_ll==0) && (x_l==0) && (x_z==0) && (x_r==0) && (x_rr==0))
	{		
		beep = 0;							 
		go();												  
		delay_1ms(qian_duo);			
		stop();				
		delay_1ms(flag_stop);
	    beep = 1;
		if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))
		{				
			stop();		    // 到终点停下
			migong_path();  // 得到最最短路径	
			flag_end = 0;	
		}else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
		{
			migong_dispose(L);	 //丁字路口
			left_s_90_while();		
		}
		else if((xun_ll==1) && (xun_rr==1)) 
		{							 //  --|--	十字路口
			//      beep = 0;
			migong_dispose(L);
			left_s_90_while();
			//      beep = 1;	
		}
		xunji_clear();			
	}
	if((x_ll==0) && (x_l==0) && (x_z==0) && (x_rr==1))   
	{
		i_l ++;
		if(i_l >= left_xun)
		{
			i_r = 0; i_l = 0;
//           beep = 0;
			go();
//			xun_shizi(200); xun_shizi(200);
			delay_1ms(qian_duo);
			      beep = 1;
			stop();
			delay_1ms(flag_stop);				
			if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))	  //左转90
			{
//				beep = 0;
				migong_dispose(L);
				left_s_90_while();
				beep = 1;	
			}
			else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))	  //左转90
			{	
//				beep = 0;									      
				left_s_90_while();	   //正常左转	
				beep = 1;			
			}
			else if((xun_ll==1) && (xun_rr==1))	  //左转90	
			{										 //	 __|  
				migong_dispose(L);
				left_s_90_while();	  //  --|
			}
			xunji_clear();
		}
	}
//	else 
//		i_l = 0;
		
	if((x_ll==1) && (x_z==0) && (x_r==0) && (x_rr==0)) 
//	if((xun_ll==1) && (xun_r==0) && (xun_rr==0)) 
	{
		i_r ++;
		if(i_r >= right_xun)
		{
			i_r = 0; i_l = 0;
//			beep = 0;	
			go();	
//			xun_shizi(200); xun_shizi(200);
			delay_1ms(qian_duo);		  
		    beep = 1;
			stop();
			delay_1ms(flag_stop);
			if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))	  //左转90
			{
//			    beep = 0;
				migong_dispose(L);
				left_s_90_while();
				beep = 1;	
			}
			else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))	  //
			{	
//				beep = 0;								  //	 |__ 	
				right_s_90_while();	   //90	正常右转
				beep = 1;			  
			}
			else if((xun_ll==1) && (xun_rr==1))  
			{						   //右|--路口 前进 
				migong_dispose(S);								  //	 
				go();			
			}
			xunji_clear();
		}											 					
	}
//	else 
//		i_r = 0;


	

 /*********************************走直线的左右转*****************************************/
				
} 	

void migong()
{
/*********--------------左手法则-------------------*********/
	if((x_ll==0) && (x_l==0) && (x_z==0) && (x_r==0) && (x_rr==0)) 
	{	
//		beep = 0;			 							  //---
		go();									  
		delay_1ms(qian_duo);
		stop();		
		delay_1ms(flag_stop);
	    beep = 1;
		if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))
		{				
			stop();		//180	
			flag_mg = 0;	
		}else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))
		{
			migong_e_dispose();	   //丁字路口	
		}
		else if((xun_ll==1) && (xun_rr==1)) 
		{							 //  --|--	十字路口
			migong_e_dispose();	
		}
		xunji_clear();	
	}
	if((x_ll==0) && (x_l==0) && (x_z==0) && (x_rr==1))   
	{
		go();
		delay_1ms(qian_duo);			
		stop();
		delay_1ms(flag_stop);		
		if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))	  //左转90
		{
			migong_e_dispose();	
		}
		else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))	  //左转90
		{										      
			left_s_90_while();	   //正常左转				
		}
		else if((xun_ll==1) && (xun_rr==1))	  //左转90	
		{										 //	 __|  
			migong_e_dispose();	
		}
		xunji_clear();
	}
	if((x_ll==1) && (x_z==0) && (x_r==0) && (x_rr==0)) 
	{	
		i_r ++;
		if(i_r > right_xun)
		{	
			go();
			//      beep = 0;
			delay_1ms(qian_duo);		 //右转 90时 这个延时好一些
			//      beep = 1;
			stop();
			delay_1ms(flag_stop);	
			if((xun_ll==0) && (xun_l==0) && (xun_z==0) && (xun_r==0) && (xun_rr==0))	  //左转90
			{
				migong_e_dispose();	
			}
			else if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1))	  //
			{									  //	 |__ 	
				right_s_90_while();	   //90	aaa	正常右转
			}else if((xun_ll==1) && (xun_rr==1))  
			{						   //右|--路口
				migong_e_dispose();				
			}
			xunji_clear();			
		}											 					
	}


	if((x_ll==1) && (x_l==1) && (x_z==1) && (x_r==1) && (x_rr==1)) 
	{	
		if(che_zt == c_11001)
			right();
		else if(che_zt == c_10011)
			left();
		else 
			go();
//		beep = 0;
		i_bai++;
		if(i_bai > 1300)
		{
//			delay_1ms(3);	
////			beep = 1;
//			if((xun_ll==1) && (xun_l==1) && (xun_z==1) && (xun_r==1) && (xun_rr==1)) 
//			{
//				migong_dispose(U);	
//				right_s_90_while();		//180	 aaa
//			}
		}	
	}
	else 
		i_bai = 0;
 /*********************************走直线的左右转*****************************************/
//	xunji_zhixian();
}
   
#endif

⌨️ 快捷键说明

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