赞
踩
目录
AT+NAME=8888 //名字
AT+NAME? //查看名字
AT+PSWD="6666" //密码
AT+PSWD? //查看名字
AT+UART=9600,0,0 //波特率
AT+UART? //查看波特率
AT+RESET //重启
设置成功都会返回 OK
开启串口中断
打印函数,用于测试的。
开启接收中断
进入串口接收中断回调函数,此函数为弱函数,即在主函数中调用便可覆盖之前执行的内容,执行现在打印的函数。
手机连上蓝牙发送信息;串口界面打印 111111 换行 hello 就表示可以进入中断函数,
ENA和ENB使能,ENA控制INT1和INT2,ENB控制INT3和INT4。
分别对应PA0,PA1,PB15,PB14,PB13,PB12。
这里我们使用PWM(脉冲宽度调制),指1秒内信号从高电平到低电平再回到高电平的次数,即高电平在一个周期所占比。可以调节左右两边车轮的速度。这里就不细讲了。
1.在主函数里面开启PWM
模块化,在Core/Src下面添加一个.c文件,在里面添加用到的头文件。
- #include "DJ.h"
- #include "main.h"
- #include "stm32f1xx_hal.h"
-
- extern TIM_HandleTypeDef htim2;
- extern TIM_HandleTypeDef htim3;
-
- //电机正转
- void DJ(int a,int b)
- {
- __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,a);
- HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_SET);
-
- __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,b);
- HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_RESET);
- HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_SET);
- }
- //电机反转
- void BACK(int c,int d)
- {
- __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,c);
- HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_SET);
- HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_RESET);
-
- __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,d);
- HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_SET);
- HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_RESET);
- }
-
-
在Core/INC文件夹里面添加一个.h文件
- #ifndef INC_DJ_H_
- #define INC_DJ_H_
-
- void DJ(int a,int b);
- void BACK(int c,int d);
-
- #endif
在main.c里中断接收函数里添加如下代码
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
-
- HAL_UART_Transmit(&huart3,data,1,10); //发送函数
-
- if(data[0] == 'a')
- {
- DJ(150,150); //前进
- }
- if(data[0] == 'b')
- {
- DJ(10,150); //左转
- }
- if(data[0] == 'c')
- {
- DJ(0,0); //停止
- }
- if(data[0] == 'd')
- {
- BACK(150,150); //后退
- }
- if(data[0] == 'e')
- {
- DJ(150,10); //右转
- }
- HAL_UART_Receive_IT(&huart3,data,1); //开启接收中断
- }
第一步测试在串口界面打印了就说明是可以通信的,在手机蓝牙调试器软件上发相应的字符
就能实现相应的功能,
蓝牙控制小车功能已经实现,
引脚分别对应PC4,PC5,PB0,PB1,PB2。
1.放在main.c文件里面,头文件下面主函数之前,也可以模块化代码,步骤和上面一样。
因为该红外传感器0是黑色,1是其他颜色
- int KZ(void)
- {
- int flag=0;
-
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==0 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
- {
- flag=1;//左转大弯
- }
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
- {
- flag=2; //左转小弯
-
- }
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
- {
- flag=3;//慢�?�前�???
-
- }
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
- {
- flag=4; //右转小弯
-
- }
- if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
- {
- flag=5; //右转大弯
-
- }
- return flag;
- }
2.在主函数while循环里添加如下代码
- while (1)
- {
- /* USER CODE END WHILE */
-
- /* USER CODE BEGIN 3 */
-
- if(KZ()==1)
- {
- DJ(50,100); //左大转
- }
- if(KZ()==2)
- {
- DJ(100,200); //左小转
- }
- if(KZ()==3)
- {
- DJ(200,200); //前进
- }
- if(KZ()==4)
- {
- DJ(200,100); //右小转
- }
- if(KZ()==5)
- {
- DJ(200,50); //右大转
- }
-
- }
循迹功能也可以显示了,也可以在此基础上添加一些其他功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。