当前位置:   article > 正文

基于蓝牙技术使用stm32制造一个智能小车 (寻迹,避障,遥控)_stm32蓝牙遥控小车

stm32蓝牙遥控小车

目录

1.制作智能小车的硬件名单:

3.引脚图

2.先让小车动起来

 1.小车运动

2.代码

3.寻迹

 1.工作原理

2.代码

4.超声波避障

 1.工作原理

2.代码

5.蓝牙遥控

 1.蓝牙工作原理

2.代码

6.oled屏幕

1.工作内容

7.led灯

8.蜂鸣器

9.蓝牙使用代码main


1.制作智能小车的硬件名单:

 STM32C6T6核心板1块
L298N电机驱动 1块
五路灰度循迹模块   1个
带电机轮子的小车底盘(自带tt电机) 1个    
12V供电电池1个
蓝牙模块1个
超声波1个
电源转换模块1个
OLED屏幕1个
LED灯1个
蜂鸣器1个

1.小车底盘可以凭自己爱好买两轮或者四轮的。

2.核心板也可以凭性能改变,我觉得c6t6的已经可以完成他们了。

3.引脚图

2.先让小车动起来

 1.小车运动

前进:让所有的轮子正转。

后退:让所有的轮子反转。

左转:左侧轮子不动,右边轮子往正转。

右转:右侧轮子不动,左边轮子往反转。

2.代码

  1. #include "motor.h"
  2. //使用定时器2
  3. void PWM_Init(void)
  4. {
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOA, &GPIO_InitStructure);
  12. TIM_InternalClockConfig(TIM2);
  13. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  14. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  15. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  16. TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
  17. TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //PSC
  18. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  19. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  20. TIM_OCInitTypeDef TIM_OCInitStructure;
  21. TIM_OCStructInit(&TIM_OCInitStructure);
  22. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  23. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  24. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  25. TIM_OCInitStructure.TIM_Pulse = 0; //CCR
  26. TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  27. TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  28. TIM_Cmd(TIM2, ENABLE);
  29. }
  30. void PWM_SetCompare3(uint16_t Compare)
  31. {
  32. TIM_SetCompare3(TIM2, Compare);
  33. }
  34. void PWM_SetCompare2(uint16_t Compare)
  35. {
  36. TIM_SetCompare2(TIM2, Compare);
  37. }
  38. void Motor_Init(void)
  39. {
  40. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  41. GPIO_InitTypeDef GPIO_InitStructure;
  42. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_3 | GPIO_Pin_6;
  44. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  45. GPIO_Init(GPIOA, &GPIO_InitStructure);
  46. PWM_Init();
  47. }
  48. //TIM_SetCompare2 TIM_SetCompare3的数值分别对应左右两边的速度,可自行调整
  49. void run(u8 s)
  50. {
  51. TIM_SetCompare2(TIM2,s);
  52. TIM_SetCompare3(TIM2,s);
  53. IN1 = 1;
  54. IN2 = 0;
  55. IN3 = 1;
  56. IN4 = 0;
  57. }
  58. void back(u8 s)
  59. {
  60. TIM_SetCompare2(TIM2,s);
  61. TIM_SetCompare3(TIM2,s);
  62. IN1 = 0;
  63. IN2 = 1;
  64. IN3 = 0;
  65. IN4 = 1;
  66. }
  67. void zhuan1(u8 s)
  68. {
  69. TIM_SetCompare2(TIM2,s);
  70. TIM_SetCompare3(TIM2,s);
  71. IN1 = 1;
  72. IN2 = 0;
  73. IN3 = 0;
  74. IN4 = 1;
  75. }
  76. void zhuan2(u8 s)
  77. {
  78. TIM_SetCompare2(TIM2,s);
  79. TIM_SetCompare3(TIM2,s);
  80. IN1 = 0;
  81. IN2 = 1;
  82. IN3 = 1;
  83. IN4 = 0;
  84. }
  85. void right(u8 s)
  86. {
  87. TIM_SetCompare2(TIM2,s);
  88. TIM_SetCompare3(TIM2,s);
  89. IN1 = 1;
  90. IN2 = 1;
  91. IN3 = 1;
  92. IN4 = 0;
  93. }
  94. void left(u8 s)
  95. {
  96. TIM_SetCompare2(TIM2,s);
  97. TIM_SetCompare3(TIM2,s);
  98. IN1 = 1;
  99. IN2 = 0;
  100. IN3 = 1;
  101. IN4 = 1;
  102. }
  103. void stop()
  104. {
  105. IN1 = 0;
  106. IN2 = 0;
  107. IN3 = 0;
  108. IN4 = 0;
  109. }
  1. #ifndef __MOTOR_H
  2. #define __MOTOR_H
  3. #include "bm.h"
  4. #include "stm32f10x.h" // Device header
  5. //可以按照此处接线 IN1~4
  6. #define IN1 PAout(6)
  7. #define IN2 PAout(5)
  8. #define IN3 PAout(4)
  9. #define IN4 PAout(3)
  10. void Motor_Init(void);
  11. void run(u8 s);
  12. void left(u8 s);
  13. void right(u8 s);
  14. void back(u8 s);
  15. void stop(void);
  16. void zhuan1(u8 s);
  17. void zhuan2(u8 s);
  18. #endif

