完整资料和技术指导请看:
博客地址
昨天遇到这个问题,需要使用 手机蓝牙 与 单片机连接的蓝牙完成 通信控制。以点亮led 为目的进行测试开发。因为没有搞过蓝牙模块,又对这个东西不太自信。所以断断续续折腾了一整天。 最终还是 搞定了,所以 把整个过程梳理一下,也希望能帮助到大家,小白们,看过来吧。
开发器件: 蓝牙模块(HC-05)、最小系统板(晶振11.0592使用了9600的波特率)、单片机(STC89C52RC)、
USB转TTL烧录器、一些 杜邦线、 另加一个 蓝牙功能完好的手机或者平板+蓝牙串口软件(个人用的是蓝牙串口)
在测试的过程中 还使用到了一个Arduino的板子,但其实没有什么用。上边的 设备就够用了。
本文中 涉及到的所有测试软件、手机软件、开发工具、源代码,包括HEX文件,一些单片机小工具。我会统一 打包到 CSDN 下载库。
如果在开发的过 程中遇到什么问题,也欢迎交流,毕竟解决bug 才是进步的源泉。
废话不说,直接看成果。
如图所示,USB给单片机5V供电,下载器 的 VCC和GND 连接最小系统的VIN和GND。最小系统通过5V和GND连接蓝牙模块,TXD连接RXD,RXD连接TXD,完成与蓝牙模块的供电 和 串口通信连接。最小系统使用GND和P2.0与led连接,P2.0接led的正极。(ps:此处是低电平点亮led,如果需要高电平点亮led,可能需要连接vcc和P2.0)。
开启最小系统的开关,此时 HC-05的指示灯闪烁,打开手机的蓝牙 选择 连接设备,然后选择检测到的设备进行连接,连接成功,蓝牙模块 会 2s一闪,连闪两次。即可发送数据。发送0会点亮led,发送其他会熄灭 led。至于代码在 文末。
功能已经 实现了,现在 讲一下我的整个实现流程:
1.单独调试 蓝牙模块 HC-05 ,完成一些设置,设置主从站。
2.整个设备的硬件连接。
3.程序的解析 和 测试。
4.涉及到的一些知识,和学到的一些内容。
------------------------------------------------------------------------------
1.单独调试 蓝牙模块 HC-05 ,完成一些设置,设置主从站。
第一部分:
首先,连接,蓝牙HC-05通过USB转TTL的下载线,连接电脑。
在完成 硬件连接 之后,先不要上电,上电的同时,按着 蓝牙模块的HC- 05的一个按键(小黑点),上电完成之后,松开按键,指示灯会1s一闪。说明 模块进入 AT 指令模式。进入AT模式,可以通过串口发送AT指令 进行硬件的设置。
电脑端使用SSCOM42 的串口助手:选择合适的 Com口,选择38500,38500是蓝牙模块AT模式的可用波特率。
关于AT指令的内容在这里:
我个人只需要 几条命令就可以完成调试:(具体的说明请进入 上方链接查看)具体用到用不到,记不太清楚了。
AT+STATE:这个指令用来查询蓝牙模块当前的状态。
AT+INQM:设置或查询访问模式,格式如此。
AT+RESET:该指令顾名思义,是复位HC05蓝牙设备的,
AT+PSWD:这个指令时设置蓝牙模块的配对密码
AT+ROLE:该指令用于选择HC05蓝牙模块的角色,
AT+ROLE=0\r\n 将蓝牙模块设置成从角色,只能被动连接
AT+ROLE=1\r\n 将蓝牙模块设置成主角色,可以查询周围SPP蓝牙从设备,并发送连接
AT_UART:这个指令是设置串口的参数,
AT+UART=9600,0,0 此处一定设置成9600,因为是蓝牙模块的正常工作波特率,因为这个东西废了很多时间。
正常 情况下发送如下指令:
AT+ROLE=0
AT+PSWD=1234
AT+UART=9600,0,0
AT+STATE 返回 +STATE:INITIALIZED OK ====》说明处于初始化状态,是正常情况,完成设置就能断电了
主要就是设置主从站,密码,波特率。就算是完成了,通过SSCOM42设置 成功,会返回 OK。具体的细节去参考上边的博客。
功能测试:通过AT完成设置之后,蓝牙模块就可以使用了,断电,再上电,蓝牙模块的指示灯会闪烁,此时通过手机搜索蓝牙,可以搜索到蓝牙模块,通过1234密码连接,此时蓝牙模块的指示灯会 2s一闪烁,每次闪烁 2次,说明连接成功。
此时 可以通过手机蓝牙发送 数据到 蓝牙模块,并通过电脑端的 SSCOM42或者其他的串口助手查看到 接收的信息。 需要关闭串口,设置波特率9600,再打开串口,因为 蓝牙模块的 AT模式下 波特率是 38500,在正常工作模式下是 9600。
------------------------------------------------------------------------------
2.整个设备的硬件连接。
硬件的连接如图所示,我觉得比较清楚了,就不写什么说明了,注意串口通信 是 TXD接RXD ,RXD接TXD,就够用了。
手机端的软件:就不打包了,我是从 360商店下载的,用的是左边的蓝牙串口软件。
------------------------------------------------------------------------------
3.程序的解析 和 测试。
普通 点亮 led闪烁 的程序:
#include
#include
#define uchar unsigned char
sbit led = P2^0;
void delay50ms();
void main()
{
led = 0;
while(1)
{
led = ~led;
delay50ms();
}
}
void delay50ms(void) //误差 0us
{
unsigned char a,b;
for(b=173;b>0;b--)
for(a=143;a>0;a--);
}
串口通信中 点亮led的程序:真的不想贴 源代码,想挣个积分的,但是又不想折磨你们,还是给你们吧,然后
//**** 声明 ********************************************************************
/*******************************************************************************
* 下面来自互联开源程序,由广州汇承信息科技有限公司收集
* 方便用户参考学习,本公司不提供任何技术支持
* 程序仅供测试参考,不能应用在实际工程中,不一定能通过编译
* 公司网站 http://www.hc01.com/
* 淘宝网址 http://hc-com.taobao.com/
*******************************************************************************/
/*-----------------------------------------------------------------------------
* 实 验 名 : RS232串口试验
* 实验说明 : 单片机串口接收数据控制灯亮灭
* 连接方式 :
* 注 意 : 该试验使用的晶振是11.0592
*******************************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar PuZh[36] = "广州汇承信息科技有限公司www.hc01.com";
//--定义使用的IO--//
sbit LED=P2^0;
//--声明全局函数--//
void UsartConfiguration();
void Delay_1ms(uint i);
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
uchar i;
uchar receive_data;
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
RI = 0;
receive_data = SBUF;//接收到的数据
if(receive_data == '1')
{
LED = 0;//接收到1亮灯
}
else
{
LED = 1; //其他情况灯灭
}
}
for(i=0; i<36; i++)
{
SBUF = PuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
EA = 1;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
UsartConfiguration();//初始化串口
while(1);
}
/*******************************************************************************
* 函 数 名 : UsartConfiguration()
* 函数功能 : 设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1,8位数据,可变波特率
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //波特率不加倍
TH1=0XFd; //计数器初始值设置,[email protected]
TL1=0XFd;
TR1=1; //打开计数器
ES = 1; //开串口中断
EA = 1; //开总中断
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j
恩,就这些。
------------------------------------------------------------------------------
4.涉及到的一些知识,和学到的一些内容。
在学习的过程中,了解了 JATG 烧录线 和 串口烧录的区别,以及 JATG不能烧录STC89C52的芯片。
了解了EA为什么接VCC,以及关于 中断的 一些内容。
了解了低电平 点亮 led 和 高电平点亮led 的区别。
认识到了波特率的重要性,因为波特率的问题,整整折腾了一天。
------------------------------------------------------------------------------
(如果真的有积分,希望你们能下载)涉及到的所有资料:https://download.csdn.net/download/ca1m0921/10454017
有什么 问题欢迎交流。