**首先声明我用的是52单片机,板子型号为HC6800-ES V2.0;如果
非同类型,实现不了,概不认账。**
要实现这个玩法,首先得掌握串口通信的知识,不需要太多,只要知道如何接收/发送数据就行。
串行通信:
按照数据传送方向分为:
*单工
数据传输只支持数据在一个方向上传输。
*半双工
允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
*全双工
允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
通信方式:
*同步通信:
带时钟同步信号传输。 SPI,IIC通信接口。
*异步通信:
不带时钟同步通信。 UART(通用异步收发器),单总线。
串口通讯:(简单介绍)
同步通信:简单来说,同步通信是一种比特(bit)同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。但这时还有两种不同的同步方式.一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步.另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。
异步通信:异步通信在发送字符时,所发送的字符之间的时隙可以是任意的。但是接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大,每帧之间还有间隔)。
先来看一下过程图:
有两个物理上独立的接收,发送缓冲器SBUF,它们占用同一个地址99H;接收器是双缓冲结构。发送缓冲器:因为发送时CPU是主动的,所以不会产生重叠错误。
TXD和RXD:T 代表 Transmit(发送)
R 代表 Receive(接收)
X 代表要交叉,也就是说A方的TX接B方的RX、B方的TX接A方的RX。
串行通信的数据结构:
起始位+数据位(数据的最低位,8位或9位看工作方式,数据的最高位)+校验位+停止位
工作方式寄存器SCON:
*RI:接收中断标志位
接受结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
*TI:发送中断标志位
发送结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
*TB8:用来存放发送的第9位
*RB8:用来存放接收的第9位。
*REN:是串行接收允许位
0时:禁止串行接收
1时:允许串行接收
串行口的工作方式:
SM2:多机通信控制位
* 因为多级通信控制是在工作方式2和工作方式3下进行的,因此SM2主要是用在工作方式2和工作方式3。
当SM2=0时:不论接收的第9位是0还是1,都接收数据产生中断。当SM1=1时:只有在接收到第9位为1时,才接收数据,并产生中断:
而如果接收到的第9位为0 时,则将接收到的数据丢弃,不产生中断。
工作方式寄存器PCON:
要注意的是:PCON是没有位寻址的,也就是说不能直接操作,SMOD是直接操作PCON寄存器
*SMOD:是波特率是否加倍的选择位。
0时:波特率不加倍。
1时:波特率加倍。
波特率的概念
* 波特率的定义是:串行口每秒钟发送的位数称为波特率。
比如说2400的波特率就是每秒钟发送2400个位数。
* 串行口的波特率是定时器T1作为波特率发生器的,这时定时器设置在工作方式2(可自动重装初值)
* 波特率=(2*SMOD)/32*定时器T1的溢出率 (当SMOD是0(2*SMOD)=1,为1时值为2)
* 定时器T1的溢出率=单片机内部时钟频率/(256-X) X是定时器的初值
* 波特率=(2*SMOD)/32*(单片机内部时钟频率/(256-X))
串口的操作步骤:
*先设置波特率:
设置定时器T1为工作方式工作方式2(设置TMOD寄存器)
给计数器赋初值(工作方式会自动重装)
*设置串口的工作方式
*设置SCON(如果允许)
*如果使用中断方式,那么打开相应的中断和总中断。
*打开定时器T1,开始产生波特率
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器1
}
下面介绍一下HC-05 蓝牙模块:
引用一句话“模块就是拿来用的”。作为初学者刚开始拿到这个东西,也是很懵逼的,在网上找资料,看到这句话,觉得很有道理,这些新的事物对我们来说就是拿来用的,不用担心,不要畏惧,即使多走点弯路也是值得的。前行的路上有了这些才显得弥足珍贵!
说正事吧!首先可以看一下我分享的这个资料,对蓝牙模块有个初步了解。链接:http://pan.baidu.com/s/1bpF2Z5H 密码:uk88。(补充一下,进入AT指令模式,我的做法是:按住按键,然后再给它上电,慢闪就代表进入AT模式了,接线要用USB 转TTL)用一个简单的例子来解释一下这个模块吧,我们可以把它当作一个传话者,我们发消息给她,她就把消息传给MCU,MCU再去执行相应的操作。
单片机接线是3.0和3.1,记得TX和RX是交叉接线!
下面附上代码:
#include<reg52.h>
#define uchar unsigned char
uchar receiveData;
sbit led = P0^0;
sbit led2 = P0^1;
void UsartConfiguration();
void main()
{
UsartConfiguration();
led = 0;
led2 = 0; //检测是否接收到字符,即是否进入串行口中断
TI = 0;
while(1)
{
if(receiveData == 'A')
led = 1; //点亮
if(receiveData == 'B')
led = 0; //熄灭
}
}
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的(晶振为12.0MHz)
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器1
}
void Usart() interrupt 4 //串行口中断,为什么是4可以参考上一篇中断的文章
{
receiveData=SBUF; //出去接收到的数据
RI = 0; //清除接收中断标志位
SBUF=receiveData; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
忘了一点:还需要下载一个手机APP,“蓝牙串口”这一类的APP,提醒一下,有的APP是不能用的,并非代码问题。
好了,,先说到这里,继续前行!