3.寻迹

 1.工作原理

黑色返回1,对应的灯不亮。

白色返回0,对应的灯亮。

可以用螺丝刀调节灵敏度。

2.代码

  1. #include "xunji.h"
  2. #include "motor.h"
  3. #include "Delay.h"
  4. //五路寻迹模块
  5. void XUN_GPIO_COnfine(void)
  6. {
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_8|GPIO_Pin_7;
  10. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12. GPIO_Init(GPIOB, &GPIO_InitStructure);
  13. }
  14. extern int l;
  15. //寻迹运动
  16. //根据线的宽度来决定;
  17. void run1(void )
  18. {
  19. if(L2==0&&L1==0&&M==1&&R1==0&&R2==0&&l>20)
  20. {run(70);}
  21. else if(L2==0&&L1==1&&M==0&&R1==0&&R2==0&&l>20)
  22. { run(70);}
  23. else if(L2==0&&L1==0&&M==0&&R1==1&&R2==0&&l>20)
  24. { run(70);}
  25. else if(L2==0&&L1==0&&M==1&&R1==1&&R2==0&&l>20)
  26. { run(70);}
  27. else if(L2==0&&L1==1&&M==1&&R1==0&&R2==0&&l>20)
  28. { run(70);}
  29. else if(L2==0&&L1==1&&M==1&&R1==1&&R2==0&&l>20)
  30. { run(70);}
  31. else if(L2==0&&L1==1&&M==1&&R1==1&&R2==1&&l>20)
  32. { left(70);}
  33. else if(L2==1&&L1==1&&M==1&&R1==1&&R2==0&&l>20)
  34. { right(70);}
  35. else if(L2==1&&L1==0&&M==0&&R1==0&&R2==0&&l>20)
  36. {right(80);}
  37. else if(L2==1&&L1==1&&M==0&&R1==0&&R2==0&&l>20)
  38. {right(80);}
  39. else if(L2==1&&L1==1&&M==1&&R1==0&&R2==0&&l>20)
  40. {right(80);}
  41. else if(L2==1&&L1==0&&M==1&&R1==0&&R2==0&&l>20)
  42. {right(80);}
  43. else if(L2==1&&R2==0&&l<20)
  44. {right(80);}
  45. else if(L2==0&&L1==0&&M==1&&R1==1&&R2==1&&l>20)
  46. {left(80);}
  47. else if(L2==0&&L1==0&&M==0&&R1==1&&R2==1&&l>20)
  48. {left(80);}
  49. else if(L2==0&&L1==0&&M==0&&R1==0&&R2==1&&l>20)
  50. {left(80);}
  51. else if(L2==0&&L1==0&&M==1&&R1==0&&R2==1&&l>20)
  52. {left(80);}
  53. else if(L2==0&&R2==1&&l>20)
  54. {left(80);}
  55. else if(L2==1&&L1==1&&M==1&&R1==1&&R2==1&&l>20)
  56. { zhuan1(75);
  57. Delay_ms(100);
  58. stop();
  59. Delay_ms(500);
  60. }
  61. else if(L2==0&&L1==0&&M==0&&R1==0&&R2==0&&l>20)
  62. {
  63. zhuan1(75);
  64. Delay_ms(100);
  65. stop();
  66. Delay_ms(500);
  67. }
  68. }
  1. #ifndef __XUNJI_H
  2. #define __XUNJI_H
  3. #include "stm32f10x.h" // Device header
  4. #define R2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)
  5. #define R1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)
  6. #define M GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5)
  7. #define L1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)
  8. #define L2 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
  9. void XUN_GPIO_COnfine(void);
  10. void run1(void);
  11. #endif

