【硬件】蓝牙模块HC05初使用

【硬件】蓝牙模块HC05初使用

蓝牙控制点亮Led灯

在大学的时候,遇到这个问题,需要使用 手机蓝牙 与 单片机连接的蓝牙完成 通信控制。以点亮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指令的内容在这里:

ATK-HC05蓝牙模块介绍: 

 https://blog.csdn.net/u011318735/article/details/17429879

只需要 几条命令就可以完成调试。(具体的说明请进入 上方链接查看)

 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<reg52.h>
#include<intrins.h>
#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的程序:

/*------------------------------------------------------------------
* 实 验 名     : RS232串口试验
* 实验说明     : 单片机串口接收数据控制灯亮灭
* 连接方式     : 
* 注    意     : 该试验使用的晶振是11.0592
********************************************************************/
#include<reg52.h>
#include<intrins.h>

#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;	//计数器初始值设置,9600@11.0592MHz
	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<i;j++)
    for(x=0;x<=148;x++);
}

恩,就这些。

——————————————————————————

4.涉及到的一些知识,和学到的一些内容。

   在学习的过程中,了解了 JATG 烧录线 和 串口烧录的区别,以及 JATG不能烧录STC89C52的芯片。

   了解了EA为什么接VCC,以及关于 中断的 一些内容。

   了解了低电平 点亮 led 和 高电平点亮led 的区别。

   认识到了波特率的重要性,因为波特率的问题,整整折腾了一天。


0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments