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

📄 autocar4_4.1.c

📁 自动小车 寻找白线 程序。 采用后轮驱动mega系列单片机控制
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	if (accespeed != 0)		//加速度不为零时,梯形加速
	{
		if (Lines >= 3)
    		TrapeziaV.SpeedState =  ACCESTATE;		//梯形速度曲线设置
		else 
			TrapeziaV.SpeedState =  REGUSTATE;		//如果走的线数太少时,不走梯形曲线
	}
	else 
	{
		TrapeziaV.SpeedState =  REGUSTATE;		//匀速
	}	
	
	TrapeziaV.AcceSpeed = accespeed;	
	
	while (CrossedLines < Lines)
	{
		if (RSensorON)		//判断在线
		{
			delay_100us(1);
			if (RSensorON)	//二次判断在线,确认信号
			{
				while (1)		//在白线,等待出线。
				{
					if (!RSensorON)
					{
						delay_100us(1);
						if (!RSensorON)
						{
							CrossedLines++;
							
							if (Lines >= 3)		//如果走的线数太少时,不走梯形曲线, 保持匀速过程
							{
    							/************************************数线减速************************/
    							if (CrossedLines == (Lines - decespeedline))	//从终点线的前decespeedline根线开始减速
    							{
    								TrapeziaV.SpeedState =  DECESTATE;
    								TrapeziaV.AcceSpeed = -accespeed;			//减速度设定,与加速阶段对称
    							}
							}
							
							break;
						}
					}
				}
			}
		}
	}////////
	
	TCCR2 = 0x00;
	//set_distance(100, 1);	//保证将数线传感器移出白线
	//set_distance(100, 0);
	//delay_ms(200);	
	
	//左转
	set_distance(0, 0);		//左轮不动
	set_speed(800, 1);	   //右轮旋转,实现左转
	
	while (flag)
	{
		if (RSensorON)
		{
			delay_100us(1);
			if (RSensorON)
			{
				while (1)
				{
					if (!RSensorON)		//两次判断左边数线从传感器出线。
					{
						delay_100us(1);
						if (!RSensorON)
						{
							while (PINA != 0xF9);	//当前排传感器没有达到特定的状态时,持续转动
							flag = 0;
							break;
						}
					}
				}
			}
		}
	}
	
	set_speed(0, 1);
	set_speed(0, 0);
	
	return 1;
}

///////////////////////////////////////////////////////
//用右边传感器数线,直走,到达终点,停车
unsigned char GoSraight_R(unsigned char Lines, signed int motorinitspeed, signed int accespeed, unsigned char decespeedline)
{
	unsigned char flag = 1, CrossedLines = 0;	//小车已经通过的横向白线数目
	
	TCCR2 = 0x07;	//寻线
	
	TrapeziaV.MotorSpeed = motorinitspeed;
	
	if (accespeed != 0)		//加速度不为零时,梯形加速
	{
		if (Lines >= 3)
    		TrapeziaV.SpeedState =  ACCESTATE;		//梯形速度曲线设置
		else 
			TrapeziaV.SpeedState =  REGUSTATE;		//如果走的线数太少时,不走梯形曲线
	}
	else 
	{
		TrapeziaV.SpeedState =  REGUSTATE;		//匀速
	}	
	
	TrapeziaV.AcceSpeed = accespeed;	
	
	while (CrossedLines < Lines)
	{
		if (RSensorON)		//判断在线
		{
			delay_100us(1);
			if (RSensorON)	//二次判断在线,确认信号
			{
				while (1)		//在白线,等待出线。
				{
					if (!RSensorON)
					{
						delay_100us(1);
						if (!RSensorON)
						{
							CrossedLines++;
							
							if (Lines >= 3)		//如果走的线数太少时,不走梯形曲线, 保持匀速过程
							{
    							/************************************数线减速************************/
    							if (CrossedLines == (Lines - decespeedline))	//从终点线的前decespeedline根线开始减速
    							{
    								TrapeziaV.SpeedState =  DECESTATE;
    								TrapeziaV.AcceSpeed = -accespeed;			//减速度设定,与加速阶段对称
    							}
							}
							
							break;
						}
					}
				}
			}
		}
	}////////
	
	TCCR2 = 0x00;
	
	set_speed(0, 1);
	set_speed(0, 0);
	
	return 1;

}
	
void dongzuo(void)
{
	
	  push2go();
	  delay_ms(3000);
	  push2back();
	  delay_ms(3000);
	  riseback();
}
     
void  qidong(void)	 
{ 
	 set_speed(500,1);
	 set_speed(800,0);
	 delay_ms(1500);
	 set_speed(0,0);
	 delay_ms(800); 
}	
	
/*********************************************************************************/

//call this routine to initialise all peripherals
void init_devices(void)
{
	//stop errant interrupts until set up
	CLI(); //disable all interrupts
	port_init();
	spi_init( );
	uart0_init();
	timer2_init();
	//init_7279();
	SEEK_PIDInit(0x00);		//PID 参数初始化
	
	MCUCR = 0x00;
	GICR  = 0x00;
	TIMSK = 0x40; //timer interrupt sources
	SEI(); //re-enable interrupts
	//all peripherals are now initialised
}