4.超声波避障

 1.工作原理

由于超声波碰到物体返回的特点,利用两者的时间差,以及声音在空中的速度就可以计算出障碍物的距离,进行躲避。

2.代码

  1. #include "sonic.h"
  2. //定时器3设置
  3. void hcsr04_NVIC()
  4. {
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  7. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  8. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  9. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  10. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11. NVIC_Init(&NVIC_InitStructure);
  12. }
  13. //IO口初始化 及其他初始化
  14. void Hcsr04Init(void)
  15. {
  16. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  17. GPIO_InitTypeDef GPIO_InitStructure;
  18. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  19. GPIO_InitStructure.GPIO_Pin =Trig_Pin;
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  22. GPIO_Init(GPIOB, &GPIO_InitStructure);
  23. GPIO_ResetBits(GPIOB ,Trig_Pin);
  24. GPIO_InitStructure.GPIO_Pin = Echo_Pin ;
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  26. GPIO_Init(GPIOB, &GPIO_InitStructure);
  27. GPIO_ResetBits(GPIOB,Echo_Pin);
  28. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  29. TIM_DeInit(TIM3);
  30. TIM_TimeBaseStructure.TIM_Period = (1000-1);
  31. TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
  32. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  33. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  34. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  35. TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  36. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  37. hcsr04_NVIC();
  38. TIM_Cmd(TIM3,DISABLE);
  39. }
  40. u16 msHcCount = 0;
  41. //打开定时器3
  42. static void OpenTimerForHc()
  43. {
  44. TIM_SetCounter(TIM3,0);
  45. msHcCount = 0;
  46. TIM_Cmd(TIM3, ENABLE);
  47. }
  48. //关闭定时器3
  49. static void CloseTimerForHc()
  50. {
  51. TIM_Cmd(TIM3, DISABLE);
  52. }
  53. //定时器3终中断
  54. void TIM3_IRQHandler(void)
  55. {
  56. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  57. {
  58. TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
  59. msHcCount++; //计数器开始加
  60. }
  61. }
  62. //获取定时器3计数器值
  63. u32 GetEchoTimer(void)
  64. {
  65. u32 t = 0;
  66. t = msHcCount*1000;
  67. t += TIM_GetCounter(TIM3);
  68. TIM3->CNT = 0; //计数器归零
  69. Delay_ms(50);
  70. return t;
  71. }
  72. //通过定时器3计数器值推算距离
  73. float Hcsr04GetLength(void )
  74. {
  75. u32 t = 0;
  76. int i = 0;
  77. float lengthTemp = 0;
  78. float sum = 0;
  79. u8 ll=0;
  80. while(i!=5) //测量五次取平均
  81. {
  82. for(ll=0;ll<5;ll++)
  83. {
  84. TRIG_Send = 1; //给控制端高电平
  85. Delay_us(20);
  86. TRIG_Send = 0; //超声波模块已开始发送8个40khz脉冲
  87. }
  88. while(ECHO_Reci == 0); //若ECHO_Reci为低电平,则一直循环,直到为高电平。
  89. OpenTimerForHc(); //此时说明检测到高电平,开启定时器,开始计时。
  90. i = i + 1;
  91. while(ECHO_Reci == 1); //若ECHO_Reci为高电平,则一直循环,直到为低电平。
  92. CloseTimerForHc(); //此时说明检测到低电平,关闭定时器,停止计时
  93. t = GetEchoTimer(); //获取定时器时间
  94. lengthTemp = ((float)t/58.0); //数据处理,转换成cm
  95. sum = lengthTemp + sum ; //五次测得数据累加
  96. }
  97. lengthTemp = sum/5.0; //取平均
  98. return lengthTemp;
  99. }
  100. //超声波避障
  101. extern int l;
  102. void run2()
  103. {
  104. if(l>30)
  105. {
  106. run(70);
  107. }
  108. if(l<=30)
  109. {
  110. back(70);
  111. }
  112. if(l<=7)
  113. {
  114. zhuan1(75);
  115. Delay_ms(100);
  116. stop();
  117. Delay_ms(500);
  118. }
  119. }
  1. #ifndef __SONIC_H
  2. #define __SONIC_H
  3. #include "stm32f10x.h" // Device header
  4. #include "BM.h"
  5. #include "Delay.h"
  6. #include "motor.h"
  7. #define Trig_Pin GPIO_Pin_0
  8. #define TRIG_Send PBout(0)
  9. #define Echo_Pin GPIO_Pin_1
  10. #define ECHO_Reci PBin(1)
  11. void Hcsr04Init(void);
  12. float Hcsr04GetLength(void);
  13. void run2(void);
  14. #endif

