原理(如下图)
1、该模块与单片机采用串口通信,手机连接蓝牙模块,通过无线信号发送数据给蓝牙模块,蓝牙模块收到数据后会把数据通过**串口(USART)**发送给单片机,单片机收到数据(SUBF)以后,就可以对数据进行处理,解析,从而完成单片机对外设的控制。这里注意手机端发送的一般是16进制数据(HEX),或者也可以设置为发送ASCLL格式的数据。
2、此实验需要把蓝牙模块配置为从机模式,若模块出厂默认就是从机模式,就不需要配置了,(如果不知道默认是什么模式,可以查芯片手册或询问客服),如果是主从一体的模块,可用AT指令配置成为从机模式就可以了。以HC-05主从一体机为例,在出厂设定的就是从机模式(主机发送数据,从机接受数据)
如何进入AT模式:
HC-05与HC-06不同,HC-06没有连接上时,就是AT模式,而HC-05需要有个开关,注意到模块上的小黑点没有,不按的时候是可配对状态,1秒闪2次。按它再上电就使HC-05进入AT模式了,严格的讲,它只是一个开的作用,无法退出AT模式。(退出的话可以在串口发送AT+RESET复位,或者重新上电)此时指示灯慢闪(2秒亮一次),模块进入AT状态。
线路连接图:
HC-05引脚说明
1. RXD: 接收端
2. TXD: 发送端
3. VCC: 模块供电正极(3.6V~6V)
4. GND: 模块供电负极
5. EN: 用于进入AT模式,高电平有效(默认悬空低电平)(模块上的小黑点就是配置这个引脚的)
6. STATE:配对状态输出:配对成功输出高电平,未配对输出低电平
LED与KEY与HC-05不一致。可以忽略,只看连线就行
AT指令配置说明:
这这里以STC官方烧录器为例,也是有串口助手功能的。不必多余下载:
常用的AT指令:
AT 测试指令
AT+ADDR? 读取蓝牙模块的地址
AT+NAME="XXX" 修改蓝牙模块名称为XXX
AT+ROLE=0 蓝牙模式为从模式
AT+CMODE=1 蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接
AT+PSWD=1234 蓝牙配对密码为1234
AT+UART=9600,0,0 蓝牙通信串口波特率为9600,停止位1位,无校验位
AT+UART? 读取读取蓝牙模块的波特率
AT+RESET 复位指令 //指令与大小写均无关
at数据的发送格式是需要在指令后接回车换行的,如果按下回车后发送指令无效,那么可以在指令后加上:\r\n ,例如:AT\r\n,再次发送。
只跟手机进行配对的话,这些指令就足够了。可以发现,同样的指令后接‘=’就是修改,后接‘?’就是读取。
串口助手的配置:
文本模式进行发送(如果记不起来,想想HEX是没有字母T的是吧,否则咋发送AT指令呢)
还有一点需要注意的是,模块的波特率不一定是38400或者9600,部分可能存在问题的模块,需要我们自己去测,调试,有的模块甚至是115200都有。
AT+UART?
AT+UART=9600,0,0 //蓝牙通信串口波特率为9600,停止位1位,无校验位
而且有的时候如果发送数据蓝牙没有应答,可以尝试清空接收区,发送区。关闭打开串口,或者将USB与电脑重新连接。我当时买的那个主从一体的HC-05模块就是的,感觉反应迟钝,发送了过一会才能返回。每发送一次就需要清空等等,还是得多调试几次,或者更换串口调试软件。如果实在不行,不排除模块有质量问题的可能。
与此同时用电脑检测手机与模块之间的通讯情况时,一般从手机发过来的是HEX数据,然后将串口调至刚刚用AT指令 AT+UART? 查的波特率,如果波特率不调可能收不到数据,HEX模式不调可能出现的数据不是发送的数据,或者乱码。当然,手机发送的是字母类型的数据(手机上的蓝牙串口助手有一个选项的)电脑端依旧用文本模式进行收取。
总体架构图:
源码:
主函数
舵机的信号线接单片机P3^7。蓝牙与单片机的TX,RX交错连接
/*
Ä£Äâ¶æ»ú¿ØÖÆÔÀí£º0~180¡ã
0.5ms-----0¶È
1.0ms-----45¶È
1.5ms-----90¶È
2.0ms-----135¶È
2.5ms-----180¶È
*/
#include <REGX52.H>
#include "timer0.h"
#include "Uart.h"
sbit SG_PWM=P3^7; //ÐźſØÖÆÒý½Å
unsigned char count=0; //¼Æ´Î ¸³³õֵΪ0
unsigned char PWM_count=0; //0--0¶È£¬2--45¶È£¬4--90¶È£¬6--135¶È£¬8--180¶È
void main()
{
Timer0_Init();
Uart_Init();
while(1)
{
}
}
void Timer0() interrupt 1 //Ìرð×¢Òâ´Ë´¦£¬0--ÍⲿÖжÏ0£¬1--¶¨Ê±Æ÷ÖжÏ0£¬2--ÍⲿÖжÏ1£¬3--¶¨Ê±Æ÷ÖжÏ1£¬4--´®ÐпÚÖжÏ1
{
TL0 = 0x33;
TH0 = 0xFE; //ÖØи³¼ÆÊý³õֵΪ0.5ms
count++; //¼Æ´Î£¬Ã¿500us count+1
count%=40; //ÖÜÆÚΪ20ms
if(count<PWM_count)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
void UART_Routine() interrupt 4 //´®¿ÚÖжϷþÎñº¯Êý
{
if(RI==1) //Èç¹û½ÓÊÕÖжϱê־λΪ1
{
P1=SBUF; //·¢Ë͵ÄÊý¾ÝSBUF£¬¸³¸øP1
if(P1==0X01) //0x01Õâ¸öÖµ¿ÉÒÔͨ¹ýÀ¶ÑÀµ÷ÊÔÆ÷±à¼Ä£Ê½ÉèÖÃ
{ //ͬÑùµÄ£¬ÏÂÃæµÄ0X02,0X03,0X04,,,Ò²ÊÇ¿ÉÒÔͨ¹ýÀ¶ÑÀµ÷ÊÔÆ÷±à¼Ä£Ê½ÉèÖÃ
PWM_count=1;
}
if(P1==0X02)
{
PWM_count=2;
}
if(P1==0X03)
{
PWM_count=3;
}
if(P1==0X04)
{
PWM_count=4;
}
if(P1==0X05)
{
PWM_count=5;
}
RI=0; //½ÓÊÕÖжϱê־λÈí¼þÇåÁã
}
}
串口初始化:
#include <REGX52.H>
void Uart_Init() //9600bps@11.0592MHz
{
PCON |= 0x80; //ʹÄܲ¨ÌØÂʼӱ¶
SCON = 0x50; //½ÓÊÕ8λÊý¾Ý
TMOD &= 0x0F; //Çå³ý¶¨Ê±Æ÷1ģʽ
TMOD |= 0x20; //É趨¶¨Ê±Æ÷8Ϊ×Ô¶¯
TL1 = 0xFA; //É趨³õʼֵ
TH1 = 0xFA; //É趨³õʼֵ
ET1 = 0;
TR1 = 1;
EA = 1;
ES =1 ;
}
定时器0初始化:
#include <REGX52.H>
void Timer0_Init()
{
TMOD &= 0xF0; //ÉèÖö¨Ê±Æ÷ģʽ
TMOD |= 0x01; //ÉèÖö¨Ê±Æ÷ģʽ
TL0 = 0x33; //ÉèÖö¨Ê±³õʼֵ
TH0 = 0xFE; //ÉèÖö¨Ê±³õʼֵ
ET0 = 1; //´ò¿ª¶¨Ê±Æ÷0µÄÖжÏ
TF0 = 0; //Çå³ýÒç³öÖжϱê־λ
TR0 = 1; //¶¨Ê±Æ÷0¿ªÊ¼¼Æʱ
EA = 1; //¿ª×ÜÖжÏ
}
总结/大致步骤:
1,用上位机(USB->TTL)将蓝牙模块(预先调至AT指令模式)与电脑USB连接,打开电脑上的串口助手调节通讯波特率与发送方式,按照AT指令集修改蓝牙模块的配置参数
2,把单片机和蓝牙模块对应的引脚用导线连接好,下载好程序,给单片机上电(TX->RX,RX->TX)
3,在手机上搜到蓝牙模块的名称,输入自己设置好的密码,连接后发送指令。
4,在连接单片机之前,依旧可以先用上位机(USB->TTL)将蓝牙模块与电脑USB连接,但是此时蓝牙模块不必调至AT模式,手机连接上以后直接发送数据,在电脑的接受端口如果可以接受到,那么说明配置成功了,下一步连接到单片机上也不迟。
注:手机上一般下载一个蓝牙调试助手,可以向单片机发送数据就行。部分软件有编辑按钮的设置,就是可以自定义某一个按钮发送一个事先定义好的HEX/ASCLL数据