当前位置:文档之家› 蓝牙模块学习笔记(1)

蓝牙模块学习笔记(1)

蓝牙模块学习笔记(1)蓝牙模块学习刚拿到蓝牙模块,心中有点小激动啊;民用级:HC-05,HC-06(HC-06-M,HC-06-S)HC-05-D,HC-06-D(是带底板的模块,主要是用户用于测试和评估)本文介绍的为HC-06蓝牙串口模块。

蓝牙串口模块用于把串口转换为蓝牙,这种模块工作的时候分为主机和从机,其中偶数命名的型号出厂时就确定了是从机或者是主机,并无法更改。

奇数命名的型号可以用户自己通过AT指令修改模块为主机或者从机。

主机:HC-06-M , M=master从机:HC-06-S , S = slaver串口模块的使用,是不需要驱动的,只要是串口就可以接入,配对完毕即可通信,模块与模块的通信需要至少 2 个条件:1、必须是主机与从机之间2、必须密码一致(密码:1234)主机:记忆最后一次配对过的从机,并只与该从机配对,直到KEY(26 脚)高电平触发时放弃记忆,26 脚默认应该接低电平。

配对方式:主机自动搜索从设备进行配对。

典型方式:在一定条件下,主从之间自动配对AT 模式:配对前就是AT 模式,配对完毕后透明通信图1 是HC-06 图片及主要引脚现在你手中拿到的HC-06引出了四个引脚,分别为VCC、GND、TXD、RXD。

四个引脚分别对应单片机的电源5V或3.3V;GND接地;TXD、RXD交叉连接(对应单片机的P3^0,P3^1)。

连接好,单片机上电,此时蓝牙模块上led闪烁,表示尚未连接其他蓝牙设备。

此时用手机蓝牙搜索,可以搜索到HC-06.点击连接,输入pin 密码则可以连接。

连接好后,利用蓝牙串口助手就可以对蓝牙模块通信了,编程也就可以把蓝牙当作普通串口来对待。

注意编写好程序后,向单片机烧录时,必须将TXD、RXD拔出才能烧写!!!问题:串口发送字符串时,最后没有标志可寻。

可以将字符串接收到数组中,发送数据到12864,检测是否到’\0’,如果检测得到,将标识符flag 置为1;串口中断服务程序中,检测到flag为1时,这证明数据显示成功。

此时应当清屏!清屏方法:while(Tem[i]!='\0'){Tem[i]=' ';i++;}/************************************** *********************STC89C52RC与HC-06蓝牙连线:RXD TXDTXD RXD其他连线:P2.0、P2.1、P2.3分别接一个指示灯*************************************** ********************/#include <reg52.h>#include <intrins.h>unsigned char tmp;unsigned int c=0;sbit led1=P1^0; //指示灯0sbit led2=P1^1; //指示灯1sbit led3=P1^2; //指示灯2sbit beep=P3^2; //蜂鸣器void init(); //串口初始化void send(unsigned char a); //单字节发送函数void ctrl(); //接收处理函数void delay(unsigned int x){unsigned int i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void main(){init();while(1){if(RI==1)// 是否有数据到来{RI = 0;tmp = SBUF; // 暂存接收到的数据ctrl();}}}void init() //串口初始化{ES=0; //关中断SCON = 0x50; // REN=1允许串行接受状态,串口工作模式1,//10位UART(1位起始位,8位数据位,1位停止位,无奇偶校验),波特率可变TMOD = 0x20; // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率TH1=TL1=0xFD;// 波特率9600 (本次测试采用晶振为11.0592)PCON &= 0x7f; // 波特率不倍增TR1 = 1; //定时器1开始工作,产生波特率//发送标志位置TI=0; //接收标志位置0RI=0;//EA=0;ES=1;led1=0;//初始化设置3个指示灯全亮led2=0;led3=0;}void send(unsigned char a) //单字节数据发送{ //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。

