HC05的AT操作
简介
关于HC05的AT模式网上在使用时,大多是用USB转TTL转接口进行操作的。
因为我在使用HC05时没有买转接口,而又怕等快递时等太久;于是便想用单片机直接进入AT模式,虽然其中有不少波折,也查过不少资料,现在终于算是搞懂了一点。
于是写在这里,给像我一样刚刚入门单片机的小白们,避免走弯路。
先来看看HC05:
HC05的正面,有个小按钮
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
来看看具体操作
1.连接好四根线后,需将HC05上的按钮按住并同时上电,这样才能进入AT模式,指示灯变为慢闪状态;将串口助手打开,只是使用串口助手,不能烧能任何程序
串口助手的截图;注意指令要换行。
2.烧录程序时要拔掉蓝牙MCU引针上的HC05,因为此时电脑与MCU通讯,插上会干扰程序烧录。
3.使用时,连接上后,调用手机蓝牙,连接上后,HC05的指示灯会变成双闪状态。(未连接时单闪,快闪状态)
最后,附上串口收发的函数,我把它封装成了一个.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) //4800bps@12.000MHz
@函数功能 : 串口及中断初始化
@输 入 : 无
@输 出 : 无
@说 明 : 上键就需初始化
*******************************************************************************/
void UARTInit(void) //4800bps@12.000MHz
{
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;
}
}
因为是第一次写博客,有些不太对的地方希望大家能指出来,并多多包涵。