写在前面:
蓝牙串口模块在我们日常的嵌入式开发板的学习中可以说是经常使用,今天我们学习如何使用蓝牙串口模块,并利用其进行简单的操作。以便大家对于蓝牙模块用于基本的认识以及基本的使用。
实验现象视频在文末!!
实现功能:
1、通过蓝牙模块建立手机同电脑进行数据的交换;
2、通过蓝牙模块建立手机同单片机的数据交换,将单片机的温度传感器传感数值通过蓝牙传至手机。
实验源码即现象视频
链接:https://pan.baidu.com/s/1PswxBuydhh8gWiVSMg_Dcw
提取码:1022
目录
一、HC-08蓝牙模块介绍
1.1基本介绍
蓝牙模块,是一种集成的蓝牙功能的PCB板,用于短距离无线通信,按照功能分为蓝牙数据模块和蓝牙语音模块,是集成蓝牙功能的芯片和基本电路的集合,用于无线网络通讯。
HC-08蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM,调制方式是 GFSK。模块最大发射功率为 4dBm, 接收灵敏度-93dBm,空旷环境下和 iphone4s 可以实现 80 米超远距离通信。
本次我采用的蓝牙模块为HC-08产品,常见的还有HC-02、05、06等等系列;模块的实物图如下图所示:
产品带底板焊排针,引出6个引脚,可直接同单片机的串口进行连接,待匹配成功后,即可当成一堆串口穿透数据。
产品的参数:
1、引脚
EN(KEY)、VCC、GND、RXD、TXD、STATE共6个引脚,,STATE是蓝牙状态引出引脚,未连接时输出低电平。连接时输出高电平,EN相当于KEY引脚,可消除主机配对记忆。这两个引脚我们不必关注,按照要求连接好其余4个引脚即可。
2、电压说明
输入电压为3.2-6V,电源自带防止反接功能,但是反接不能工作;
3、状态指示
模块上有状态指示灯,配对前,主机未记录从机地址,每秒亮100ms;主机记录从机地址,每秒亮900ms;配对后,主机灯与从机灯都常亮。
4、接口电平
数据的输入输出接口RXD、TXD为3.2-6V TTL电平,可以同单片机直接连接。
5、通信距离
空旷环境下,通信距离可达80m;
6、通信格式
配对成功后,可以作为全双共串口使用,无需了解蓝牙协议,但只支持8位数据位,1位停止位,无校验位的通信格式,校验位可以更改。
7、默认值
波特率9600,蓝牙名HC-08。
1.2连接方式
串口通信的相关知识,请看我之前的博客:
我们前面讲过蓝牙通信方式为串口通信,首先单个模块同串口的连线方式如下图:
实物连线方式为:
同串口助手连接
如果同单片机的串口相连,只要按照上图的连线方式,找到其对应的引脚连接即可。单片机的RXD为P3.0引脚,TXD为P3.1引脚。
1.3模块连接
当蓝牙模块同串口连接后,若串口为单片机的串口,则单片机便有了蓝牙功能,若跟串口助手在电脑上,则电脑就有了蓝牙功能。当电脑、单片机等设备有了蓝牙功能后,便可以同其他用于蓝牙功能的设备进行通信。如下图所示:
两个单片机同经过蓝牙通信
单片机同手机经过蓝牙通信
当然还有电脑同手机经过蓝牙通信。
二、硬件设计
2.1硬件介绍
本次涉及的硬件部分主要有:
1、51单片机;
2、HC-08模块;
3、串口模块;
4、电脑;
5、手机;
其中:电脑端的串口助手为:COM-HC;
手机端的串口助手为:小程序HCBLE串口助手
2.2工作流程
流程1:
通过蓝牙模块建立手机同电脑进行数据的交换;
流程2:
通过蓝牙模块建立手机同单片机的数据交换,将单片机的温度传感器传感数值通过蓝牙传至手机。
三、软件设计
3.1电脑-手机通信
将串口模块同蓝牙模块连接到电脑上,并完成同手机端蓝牙的配对。灯常亮表示蓝牙配对成功。
先由电脑向手机发送“蓝牙模块”字符,再由手机向电脑发送“666、哈哈哈”;
蓝牙视频1
3.2单片机-手机通信
程序源码:
main.c
#include <REGX52.H>//包含相关头文件
#include "DS18B20.h"
#include "uart.h"
#include "delay.h"
float t;//定义温度变量
void main()
{
UART_Init();//串口初始化
while(1)
{
DS18B20_ConverT();//温度测试
t =DS18B20_ReadT();//温度数值
UART_SendByte(t);//将数值通过串口进行发送
Delay100ms(10);
}
}
uart.c
#include <REGX52.H>
/**
*@breaf 串口初始化
*@param 无
*@retval 无
*/
void UART_Init(void)
{
TMOD =0X20;//设置定时器的工作方式:设置使用定时器1,工作方式为方式1;
SCON=0X50;//设置串口工作方式:设置为工作方式1;打开接受ren=1;
PCON =0X80;//设置电源控制寄存器,波特率加倍;
//计算波特率,设置定时计数器的初值
TH1= 0xfa;
TL1= 0xfa;
//是否使用中断,如若使用,则打开中断配置;
EA=1;//打开中断总开关;
ES=1;//启动串口中断;
ET1=0;//关闭定时器1的中断
TR1=1;//打开计数器;TCON寄存器
}
/**
*@breaf 串口发送一个字节数据函数
*@param byte 传送的一个字节
*@retval 无
*/
void UART_SendByte(unsigned char byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
DS18B20.c
#include <REGX52.H>
#include "one_wire.h"
void DS18B20_ConverT()
{
OneWire_Init();
OneWire_SendByte(0xcc);
OneWire_SendByte(0x44);
}
float DS18B20_ReadT()
{
unsigned char TLSB,TMSB;
int Temp;
float T;
OneWire_Init();
OneWire_SendByte(0xcc);
OneWire_SendByte(0xBE);
TLSB =OneWire_ReceiveByte();
TMSB=OneWire_ReceiveByte();
Temp=(TMSB<<8)|TLSB;
T=Temp/16.0;
return T;
}
onewire.c
#include <REGX52.H>
//定义端口
sbit OneWire_IO=P3^7;
/**
*@breaf 单总线初始化函数
*@param 无
*@retval ACK 从机响应主机
*/
unsigned char OneWire_Init()
{
unsigned char i;
unsigned char ACK;
OneWire_IO=1;
OneWire_IO=0;//主机将总线拉低:至少480us;用来产生复位脉冲;
i = 227;while (--i);//延时500us;
OneWire_IO=1;//主机释放总线;外部上拉电阻将单总线拉高;
i = 20;while (--i);//延时50us;
ACK=OneWire_IO;//从机对主机的响应;
i = 227;while (--i);//延时500us;
return ACK;
}
/**
*@breaf 单总线发送一位数据
*@param Bit发送的数据
*@retval 无
*/
void OneWire_Sendbit(unsigned char Bit)
{
unsigned char i;
OneWire_IO=0;
i = 3;while (--i);// 延迟10us;
OneWire_IO= Bit;
i = 22;while (--i);// 延迟50us;
OneWire_IO=1;
}
/**
*@breaf 单总线接收一位数据
*@param 无
*@retval Bit总线接受到的数据
*/
unsigned char OneWire_ReceiveBit()
{
unsigned char Bit;
unsigned char i;
OneWire_IO=0; //主机拉低总线;
i = 2;while (--i);//延迟5us;
OneWire_IO=1;//主机释放总线;
i = 2;while (--i);//延迟5us;
Bit=OneWire_IO;//主机读取总线的值;
i = 22;while (--i);// 延迟50us;
return Bit;
}
/**
*@breaf 单总线发送一个字节数据
*@param Byte发送的数据
*@retval 无
*/
void OneWire_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
OneWire_Sendbit(Byte&(0x01<<i));//依次将一个字节的每一位发送给内部;低位在前,高位在后;
}
}
/**
*@breaf 单总线接收一个字节的数据
*@param 无
*@retval Byte接收到的数据
*/
unsigned char OneWire_ReceiveByte()
{
unsigned char Byte=0x00;
unsigned char i;
for(i=0;i<8;i++)
{
if(OneWire_ReceiveBit()) {Byte|=(0x01<<i);}
}
return Byte;
}
代码中涉及到的温度传感器、串口通信知识请看我之前的相关博客;
实验现象:
单片机与手机
由于传输的数据是以16进制进行传送,所以收到的为1a;
十六进制:1a=十进制:26;
十六进制:1b=十进制:27;
总结:本节我们学习了蓝牙HC-08模块,通过模块实现了电脑同手机、单片机同手机的通信,介绍了模块的使用以及基本的参数,实现了一些小项目。最重要的是通信方式是串口通信,所以大家一定要看看我之前的博客。最后一定是要自己动手做一做,熟能生巧。
创作不易,还请大家多多点赞支持!!!