赞
踩
目录
STM32C6T6核心板 | 1块 |
L298N电机驱动 | 1块 |
五路灰度循迹模块 | 1个 |
带电机轮子的小车底盘(自带tt电机) | 1个 |
12V供电电池 | 1个 |
蓝牙模块 | 1个 |
超声波 | 1个 |
电源转换模块 | 1个 |
OLED屏幕 | 1个 |
LED灯 | 1个 |
蜂鸣器 | 1个 |
1.小车底盘可以凭自己爱好买两轮或者四轮的。
2.核心板也可以凭性能改变,我觉得c6t6的已经可以完成他们了。
前进:让所有的轮子正转。
后退:让所有的轮子反转。
左转:左侧轮子不动,右边轮子往正转。
右转:右侧轮子不动,左边轮子往反转。
- #include "motor.h"
- //使用定时器2
- void PWM_Init(void)
- {
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- TIM_InternalClockConfig(TIM2);
-
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
- TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //PSC
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
-
- TIM_OCInitTypeDef TIM_OCInitStructure;
- TIM_OCStructInit(&TIM_OCInitStructure);
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- TIM_OCInitStructure.TIM_Pulse = 0; //CCR
-
- TIM_OC3Init(TIM2, &TIM_OCInitStructure);
- TIM_OC2Init(TIM2, &TIM_OCInitStructure);
-
- TIM_Cmd(TIM2, ENABLE);
- }
-
- void PWM_SetCompare3(uint16_t Compare)
- {
- TIM_SetCompare3(TIM2, Compare);
- }
-
- void PWM_SetCompare2(uint16_t Compare)
- {
- TIM_SetCompare2(TIM2, Compare);
- }
-
- void Motor_Init(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_3 | GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- PWM_Init();
- }
-
- //TIM_SetCompare2 TIM_SetCompare3的数值分别对应左右两边的速度,可自行调整
- void run(u8 s)
- {
-
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 1;
- IN2 = 0;
-
- IN3 = 1;
- IN4 = 0;
- }
-
- void back(u8 s)
- {
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 0;
- IN2 = 1;
-
- IN3 = 0;
- IN4 = 1;
- }
-
- void zhuan1(u8 s)
- {
-
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 1;
- IN2 = 0;
-
- IN3 = 0;
- IN4 = 1;
-
- }
-
- void zhuan2(u8 s)
- {
-
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 0;
- IN2 = 1;
-
- IN3 = 1;
- IN4 = 0;
-
- }
-
- void right(u8 s)
- {
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 1;
- IN2 = 1;
-
- IN3 = 1;
- IN4 = 0;
- }
-
- void left(u8 s)
- {
- TIM_SetCompare2(TIM2,s);
- TIM_SetCompare3(TIM2,s);
-
- IN1 = 1;
- IN2 = 0;
-
- IN3 = 1;
- IN4 = 1;
- }
-
-
- void stop()
- {
-
- IN1 = 0;
- IN2 = 0;
-
- IN3 = 0;
- IN4 = 0;
- }
- #ifndef __MOTOR_H
- #define __MOTOR_H
- #include "bm.h"
-
- #include "stm32f10x.h" // Device header
- //可以按照此处接线 IN1~4
-
- #define IN1 PAout(6)
- #define IN2 PAout(5)
- #define IN3 PAout(4)
- #define IN4 PAout(3)
-
- void Motor_Init(void);
- void run(u8 s);
- void left(u8 s);
- void right(u8 s);
- void back(u8 s);
- void stop(void);
- void zhuan1(u8 s);
- void zhuan2(u8 s);
-
- #endif
黑色返回1,对应的灯不亮。
白色返回0,对应的灯亮。
可以用螺丝刀调节灵敏度。
- #include "xunji.h"
- #include "motor.h"
- #include "Delay.h"
- //五路寻迹模块
- void XUN_GPIO_COnfine(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_8|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
-
- extern int l;
- //寻迹运动
- //根据线的宽度来决定;
- void run1(void )
- {
- if(L2==0&&L1==0&&M==1&&R1==0&&R2==0&&l>20)
- {run(70);}
-
- else if(L2==0&&L1==1&&M==0&&R1==0&&R2==0&&l>20)
- { run(70);}
-
- else if(L2==0&&L1==0&&M==0&&R1==1&&R2==0&&l>20)
- { run(70);}
-
- else if(L2==0&&L1==0&&M==1&&R1==1&&R2==0&&l>20)
- { run(70);}
-
- else if(L2==0&&L1==1&&M==1&&R1==0&&R2==0&&l>20)
- { run(70);}
-
- else if(L2==0&&L1==1&&M==1&&R1==1&&R2==0&&l>20)
- { run(70);}
-
- else if(L2==0&&L1==1&&M==1&&R1==1&&R2==1&&l>20)
- { left(70);}
-
- else if(L2==1&&L1==1&&M==1&&R1==1&&R2==0&&l>20)
- { right(70);}
-
-
-
- else if(L2==1&&L1==0&&M==0&&R1==0&&R2==0&&l>20)
- {right(80);}
-
- else if(L2==1&&L1==1&&M==0&&R1==0&&R2==0&&l>20)
- {right(80);}
-
- else if(L2==1&&L1==1&&M==1&&R1==0&&R2==0&&l>20)
- {right(80);}
-
- else if(L2==1&&L1==0&&M==1&&R1==0&&R2==0&&l>20)
- {right(80);}
-
- else if(L2==1&&R2==0&&l<20)
- {right(80);}
-
-
- else if(L2==0&&L1==0&&M==1&&R1==1&&R2==1&&l>20)
- {left(80);}
-
- else if(L2==0&&L1==0&&M==0&&R1==1&&R2==1&&l>20)
- {left(80);}
-
- else if(L2==0&&L1==0&&M==0&&R1==0&&R2==1&&l>20)
- {left(80);}
-
- else if(L2==0&&L1==0&&M==1&&R1==0&&R2==1&&l>20)
- {left(80);}
-
- else if(L2==0&&R2==1&&l>20)
- {left(80);}
-
- else if(L2==1&&L1==1&&M==1&&R1==1&&R2==1&&l>20)
- { zhuan1(75);
- Delay_ms(100);
-
- stop();
- Delay_ms(500);
- }
-
- else if(L2==0&&L1==0&&M==0&&R1==0&&R2==0&&l>20)
- {
- zhuan1(75);
- Delay_ms(100);
-
- stop();
- Delay_ms(500);
- }
- }
- #ifndef __XUNJI_H
- #define __XUNJI_H
-
- #include "stm32f10x.h" // Device header
-
-
- #define R2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)
- #define R1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)
- #define M GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)
- #define L1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)
- #define L2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
-
- void XUN_GPIO_COnfine(void);
- void run1(void);
-
- #endif
由于超声波碰到物体返回的特点,利用两者的时间差,以及声音在空中的速度就可以计算出障碍物的距离,进行躲避。
- #include "sonic.h"
-
- //定时器3设置
- void hcsr04_NVIC()
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- 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);
- }
-
-
- //IO口初始化 及其他初始化
- void Hcsr04Init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin =Trig_Pin;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOB ,Trig_Pin);
-
- GPIO_InitStructure.GPIO_Pin = Echo_Pin ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOB,Echo_Pin);
-
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- TIM_DeInit(TIM3);
- TIM_TimeBaseStructure.TIM_Period = (1000-1);
- TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
- TIM_ClearFlag(TIM3, TIM_FLAG_Update);
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
- hcsr04_NVIC();
- TIM_Cmd(TIM3,DISABLE);
- }
-
- u16 msHcCount = 0;
- //打开定时器3
- static void OpenTimerForHc()
- {
- TIM_SetCounter(TIM3,0);
- msHcCount = 0;
- TIM_Cmd(TIM3, ENABLE);
- }
-
- //关闭定时器3
- static void CloseTimerForHc()
- {
- TIM_Cmd(TIM3, DISABLE);
- }
-
- //定时器3终中断
- void TIM3_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
- msHcCount++; //计数器开始加
- }
- }
-
-
- //获取定时器3计数器值
- u32 GetEchoTimer(void)
- {
- u32 t = 0;
- t = msHcCount*1000;
- t += TIM_GetCounter(TIM3);
- TIM3->CNT = 0; //计数器归零
- Delay_ms(50);
- return t;
- }
-
- //通过定时器3计数器值推算距离
- float Hcsr04GetLength(void )
- {
- u32 t = 0;
- int i = 0;
- float lengthTemp = 0;
- float sum = 0;
- u8 ll=0;
-
- while(i!=5) //测量五次取平均
- {
- for(ll=0;ll<5;ll++)
- {
- TRIG_Send = 1; //给控制端高电平
- Delay_us(20);
- TRIG_Send = 0; //超声波模块已开始发送8个40khz脉冲
- }
-
- while(ECHO_Reci == 0); //若ECHO_Reci为低电平,则一直循环,直到为高电平。
- OpenTimerForHc(); //此时说明检测到高电平,开启定时器,开始计时。
- i = i + 1;
- while(ECHO_Reci == 1); //若ECHO_Reci为高电平,则一直循环,直到为低电平。
-
- CloseTimerForHc(); //此时说明检测到低电平,关闭定时器,停止计时
-
- t = GetEchoTimer(); //获取定时器时间
- lengthTemp = ((float)t/58.0); //数据处理,转换成cm
- sum = lengthTemp + sum ; //五次测得数据累加
-
- }
-
- lengthTemp = sum/5.0; //取平均
- return lengthTemp;
- }
- //超声波避障
- extern int l;
- void run2()
- {
-
- if(l>30)
- {
- run(70);
-
- }
-
- if(l<=30)
- {
-
- back(70);
-
- }
-
- if(l<=7)
- {
- zhuan1(75);
- Delay_ms(100);
-
- stop();
- Delay_ms(500);
-
- }
- }
- #ifndef __SONIC_H
- #define __SONIC_H
-
- #include "stm32f10x.h" // Device header
- #include "BM.h"
- #include "Delay.h"
- #include "motor.h"
-
- #define Trig_Pin GPIO_Pin_0
- #define TRIG_Send PBout(0)
- #define Echo_Pin GPIO_Pin_1
- #define ECHO_Reci PBin(1)
-
- void Hcsr04Init(void);
- float Hcsr04GetLength(void);
- void run2(void);
- #endif
购买回来的蓝牙模块需要进行设置时(如主从机设置、波特率、蓝牙名称以及密码修改等):
进入AT指令方法,具体要看手册,不同模块有不同进入方法,
打开串口,设置与蓝牙模块相同波特率:
3、主、从机模式设置:
主、从机模式需要通过设置实现(蓝牙模块都默认为从机模式,不需要改请忽略),既通过串口发送AT指令设置:
AT+ROLE设置主从模式: AT+ROLE?是查询主从状态;AT+ROLE=1是设成主;AT+ROLE=0是设成从。
4、波特率设置:
波特率一般默认为9600。波特率越低,传输速度越慢,但也不是越高越好,看具体情况而定,一般单片机用的都是9600。(注意:蓝牙模块的波特率需要和单片机的相同,否则传输不了数据)
这个默认波特率不是每个蓝牙模块都一样的,有的蓝牙模块默认波特率是115200,使用的时候需要看下商家资料。或者每个波特率试着改一下,总能试出来蓝牙模块的默认波特率。
指令代码部分先还有很多(比如:改蓝牙名称、蓝牙密码),感兴趣的话可以看一下数据手册,这里就不说那么多。
- include "hc_05.h"
-
- //蓝牙
- void uart1_init( u32 bound )
- {
- /* GPIO端口设置 */
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
-
-
- RCC_APB2PeriphClockCmd( HC_05_GPIO_CLK, ENABLE );
- RCC_APB2PeriphClockCmd( HC_05_CLK , ENABLE ); /* 使能USART1,GPIOA时钟 */
-
-
-
- /* TXD */
- GPIO_InitStructure.GPIO_Pin = TX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init( HC_05_GPIO_PORT, &GPIO_InitStructure );
- /* RXD */
- GPIO_InitStructure.GPIO_Pin = RX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init( HC_05_GPIO_PORT, &GPIO_InitStructure );
-
-
- /* USART 初始化设置 */
- USART_InitStructure.USART_BaudRate = bound; /* 串口波特率 */
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 字长为8位数据格式 */
- 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_Rx | USART_Mode_Tx; /* 收发模式 */
-
- USART_Init(HC_05_USARTX, &USART_InitStructure ); /* 初始化串口1 */
- USART_Cmd( HC_05_USARTX, ENABLE ); /* 使能串口 1 */
- }
-
- /***************** 发送一个字符 **********************/
- static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
- {
- /* 发送一个字节数据到USART1 */
- USART_SendData(pUSARTx,ch);
-
- /* 等待发送完毕 */
- while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
- }
-
-
- /***************** 发送字符串 **********************/
- void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
- {
- unsigned int k=0;
- do
- {
- Usart_SendByte( pUSARTx, *(str + k) );
- k++;
- } while(*(str + k)!='\0');
- }
- #ifndef __HC_05_H
- #define __HC_05_H
-
- #include "stm32f10x.h" // Device header
-
- void uart1_init( u32 bound );
-
- void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str);
- //使用宏定义容易修改串口
- #define HC_05_GPIO_PORT GPIOA /* GPIO端口 */
- #define HC_05_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
-
- #define RX_GPIO_PIN GPIO_Pin_10
- #define TX_GPIO_PIN GPIO_Pin_9
-
- #define HC_05_USARTX USART1
- #define HC_05_CLK RCC_APB2Periph_USART1
-
-
- #endif
显示距离和五路寻迹状况,还有处于那种模式。
- #include "led.h"
-
- /**
- * @brief 初始化控制LED的IO
- * @param 无
- * @retval 无
- */
- void LED_GPIO_Config(void)
- {
- /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /*开启LED相关的GPIO外设时钟*/
- RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK|LED3_GPIO_CLK , ENABLE);
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
-
- /*设置引脚模式为通用推挽输出*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
- /*设置引脚速率为50MHz */
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
-
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
-
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
-
- /*调用库函数,初始化GPIO*/
- GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
-
-
- }
-
- /*********************************************END OF FILE**********************/
- ifndef __LED_H
- #define __LED_H
-
-
- #include "stm32f10x.h"
-
-
- /* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
- #define LED1_GPIO_PORT GPIOA /* GPIO端口 */
- #define LED1_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
- #define LED1_GPIO_PIN GPIO_Pin_8
-
- #define LED2_GPIO_PORT GPIOA /* GPIO端口 */
- #define LED2_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
- #define LED2_GPIO_PIN GPIO_Pin_11
-
- #define LED3_GPIO_PORT GPIOA /* GPIO端口 */
- #define LED3_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
- #define LED3_GPIO_PIN GPIO_Pin_12
-
- /** the macro definition to trigger the led on or off
- * 1 - off
- *0 - on
- */
- #define ON 0
- #define OFF 1
-
- /* 使用标准的固件库控制IO*/
- #define LED1(a) if (a) \
- GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
- else \
- GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
-
- #define LED2(a) if (a) \
- GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
- else \
- GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
-
- #define LED3(a) if (a) \
- GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
- else \
- GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
-
-
- /* 直接操作寄存器的方法控制IO */
- #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
- #define digitalLo(p,i) {p->BRR=i;} //输出低电平
- #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
-
-
- /* 定义控制IO的宏 */
- #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
- #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
- #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
-
- #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
- #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
- #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
-
-
- #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
- #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
- #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
-
- void LED_GPIO_Config(void);
-
- #endif /* __LED_H */
- #include "Buzzer.h"
-
- void Buzzer_GPIO_Config(void)
- {
- /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /*开启LED相关的GPIO外设时钟*/
- RCC_APB2PeriphClockCmd( Buzzer_GPIO_CLK , ENABLE);
- /*选择要控制的GPIO引脚*/
- GPIO_InitStructure.GPIO_Pin = Buzzer_GPIO_PIN;
-
- /*设置引脚模式为通用推挽输出*/
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
- /*设置引脚速率为50MHz */
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
- /*调用库函数,初始化GPIO*/
- GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStructure);
- //置高电平
- GPIO_SetBits(Buzzer_GPIO_PORT, Buzzer_GPIO_PIN);
- }
- #ifndef __Buzzer_H
- #define __Buzzer_H
-
- #include "stm32f10x.h" // Device header
-
-
- #define Buzzer_GPIO_PORT GPIOA /* GPIO端口 */
- #define Buzzer_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
- #define Buzzer_GPIO_PIN GPIO_Pin_7
-
-
- #define Buzzer_OFF GPIO_ResetBits(Buzzer_GPIO_PORT,Buzzer_GPIO_PIN)
- #define Buzzer_ON GPIO_SetBits(Buzzer_GPIO_PORT,Buzzer_GPIO_PIN)
-
- void Buzzer_GPIO_Config(void);
-
- #endif
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "OLED.h"
- #include "sonic.h"
- #include "xunji.h"
- #include "motor.h"
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "led.h"
- #include "hc_05.h"
- #include "Buzzer.h"
-
- u8 i=0;
- int sp,l;
- unsigned int receive_data;
- void hc_05_send(void)
- {
- if(receive_data =='a')
- {
- i=1;
- receive_data=0;
- }
-
- if(receive_data =='b')
- {
- i=2;
- receive_data=0;
- }
- if(receive_data =='c')
- {
- i=3;
- receive_data=0;
- }
- if(receive_data =='d')
- {
- i=4;
- receive_data=0;
- }
- if(receive_data =='e')
- {
- i=5;
- receive_data=0;
- }
- if(receive_data =='f')
- {
- i=6;
- receive_data=0;
- }
-
- if(receive_data =='g')
- {
- i=7;
- receive_data=0;
- }
-
- if(receive_data =='k')
- {
- i=8;
- receive_data=0;
- }
-
- if(receive_data =='j')
- {
- i=9;
- receive_data=0;
- }
-
- if(receive_data =='l')
- {
- i=10;
- receive_data=0;
- }
- if(receive_data =='p')
- {
- i=11;
- receive_data=0;
- }
- if(receive_data =='v')
- {
- i=12;
- receive_data=0;
- }
- }
-
- void fying(void)
- {
- if(i==1)
- {
- OLED_ShowString(1,4," run");
- run(90);
- }
-
- if(i==2)
- {
- OLED_ShowString(1,4,"black");
- back(90);
- }
-
- if(i==3)
- {
- OLED_ShowString(1,4,"left ");
- left(70);
- }
-
- if(i==4)
- {
- OLED_ShowString(1,4,"right ");
- right(70);
- }
- if(i==5)
- {
- OLED_ShowString(1,4,"zhuan1");
- zhuan1(80);
- }
- if(i==6)
- {
- OLED_ShowString(1,4," stop ");
- stop();
- }
-
-
- if(i==7)
- {
- run1();
- OLED_ShowString(1,4," xunji");
- }
-
- if(i==8)
- {
-
- OLED_ShowString(1,4," LEDS ");
- LED1_OFF;LED2_OFF;LED3_OFF;
- }
-
- if(i==9)
- {
-
- OLED_ShowString(1,4," LEDM ");
- LED1_ON;LED2_ON;LED3_ON;
- }
- if(i==10)
- {
-
- OLED_ShowString(1,4," SONIC ");
- run2();
- }
- if(i==11)
- {
-
- OLED_ShowString(1,4,"BUZZER");
- Buzzer_OFF;
- }
- if(i==12)
- {
-
- OLED_ShowString(1,4,"BUZZER");
- Buzzer_ON;
- }
- }
-
- int main(void)
- {
-
-
- uart1_init(9600);
- OLED_Init();
- Motor_Init();
- Hcsr04Init();
- XUN_GPIO_COnfine();
- LED_GPIO_Config();
- Buzzer_GPIO_Config();
- while(1)
- {
-
- sp= (L2* 10000) + (L1 * 1000)+ (M * 100) + (R1 * 10) + R2;
- l=Hcsr04GetLength();
- OLED_ShowNum(2,4,l,3);
- OLED_ShowNum(3,4,sp,5);
- if(USART_GetFlagStatus(HC_05_USARTX,USART_FLAG_RXNE)==1)
- {
- receive_data=USART_ReceiveData(HC_05_USARTX);
-
- hc_05_send();
-
- USART_ClearFlag(HC_05_USARTX,USART_FLAG_RXNE);
- }
- fying();
- if(l<10)
- {
- Buzzer_OFF;
- LED1_OFF;
- }
- if(l>10)
- {
- Buzzer_ON;
- LED1_ON;
- }
-
-
- }
-
- }
-----------------------欢迎大家指正交流,有空可以一起讨论代码啊。--------------------------------
完整工程链接:通过百度网盘分享的文件:小车.zip
链接:https://pan.baidu.com/s/1dXtAi0C-9MGuAeWu13SXeQ?pwd=3gv8
提取码:3gv8
有偿回答可以加QQ:1521354774
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。