一、注意事项
1、烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响。
2、执行HC05集命令时,均以rn结尾。串口中断若选择“发送新行”时,不用添加rn。原理相同。
二、准备软硬件
1、硬件:单片机STC89C52RC开发板,蓝牙模块HC05
2、软件:串口工具SSCOM3.3,手机蓝牙客户端
三、蓝牙模块HC05端口定义(6引脚)
state——蓝牙连接状态,未连接输出低,连接后输出高
TX——信号发
RX——信号收
GND——地
+5V
EN——使能端,需要进入AT模式时接3.3V,接单片机i/o引脚即可,高电平
四、进入AT模式进行参数和状态的设置
两种工作模式:命令响应工作模式和自动连接工作模式
命令响应工作模式(AT模式)
state——接任意单片机i/o
rx——接usb转串口的tx端,P3^0
tx——接usb转串口的rx端,P3^1
gnd——接地
5v——接5V电
en——接任意单片机i/o,高电平
1、需要接通en,并给高电平
2、通信线路:电脑-->usb转串口-->hc05蓝牙模块(电脑与蓝牙模块间进行串口传输)
3、按住蓝牙模块的key键不松,单片机开发板上电,蓝牙模块指示灯进入慢闪状态,说明进入AT模式
4、通过电脑串口工具可以设置蓝牙的工作参数与状态
5、执行电脑串口工具SSCOM3.3,设置比特率38400,8位数据,1位停止位
6、发送测试指令ATrn,如果返回OK表示通信正常。
7、可以执行自己所需的命令了。
8、发送恢复默认状态指令AT+ORGLrn,如果返回OK表示设置成功。
出厂默认状态:
①.设备类:0
②.查询码:0x009e8b33
③.模块工作角色:Slave Mode
④.连接模式:指定专用蓝牙设备连接模式
⑤.串口参数:波特率—38400bits/s;停止位:1位;校验位:无
⑥.配对码:“1234”
⑦.设备名称:“H-C-2010-06-01”
..
9、设置波特率9600与单片机串口匹配,1停止位,0校验位
· 执行AT+UART=9600,1,0rn。返回OK
10、查看UART状态是否更改成功,执行AT+UART?,返回+UART:9600,1,0 OK
11、参数状态设置完毕,可断电,准备进入工作模式
五、进入自动连接工作模式进行蓝牙匹配
state——接任意单片机i/o
rx——接单片机的tx端,P3^1,与命令相应模式相反
tx——接单片机的rx端,P3^0
gnd——接地
5v——接5V电
en——可不接
1、不需要接通en
2、通信线路:手机蓝牙控制端-->hc05蓝牙模块-->单片机
3、单片机开发板上电,蓝牙模块指示灯进入快闪状态,说明进入自动连接工作模式
4、手机开蓝牙,即可搜到蓝牙模块,连接
5、打开手机端蓝牙串口工具,连接成功,蓝牙模块指示灯进入双闪状态
6、至此连接成功,准备发送数据
#include void main(void) { while(1); } 设置参数状态,匹配测试用上述几行代码即可。 五、利用蓝牙向单片机发送数据 1、通信线路:手机蓝牙控制端输出字符‘0’-->hc05蓝牙模块-->单片机接收字符‘0’(单片机与蓝牙模块间进行串口传输)-->单片机控制灯1亮 2、通信线路:手机蓝牙控制端输出字符‘1’-->hc05蓝牙模块-->单片机接收字符‘1’(单片机与蓝牙模块间进行串口传输)-->单片机控制灯2亮 3、通信线路:手机蓝牙控制端输出其它字符-->hc05蓝牙模块-->单片机接收该字符(单片机与蓝牙模块间进行串口传输)-->单片机控制灯3亮 4、该程序源码 #include typedef unsigned char u8; typedef unsigned int u16; u8 r_buf; //蓝牙接收到的字符存储缓冲区 sbit led1 = P1^0; //灯1,当接收字符0时,灯1亮 sbit led2 = P1^1; //灯2,当接收字符1时,灯2亮 sbit led3 = P1^2; //灯2,当接收其它字符时,灯3亮 sbit led4 = P1^3; //蓝牙连接状态灯,当蓝牙连通时,灯4亮 sbit state = P3^6; //蓝牙连通的状态标志位 void delay(u16 z) //延迟函数 { u16 x,y; for(x=z;x>0;x--) for(y=125;y>0;y--); } void InitUART() //串口初始化9600 { //初始化串口定时器9600 TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; ES = 1; EA = 1; } void SendOneByte(unsigned char c) //发送字符函数 { SBUF = c; while(!TI); TI = 0; } void main(void) { InitUART(); led1 = 1; led2 = 1; led3 = 1; led4 = 1; r_buf = '2'; while(1) { if(state == 1)//蓝牙连通状态判断 { led4 = 0; //如果蓝牙匹配成功,灯4亮 } else { led4 = 1; //如果蓝牙匹配不成功,灯4不亮 } } } void UARTInterrupt(void) interrupt 4 //串口接收字符 { if(RI) { RI = 0; //add your code here! r_buf = SBUF; if(r_buf == '0')//如果为字符‘0’,灯1亮 { led1 = 0; delay(1000); led1 = 1; } if(r_buf == '1')//如果为字符‘1’,灯2亮 { led2 = 0; delay(1000); led2 = 1; } else //如果为其它字符,灯3亮 { led3 = 0; delay(1000); led3 = 1; } SendOneByte(r_buf);//回发该字符 } }