HC05蓝牙点亮LED

 本文是对基于STM32的HC05蓝牙点灯实验,目的在于认识HC05蓝牙模块,学会配置HC05,知道怎么用蓝牙在手机上控制单片机并且传输数据,虽然本文只控制led,但是点灯就是基础,主要在于学习hc05蓝牙模块。

 1.认识一下HC05模块

6根引脚,名称与功能如下;
VCC 接电源的正极,电压的范围为3.3v到5.0v;
VDD 为外接供电电源输入端;
GND 地线;
TXD:模块串口发送引脚(TTL电平,不能直接接RS232电平),可直接接单片机的RXD引脚;
RXD:模块串口接收引脚(TTL电平,不能直接接RS232电平),可直接接单片机的TXD引脚;
KEY:用于进入AT状态;
LED:这个引脚是用来检测蓝牙模块是否已经连接上了其他蓝牙设备;

原理啥的可以看参考手册,但是我觉得HC蓝牙本质上就是控制串口,所以学好串口就会这玩意。

2.hc05使用前的配置

1.首先你需要有转TTL口和两个蓝牙模块,连接方式就是tx和RX都反接,VCC对VCC,GND也是
2.将TTL插到电脑上打开串口助手(插得时候记得把蓝牙模块上面有个小按键按住,这是为了让蓝牙模块进入AT模式)
3.配置参数

 1.HC-T串口助手

这是我买的HC05提供是上面的一个串口助手,按图片来操作,先进AT模式再配置,

这个串口助手把指令封装好了,测试AT指令会返回OK,波特率再调试到9600,因为我使用的是STM32F103C8T6,另外还可以给你的蓝牙起名字还有配对密码,设置好之后可以在手机上安装一个蓝牙调试器,先实现手机与电脑串口的数据传输。

这个蓝牙调试软件可以修改你的字符编码和换行符,根据需要修改。

2.XCOM串口软件  

这个XCOM串口指令配置蓝牙指令可以参考这个 配置指令

3.STM32与HC05(重点)

我用的是USART1,所以连接的是A9和A10 

话不多说直接上代码

Serial.h 

#include "stm32f10x.h"                  
#include <stdio.h>
#include <stdarg.h>

char Serial_RxPacket[100];	//定义一个接收存放		
uint8_t Serial_RxFlag;      //接收标志位

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);   
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //开启串口与GPIO时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;               
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         //tx发送引脚  输出模式
	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;           //rx接收  出入模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);                     //初始化GPIO
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;                   //波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不使用硬件流
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;   //发送接收模式
	USART_InitStructure.USART_Parity = USART_Parity_No;       //无奇偶校验位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;    //1位停止符
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;    //配置帧数据字长
	USART_Init(USART1, &USART_InitStructure);                     //usart结构体初始化
	 
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);         //开启中断控制 使能串口
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //NVIC优先级
	
	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);                       //NVIC结构体配置
	
	USART_Cmd(USART1, ENABLE);          //开启USART1
}


void USART1_IRQHandler(void)            //串口中断
{
	static uint8_t RxState = 0;             
	static uint8_t pRxPacket = 0;       //用于数据存储次数
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)   //判断是否接收到数据
	{
		uint8_t RxData = USART_ReceiveData(USART1);       //暂存到RxData
		
		if (RxState == 0)
		{
			if (RxData == '@' && Serial_RxFlag == 0)     //当接收到@字符而且标志位为0是
			{
				RxState = 1;               
				pRxPacket = 0;                 
			}
		}
		else if (RxState == 1)             
		{ 
		   	if (RxData == '\r')             //当接收到\r时
			{
				RxState = 2;
			}
			else
			{
				Serial_RxPacket[pRxPacket] = RxData; //数据传给Serial_RxPacket[pRxPacket]
				pRxPacket ++;             //同时pRxPacket 的位置++
			}
		}
		else if (RxState == 2)
		{
			if (RxData == '\n')        
			{
				RxState = 0;
				Serial_RxPacket[pRxPacket] = '\0'; //给字符数组加一个结束标志位
				Serial_RxFlag = 1;
			}
		}
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);  //清除
	}
}

mian.c

#include "stm32f10x.h"                  
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "LED.h"
#include "string.h"

int main(void)
{
	OLED_Init();
	LED_Init();
	Serial_Init();
	
	OLED_ShowString(1, 1, "TxPacket");
	OLED_ShowString(3, 1, "RxPacket");
	
	while (1)
	{
		if (Serial_RxFlag == 1)
		{
			OLED_ShowString(4, 1, "                ");
			OLED_ShowString(4, 1, Serial_RxPacket);
			
			if (strcmp(Serial_RxPacket, "ON") == 0)
			{
				LED1_ON();
				Serial_SendString("LED_ON_OK\r\n");
				OLED_ShowString(2, 1, "                ");
				OLED_ShowString(2, 1, "LED_ON_OK");
			}
			else if (strcmp(Serial_RxPacket, "OFF") == 0)
			{
				LED1_OFF();
				Serial_SendString("LED_OFF_OK\r\n");
				OLED_ShowString(2, 1, "                ");
				OLED_ShowString(2, 1, "LED_OFF_OK");
			}
			else
			{
				Serial_SendString("ERROR\r\n");
				OLED_ShowString(2, 1, "        ");
				OLED_ShowString(2, 1, "ERROR");
			}
			
			Serial_RxFlag = 0;
		}
	}
}

这部分代码都是江科大讲串口传输数据包的代码,刚开始我自己做的是传输一个字符让LED点亮,后面发现一些传感器的数据都是多个的,就想先使用字符串来控制LED,后面因为没有设置好包头包尾容易乱码,而数据包的传输可以把多个单独数据打包起来,方便进行多字节的数据通信,建议大家可以看一下也江科大的32视频,受益匪浅 。

本代码使用@当包头,\r\n当包尾,在手机的蓝牙调试中记得加上,点灯都会了,其他关于此模块都差不多。

 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值