赞
踩
蓝牙通信,实现手机端远程(15米)控制单片机,这听起来对于初学者的我来说,是那么不可思议,经过不断地实验,阅读其他大佬的文章,终于实现了。
在有基础的通信原理知识的前提下,知,HC-05蓝牙模块与51的通信其实很简单,就是蓝牙模块的RXD(接收端)接单片机的TXD(发送端),同样,TXD接RXD。
51单片机的P3^0为其R XD,P3^1为其TXD。
接线如图所示:
手机端我推荐使用SPP蓝牙串口,界面简单清晰,适合初次使用HC-05的同学,长这样:
给蓝牙模块接上电后就可以在这个软件上找到它的信号了,可以直接连接。(接电后未连接的情况下模块会持续闪烁,连接成功后后闪烁频率降低)。
原理图:(不好意思,画图能力有限),功能实现的原理大致就是手机端通过软件控制HC-05蓝牙模块,手机端发送数据给蓝牙模块,实际就成为蓝牙模块发送数据给单片机,同样单片机也能发送数据给蓝牙模块,即双方通过TXD,RXD都能发送和接收。
利用此原理,我们就可以这样编写代码来设计单片机:当接收到什么数据的时候,做出什么反应,就可以实现手机点灯了。
- dat为接收到的数据
- switch(dat)
- {
- case 1:......//当dat=1时
- case 2:......//当dat=2时
- case 3:......//.....
- .............
- }
数据的发送与接收是通过串口通信实现的,所以我们需对串口初始化,写中断函数。
工程总代码如下:
- #include <REGX52.H>
- #include <stdlib.h>
- sbit LED1=P2^0;
- sbit LED2=P2^1;
- sbit LED3=P2^2;
- sbit LED4=P2^3;
- sbit LED5=P2^4;
- sbit LED6=P2^5;
- sbit LED7=P2^6;
- sbit LED8=P2^7;
- unsigned char dat;
- void UART_init() //设置串行通信 本晶振为11.0592MHZ
- {
- TMOD = 0x20;
- TH1 = 0xfd;
- TL1 = 0xfd; //波特率9600
- SM0 = 0;
- SM1 = 1; // 串口工作方式1 10位异步
- REN = 1; //串口允许接收
- TR1 = 1;
- EA = 1;
- ES =1 ; //串口中断
- }
-
- void UART_SendByte(unsigned char Byte) //字节的发送
- {
- SBUF = Byte;
- while(TI == 0);//当数据发送完成时,TI会变为一
- TI = 0;
- }
-
- void main()
- {
-
- UART_init();
- LED1=1,LED2=1,LED3=1,LED4=1,LED5=1,LED6=1,LED7=1,LED8=1;
- while(1)
- {
- switch(dat)
- {
- case 1 :{LED1=0;break;}
- case 2 :{LED2=0;break;}
- case 3 :{LED3=0;break;}
- case 4 :{LED4=0;break;}
- case 5 :{LED5=0;break;}
- case 6 :{LED6=0;break;}
- case 7 :{LED7=0;break;}
- case 8 :{LED8=0;break;}
- }
- }
-
- }
-
-
- void UART_INTERRUPT() interrupt 4
- {
- if(RI==1)//RI=1时表示接收到了数据
- {
- dat = SBUF;//创建变量dat接收缓存区的数据,实现接收。
- RI = 0;
- UART_SendByte(SBUF);//或SBUF = dat; 将数据放于缓冲位实现发送。
- }
- }
这样就可以实现了。
现象如下:
文章如有不对的地方,期待您的指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。