当前位置:   article > 正文

小兴教你做平衡小车-蓝牙模块JDY-31介绍

小兴教你做平衡小车-蓝牙模块JDY-31介绍

1 前言

大家应该都知道手机和电脑上都有蓝牙功能吧,蓝牙的功能强大,比如两个手机可以连上蓝牙来进行数据的交换,这里的数据与可以是图片、视频或者音乐等。本次先来介绍蓝牙模块
蓝牙模块的具体实物图见下图所示。可以看出该模块共引出6个引脚。VCC、GND、RXD、TXD、STATE、EN。
在这里插入图片描述
在这里插入图片描述

2 模块资料下载

资料链接:https://pan.baidu.com/s/1V3ZK5eqk0trze7PLqD3wgA                       提取码:7185

蓝牙串口模块/JDY-31(6)  资料下载(浏览器粘贴直接下载):https://www.yourcee.com/filedownload/533344

蓝牙串口模块/JDY-31(4)  资料下载(浏览器粘贴直接下载):https://www.yourcee.com/filedownload/533845
  • 1
  • 2
  • 3
  • 4
  • 5

咱们下载好资料后,内容如下图所示。
在这里插入图片描述

3 模块介绍

3.1 模块特点

首先咱们先介绍一下这个模块,原来咱们买的是生厂商焊接后的样子了,你看下图,如果直接给我们下图所示的模块,是非常不利于我们进行项目的开发的。
在这里插入图片描述
下图是模块的具体参数,重点关注通讯接口(UART)和工作电压(3.3V)。可以看出传输距离还是蛮大的,30米的距离已经很远了。
此外,这个模块属于从机。
在这里插入图片描述
下图可以看到其实能用的引脚并不多的,主要用到的是TXD、RXD、VCC、GND、EN、STAT这几个引脚。
在这里插入图片描述
在这里插入图片描述

3.2 模块相关指令介绍

下图是常用的蓝牙模块常用的指令集。
在这里插入图片描述
我们用USB转TTL模块来对蓝牙模块进行设置。
只需要连接两个模块的4个引脚即可。VCC(蓝牙模块)-5V(串口模块)、GND(蓝牙模块)–GND(串口模块)、TXD(蓝牙模块)-RXD(串口模块)、RXD(蓝牙模块)-TXD(串口模块)
在这里插入图片描述
接到电源上后,可以看到蓝牙模块上唯一的小灯处于闪烁状态,从这个现象可以推断出,小灯的另一端是接到ALED上的。
在这里插入图片描述
当我欢喜的打开串口助手后发现,并没有识别到串口。原来是驱动没有安装导致。经过一顿操作之后,终于可以识别了。
参考博客:CP2102 USB to UART Bridge Controller 驱动安装(windows or Ubuntu)
在这里插入图片描述
在这里插入图片描述
此时用串口助手软件可以识别到串口了。
在这里插入图片描述

3.3 指令学习

3.3.1 查看版本号

查看版本号:AT+VERSION

在这里插入图片描述

3.3.2 软复位

软复位:AT+RESET
在这里插入图片描述

3.3.3 查看模块的波特率

查看模块的波特率:AT+BAUD,下图显示的是4,也即是波特率为9600。
在这里插入图片描述
在这里插入图片描述

3.3.4 修改模块的波特率

同样,我们也可以设置模块的波特率:AT+BAUD<Param>,这里举个例子,如果想要设置模块的波特率为115200,可以发送:AT+BAUD8
在这里插入图片描述
最后在查看下目前的波特率:AT+BAUD。因为目前模块的波特率发生改变,我们需要实现修改下串口助手的相关配置。

在这里插入图片描述
有个小细节,这里给大家提及一下,你看咱们发送完AT+BAUD,串口助手记得设置为16进制显示。尾部的0x0d0x0a,根据ascii码表,可以得到0x0d代表的是回车,0x0a代表的是换行。

在这里插入图片描述

3.3.5 蓝牙配对密码查看

蓝牙配对密码查看:AT+PIN
在这里插入图片描述

3.3.6 修改蓝牙配对密码

修改蓝牙配对密码:AT+PIN8888
在这里插入图片描述
再次使用AT+PIN,查看设置是否成功。

在这里插入图片描述

3.3.7 广播名查询

广播名查询:AT+NAME
在这里插入图片描述

3.3.8 广播名修改

广播名修改:AT+NAMEJDY-31
在这里插入图片描述
再次使用AT+NAME,查看设置是否成功。
在这里插入图片描述

3.3.9 恢复出厂配置

恢复出厂配置:AT+DEFAULT,这个咱们就不运行了哈。