5.蓝牙遥控

 1.蓝牙工作原理

  

购买回来的蓝牙模块需要进行设置时(如主从机设置、波特率、蓝牙名称以及密码修改等):

进入AT指令方法,具体要看手册,不同模块有不同进入方法,

打开串口,设置与蓝牙模块相同波特率:

3、主、从机模式设置:

 主、从机模式需要通过设置实现(蓝牙模块都默认为从机模式,不需要改请忽略),既通过串口发送AT指令设置:

AT+ROLE设置主从模式: AT+ROLE?是查询主从状态;AT+ROLE=1是设成主;AT+ROLE=0是设成从。 

4、波特率设置:

        波特率一般默认为9600。波特率越低,传输速度越慢,但也不是越高越好,看具体情况而定,一般单片机用的都是9600。(注意:蓝牙模块的波特率需要和单片机的相同,否则传输不了数据)

这个默认波特率不是每个蓝牙模块都一样的,有的蓝牙模块默认波特率是115200,使用的时候需要看下商家资料。或者每个波特率试着改一下,总能试出来蓝牙模块的默认波特率。

指令代码部分先还有很多(比如:改蓝牙名称、蓝牙密码),感兴趣的话可以看一下数据手册,这里就不说那么多。

2.代码

  1. include "hc_05.h"
  2. //蓝牙
  3. void uart1_init( u32 bound )
  4. {
  5. /* GPIO端口设置 */
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. USART_InitTypeDef USART_InitStructure;
  8. RCC_APB2PeriphClockCmd( HC_05_GPIO_CLK, ENABLE );
  9. RCC_APB2PeriphClockCmd( HC_05_CLK , ENABLE ); /* 使能USART1,GPIOA时钟 */
  10. /* TXD */
  11. GPIO_InitStructure.GPIO_Pin = TX_GPIO_PIN;
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  13. GPIO_Init( HC_05_GPIO_PORT, &GPIO_InitStructure );
  14. /* RXD */
  15. GPIO_InitStructure.GPIO_Pin = RX_GPIO_PIN;
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  17. GPIO_Init( HC_05_GPIO_PORT, &GPIO_InitStructure );
  18. /* USART 初始化设置 */
  19. USART_InitStructure.USART_BaudRate = bound; /* 串口波特率 */
  20. USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 字长为8位数据格式 */
  21. USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 一个停止位 */
  22. USART_InitStructure.USART_Parity = USART_Parity_No; /* 无奇偶校验位 */
  23. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; /* 无硬件数据流控制 */
  24. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* 收发模式 */
  25. USART_Init(HC_05_USARTX, &USART_InitStructure ); /* 初始化串口1 */
  26. USART_Cmd( HC_05_USARTX, ENABLE ); /* 使能串口 1 */
  27. }
  28. /***************** 发送一个字符 **********************/
  29. static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
  30. {
  31. /* 发送一个字节数据到USART1 */
  32. USART_SendData(pUSARTx,ch);
  33. /* 等待发送完毕 */
  34. while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
  35. }
  36. /***************** 发送字符串 **********************/
  37. void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
  38. {
  39. unsigned int k=0;
  40. do
  41. {
  42. Usart_SendByte( pUSARTx, *(str + k) );
  43. k++;
  44. } while(*(str + k)!='\0');
  45. }
  1. #ifndef __HC_05_H
  2. #define __HC_05_H
  3. #include "stm32f10x.h" // Device header
  4. void uart1_init( u32 bound );
  5. void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str);
  6. //使用宏定义容易修改串口
  7. #define HC_05_GPIO_PORT GPIOA /* GPIO端口 */
  8. #define HC_05_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  9. #define RX_GPIO_PIN GPIO_Pin_10
  10. #define TX_GPIO_PIN GPIO_Pin_9
  11. #define HC_05_USARTX USART1
  12. #define HC_05_CLK RCC_APB2Periph_USART1
  13. #endif

6.oled屏幕

1.工作内容

显示距离和五路寻迹状况,还有处于那种模式。

