关于用单片机操作HC05进入AT模式的小总结

HC05的AT操作

简介

关于HC05的AT模式网上在使用时,大多是用USB转TTL转接口进行操作的。
因为我在使用HC05时没有买转接口,而又怕等快递时等太久;于是便想用单片机直接进入AT模式,虽然其中有不少波折,也查过不少资料,现在终于算是搞懂了一点。
于是写在这里,给像我一样刚刚入门单片机的小白们,避免走弯路。
先来看看HC05:关于用单片机操作HC05进入AT模式的小总结_第1张图片
HC05的正面,有个小按钮
关于用单片机操作HC05进入AT模式的小总结_第2张图片
HC05的背面,有六根引脚,但常用的只有TX,RX,GND,VCC(5V+)这四个。
我是用51的学习板在做蓝牙播放器的时候,才用到HC05这个模块的,所以是用51单片机进入AT模式。

使用

几个重点:
1.HC05使用的UART串口通讯的方式进行通讯,所以在通讯时,两个设备必然是RX接TX,TX接RX(无论是AT模式还是使用时,但要认清楚是与哪个设备通讯)
2.AT模式的部分指令如下:(切记每个指令后要换行)

指令 功能 回复
AT 询问进入AT模式 OK
AT+NAME? 询问设备名称 有些没有名称回复(我的就是)
AT+UART? 询问波特率参数 OK+UART:9600,0,0(波特率,间隔位,停止位)
AT+PSWD? 询问蓝牙配对密码 OK+PSWD:1234
AT+NAME=Sheep 将蓝牙名称设为Sheep OK
AT+UART=4800,0,0 将蓝牙参数设为波特率4800,无校验位,无停止位 OK
AT+PSWD=0000 将蓝牙密码设为0000 OK

3.HC05默认的通讯波特率是9600;但默认进入AT模式的波特率是38400

4.因为AT模式是要与电脑的串口助手进行通讯,所以AT模式时,蓝牙的TX应接单片机上USB转TTL接口的RX,RX应接转接口TX,(也就是图中红框内的TXD和RXD)而转接口的引脚被引出与MCU出的引脚相接,即AT模式时,蓝牙TX接P3.1,蓝牙RX接P3.0
同理,烧录完程序后,进行串口通讯时,蓝牙应与MCU进行通讯,图中的蓝框内RXD,TXD;使用时,蓝牙TX接P3.0,蓝牙RX接P3.1
关于用单片机操作HC05进入AT模式的小总结_第3张图片

来看看具体操作

1.连接好四根线后,需将HC05上的按钮按住并同时上电,这样才能进入AT模式,指示灯变为慢闪状态;将串口助手打开,只是使用串口助手,不能烧能任何程序
关于用单片机操作HC05进入AT模式的小总结_第4张图片
串口助手的截图;注意指令要换行
关于用单片机操作HC05进入AT模式的小总结_第5张图片
2.烧录程序时要拔掉蓝牙MCU引针上的HC05,因为此时电脑与MCU通讯,插上会干扰程序烧录。
3.使用时,连接上后,调用手机蓝牙,连接上后,HC05的指示灯会变成双闪状态。(未连接时单闪,快闪状态)
关于用单片机操作HC05进入AT模式的小总结_第6张图片
最后,附上串口收发的函数,我把它封装成了一个.c文件,使用时,include头文件就可以在主函数中使用了。
下面是串口的头文件

主要是条件编译和函数的声明
#ifndef __UART_H__
#define __UART_H__

#ifndef __u8_H__
#define __u8_H__
typedef unsigned char u8;
#endif

#ifndef __u16_H__
#define __u16_H__
typedef unsigned int u16;
#endif

void UARTInit(void);
void UART_sendByte(u8 Byte);
u8 Read_SBUF();
u8 UART_CF();

#endif

下面是 串口的.c文件

这些收发串口数据的函数,直接在主函数中调用就可以对数据进行处理了。
#include <REGX52.H>
#include "UART.h"
static u8 agency;
static u8 UART_Change;
/*******************************************************************************
 @函 数 名         : void UARTInit(void)		//[email protected]
 @函数功能				 : 串口及中断初始化
 @输    入         : 无
 @输    出         : 无
 @说    明         : 上键就需初始化
*******************************************************************************/
void UARTInit(void)		//[email protected]
{
	PCON |= 0x80;	//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率,可接收数据
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;		//启动串口中断
	EA=1;		//中断总开关打开
}

/*******************************************************************************
 @函 数 名         : UART_sendByte(u8 Byte)
 @函数功能				 : 向发送缓存写入一字节数据
 @输    入         : unsigned char 的一字节数据
 @输    出         : 无
 @说    明         : 无
*******************************************************************************/
void UART_sendByte(u8 Byte)
{
	SBUF=Byte;//将出数据(1Byte)写入发出缓存;
	while(TI==0);//检测数据是否发出,未发出为0,使其一直空循环;
	TI=0;//软件将TI口置0;
}

/*******************************************************************************
 @函 数 名         : void Read_SBUF()
 @函数功能				 : 在主函数中将SBUF的值读出
 @输    入         : 无
 @输    出         : u8 SBUF的值
 @说    明         : 无
*******************************************************************************/
u8 Read_SBUF()
{
	return agency;
}

/*******************************************************************************
 @函 数 名         : u8 UART_CF()
 @函数功能				 : 在主函数中检测串口是否有信息进入
 @输    入         : 无
 @输    出         : 在主函数中调用,检测串口是否有消息传入
 @说    明         : 有数据从串口传入,CF(changeflag)为1;否则为0;
*******************************************************************************/
u8 UART_CF()
{
	u8 ret;
	if(UART_Change){ret=1;UART_Change=0;}
	return ret;
}

/*串口中断例行函数*/
void UART_routine() interrupt 4//串口中断序号为4
{
	if(RI==1)
		{
			agency=SBUF;//接受数据直接赋给P2
			UART_Change=1;
			RI=0;//将RI接受中断归零
			UART_sendByte(agency);//将接受数据重新发出;
		}
}

下面是一个 对数据简单调用的主函数

主要功能是发一个数据(0x55)出去;
还有将串口收到的数据赋值给P2口用于控制八个LED的亮灭。
#include <REGX52.H>
#include "UART.h"
u8 agency;
void main()
{
	
	UARTInit();	
	UART_sendByte(0x55);
	while(1)
	{
		if(UART_CF()){agency=Read_SBUF();}
		P2=agency;
	}

}

因为是第一次写博客,有些不太对的地方希望大家能指出来,并多多包涵。

你可能感兴趣的:(51单片机,HC05,单片机,串口通信)