#include <stdio.h>
#include <stdlib.h>
#include "tcs.h"
#include "timer.h"
#include"stdbool.h"
#include "delay.h"
#define QTI1_Pin GPIO_Pin_0
#define QTI2_Pin GPIO_Pin_1
#define QTI3_Pin GPIO_Pin_2
#define QTI4_Pin GPIO_Pin_3
#define QTI15_Pin GPIO_Pin_15
#define leftservo GPIO_Pin_6
#define rightservo GPIO_Pin_7
/* -------------------------?????????????--------------------------------------*/
#define S0_Write_1() GPIO_SetBits(GPIOE,GPIO_Pin_4) //?1
#define S0_Write_0() GPIO_ResetBits(GPIOE,GPIO_Pin_4) //?0
#define S1_Write_1() GPIO_SetBits(GPIOE,GPIO_Pin_5)
#define S1_Write_0() GPIO_ResetBits(GPIOE,GPIO_Pin_5)
#define S2_Write_1() GPIO_SetBits(GPIOE,GPIO_Pin_6)
#define S2_Write_0() GPIO_ResetBits(GPIOE,GPIO_Pin_6)
#define S3_Write_1() GPIO_SetBits(GPIOE,GPIO_Pin_8)
#define S3_Write_0() GPIO_ResetBits(GPIOE,GPIO_Pin_8)
#define LED_Write_1() GPIO_SetBits(GPIOE,GPIO_Pin_10)
#define LED_Write_0() GPIO_ResetBits(GPIOE,GPIO_Pin_10)
//OUT ??PD2
/*********??QTI??????*******/
#define PE0_ReadBit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)//?PE0???
#define PE1_ReadBit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1)//?PE1???
#define PE2_ReadBit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//?PE2???
#define PE3_ReadBit() GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//?PE3???
#define Yellow 3
#define White 1
#define Red 4
#define Black 2
#define Blue 5
extern int count_tcs230;
/************************************????************************/
void BlueCarry(void); //?????????
void BlackCarry(void); //?????????
void YellowCarry(void); //?????????
void WhiteCarry(void); //?????????
void RedCarry(void); //?????????
/*---------------------------------????????????????------------------------------------------------------------------------------*/
ErrorStatus HSEStartUpStatus;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
int f_flag=1;
int g_flag=0;
int h_flag=1;
int i_flag=0;
volatile u16 times;
volatile unsigned int time;
char process=0;
char Ahavesome = 1;//A?????? //??????????????????1
char Bhavesome = 1;//B??????
char Chavesome = 1;//C??????
char Dhavesome = 1;//D??????
char Ehavesome = 1;//E??????
char Fhavesome = 0;//F??????
char Ghavesome = 0;//G??????
char Hhavesome = 0;//H??????
char Ihavesome = 0;//I??????
char pointsth=0;//??????????
char findsekuai = 0;// ??????????
//char pointsth=3;//??????????
//char findsekuai = 3;// ??????????
char Idone=0;
char sekuai = 5;//??????
u16 pcolor[3]={0,0,0};//??????????
u16 RGB[3]={0,0,0};
int hadedone = 1;
unsigned char QTIS;//???QTI??
unsigned int color =0;//?????
unsigned int distance=0;//?????
unsigned int speed=0;//????
unsigned int pulses=0;//???
bool colorCheck = true;
volatile char i=0,j=0;
unsigned int i1=0;
unsigned int goal=38; //???????????? //?????????
unsigned int a=0; //?????fg ?hi??? ???????
int count = 1; //????????
int LRp = 12;
int aim = 7;
bool have=true;
/*************************************
* @brief Configure peripheral RCC.
* @param None
* @retval None
************************************/
void RCC_Configuration(void)
{
/* ???RCC??????????????????????????CC_CR?HSITRIM[4:0]?????????RCC_BDCR????RCC_CSR */
RCC_DeInit();
/* ????HSE???? */
RCC_HSEConfig(RCC_HSE_ON);
/* ??HSE?????????????????? */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* SUCCESS:HSE????????ERROR?HSE????? */
if(HSEStartUpStatus == SUCCESS)
{
/* ??flash????????????RCC????? */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* ??FLASH???????????2?????????
FLASH_Latency_0?0?????FLASH_Latency_1?1????
FLASH_Latency_2?2???? */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK=SYSCLK ????????=???? */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK1=HCLK/2 ??????1??=????????*/
RCC_PCLK1Config(RCC_HCLK_Div2);
/* PCLK2=HCLK ??????2??=?????? */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */
/* ??????HSE??8MHz??9???72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL???PLL??? */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready?????????? */
/* RCC_FLAG_HSIRDY?HSI?????RCC_FLAG_HSERDY?HSE????
RCC_FLAG_PLLRDY?PLL???RCC_FLAG_LSERDY?LSE????
RCC_FLAG_LSIRDY?LSI?????RCC_FLAG_PINRST?????
RCC_FLAG_PORRST?POR/PDR???RCC_FLAG_SFTRST?????
RCC_FLAG_IWDGRST?IWDG???RCC_FLAG_WWDGRST?WWDG??
RCC_FLAG_LPWRRST?????? */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;
/* Select PLL as system clock source?????????????? */
/* RCC_SYSCLKSource_HSI???HSI??????
RCC_SYSCLKSource_HSE???HSE??????
RCC_SYSCLKSource_PLLCLK???PLL??????*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* ??PLL??????????? */
/* 0x00?HSI???????0x04?HSE??????
0x08?PLL?????? */
while(RCC_GetSYSCLKSource() != 0x08);
}
/* Enable GPIOA~E and AFIO clocks????????????????????????????????????*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|
RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOE|
RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 ,ENABLE);
/* TIM5 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
/* Enable USART1 clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
/************************************************
* @brief Configure NVIC.
* @param None
* @retval None
***********************************************/
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* Configure the Priority Grouping with 0 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Configure the Priority Grouping with 1 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable TIM2 global interrupt with Preemption Priority 1 and Sub
Priority as 5 */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure the Priority Grouping with 2 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* Enable TIM3 global interrupt with Preemption Priority 1 and Sub
Priority as 6 */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Configure the Priority Grouping with 2 bit */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //???
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/************************************************
* @brief Configure the TIM2 Timer for 1ms.
* @param None
* @retval None
***********************************************/
void TIM2_Configure(void)
{
TIM_DeInit( TIM2);//??TIM2???
TIM_TimeBaseStructure.TIM_Period = 99;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
/* Clear TIM2 update pending flag[??TIM2??????] */
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
/* Enable TIM2 Update interrupt [TIM2??????]*/
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
/* TIM2 enable counter [??tim2??]*/
TIM_Cmd(TIM2, DISABLE);
}
/************************************************
* @brief Configure the TIM3 Counter.
* @param None
* @retval None
***********************************************/
void TIM3_Counter_Configure(void)
{
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;//?????????
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;//????
TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//??????
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);// Time base configuration
TIM_ETRClockMode2Config(TIM3, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
TIM_SetCounter(TIM3, 0);//???????
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//???????
TIM_Cmd(TIM3, DISABLE); //?????
}
void TIM4_Configuration(void)
{
TIM_DeInit(TIM4);
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 0xffff;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM4,71, TIM_PSCReloadMode_Immediate);
/* enable preload value */
TIM_ARRPreloadConfig(TIM4,DISABLE);
TIM_SetCounter(TIM4,0); //TIM4?????
TIM_Cmd(TIM4,DISABLE); //TIM4?????
}
void TIM5_Configure(void)
{
TIM_DeInit(TIM5);//??TIM5???
TIM_TimeBaseStructure.TIM_Period = 9;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, & TIM_TimeBaseStructure);
/* Clear TIM2 update pending flag[??TIM2??????] */
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
/* Enable TIM2 Update interrupt [TIM2??????]*/
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
/* TIM2 enable counter [??tim2??]*/
TIM_Cmd(TIM5, DISABLE);
}
/************************************************
* @brief Configure USART1.
* @param None
* @retval None
***********************************************/
void USART1_Configuration(void)
{
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
/* Enables the USART1 transmit interrupt */
USART_ClearFlag(USART1, USART_FLAG_TC);
/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}
/************************************************
* @brief Configure the TCS230 Pins.
* @param None
* @retval None
***********************************************/
void GPIO_TCS230_Configure(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/***********************************************
* @brief Configure USART1 Pins.
* @param None
* @retval None
***********************************************/
void GPIO_USART1_Configure(void)
{
/*USART1_TX*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*USART1_RX*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/************************************************
* @brief Configure the TIM3 Pins.
* @param None
* @retval None
***********************************************/
void GPIO_TIM3_Configure(void)
{
//??TIM3?????? PD2 ETR ????????????
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void GPIO_Dist_Config(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void GPIO_Motor_Config(void)
{
/* Configure Motors IO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void GPIO_QTI_Config(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //????
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
u8 QTI_State(u8 pin)//?????
{
return GPIO_ReadInputDataBit(GPIOE,pin);
}
/**************************************************
* Function Name : fputc
* Description : Retargets the C library printf function to the USART.
**************************************************/
int fputc(int ch, FILE *f)
{
/* Place your implementation of fputc here */
USART1->SR;//?????????????????
/* e.g. write a character to the USART */
USART_SendData(USART1, (u8) ch);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // waiting here
return ch;
}
void delay_nus(unsigned int n) //??n us: n>=6,??????6us
{
unsigned int j;
while(n--) // ?????8M?PLL?9?8M*9=72MHz
{
j=8; // ????????????
while(j--);
}
}
void delay_nms(unsigned int n) //??n ms
{
while(n--) // ?????8M?PLL?9?8M*9=72MHz
delay_nus(1100); // 1ms????
}
void motor_motion1(unsigned int left_val, unsigned int right_val, unsigned int count) //? ? ??
{
unsigned int i;
for(i=0; i<count; i++)
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
delay_nus(left_val);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
GPIO_SetBits(GPIOC, GPIO_Pin_6);
delay_nus(right_val);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
delay_nms(20);
}
}
/*******************************************************************************
*TCS230_CurrentColor(u16 pRGB[3],u16 rgb[3])
* ??????RGB????????RGB[3]={0,0,0}?
********************************************************************************/
u8 TCS230_CurrentColor(u16 pRGB[3])
{
u8 currentcolor=0;
S0_Write_0(); S1_Write_1(); //?????(1/50)*500KHz=10KHz
LED_Write_1(); //??LED
S2_Write_0(); S3_Write_0(); //????
times=0;
TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
while(pRGB[0] != times);
TIM_Cmd(TIM2, DISABLE);
TIM_Cmd(TIM3, DISABLE);
RGB[0] = TIM_GetCounter(TIM3);
S3_Write_1();//????
times=0;TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
while(pRGB[1] != times);
TIM_Cmd(TIM2, DISABLE);TIM_Cmd(TIM3, DISABLE);
RGB[1] = TIM_GetCounter(TIM3);
S2_Write_1();//????
times=0;TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
while(pRGB[2] != times);
TIM_Cmd(TIM2, DISABLE);TIM_Cmd(TIM3, DISABLE);
RGB[2] = TIM_GetCounter(TIM3);
LED_Write_0();//??LED
printf("Red: %d Blue: %d Green: %d\n",RGB[0],RGB[1],RGB[2]);
return currentcolor;
}
/*******************************************************************************
* @brief TCS230_WhiteBalance Function.
* Description??????RGB???255??????????????pColor[]?
********************************************************************************/
void TCS230_WhiteBalance(u8 pColor[3]) //??????
{
S0_Write_0();
S1_Write_1();//?????(1/50)*500KHz=10KHz
LED_Write_1();//??LED
S2_Write_0();
S3_Write_0();//????
times=0;TIM_SetCounter(TIM3,0);//???3??
TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
while(TIM_GetCounter(TIM3)<255);
TIM_Cmd(TIM2, DISABLE);TIM_Cmd(TIM3, DISABLE);
pColor[0] = times;//??????
S3_Write_1();//????
times=0;TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
while(TIM_GetCounter(TIM3)<255);
TIM_Cmd(TIM2, DISABLE);TIM_Cmd(TIM3, DISABLE);
pColor[1] = times;//??????
S2_Write_1();//????
times=0;TIM_SetCounter(TIM3,0);
TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
while(TIM_GetCounter(TIM3)<255);
TIM_Cmd(TIM2, DISABLE);TIM_Cmd(TIM3, DISABLE);
pColor[2] = times;//??????
LED_Write_0();//??LED
printf("Red**: %d Blue**: %d Green**: %d\n",pColor[0],pColor[1],pColor[2]);
}
/*******************************************************************************
* @brief Robot_checkColor(void)
* ??????RGB????????RGB??????
********************************************************************************/
unsigned int Robot_checkColor(void)
{
TCS230_CurrentColor(pcolor); //???????RGB?
printf("Red: %d Blue: %d Green: %d\n",RGB[0],RGB[1],RGB[2]);
//???? //??RGB?????
if((RGB[0] > 90)&&((RGB[0] - RGB[2]) > 60) && ((RGB[0] - RGB[1]) > 60)&&((RGB[2] - RGB[1]) < 80))
{
return 3;//??
}
else if(((abs(RGB[0] - RGB[2])<50)&&(abs(RGB[0] - RGB[1])<50)&& (RGB[0]>100) ) ||( RGB[1]-RGB[2]<15 && RGB[0]>200 && (RGB[1]<80)) || ( (RGB[0]>200)&& (RGB[2]>200)&&(RGB[1]<15) ) )
{
return 2;//??
}
else if((abs(RGB[0] - RGB[2])<30)&&(abs(RGB[0] - RGB[1])<30)&& (RGB[0]<40)&& (RGB[1]<40)&& (RGB[2]<40) )
{
return 4;//??
}
else if( ((RGB[0] < RGB[1]) && (RGB[2] < RGB[1])&&((RGB[1] - RGB[0])>10)) || ((RGB[0] < RGB[1]) && (RGB[2] < RGB[1])&&((RGB[1] - RGB[0])>5)) )
{
return 5;//??
}
else if( (((RGB[2] - RGB[1]) > 80) && ((RGB[1] - RGB[0]) > 80)&&(RGB[2] > 90)) || (((RGB[2] - RGB[1]) > 50) && ((RGB[0]-RGB[1]) > 65) && RGB[1]>80 ) )
{
return 1;//??
}
return 0;
}
int GetDis(int echo,int trig) //????????????
{
int dis;
int count;
GPIO_ResetBits(GPIOC,echo); //echo????
GPIO_ResetBits(GPIOC,trig); //trig????
TIM_SetCounter(TIM4,0); //TIM4?????
GPIO_SetBits(GPIOC,trig); //trig?? ??10us??????
delay_nus(10);
GPIO_ResetBits(GPIOC,trig);
delay_nus(100);
while(GPIO_ReadInputDataBit(GPIOC, echo) == 0);
TIM_Cmd(TIM4,ENABLE); //?????
//?????????
while(GPIO_ReadInputDataBit(GPIOC, echo)); //??echo??
TIM_Cmd(TIM4,DISABLE); //?????
count = TIM_GetCounter(TIM4);//??????
dis = (int)count/60.034;//?????,?29.034us??????1cm
return dis;
}
/*
* //?????QTI??????
*/
bool IsMLeftQtiBlack2(void) //?????QTI??????
{
if(QTI_State(QTI3_Pin)==true) //?????QTI???????
{ //?????ture ??????false
delay_nms(2);
if(QTI_State(QTI3_Pin)==true)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
bool IsMLeftQtiBlack(void) //?????QTI??????
{
if(QTI_State(QTI1_Pin)==true) //?????QTI???????
{ //?????ture ??????false
delay_nms(2);
if(QTI_State(QTI1_Pin)==true)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
bool IsMRightQtiBlack(void) //?????QTI??????
{
if(QTI_State(QTI2_Pin)==true) //?????QTI???????
{ //?????ture ??????false
delay_nms(2);
delay_nms(2);
if(QTI_State(QTI2_Pin)==true)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
bool IsMRightQtiBlack1(void) //?????QTI??????
{
if(QTI_State(QTI3_Pin)==true) //?????QTI???????
{ //?????ture ??????false
delay_nms(2);
delay_nms(2);
if(QTI_State(QTI3_Pin)==true)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
void PulseOut(uint8_t pin,int speed) //??????
{
GPIO_SetBits(GPIOC,pin );
delay_nus(speed);
GPIO_ResetBits(GPIOC,pin);
}
void stop(void)//??
{
int i;
for(i=1;i<=2;i++)
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
delay_nus(1500);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC, GPIO_Pin_7);
delay_nus(1500);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
delay_nms(20);
}
}
void SpinLeft(void)// ???
{
PulseOut(leftservo,1480);
PulseOut(rightservo,1480);
delay_nms(20);
}
void SpinRight(void)// ???
{
PulseOut(leftservo,1520);
PulseOut(rightservo,1520);
delay_nms(20);
}
void TurnLeftAnyPulse(int pulses)//??????? pluses??????
{
while(pulses--)
{
SpinLeft(); //???
delay_nms(2);
}
}
void TurnRightAnyPulse(int pulses) //??????? pluses??????
{
while(pulses--)
{
SpinRight();
delay_nms(2);
}
}
void findLline2(void) //???????
{
TurnLeftAnyPulse(8);
while(1)
{
SpinLeft(); //???
if(IsMLeftQtiBlack2()) // ??????????
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
while(1)
{
SpinLeft();
if(!IsMLeftQtiBlack2())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
stop();
}
void findLline(void) //???????
{
TurnLeftAnyPulse(8);
while(1)
{
SpinLeft(); //???
if(IsMLeftQtiBlack()) // ??????????
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
while(1)
{
SpinLeft();
if(!IsMLeftQtiBlack())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
stop();
}
void findRline(void) //???????
{
TurnRightAnyPulse(10);
while(1)
{
SpinRight();
if(IsMRightQtiBlack())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
// stop();
while(1)
{
SpinRight();
if(!IsMRightQtiBlack())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
// stop();
}
void findRline1(void) //???????
{
TurnRightAnyPulse(10);
while(1)
{
SpinRight();
if(IsMRightQtiBlack1())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
// stop();
while(1)
{
SpinRight();
if(!IsMRightQtiBlack1())
{
i1++;
if(i1==2)
{
i1=0;
break;
}
}
}
// stop();
}
/*
//?????PE0_state()
//??? ???????QTI?????
//??????
//????1??????????0?????????
*/
int PE0_state(void)
{
return PE0_ReadBit();
}
/*
?????PE1_state()
??? ???????QTI?????
??????
????1??????????0?????????
*/
int PE1_state(void)
{
return PE1_ReadBit();
}
/*
?????PE2_state()
??? ???????QTI?????
??????
????1??????????0?????????
*/
int PE2_state(void)
{
return PE2_ReadBit();
}
/*
?????PE3_state()
??? ???????QTI?????
??????
????1??????????0?????????
*/
int PE3_state(void)
{
return PE3_ReadBit();
}
void motor_motion2(unsigned int left2_val, unsigned int right2_val)
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
delay_nus(left2_val);
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
GPIO_SetBits(GPIOC, GPIO_Pin_6);
delay_nus(right2_val);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);
delay_nms(20); //???????PWM??
}
void Robot_hunting1(unsigned int speed)
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
switch (QTIS)
{
//case 0:motor_motion1(speed, (3000-speed)-35-10,3);break;
case 1:motor_motion1(speed, (3000-speed)-35-10,3);break;
case 2:motor_motion1(speed, (3000-speed)-35,1);break;
case 3:motor_motion1(speed, (3000-speed)-35,1);break;
case 4:motor_motion1(speed+35, (3000-speed),1);break;
case 8:motor_motion1(speed+35+10, (3000-speed),3);break;
case 12:motor_motion1(speed+35, (3000-speed),2);break;
case 6:motor_motion2(speed+100, 3000-speed-100-2);break;
default:motor_motion2(1550, 1450);break;
}
}
void Robot_hunting2(unsigned int speed)
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
switch (QTIS)
{
case 1:motor_motion1(1500, 1400,2);break;
case 2:motor_motion1(1500, 1400,1);break;
case 3:motor_motion1(1500, 1400,1);break;
case 4:motor_motion1(1600, 1500,1);break;
case 8:motor_motion1(1600, 1500,2);break;
case 12:motor_motion1(1600, 1500,1);break;
case 6:motor_motion2(speed, 3000-speed);break;
default:motor_motion2(speed, 3000-speed);break;
}
}
void Robot_hunting(unsigned int speed)
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
switch (QTIS)
{
case 1:motor_motion1(speed, (3000-speed)-40-10,2);break;//??
case 2:motor_motion1(speed, (3000-speed)-40,1);break;//??
case 3:motor_motion1(speed, (3000-speed)-40,1);break;//??
case 4:motor_motion1(speed+40, (3000-speed),1);break;//??
case 8:motor_motion1(speed+40+10, (3000-speed),2);break;//??
case 12:motor_motion1(speed+40, (3000-speed),1);break;//??
case 6:motor_motion2(speed, 3000-speed-2);break; //??
default:motor_motion2(speed, 3000-speed-2);break; //??????
}
}
void Peripheral_Init(void) //??????????
{
RCC_Configuration(); //???????
NVIC_Configuration(); //???????
GPIO_USART1_Configure(); //??1 IO???
USART1_Configuration(); //??1??
GPIO_TCS230_Configure(); //?????IO???
TIM2_Configure(); // ???2??
GPIO_TIM3_Configure(); //???3????????
TIM3_Counter_Configure();// ???3?????
TIM5_Configure(); // ???5??
GPIO_Motor_Config(); //????IO????
GPIO_QTI_Config(); //QTI??????
TIM4_Configuration(); //???4??
GPIO_Dist_Config(); //
}
/*??????*/
void TurnR_toBlackLine(void) //?????????
{
motor_motion1(1515, 1515,5); //??
do
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1515, 1515,1);
} while(QTIS!=6); //???????1001 ??????
do
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
//motor_motion1(1515, 1515,1);
} while(QTIS!=6); //?????????1001
motor_motion1(1515, 1515,1);
}
void TurnL_toBlackLine(void) //?????????
{
motor_motion1(1485, 1485,10);
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1485, 1485,1);
} while(QTIS!=6); //???????1001 ??????
delay_nms(5);
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
//motor_motion1(1485, 1485,1);
} while(QTIS!=6); //?????????1001
motor_motion1(1485, 1485,1); //????
}
void Turn1_180(void) // ???? //???????????????????????
{
motor_motion1(1350, 1350,15 ); //??????
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1400, 1400,1);
} while(QTIS!=6); //??????? ??????????1001
delay_nms(5);
while(QTIS!=6)
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1480, 1480,1);
} //???????????????
}
void Turn_180(void) // ???? //???????????????????????
{
motor_motion1(1465, 1465,32 ); //??????
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1465, 1465,1);
} while(QTIS!=6); //??????? ??????????1001 0110
motor_motion2(1500, 1500);
// motor_motion1(1475, 1475,1);
// delay_nms(5);
// do{
// QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
// motor_motion1(1465, 1465,1);
// }while(QTIS!=6); //???????????????
}
void Turn_180_four(void) // ???? //???????????????????????
{
motor_motion1(1465, 1465,35 ); //??????
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1465, 1465,1);
} while((QTIS!=6)&&(QTIS!=0x0f));//while(QTIS!=6); //??????? ??????????1001
motor_motion1(1475, 1475,1);
delay_nms(5);
do{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1465, 1465,1);
}while((QTIS!=6)&&(QTIS!=0x0f)); //???????????????
}
void TurnRight_nDegree(char degree) //?? degree ???
{
motor_motion1(1522, 1522,degree);//1517
return;
}
void TurnLeft_nDegree(char degree) //?? degree ???
{
motor_motion1(1478, 1478,degree);//1485
return;
}
void Back_toBlack(void) //?????
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
while(QTIS != 15)
{
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
motor_motion1(1485,1512,1);
}
return;
}
void CCheck(void) //??C??????
{
motor_motion1(1500,1500,1);
delay_nms(200);
j=0;
process = 9;
}
void BCheck(void) //??B??????
{
// TurnLeft_nDegree(10);
findLline();
delay_nms(200);
process = 11;//1;
}
void ACheck(void) //??A??????
{
TurnLeft_nDegree(30); //???60
findLline(); //?findLline();?TurnLeft_nDegree(40);?20
delay_nms(200);
process = 1;
}
void ICheck(void) //??I??????
{
findLline();
findLline();
TurnLeft_nDegree(35+15-5);//??n?
}
void HCheck(void) //??H??????
{findLline();
findLline();
TurnLeft_nDegree(38+10+10+9-9+5);//??n?
Hhavesome = 1;
}
void GCheck(void) //??G??????
{findRline();
findRline();
TurnRight_nDegree(50);
Ghavesome = 1;
}
void FCarry(void)
{
}
void GCarry(void)
{
}
void HCarry(void)
{
}
void ICarry(void)
{
}
void FCheck(void) //??F??????
{
// findRline();
// findRline();
TurnRight_nDegree(21+90-10);//??n?
stop();
delay_nms(200);
/*j=0;
for(i=0,j=0;i<10;i++)
{
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance>0&&distance < 34)
{
j=j+1;
}
delay_nms(50);
}
if(j<1)
{
TurnRight_nDegree(2);//??n?
delay_nms(200);
for(i=0,j=0;i<10;i++)
{
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance>0&&distance < 30)
{
j=j+1;
}
delay_nms(50);
}
}
if(j<1)
{
TurnRight_nDegree(2);//??n?
delay_nms(200);
for(i=0,j=0;i<10;i++)
{
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance>0&&distance < 34)
{
j=j+1;
}
delay_nms(200);
}
}
if(j<1)
{
TurnLeft_nDegree(8);//
delay_nms(200);
for(i=0,j=0;i<10;i++)
{
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance>0&&distance < 34)
{
j=j+1;
}
delay_nms(200);
}
}
if(j >= 1)
{
delay_nms(100);
Fhavesome = 1;
}
else
{
Fhavesome = 0;
}
j=0;
a=1; */
Fhavesome = 1;
// process = 11;
// LED_Write_1();
}
void ECheck(void) //??E??????
{
TurnRight_nDegree(30);//??n?
delay_nms(200);
findRline();
delay_nms(200);
process = 2;//11;
}
void DCheck(void) //??D??????
{
findRline();
delay_nms(200);
process =8;
}
/*---------------------------------------------------------------------------------------------------------
* Function name?DownFirst(void)
* Description???A???????????????????? ,???????????
---------------------------------------------------------------------------------------------------------*/
void DownFirst(void) //??????A????????????????
{
time =0;
TIM5_Configure();
TIM_Cmd(TIM5, ENABLE); //?????5
do
{
Robot_hunting2(1550);
}while(time < 2300);
TIM_Cmd(TIM5, DISABLE); //?????5
motor_motion1(1450,1550,16); //??
Turn1_180(); //??180?
do
{
Robot_hunting2(1540);
}while(QTIS !=15);
pulses = LRp;
while(pulses--)
{
motor_motion2(1550, 1450);
}
// gai wei
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
pointsth++;
}
/*---------------------------------------------------------------------------------------------------------
* Function name?DownSecond(void)
* Description???B???????????????????? ,?????????????????DownFirst(void)
---------------------------------------------------------------------------------------------------------*/
void DownSecond(void) //??????B????????????????
{
time =0;
TIM5_Configure();
TIM_Cmd(TIM5, ENABLE); //?????5
do
{
Robot_hunting2(1550);
}while(time < 1900);
TIM_Cmd(TIM5, DISABLE);
motor_motion1(1450,1550,16);//??
Turn1_180();
do
{
Robot_hunting2(1550);
}while(QTIS != 15);
pulses = LRp;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// gai wei
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
//???????
pointsth++; //?????2???
}
/*---------------------------------------------------------------------------------------------------------
* Function name?Downthird(void)
* Description???c???????????????????? ,?????????????????DownFirst(void)
??????c
---------------------------------------------------------------------------------------------------------*/
void Downthird(void) //??????C????????????????
{
time =0;
TIM5_Configure();
TIM_Cmd(TIM5, ENABLE); //?????5
do
{
Robot_hunting2(1550);
}while(time < 1500);
TIM_Cmd(TIM5, DISABLE);
motor_motion1(1450,1550,16); //??
Turn1_180();
do
{
Robot_hunting2(1530);
}while(QTIS != 15); //??????
pulses =LRp;
while(pulses--)
{
Robot_hunting2(1545);
} //????????????????????
// gai wei
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
pointsth++; //?????3???
}
/*---------------------------------------------------------------------------------------------------------
* Function name?DownFourth(void)
* Description???D???????????????????? ,?????????????????DownFirst(void)
---------------------------------------------------------------------------------------------------------*/
void DownFourth(void) //??????D????????????????
{
time =0;
TIM5_Configure();
TIM_Cmd(TIM5, ENABLE); //?????5
do
{
Robot_hunting2(1550);
}while(time < 1000);
/*TIM_Cmd(TIM5, DISABLE);*/
motor_motion1(1450,1550,16); //??
Turn_180(); //??
// Turn_180_four();
do
{
Robot_hunting1(1550); //??
}while(QTIS != 15); //??????
pulses = LRp;
while(pulses--)
{
motor_motion2(1550, 1450-50); //??
}
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
pointsth++; //?????4???
}
/*---------------------------------------------------------------------------------------------------------
* Function name?DownFiveth(void)
* Description???E????????????????????,?????DownFirst(void)
---------------------------------------------------------------------------------------------------------*/
void DownFiveth(void) //??????E????????????????
{
time =0;
TIM5_Configure();
TIM_Cmd(TIM5, ENABLE); //?????5
do
{
Robot_hunting2(1550);
}while(time < 800);
TIM_Cmd(TIM5, DISABLE);
// motor_motion1(1450,1550,16); //??
Turn_180(); //??
// Turn_180_four();
// do
// {
// Robot_hunting1(1550); //??
// }while(QTIS != 15); //??????
//
// pulses = LRp;
//
// while(pulses--)
// {
// motor_motion2(1550, 1450); //??
// }
motor_motion2(1500,1500);
delay_ms(50);
// pulses = 2;
// while(pulses--)
// {
// Robot_hunting1(1580);
// }
pointsth++; //?????5???
}
void GotoLine(void)
{
int tempa=0;
switch(pointsth) // pointsth????0
{
case 0:DownFirst(); // ??A????
break;
case 1:DownSecond(); //??B????
break;
case 2:Downthird(); //??C????
break;
case 3:DownFourth(); //??E????
break;
case 4:DownFiveth(); //??F????
break;
default:
break;
}
tempa++;
tempa=0x22;
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryGpoint(void)
* Description???G????????????????????,????? CarryIpoint(void)
****************??????????????***************
---------------------------------------------------------------------------------------------------------*/
void Gback(){
pulses=8;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
//TurnRight_nDegree(80); //??120
findLline();
/*do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);// ??*/
pulses=15;
while(pulses--)
{
Robot_hunting1(1550); //??
}
TurnLeft_nDegree(80);//??n?
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=8;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findRline();
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//???????????
pulses = LRp-2;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// gai wei
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
}
void Hback(){
motor_motion1(1550, 1450,10);
findRline();
pulses=15;
while(pulses--)
{
Robot_hunting1(1550); //??
}
TurnRight_nDegree(100);//??
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=12;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline();
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//???????????
pulses = LRp-2;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
pulses = 2;
while(pulses--)
{
Robot_hunting1(1580);
}
}
void CarryGpoint(void) //??????G????????????????
{
Ghavesome=0;
do
{
motor_motion2(1540, 1460);
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance > 4 && QTIS == 15){
have = false;
Gback();
process=3; //*****??******??***********??******??***********??*********************??************************8888
return;
}
}while(distance > 4); //????G?????????
pulses=15;
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=50;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
motor_motion1(1450,1550,30);//??
TurnRight_nDegree(65-3);
findRline();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);
pulses=30-10;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
TurnRight_nDegree(90+45-20);
// findRline1();
// findRline1();
do
{
Robot_hunting1(1550); //??
}while(QTIS != 15);
pulses=15;
while(pulses--)
{
motor_motion2(1550, 1450); //??
} //??????
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryHpoint(void)
* Description???H????????????????????,????? CarryIpoint(void)
---------------------------------------------------------------------------------------------------------*/
void CarryHpoint(void)
{
Hhavesome=0;
do
{
motor_motion2(1540, 1460);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
if(distance > 4 && QTIS == 15){
have = false;
Hback(); //
process=3; //*****??******??***********??******??***********??*********************??************************8888
return;
}
}while(distance > 4); //
pulses=15;
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=50;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
motor_motion1(1450,1550,25);//??
TurnLeft_nDegree(65-9);
findLline2();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);
stop();
pulses=30-10;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
stop();
TurnLeft_nDegree(90+45-10-5-20-10);
// findRline1();
// findRline1();
stop();
do
{
Robot_hunting1(1550); //??
}while(QTIS != 15);
pulses=15;
while(pulses--)
{
motor_motion2(1550, 1450); //??
} //??????
void CarryCpoint(void)
{
Chavesome=0;
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 30;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//?????
pulses = 15;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
GotoLine();
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryDpoint(void)
* Description??D????????????? ,????????A?CarryApoint(void)
---------------------------------------------------------------------------------------------------------*/
void CarryDpoint(void) //??????A????????????????
{
Dhavesome=0;
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 35;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180();
delay_nms(200);
do
{
Robot_hunting1(1540);
}while(QTIS !=15);//?????
pulses = 18;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline();
GotoLine();
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryEpoint(void)
* Description??E????????????? ,????????A?CarryApoint(void)
---------------------------------------------------------------------------------------------------------*/
void CarryEpoint(void) //??????A????????????????
{
Ehavesome=0;
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 40;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//?????
pulses = 14;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline();
GotoLine();
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
/*
Ehavesome=0;
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 40;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//?????
pulses = 14;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline();
GotoLine();
pulses = 18;
while(pulses--)
{
motor_motion2(1550,1450);
}
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
*/
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryBpoint(void)
* Description??B????????????? ,????????A?CarryApoint(void)
---------------------------------------------------------------------------------------------------------*/
void CarryBpoint(void) //??????A????????????????
{
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 35;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180();
// stop();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//?????
pulses = 20;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
stop();
TurnLeftAnyPulse(10);
findRline();
GotoLine();
motor_motion2(1500, 1500);
delay_ms(50);
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryApoint(void)
* Description??A?????????????
---------------------------------------------------------------------------------------------------------*/
void CarryApoint(void)
{
Ahavesome=0;
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 35;
while(pulses--)
{
Robot_hunting1(1550); //??
}
Turn_180(); //??180?
do
{
Robot_hunting1(1550);
}while(QTIS !=15);
pulses = 15;
while(pulses--) //
{
motor_motion2(1550, 1450); //??
}
findRline(); //??????????
GotoLine();
findsekuai++;
if(findsekuai==5)
{
process=11;
Idone=1;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name? RedCarry(void)
* Description?????????????????
---------------------------------------------------------------------------------------------------------*/
void goBackCenter(){
pulses = 25;
while(pulses--)
{
Robot_hunting1(1540);
}//???????????
Turn_180();//??180?
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//???????????
pulses = LRp;
while(pulses--)
{
motor_motion2(1550, 1450);
} //??
}
void gotoG(){
void moveBack();
if(!have){
moveBack();
process = 13;
return ;
}
pulses = 22;
while(pulses--)
{
Robot_hunting1(1550);
}//???????????
TurnLeft_nDegree(35);//??n?
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=10;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline(); //??????????
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>4 );
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
TurnLeft_nDegree(110);//??n?
pulses=5;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(!QTIS);
pulses=14;
while(pulses--)
{
motor_motion2(1540, 1460); //??
}
findRline(); //??????????
process = 11;
}
void gotoH(){
void moveBack();
if(!have){
moveBack();
process = 13;
return ;
}
pulses = 22;
while(pulses--)
{
Robot_hunting1(1550);
}//???????????
TurnRight_nDegree(27);//??n?
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=10;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findRline(); //??????????
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>4 );
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
TurnRight_nDegree(79);//??n?
pulses=5;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(!QTIS);
pulses=13;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
findLline(); //??????????
process = 11;
}
/////////////////////////////////////////////////
void RedCarry(void)//?????????
{
hadedone++;
printf("hadedone:%d",hadedone);
do
{
Robot_hunting1(1550);
}while(QTIS);//?????????????
stop();
pulses = 35;
while(pulses--)
{
Robot_hunting1(1530); //??
}
stop();
/*pulses = goal-1;
while( (GPIO_ReadInputData(GPIOE)&0x08000) || pulses--)
{
Robot_hunting1(1550); //??
} */
while( !(GPIO_ReadInputData(GPIOE)&0x08000))
{
delay_nms(50);
Robot_hunting1(1502); //??
}
stop();
motor_motion1(1450,1550,25);//??
stop();
Turn_180();//??180?
stop();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//???????
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
if(hadedone >= 6){
process=12;
printf("process:%d",process);
return;
}
if(hadedone >= 4)
{
TurnLeft_nDegree(180);
// do
// {
// Robot_hunting1(1550);
// }while(QTIS !=15);//?????
// pulses = 15; //?????????
// while(pulses--)
// {
// Robot_hunting2(1530);
// }
}
else
{
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>5 );
pulses =10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
delay_nms(50);
Turn_180();
process=11;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name? WhiteCarry(void)
* Description??????????????? ??????????RedCarry(void)
---------------------------------------------------------------------------------------------------------*/
void WhiteCarry(void)//?????????
{
hadedone++;
printf("hadedone:%d",hadedone);
TurnLeft_nDegree(10);
findLline(); //????????? ?????????
delay_nms(200);
do
{
Robot_hunting1(1550);
}while(QTIS); //?????????????0
pulses = 35;
while(pulses--)
{
Robot_hunting1(1530); //??
}
/*pulses = goal-1;
while( (GPIO_ReadInputData(GPIOE)&0x08000) || pulses--)
{
Robot_hunting1(1550); //??
} */
while( !(GPIO_ReadInputData(GPIOE)&0x08000))
{
delay_nms(50);
Robot_hunting1(1502); //??
}
motor_motion1(1450,1550,25);//??
Turn_180(); //??180? ?????
do
{
Robot_hunting1(1550);
}while(QTIS !=15); //?????
pulses = 20; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// findRline();
delay_nms(200);
if(hadedone >= 6){
process=12;
printf("process:%d",process);
return;
}
// if(hadedone >= 5){
// //process=aim;
// //goBackCenter();
// //gotoG();
// gotoH();
// return;
// }
if(hadedone >= 4)
{
TurnLeft_nDegree(135);
// do
// {
// Robot_hunting1(1550);
// }while(QTIS !=15);//?????
// pulses = 15; //?????????
// while(pulses--)
// {
// Robot_hunting2(1530);
// }
}
else
{
findRline();
do{
Robot_hunting(1535);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>5);
pulses =10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
delay_nms(50);
Turn_180();
process=11;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?YellowCarry(void)
* Description??????????????? ??????????RedCarry(void)
---------------------------------------------------------------------------------------------------------*/
void YellowCarry(void)//?????????
{
hadedone++;
printf("hadedone:%d",hadedone);
// if(QTTS == )
TurnLeft_nDegree(8);//??n?
findLline(); //?????? ??
delay_nms(200);
findLline(); //????????????
motor_motion2(1500,1500);
delay_ms(50);
// while(1);
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 35;
while(pulses--)
{
Robot_hunting1(1530); //??
}
/*pulses = goal-1;
while( (GPIO_ReadInputData(GPIOE)&0x08000) || pulses--)
{
Robot_hunting1(1550); //??
} */
while( !(GPIO_ReadInputData(GPIOE)&0x08000))
{
delay_nms(50);
Robot_hunting1(1502); //??
}
motor_motion1(1450,1550,25);//??
Turn_180();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);//?????
pulses = 15; //?????????
while(pulses--)
{
Robot_hunting2(1530);
}
// findRline();
TurnRight_nDegree(90);
delay_nms(200);
if(hadedone >= 6){
process=12;
printf("process:%d",process);
return;
}
if(hadedone >= 4)
{
Turn_180();
// do
// {
// Robot_hunting1(1550);
// }while(QTIS !=15);//?????
// pulses = 15; //?????????
// while(pulses--)
// {
// Robot_hunting2(1530);
// }
}
else
{
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>5);
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
delay_nms(50);
Turn_180();
process=11;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?BlackCarry(void)
* Description??????????????? ??????????RedCarry(void)
---------------------------------------------------------------------------------------------------------*/
void BlackCarry(void)//?????????
{
hadedone++;
printf("hadedone:%d",hadedone);
findRline();
delay_nms(200);
do
{
Robot_hunting1(1550);
}while(QTIS);
pulses = 40;
while(pulses--)
{
Robot_hunting1(1520); //??
}
/*pulses = goal-1;
while( (GPIO_ReadInputData(GPIOE)&0x08000) || pulses--)
{
Robot_hunting1(1550); //??
} */
while( !(GPIO_ReadInputData(GPIOE)&0x08000))
{
delay_nms(50);
Robot_hunting1(1502); //??
}
motor_motion1(1450,1550,25);//??
Turn_180();
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//?????
pulses = 18;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// findLline();
if(hadedone >= 6){
process=12;
printf("process:%d",process);
return;
}
// if(hadedone >= 5){
// //process=aim;
// //goBackCenter();
// //gotoG();
// gotoH();
// return;
// }
if(hadedone >= 4)
{
TurnRight_nDegree(135);
// do
// {
// Robot_hunting1(1550);
// }while(QTIS !=15);//?????
// pulses = 15; //?????????
// while(pulses--)
// {
// Robot_hunting2(1530);
// }
}
else
{
findLline();
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>5);
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
delay_nms(50);
Turn_180();
process=11;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?BlueCarry(void)
* Description??????????????? ??????????RedCarry(void)
---------------------------------------------------------------------------------------------------------*/
void BlueCarry(void)//?????????
{
hadedone++;
printf("hadedone:%d",hadedone);
// findRline();
// delay_nms(200);
// findRline();
// delay_nms(200);
TurnRight_nDegree(90);//??n?
stop();
do
{
Robot_hunting1(1550);
}while(QTIS);
while( !(GPIO_ReadInputData(GPIOE)&0x08000))
{
delay_nms(50);
Robot_hunting1(1502); //??
}
delay_nms(200);
pulses = 5;
while(pulses--)
{
delay_nms(20);
Robot_hunting1(1502); //??
}
// while( (GPIO_ReadInputData(GPIOE)&0x08000))
// {
// delay_nms(50);
// Robot_hunting1(1501); //??
// }
delay_nms(200);
motor_motion1(1450,1550,18);//??
Turn_180();
do
{
Robot_hunting1(1540);
}while(QTIS != 15);//?????
pulses = 14;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// findLline();
TurnLeft_nDegree(90);
delay_nms(200);
if(hadedone >= 6){
process=12;
return;
}
// if(hadedone >= 5){
// //process=aim;
// //goBackCenter();
// //gotoG();
// gotoH();
// return;
// }
//
if(hadedone >= 4)
{
TurnRight_nDegree(180);
// do
// {
// Robot_hunting1(1550);
// }while(QTIS !=15);//?????
// pulses = 15; //?????????
// while(pulses--)
// {
// Robot_hunting2(1530);
// }
}
else
{
do{
Robot_hunting(1540);
//delay_nms(50);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
}while(distance>3);
pulses = 10; //???? ??? ??
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
delay_nms(50);
Turn_180();
process=11;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?StartCarryToScore(void)
* Description??????????
---------------------------------------------------------------------------------------------------------*/
void StartCarryToScore(void)
{
count = 1; // ???1??
printf("hadedone: %d\n",hadedone);
if(hadedone >= 6){
process = 12;
return;
}
if(hadedone >= 4&&hadedone <6){
if(f_flag==1)
{
FCheck();
FCarry();
}
else if(g_flag==1)
{
GCheck();
GCarry();
}
else if(h_flag==1)
{
HCheck();
HCarry();
}
else if(i_flag==1)
{
ICheck();
ICarry();
}
}
else
{
delay_nms(200);
// printf("Color: %d\n",Robot_checkColor());
printf("Color: %d\n",xm_colourjudge(pcolor));
colorCheck = true;
while(colorCheck)
{
//color = Robot_checkColor();//????
color =xm_colourjudge(pcolor);
count++;
// if(color == 4)
//color = Robot_checkColor();//????
// color =xm_colourjudge(pcolor);
switch(color)//????
{
case Red:RedCarry();colorCheck = false;break;
case White:WhiteCarry();colorCheck = false;break;
case Yellow:YellowCarry();colorCheck = false;break;
case Black:BlackCarry();colorCheck = false;break;
case Blue:BlueCarry();colorCheck = false;break;
default:colorCheck = true;break; ////////////////////////////////////////////////////////////////////////////////
}
}
}
if(hadedone >= 6){
process = 12;
colorCheck = false;
}
}
/*---------------------------------------------------------------------------------------------------------
* Function name?CarryIpoint(void)
* Description??I??????????????
---------------------------------------------------------------------------------------------------------*/
void CarryIpoint(void)
{
Ihavesome=0;
do
{
motor_motion2(1540, 1460);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
if(distance > 4 && QTIS == 15){
have = false;
Hback(); //
process=3; //*****??******??***********??******??***********??*********************??************************8888
return;
}
}while(distance > 4); //
pulses=15;
do
{
motor_motion2(1550, 1450); //??
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);
pulses=35;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
motor_motion1(1450,1550,14);//??
TurnLeft_nDegree(65-9);
findLline2();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);
stop();
pulses=30-10;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
stop();
TurnLeft_nDegree(90+45-10-5-20-10);
// findRline1();
// findRline1();
stop();
do
{
Robot_hunting1(1550); //??
}while(QTIS != 15);
pulses=15;
while(pulses--)
{
motor_motion2(1550, 1450); //??
} //??????
process=11;
}
void CarryFpoint(void)
{
if(Fhavesome==1)
{
Fhavesome=0;
do
{
motor_motion2(1540, 1460);
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
distance = GetDis(GPIO_Pin_12,GPIO_Pin_13);
if(distance > 4 && QTIS == 15){
have = false;
Gback();
process=3; //*****??******??***********??******??***********??*********************??************************8888
return;
}
}while(distance > 4); //????F?????????
pulses=15;
do
{
motor_motion2(1550, 1450); //??
}while(!QTI_State(QTI4_Pin));
pulses=35;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
motor_motion1(1450,1550,14);//??
TurnRight_nDegree(65-3);
findRline();
do
{
Robot_hunting1(1550);
}while(QTIS !=15);
pulses=30-5;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
TurnRight_nDegree(90+45-10);
do
{
Robot_hunting1(1550); //??
}while(QTIS != 15);
pulses=15;
while(pulses--)
{
motor_motion2(1550, 1450);
process=11;
}
}
}
void GoStart(void)
{
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//???????????
pulses = 15;
while(pulses--) //?????
{
motor_motion2(1650, 1350); //??
}
do
{
Robot_hunting1(1550);
}while(QTIS != 15);//???????????
pulses = LRp-2;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
// gai wei
pulses = 2;
while(pulses--)
{
Robot_hunting1(1550);
}
}
void moveBack(){
printf("gohome");
pulses = 10;
while(pulses--)
{
Robot_hunting1(1560); //??
}
do
{
Robot_hunting1(1560);
QTIS = (GPIO_ReadInputData(GPIOE)&0x0f);
}while(QTIS != 15);//???????????
pulses = 40;
while(pulses--)
{
motor_motion2(1550, 1450); //??
}
process = 13;
}
void turn_back(){
Turn_180();
process = 11;
return;
}
//***************************************************************************************
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//??PORTA,PORTE??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//|GPIO_Pin_6|GPIO_Pin_7;//KEY0-KEY1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //???????
GPIO_Init(GPIOE, &GPIO_InitStructure);//???GPIOE4,3
// //??? WK_UP-->GPIOA.0 ????
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0??????????
// GPIO_Init(GPIOA, &GPIO_InitStructure);//???GPIOA.0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //????????
// //GPIOE.3 ???????????? ????? //KEY1
// GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
// EXTI_InitStructure.EXTI_Line=EXTI_Line3;
// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
// EXTI_Init(&EXTI_InitStructure); //??EXTI_InitStruct???????????EXTI???
// //GPIOE.4 ???????????? ????? //KEY0
// GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
// EXTI_InitStructure.EXTI_Line=EXTI_Line4;
// EXTI_Init(&EXTI_InitStructure); //??EXTI_InitStruct???????????EXTI???
//GPIOE.5 ???????????? ????? //KEY0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource5);
EXTI_InitStructure.EXTI_Line=EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure); //??EXTI_InitStruct???????????EXTI???
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //????KEY0?????????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //?????2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //????????
NVIC_Init(&NVIC_InitStructure); //??NVIC_InitStruct???????????NVIC???
}
//******************************************************************************************/
void EXTI9_5_IRQHandler(void)
{
if( EXTI_GetITStatus(EXTI_Line5) != RESET)
{
count_tcs230++;
// tim5_interruput_flag=0x01;
}
EXTI_ClearITPendingBit(EXTI_Line5);
}
//******************************************************************************************/
int main(void)
{
Peripheral_Init();//????????//
TIM5_Int_Init(0xfff0-1,720-1);
delay_init();
EXTIX_Init();
process =11;//4;//7;//5;//6; //?C/B/A/D/E/G/H??????????????????????????? ?????case11??
// process =8; //?C/B/A/D/E/G/H??????????????????????????? ?????case11??
led=1;
delay_nms(1000);
led=0;
delay_nms(1000);
xm_TCS230_WhiteBalance(pcolor); //???
led=0;
delay_nms(1000);
led=0;
delay_nms(1000);
delay_nms(1000);
// process = 8;
//GoStart(); //??????
// process = 11;
while(1)
{
//printf("process:%d\n",process);
// motor_motion2(1500, 1500);
//
// process = 9;
switch(process) //???process=1
{
/**************??1~10?????********************************/
case 1: CCheck();
CarryCpoint();
break;//?????c?
case 2: BCheck();
CarryBpoint();
// while(1);
break;//?????b?
case 3: ACheck();
CarryApoint();
break;//?????a?
case 4: ICheck();
CarryIpoint();
break;//?????i? //i??????????????
case 5: HCheck();
CarryHpoint();
break;//?????h?
case 6: GCheck();
CarryGpoint();
break;//?????g?
case 7: FCheck();
CarryFpoint();
break;//?????f?
case 8: ECheck();
CarryEpoint();
break;//?????e?
case 9: DCheck();
CarryDpoint();
break;//?????d?
//case 10:turn_back();break;
case 11:StartCarryToScore();
break;//?C/B/A/D/E/G/H?????????
case 12:moveBack();
break;
default:break;
}
//
// while(1);
}
}
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