一、HC-05藍(lán)牙模塊解析
1.簡介
HC-05模塊是一種基于藍(lán)牙協(xié)議的簡單無線通信設(shè)備,共有6個引腳,其中兩個引腳通過stm32的兩個含TX和RX的接口與之進(jìn)行通信,一般用于無線控制,智能家居等。
2.HC-05原理
VCC:用于供電
GND:用于供電
TX(發(fā)送):與單片機(jī)某一RX口進(jìn)行通信
RX(接收):與單片機(jī)某一TX口進(jìn)行通信
一句話,TX->RX,RX->TX.
//這里的TX與RX直接選某STM32一個USART的一對。
如下圖
EN:使能,若置低電平,則模塊被禁用
STATE:通過該引腳輸出的高低電平可以知道藍(lán)牙模塊的狀態(tài),連接時輸出高電平,斷開時輸出低電平。
在配置后使用藍(lán)牙時,我一般不用EN和STATE這兩個引腳
3.HC-05實物圖
二、使用AT指令進(jìn)行配置
1.進(jìn)入命令響應(yīng)工作模式
我使用PWLINK2和串口助手進(jìn)行對其的配置,接線時,也采用TX->RX,RX->TX.
長按藍(lán)牙模塊的同時,給HC-05模塊進(jìn)行上電,與此同時,模塊上的指示燈大概每隔1s閃爍一次,如視頻所示,此時則說明已經(jīng)進(jìn)入了命令響應(yīng)模式。
2.配置串口
我使用VOFA+來進(jìn)行串口調(diào)試.
打開VOFA+,
設(shè)置接口為串口
設(shè)置數(shù)據(jù)引擎為RawData
設(shè)置波特率 38400
設(shè)置數(shù)據(jù)位 8 位
設(shè)置停止位 1 位
設(shè)置無校驗位
如圖
3.進(jìn)行指令
1.測試指令:發(fā)送AT,得到回應(yīng)OK
2.獲取軟件版本號:發(fā)送AT+VERSON,得到版本號
3.獲取藍(lán)牙地址:AT+ADDR,獲得藍(lán)牙地址
4.配置藍(lán)牙模塊名稱:AT+NAME=“(名稱)”
5.配置密碼:AT+PSWD=(密碼)(4位)
6.配置主從模式:AT+ROLE=0或1(0為從模式,1為主模式)
以上指令對初學(xué)者已經(jīng)足夠使用,多余的指令可以查找參考手冊
狀況如下圖
3.和手機(jī)連接(使用手機(jī)軟件藍(lán)牙調(diào)試器)
三、使用stm32f103c8t6實現(xiàn)
1.思路
配置好串口后,當(dāng)單片機(jī)接收到數(shù)據(jù)后,執(zhí)行LED點亮的操作
2.代碼
1.HC05.C
#include "stm32f10x.h" // Device header
//1.開啟時鐘,把需要用的USART和GPIO口的時鐘打開
//2.GPIO初始化,把TX設(shè)為復(fù)用輸出,RX設(shè)為輸入
//配置USART,配置參數(shù)
#include <stdio.h>
#include <stdarg.h>
#include "HC05.h"
char HC05_RxPacket[100]; //"@MSG\r\n"
uint8_t HC05_RxData;//接收數(shù)據(jù)
uint8_t HC05_RxFlag;//接收標(biāo)志位
void HC05_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//初始化TX,把TX配置成復(fù)用推挽輸出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//TX是USART2控制的外設(shè)輸出腳,選擇復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置USART
USART_InitTypeDef USART_InitStructure;
//定義USART結(jié)構(gòu)體
USART_InitStructure.USART_BaudRate = 9600;
//波特率數(shù)值
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//不使用流控
USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
//TX發(fā)送功能
USART_InitStructure.USART_Parity = USART_Parity_No;
//校驗:不需要
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//停止位:1位停止位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//字長:8位
USART_Init(USART1, &USART_InitStructure);
//初始化
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
//配置中斷
USART_Cmd(USART1, ENABLE);
//供能
}
//發(fā)送一個字節(jié)數(shù)據(jù)的函數(shù)
void HC05_SendByte(uint8_t Byte)
{
USART_SendData(USART1, Byte);
//函數(shù)的功能是通過外設(shè)USARTx發(fā)送單個數(shù)據(jù)。
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
//該標(biāo)志位,當(dāng)下一次再次使用SendData時,會自動清0
}
//發(fā)送多個字節(jié)數(shù)據(jù)(傳遞數(shù)組)
void HC05_SendArray(uint8_t *Array, uint16_t Length)
{
uint16_t i;
for (i = 0; i < Length; i ++)
{
HC05_SendByte(Array[i]);
}
}
//發(fā)送多個字符數(shù)據(jù)
//string類型自帶標(biāo)志位,無需長度限制
void HC05_SendString(char *String)
{
uint8_t i;
for (i = 0; String[i] != '\0'; i ++)
{
HC05_SendByte(String[i]);
}
}
//求x的y次方函數(shù)
uint32_t HC05_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y --)
{
Result *= X;
}
return Result;
}
//發(fā)送數(shù)字(可顯示成字符串形式)
//利用先相除得到首位,后取余,發(fā)送出該一個數(shù)字
void HC05_SendNumber(uint32_t Number, uint8_t Length)
{
uint8_t i;
for (i = 0; i < Length; i ++)
{
HC05_SendByte(Number / HC05_Pow(10, Length - i - 1) % 10 + '0');
}
}
//重定向fputc
//printf的本質(zhì)上是不斷調(diào)用fputc()
//重定向后,只能該串口使用,其余串口無法使用
int fputc1(int ch, FILE *f)
{
HC05_SendByte(ch);
return ch;
}
void HC05_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg);
va_end(arg);
HC05_SendString(String);
}
//接收標(biāo)志位判斷
uint8_t HC05_GetRxFlag(void)
{
if ( HC05_RxFlag == 1)
{
HC05_RxFlag = 0;
return 1;
}
return 0;
}
uint8_t HC05_GetRxData(void)
{
return HC05_RxData;
}
void HC05_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
HC05_RxData = USART_ReceiveData(USART1);
HC05_RxFlag = 1;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
2.main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "HC05.h"
uint8_t RxData;
uint16_t AD0, AD1, AD2, AD3,AD4,AD5;
int main(void)
{
LED_Init();
HC05_Init();
while (1)
{
HC05_IRQHandler();
if (HC05_GetRxFlag() == 1)
{
RxData = HC05_GetRxData();
HC05_SendByte(RxData);
LED_ON();
}
}
}
3.視頻如下
審核還沒通過,通過之后補(bǔ)上,文章來源:http://www.zghlxwxcb.cn/news/detail-475026.html
希望大家多多支持創(chuàng)作文章來源地址http://www.zghlxwxcb.cn/news/detail-475026.html
到了這里,關(guān)于HC-05藍(lán)牙模塊與STM32控制led燈亮詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!