7.led灯

  1. #include "led.h"
  2. /**
  3. * @brief 初始化控制LED的IO
  4. * @param 无
  5. * @retval 无
  6. */
  7. void LED_GPIO_Config(void)
  8. {
  9. /*定义一个GPIO_InitTypeDef类型的结构体*/
  10. GPIO_InitTypeDef GPIO_InitStructure;
  11. /*开启LED相关的GPIO外设时钟*/
  12. RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK|LED3_GPIO_CLK , ENABLE);
  13. /*选择要控制的GPIO引脚*/
  14. GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
  15. /*设置引脚模式为通用推挽输出*/
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17. /*设置引脚速率为50MHz */
  18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19. /*调用库函数,初始化GPIO*/
  20. GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
  21. /*选择要控制的GPIO引脚*/
  22. GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
  23. /*调用库函数,初始化GPIO*/
  24. GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
  25. /*选择要控制的GPIO引脚*/
  26. GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
  27. /*调用库函数,初始化GPIO*/
  28. GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
  29. }
  30. /*********************************************END OF FILE**********************/
  1. ifndef __LED_H
  2. #define __LED_H
  3. #include "stm32f10x.h"
  4. /* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
  5. #define LED1_GPIO_PORT GPIOA /* GPIO端口 */
  6. #define LED1_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  7. #define LED1_GPIO_PIN GPIO_Pin_8
  8. #define LED2_GPIO_PORT GPIOA /* GPIO端口 */
  9. #define LED2_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  10. #define LED2_GPIO_PIN GPIO_Pin_11
  11. #define LED3_GPIO_PORT GPIOA /* GPIO端口 */
  12. #define LED3_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  13. #define LED3_GPIO_PIN GPIO_Pin_12
  14. /** the macro definition to trigger the led on or off
  15. * 1 - off
  16. *0 - on
  17. */
  18. #define ON 0
  19. #define OFF 1
  20. /* 使用标准的固件库控制IO*/
  21. #define LED1(a) if (a) \
  22. GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
  23. else \
  24. GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
  25. #define LED2(a) if (a) \
  26. GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
  27. else \
  28. GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
  29. #define LED3(a) if (a) \
  30. GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
  31. else \
  32. GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
  33. /* 直接操作寄存器的方法控制IO */
  34. #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
  35. #define digitalLo(p,i) {p->BRR=i;} //输出低电平
  36. #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
  37. /* 定义控制IO的宏 */
  38. #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
  39. #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
  40. #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
  41. #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
  42. #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
  43. #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
  44. #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
  45. #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
  46. #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
  47. void LED_GPIO_Config(void);
  48. #endif /* __LED_H */

8.蜂鸣器

  1. #include "Buzzer.h"
  2. void Buzzer_GPIO_Config(void)
  3. {
  4. /*定义一个GPIO_InitTypeDef类型的结构体*/
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. /*开启LED相关的GPIO外设时钟*/
  7. RCC_APB2PeriphClockCmd( Buzzer_GPIO_CLK , ENABLE);
  8. /*选择要控制的GPIO引脚*/
  9. GPIO_InitStructure.GPIO_Pin = Buzzer_GPIO_PIN;
  10. /*设置引脚模式为通用推挽输出*/
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  12. /*设置引脚速率为50MHz */
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. /*调用库函数,初始化GPIO*/
  15. GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStructure);
  16. //置高电平
  17. GPIO_SetBits(Buzzer_GPIO_PORT, Buzzer_GPIO_PIN);
  18. }
  1. #ifndef __Buzzer_H
  2. #define __Buzzer_H
  3. #include "stm32f10x.h" // Device header
  4. #define Buzzer_GPIO_PORT GPIOA /* GPIO端口 */
  5. #define Buzzer_GPIO_CLK RCC_APB2Periph_GPIOA /* GPIO端口时钟 */
  6. #define Buzzer_GPIO_PIN GPIO_Pin_7
  7. #define Buzzer_OFF GPIO_ResetBits(Buzzer_GPIO_PORT,Buzzer_GPIO_PIN)
  8. #define Buzzer_ON GPIO_SetBits(Buzzer_GPIO_PORT,Buzzer_GPIO_PIN)
  9. void Buzzer_GPIO_Config(void);
  10. #endif

