#include "stm32f10x.h"
#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);