本次测试需要接上拉电阻TI=0;SBUF=a;while(TI==0);TI=0;if(c%2) //发送指示灯标志,每接收一次,此灯亮灭交替led3=1;elseled3=0;c++;}void ctrl() //接收处理函数{switch(tmp){c ase '1':led1=1; //收到字符1,指示灯0灭send(tmp);beep=0;delay(500);break;case '2': //收到字符2,指示灯1灭led2=1;send(tmp);beep=1;delay(500);break;case '3': //收到字符3,指示灯0、1亮led1=0;led2=0;send(tmp);beep=1;delay(500);break;case '4': //收到字符4,指示灯0、1灭led1=1;led2=1;send(tmp);break;case '5': //收到字符5,指示灯3亮led3=0;send(tmp);break;default: //其他,灯全灭led1=1;led2=1;led3=1;send(tmp);beep=1;delay(500);}}以下是蓝牙接收字符串并向12864显示程序/**************************************** *************************************8*任广俊*日期:12.17*蓝牙接收并显示在12864上,1,2,3控制发光二极管*4,5控制继电器***************************************** *************************************/#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define LCD_data P0sbit LCD_EN=P3^4; //液晶使能1使能,0使不能sbit LCD_RS=P3^5; //寄存器选择1数据,0命令sbit LCD_RW=P3^6; //液晶读写控制1读出,0写入sbit LCD_PSB=P3^7; //串行口控制1并行,0串行sbit led1=P1^0;sbit led2=P1^1;sbit led3=P1^2;sbit beep=P3^2; //蜂鸣器sbit jdq=P1^6; //继电器uchar code dis1[]={"I Love MCU !"};uchar code dis2[]={"单片机学习"};uchar Tem[20];uchar dis3[8];unsigned char a=0; //定义临时变量uchar flag,flag2=0;uchar temp,i,c;void delay(uint x){uint m,n;for (m=x;m>0;m--)for(n=110;n>0;n--);}/**************************************** ***************************************** **********************12864液晶显示***************************************** ***************************************** *********************///写指令:RS=L;RW=L;E=高脉冲;D0-D7=指令码void write_cmd(uchar cmd ){LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}//写数据到LCD:RS=H;RW=L;E=高脉冲D0-D7数据void write_dat(uchar dat){LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay(5);LCD_EN=1;delay(5);LCD_EN=0;}//设定显示位置void lcd_pos(uchar x,uchar y){uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write_cmd(pos); //显示地址}void lcd_init() //lcd初始化{LCD_PSB=1; //并口方式write_cmd(0x30); //基本指令喜僮? delay(5);write_cmd(0x0C); //显示开关光标delay(5);write_cmd(0x01); //清除lcd显示内容delay(5);}/********************************************************************************* **********************************/void BT_init() //蓝牙串口初始化{ES=0; //关中串口中断SCON = 0x50; // REN=1允许串口接收状态,串口工作方式1//10位UART(1起始位,8数据位,1停止位?,无奇偶校检TMOD = 0x20; // 定时器1,工作方式2TH1=TL1=0xFD;// 设置波特率9600PCON &= 0x7f; // 波特率不倍增TR1 = 1; //允许串口中断TI=0; //发送标志0RI=0; //接收标志0ES=1;EA= 1; //开总中断led1=0; //初始化为全亮led2=0;led3=0;}void send(unsigned char a) //单字节数据发送{TI=0;SBUF=a;while(TI==0);TI=0;write_dat(a);if(c%2) //发送指示灯{led3=1;delay(500);led3=0;}c++;}}void main(){BT_init(); //Bluetooth 初始化lcd_init(); //液晶显示初始化while(1){/**************************************** ***************************************** **液晶显示区***************************************** ***************************************** *******/// write_cmd(0x01); //清除lcd显示内容lcd_pos(0,0); //向第一行首位置写数据i=0;while(dis1[i]!='\0'){write_dat(dis1[i]);i++;}lcd_pos(1,0); //向第二行首位子写数据i=0;while(dis2[i]!='\0')write_dat(dis2[i]);i++;}delay(10);lcd_pos(2,0); //向第二行首位子写数据i=0;while(Tem[i]!='\0'){write_dat(Tem[i]);i++;}flag=1;}}void UART_SER (void) interrupt 4 //串口中断服务程序{while(RI) //接收到数据{if(flag==1) //字符串发送完毕{flag=0;a=0;//数据标志清零i=0; //数据清零while(Tem[i]!='\0') //向lcd写空格{Tem[i]=' ';i++;}}RI=0; //清除标志位Tem[a++]=SBUF; //读取缓冲区的值}}AT 指令集进入AT 指令的方法:给模块上电,不配对的情况下,就是AT 模式了。

相关主题