void main(void)
{
	 unsigned char i = 1;
  	init_devices();
 //insert your functional code here...
  
    TCCR2 = 0x00;
    set_stop(0);
    set_stop(1);   


    flag=0;
    while(!flag);
	
	while(flag)
  {
    load_para();

     
		if(i == 1)
		{ 
		send(0x01);
		i = 0;
		}
	
if(sel==1)
	{
	
	
	//这条路径,从红区出发,在第2个拐弯以后会出现少数一条线的现象。未解决。
	//从蓝区出发,未发现此现象。可见程序上应没问题。多设路径,看成功率。
	/*
	Count2TurnR(13, 500, 320, 2);	//
	Count2TurnR(6, 500, 320, 2 );
	Count2TurnL(6, 500, 320, 2);
	Count2TurnL(4, 500, 320, 2);
	Count2TurnR(2, 500, 0, 0);
	Count2TurnL(1, 500, 0, 0);
	Count2TurnL(4, 500, 320, 2);
	Count2TurnL(2, 500, 0, 0);	*/	//直接编译下载,运行,看效果。
   
	Count2TurnR(14, 500, 320, 2);	
	Count2TurnR(6, 500, 320, 2 );
	
	while (1)
	{Count2TurnL(11, 500, 320, 2);
	Count2TurnL(4, 500, 320, 2); 
	Count2TurnL(11, 500, 320, 2);
	Count2TurnL(4, 500, 320, 2);}
    
	}

//////////////////////////////////////////////////////////////////////////////////////
	
	/*此为Go函数的测试。
	GoSraight_R(13, 500, 320, 2);
	delay_s(2);
	GoSraight_L(3, 500, 0, 0);
	delay_s(2);
	GoSraight_R(2, 500, 0, 0);
	delay_s(2);
	GoSraight_L(13, 500, 320, 2);*/
///////////////////////////////////////////////////////////////////////////////////	
if(sel==2)  //侧投中桥
  	 {
	 qidong();
	 Count2TurnR(12, 500, 320, 2);	
     Count2TurnR(6, 500, 320, 2 );
     Count2TurnL(2, 800, 0, 0 );
     Count2TurnR(2, 800,0, 0 );
	 GoSraight_L(1, 800, 0, 0);
	 delay_ms(500);
	 risego();
     set_speed(0, 1);
	 set_speed(0, 0);
	 delay_ms(2300);
	 GO;
	 while((PINB&0x01)!=0);  
	  TCCR2 = 0x00;
      set_stop(0);
      set_stop(1);    
	  dongzuo();
	 }
    
if(sel==3) //投对方一分区
  	 {
	 qidong();
	 Count2TurnR(14, 500, 320, 2);	
     Count2TurnR(11, 500, 320, 2);
     Count2TurnL(6, 500, 320, 2 );
     GO;
	 delay_ms(100);
	  TCCR2 = 0x00;
      set_stop(0);
      set_stop(1);    
	  risego();
      delay_ms(2300);
	  dongzuo();
	 
	 }
if(sel==4) //右桥投块
  	 {
	 qidong();
	 Count2TurnR(14, 500, 320, 2);	
     Count2TurnR(11, 500, 320, 2 );
     Count2TurnR(10, 500, 320, 2 );
     GoSraight_L(2, 800, 0, 0);
	 delay_ms(500);
	 risego();
     delay_ms(2300);
	 GO;
	 set_speed(800,1);
	 set_speed(800,0);
	 while((PINB&0x01)!=0);  
	  TCCR2 = 0x00;
      set_stop(0);
      set_stop(1);    
	 dongzuo();
	 delay_ms(3000);
	 set_speed(-600,1);
	 set_speed(-600,0);
	 delay_ms(3000);
	 set_speed(0,1);
	 set_speed(0,0);
	
	 Count2TurnL(1, 800, 0, 0 );
	 Count2TurnR(1, 800, 0, 0 );
	 Count2TurnR(3, 800, 0, 0 );
	 while(1)
	 {Count2TurnR(2, 800, 0, 0 );}
	 
	 }
if(sel==5)  //投左桥  
	{
	qidong();
	Count2TurnR(12, 500, 320, 2 );  
	GoSraight_R(7,500, 320, 2); 
	delay_ms(50);
	risego();
	delay_ms(2300);  
	GO;
	while((PINB&0x01)!=0); 
	TCCR2 = 0x00;
      set_stop(0);
      set_stop(1);     
	 dongzuo(); 
	}  
if(sel==6)	
    {
	qidong();
	Count2TurnR(11, 500, 320, 2 );  
	Count2TurnR(3, 800, 0, 0 );  
	GO;
	delay_ms(100); 
	TCCR2 = 0x00;
    set_stop(0);
    set_stop(1);      
	risego();
    delay_ms(2300);  
	dongzuo();
	}  
	  
	  TCCR2 = 0x00;
      set_stop(0);
      set_stop(1);    
      while(1);

}
}

⌨️ 快捷键说明

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