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

📄 zhudang0617.c

📁 自主移动机器人控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	R_speed =R_SPEED;
}
void Line_Count(void)//判断横着跑的数线程序
{
    if((PIND &0b00000100) ==0)//数线时判断时间,数线容错
	{
	   if(line_cont_juge <100)
	   {
	      line_cont_juge++;
	   }
	}
	else
	{
	   if(line_cont_juge >0)
	   {
	      line_cont_juge--;
	   }
	}
	if(line_cont_juge >20 && line_cont_en ==1)
	{
	   line_H_cont++;
	   line_cont_en =0;
	} 
	if(line_cont_en ==0 &&line_cont_juge <2)
	{
	   line_cont_en =1;
	}    
}
void Stop_juge(void)//判断是否到达侄女区
{
    if((PIND &0b00001000) ==0)//光电停止信号宽度判断,信号容错
	{
	   if(stop_cont_juge <100)
	   {
	      stop_cont_juge++;
	   }
	}
	else
	{
	   if(stop_cont_juge >0)
	   {
	      stop_cont_juge--;
	   }
	}
	if(stop_cont_juge >40 && stop_juge_en ==1)
	{
	   stop_cont++;
	   stop_juge_en =0;
	} 
	if(stop_juge_en ==0 &&stop_cont_juge <10)
	{
	   stop_juge_en =1;
	}    
}
void Line_V_cont(void)//判断是否出了自己的牛郎区的数线
{
   char i =0;
   char j =0b00000001;
   char LED_ON =0;//管子亮的个数变量
   for(i =0 ; i <7 ;i++)
   {//判断管子亮了好多个
       if((adc_value_flag &(j <<i)) !=0)
	   {
	      LED_ON++;
	   }
   }
   if(LED_ON >4)//光电停止信号宽度判断,信号容错
   {
	   if(V_Line_juge <100)
	   {
	      V_Line_juge++;
	   }
   }
   else
   {
	   if(V_Line_juge >0)
	   {
	      V_Line_juge--;
	   }
   }
   if(V_Line_juge >10 && V_Line_en ==1)
   {
	   Line_V++;
	   V_Line_en =0;
   } 
   if(V_Line_en ==0 && V_Line_juge ==0)
   {
	   V_Line_en =1;
   }    
}
void Hand_A_open(void)
{
   PORTC &=0b01111111;
   delay(500);
   PORTC |=0b10000000;
}
void Hand_B_open(void)
{
   PORTD &=0b11011111;
   delay(350);
   PORTD |=0b00100000;
   delay(1500);
   PORTD &=0b11011111;
   delay(1100);
   PORTD |=0b00100000;
}
//------------------------------------------------
//比赛策略选择
void MODEL_A(void)//基本策略,ModelSelect =0.
{
    delay(500);
	if(DirectSelect ==0)
	{
	   while(adc_value_flag ==0b11000000)
	   {  ;  }
	}
	else
	{
	   while(adc_value_flag ==0b00000011)
	   {  ;  }
	}
	robot_go =1;
	speed =15;
	stop_en =1;
	delay(1000);
	//speed =4;
	while(stop_cont <1);
	robot_go =0;
	ROBOT_GO(2,2);
	delay(2000);
	Hand_A_open();
	delay(2000);
	Hand_B_open();
	delay(30000);
	ROBOT_GO(1,1);
}
void MODEL_B(void)
{
    unsigned int time_finish =0;
	ROBOT_GO(15,15);
	delay(1000);
	if(DirectSelect ==0)
	{
	   ROBOT_GO(4,14);
	}
	else
	{
	   ROBOT_GO(14,4);
	}
	stop_en =1;
	while(stop_cont <1 && time_finish <600)
	{
	   delay(10);
	   time_finish++;
	}
	ROBOT_GO(2,2);
	delay(2000);
	Hand_B_open();
}
void MODEL_C(void)
{

}
void MODEL_D(void)
{

}
//------------------------------------------------
/***************主程序****************************/
void main(void)
{   
	  init_devices(); //器件及程序初始化
	  EEPROMReadBytes(0x0000,adc_value,16);
	  while(prog_step !=3)// 程序第一步等待,并显示提示信息
	  {      
	     if(prog_step ==1)
		 {
		    ADC_base_get();
		 }
	  }
	  Disp_Buff[3]=0;
	  Disp_Buff[2]=0;
	  if(DirectSelect ==0)
	  {
         PORTD &=0b10111111;
      }
	  else
	  {
	     PORTD &=0b01111111;
	  }
	  delay(300);
	  line_H_en =1;
	  while(line_H_cont <3);
	  PORTD |=0b11000000;
	  adc_start_flag =1;
	  if(DirectSelect ==0)
	  {
	     ROBOT_GO(9,15);
	  }
	  else
	  {
	     ROBOT_GO(15,9);
	  }
	  delay(500);
	  V_cont_en =1;
	  while(Line_V <6)
	  { ; }
	  switch(ModelSelect)
	  {
	     case 0:
		     MODEL_A();
			 break;
		 case 1:
		     MODEL_B();
	         break;
		 case 2:
		     MODEL_C();
			 break;
		 case 3:
		     MODEL_D();
			 break;
		 default:
		     break;
	  }
	  while(1);
}
//------------------------------------------
/***************中断函数*************************/
//系统时序
void timer0_ovf(void)
{  
   TCNT0 =0xc2;//计数器付初值
   if(key_delay >0)     //键盘去抖动延时变量
   {
      key_delay--;
   }
   time_count_sys++;    //系统时间标志计数
   if(time_count_sys ==1000)
   {
      time_count_sys =0;
   }
   if(delay_time_count >0)
   {
      delay_time_count--;  //ms延时用变量
   }
   pwm_count++;//产生PWM
   if(pwm_count >15)
   {
      pwm_count =0;
   }
   Disp_key_group();//显示刷新,取键值到缓冲区
   Key_num();//键值后期处理以及键盘去抖函数
   motor_PWM();
   if(line_H_en ==1)
   {
      Line_Count();//数竖直线
   }
   if(stop_en ==1)
   {
      Stop_juge();
   }
   if(V_cont_en ==1)
   {
      Line_V_cont();
   }
   if((key_num ==0) &&(prog_step <3))
   {
      prog_step ++;
   }
   if((key_num ==3) && (prog_step ==0))
   {
      prog_step =3;  
   }
   if(prog_step ==0)
   {
      if(key_num ==2)
	  {//按二键选择出发场地
	     if(DirectSelect ==0)
		 {
		    DirectSelect =1;
		 }
		 else
		 {
		    DirectSelect =0;
		 }
	  }
	  if(key_num ==1)
	  {
	     if(ModelSelect <3)
		 {
		    ModelSelect++;
		 }
		 else
		 {
		    ModelSelect =0;
		 }
	  }
   }
   if(prog_step ==0)
   {
       if(time_count_sys <500)
	   {	
		  
		  if(DirectSelect ==0)//第二个LED显示行走方向
		  {
			 Disp_Buff[2] =20;
			 Disp_Buff[3] =17;
	      }
		  else
		  {
		     Disp_Buff[2] =17;
			 Disp_Buff[3] =19;
		  }
	   }	
	   else
	   {	
		  Disp_Buff[3] =16;
		  Disp_Buff[2] =16;
	   }
	   Disp_Buff[0] =adc_value[0]/64;
	   Disp_Buff[1] =ModelSelect;
   }
   
   if(prog_step ==3)
   {   
		if(adc_start_flag ==1)//ADC启动标志
		{ 
		  if(adc_get_count <=7)//1Ms采样一次
	      {
	         adc_value_buff[adc_get_count] =Get_ADC_value(adc_get_count);
		     adc_get_count++;
		  }
		  if(adc_get_count >7)
		     adc_get_count =0;
		  ADC_valueFlag_get();
		}
		if(robot_go ==1)
		{
		  followline(speed,1);
        }
	    Disp_Buff[1] =L_speed;
    	Disp_Buff[0] =R_speed;
		Disp_Buff[2] =line_H_cont;
		Disp_Buff[3] =Line_V;
   }
}
/***************程序结束**************************/

⌨️ 快捷键说明

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