3.3.10 串口状态输出使能查询

串口状态输出使能查询:AT+ENLOG,默认输出1,说明打开串口状态输出。
在这里插入图片描述

3.3.11 串口状态输出使能设置

串口状态输出使能设置:AT+ENLOG<Param>,这里几个例子,比如打开串口状态输出使能,AT+ENLOG1。关闭串口状态输出使能,AT+ENLOG0
在这里插入图片描述

3.3.12 断开连接

断开连接:AT+DISC,这里返回的是+OK,目前模块还未连接,本身就处于断开状态。

在这里插入图片描述

3.3.13 查看蓝牙MAC地址

查看蓝牙MAC地址:AT+LADDR
在这里插入图片描述

4 程序编写

main.c文件。

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "oled.h"
#include "bmp.h"


int main(void)
{
	RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟
	GPIOC->CRH   &= (uint32_t)0xFF0FFFFF;//使用前清零
	GPIOC->CRH   |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHz
	//-------------------------------------------------------------------------//
	Delay_Init();//延时初始化
	//-------------------------------------------------------------------------//
	Usart_Init(115200);//串口初始化
	//-------------------------------------------------------------------------//
	OLED_Init_new();			//初始化OLED  
	OLED_Clear_new();
	OLED_ShowString_new(1, 1, "bluetooth:");
	//-------------------------------------------------------------------------//
    printf("AT+NAME\r\n");      //查询蓝牙名字
    Delay_ms(100);
    printf("AT+LADDR\r\n");     //查询mac地址
    Delay_ms(100);
    printf("AT+BAUD\r\n");      //查询波特率
    Delay_ms(100);
    printf("AT+PIN\r\n");       //查询蓝牙连接密码
    Delay_ms(100);
    printf("AT+ENLOG\r\n");     //查询状态输出使能状态
    Delay_ms(100);
    printf("AT+VERSION\r\n");   //查询版本
    Delay_ms(100);
	while(1)
	{ 		
		GPIOC->BSRR  =  (uint32_t)0x00002000;//PC13引脚输出高电平
		Delay_ms(1800);                       //延时1800ms		
		GPIOC->BRR  =   (uint16_t)0x2000;    //PC13引脚输出低电平
		Delay_ms(1800);                       //延时1800ms	
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

usart.c文件。

#include "stm32f10x.h"
#include "usart.h"	
#include "stdio.h"

int fputc(int ch,FILE *f)
{
	USART_SendData(USART1,(uint8_t)ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成
	return ch;
}

/**
 * @func	fputcc
 * @brief	发送一个字节数据到USARTx
			为Motion_Driver库提供串口打印接口
 * @param 			
	   @arg ch : 一字节数据
 * @retval	返回指定字节数据
 **/
int fputcc(int ch)
{
	/* 发送一个字节数据到USARTx */
	USART_SendData(USART1, (uint8_t) ch);
		
	/* 等待发送完毕 */
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);		
	
	return (ch);
}

void Usart_Init(uint32_t bound)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	USART_InitTypeDef  USART_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//打开USART1和GPIOA的时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;        //PA9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);  //初始化PA9引脚
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;        //PA10
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);  //初始化PA10引脚
	
	USART_InitStructure.USART_BaudRate = bound;  //串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
	USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送接收模式
	USART_Init(USART1,&USART_InitStructure); //初始化USART1
	
	//参考博客:https://blog.csdn.net/m0_63235356/article/details/135611700
	//---------------------------------------------------------------//
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //开启USART接收中断
	
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC中断配置
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
    NVIC_Init(&NVIC_InitStruct);
	//---------------------------------------------------------------//
	
	USART_Cmd(USART1,ENABLE);  //使能USART1
}


/**
 * @func	USART_SendChar
 * @brief	控制串口发送一个字符
 * @param 	
	   @arg chr : 要发送的字符
 * @retval	无
 **/
void USART_SendChar(uint8_t chr)
{
	/* 循环发送,直到发送完毕 */
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); 
	USART_SendData(USART1,chr);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84

usart.h文件。

#ifndef __USART_H
#define __USART_H

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

void Usart_Init(uint32_t bound);

int fputc(int ch,FILE *f);
int fputcc(int ch);
void USART_SendChar(uint8_t chr);
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

stm32f10x_it..h文件。

#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"

//中断函数
void USART1_IRQHandler(void)
{
    //判断数据接收标志位
    if(SET==USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){
        uint16_t data=USART_ReceiveData(USART1);            //读取出接收的数据
        printf("%c",data);
        USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);    //清除数据接收标志位
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

最终的效果如下图所示。
在这里插入图片描述

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

闽ICP备14008679号