📄 zhudang0617.c
字号:
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 + -