9.蓝牙使用代码main

  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "sonic.h"
  5. #include "xunji.h"
  6. #include "motor.h"
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include "led.h"
  11. #include "hc_05.h"
  12. #include "Buzzer.h"
  13. u8 i=0;
  14. int sp,l;
  15. unsigned int receive_data;
  16. void hc_05_send(void)
  17. {
  18. if(receive_data =='a')
  19. {
  20. i=1;
  21. receive_data=0;
  22. }
  23. if(receive_data =='b')
  24. {
  25. i=2;
  26. receive_data=0;
  27. }
  28. if(receive_data =='c')
  29. {
  30. i=3;
  31. receive_data=0;
  32. }
  33. if(receive_data =='d')
  34. {
  35. i=4;
  36. receive_data=0;
  37. }
  38. if(receive_data =='e')
  39. {
  40. i=5;
  41. receive_data=0;
  42. }
  43. if(receive_data =='f')
  44. {
  45. i=6;
  46. receive_data=0;
  47. }
  48. if(receive_data =='g')
  49. {
  50. i=7;
  51. receive_data=0;
  52. }
  53. if(receive_data =='k')
  54. {
  55. i=8;
  56. receive_data=0;
  57. }
  58. if(receive_data =='j')
  59. {
  60. i=9;
  61. receive_data=0;
  62. }
  63. if(receive_data =='l')
  64. {
  65. i=10;
  66. receive_data=0;
  67. }
  68. if(receive_data =='p')
  69. {
  70. i=11;
  71. receive_data=0;
  72. }
  73. if(receive_data =='v')
  74. {
  75. i=12;
  76. receive_data=0;
  77. }
  78. }
  79. void fying(void)
  80. {
  81. if(i==1)
  82. {
  83. OLED_ShowString(1,4," run");
  84. run(90);
  85. }
  86. if(i==2)
  87. {
  88. OLED_ShowString(1,4,"black");
  89. back(90);
  90. }
  91. if(i==3)
  92. {
  93. OLED_ShowString(1,4,"left ");
  94. left(70);
  95. }
  96. if(i==4)
  97. {
  98. OLED_ShowString(1,4,"right ");
  99. right(70);
  100. }
  101. if(i==5)
  102. {
  103. OLED_ShowString(1,4,"zhuan1");
  104. zhuan1(80);
  105. }
  106. if(i==6)
  107. {
  108. OLED_ShowString(1,4," stop ");
  109. stop();
  110. }
  111. if(i==7)
  112. {
  113. run1();
  114. OLED_ShowString(1,4," xunji");
  115. }
  116. if(i==8)
  117. {
  118. OLED_ShowString(1,4," LEDS ");
  119. LED1_OFF;LED2_OFF;LED3_OFF;
  120. }
  121. if(i==9)
  122. {
  123. OLED_ShowString(1,4," LEDM ");
  124. LED1_ON;LED2_ON;LED3_ON;
  125. }
  126. if(i==10)
  127. {
  128. OLED_ShowString(1,4," SONIC ");
  129. run2();
  130. }
  131. if(i==11)
  132. {
  133. OLED_ShowString(1,4,"BUZZER");
  134. Buzzer_OFF;
  135. }
  136. if(i==12)
  137. {
  138. OLED_ShowString(1,4,"BUZZER");
  139. Buzzer_ON;
  140. }
  141. }
  142. int main(void)
  143. {
  144. uart1_init(9600);
  145. OLED_Init();
  146. Motor_Init();
  147. Hcsr04Init();
  148. XUN_GPIO_COnfine();
  149. LED_GPIO_Config();
  150. Buzzer_GPIO_Config();
  151. while(1)
  152. {
  153. sp= (L2* 10000) + (L1 * 1000)+ (M * 100) + (R1 * 10) + R2;
  154. l=Hcsr04GetLength();
  155. OLED_ShowNum(2,4,l,3);
  156. OLED_ShowNum(3,4,sp,5);
  157. if(USART_GetFlagStatus(HC_05_USARTX,USART_FLAG_RXNE)==1)
  158. {
  159. receive_data=USART_ReceiveData(HC_05_USARTX);
  160. hc_05_send();
  161. USART_ClearFlag(HC_05_USARTX,USART_FLAG_RXNE);
  162. }
  163. fying();
  164. if(l<10)
  165. {
  166. Buzzer_OFF;
  167. LED1_OFF;
  168. }
  169. if(l>10)
  170. {
  171. Buzzer_ON;
  172. LED1_ON;
  173. }
  174. }
  175. }

-----------------------欢迎大家指正交流,有空可以一起讨论代码啊。--------------------------------

完整工程链接:通过百度网盘分享的文件:小车.zip
链接:https://pan.baidu.com/s/1dXtAi0C-9MGuAeWu13SXeQ?pwd=3gv8 
提取码:3gv8

有偿回答可以加QQ:1521354774

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/470763
推荐阅读
相关标签
  

闽ICP备14008679号