很長時間沒有寫博客了,因為搞完這個小車以后就在暑假研究無人機去了,所以上一次的藍牙模塊一直沒有時間去寫,沒事現在補上
- HC-05(我用的是這個模塊:因為價格中等,功能完善) 便宜的還有JDY-31)
可以去我第一個博客找那家店鋪)

注意買四個引腳的就可以了
下面是正點原子的(資料更詳細,但是這個小模塊沒必要)

-
藍牙模塊簡單介紹
透傳模塊是基于藍牙 2.1 協議標準,作業頻段為 2.4GHZ 范圍,具有信號強、資料傳輸快、性能穩定等特性,支持藍牙 SPP 串口協議,內置 PCB 天線,支持 UART 介面,藍牙 Class 2,資料傳輸比 BLE 藍牙快、可達到幾十 K 每秒以上的速率,
引腳功能說明
1 、 UART-TX 串口輸出,接開發板上的UART-Rx,電平為 TTL 電平
2 、 UART-RX 串口輸入,接開發板上的UART-Tx,電平為 TTL 電平
3 、 VCC 3.3V 電源
4 、 GND 電源地
它通過串口接受和發送資料(所以通過配置單片機的USART就可以)
想詳細了解USART通信請點擊 大佬總結
- 代碼部分(我用的是正點原子的usart的資料處理的函式 因為操作簡單,后面還要提到)
.c檔案
#include"HC05.h"
#include "sys.h"
#include "motor.h"
#include<stdio.h>
#if EN_USART3_RX //如果使能了接收
//串口1中斷服務程式
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8 USART3_RX_BUF[USART3_REC_LEN]; //接識訓沖,最大USART_REC_LEN個位元組.
//接收狀態
//bit15, 接收完成標志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效位元組數目
u16 USART3_RX_STA=0; //接收狀態標記
void initValuePack(u32 baudrate)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 時鐘初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
// 引腳初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* PA10 USART1_Rx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE);
// 串口初始化
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
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_Rx | USART_Mode_Tx;
USART_Init(USART3, &USART_InitStructure);
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Cmd(USART3,ENABLE);
}
void USART3_IRQHandler(void)
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中斷(接收到的資料必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART3);//(USART2->DR); //讀取接收到的資料
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART3_RX_STA=0;//接收錯誤,重新開始
else USART3_RX_STA|=0x8000; //接收完成了
}
else //還沒收到0X0D
{
if(Res==0x0d)USART3_RX_STA|=0x4000;
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=Res ;
USART3_RX_STA++;
if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//接收資料錯誤,重新開始接收
}
}
}
}
}
#endif
.h檔案
#ifndef __HC05_H
#define __HC05_H
#include "sys.h"
#define USART3_REC_LEN 200 //定義最大接收位元組數 200
#define EN_USART3_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART3_RX_BUF[USART3_REC_LEN]; //接識訓沖,最大USART_REC_LEN個位元組.末位元組為換行符
extern u16 USART3_RX_STA; //接收狀態標記
void initValuePack(u32 baudrate);
#endif
.main(主處理)
#include "motor.h"
#include<usart.h>
#include<delay.h>
int main(void)
{
u16 t;
u16 len;
u8 a[200];
u16 speed=5000;
Motor_init();
delay_init();
uart_init(9600);
PWMout(0,7199);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//藍牙資料接收判斷函式
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的資料長度
printf("\r\n您發送的訊息為:\r\n\r\n");
for(t=0;t<len;t++)
{ a[t]= USART_RX_BUF[t]; //得到的資料為字串型別
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1發送資料
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
}
printf("\r\n\r\n");//插入換行
USART_RX_STA=0;
if(a[0]==0x30)
{
Carstop();
delay_ms(1000);
}
if(a[0]==0x31) //向串口發送1 直行
{
Carstart();
}
if(a[0]==0x32)
{
Carturnall(LEFT);
}
if(a[0]==0x33)
{
Carturnall(RIGHT);
}
if(a[0]==0x34)
{
Carback();
}
if(a[0]==0x35)
{
Carspeedcontrol(speed+300);
}
if(a[0]==0x36)
{
Carspeedcontrol(speed-300);
}
}
}
}
里面的0x32-0x36都是16進制,轉化為10進制的ASII值就可以完成后面的配置了
- 與手機的通信和控制
先把這個APP給上傳來
鏈接:https://pan.baidu.com/s/1MzdCu_buEtN1Oy8LM5y_wQ 提取碼:lh5h
大概就是這個界面,進入鍵盤模式,你就可以自定義按鍵了

- 總結
1.按鍵的時候可以設定按下和松開,就和一些板子上的常規按鍵代碼的原理是類似的,所以一開始就設定按下的,然后修改代碼設定松開的發送指令,可以使你的小車更加有可操控(這個代碼很好寫我就不列出了)
2.正點原子里面USART的通信代碼一定要熟悉,以后的usart的通信你都可以以它為基礎進行代碼的改寫和讀懂別人的通信協議代碼
3.雙方的波特率要設定一致
4.一開始對于這些通信模塊都可以買一個轉TLL串口的東西,先在電腦上進行一些簡單的發送.并且在以后對于基礎模塊的開發的時候可以讓你的基礎變得更扎實
路漫漫,今日到此
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/159311.html
標籤:其他
下一篇:2020電賽準備總結(三)
