基于安卓系统的智能家居控制系统

发布时间:2024年01月18日

????????????????????????????????????????实验流程

(一)实验流程图

?

(二)实验步骤

1.蓝牙配置

(1)所需材料

????????USB 转 TTL 模块(下载器)、HC-05 蓝牙模块一对、串口调试助手。

(2)配置要求

????????实现两个蓝牙模块的主从绑定。

(3)蓝牙模块与 USB 转 TTL 模块的连接方式

????????RXD---------TXD
????????TXD---------RXD
????????vcc---------5V
????????GND---------GND

(4)设置步骤

????????进入 AT 指令模式,设置串口波特率 9600,无校验位,无停止位,修改蓝牙名称、密码,查询自身地址。

(5)操作实例

????????①用杜邦线连接好 USB 转 TTL 模块(下载器)与 HC-05 蓝牙模块;
????????②进入 AT 指令模式;
????????③将下载器与电脑连接,按住 HC-05 上的复位键,再接通电源﹐发现指示灯 缓慢闪灭,表示进入 AT 指令模式 ,并且打开串口助手。设置波特率 9600 ,数据 位 8 位,停止位 1 位,无校验位,无流控制。

(6)测试通讯

????????发送:AT
????????返回:OK
????????设置蓝牙串口:(波特率 9600,无校验位,1 停止位)
????????指令:AT+UART=9600,0,0
????????返回:OK

(7)修改名称

??????(设置模块设备名为:“YJX”)
????????指令:AT+NAME=YJX\r\n
????????返回:OK

(8)修改密码

??????(设置模块设备密码为:“2829”)
????????指令:AT+PSWD=2829
????????返回:OK

(9)查询自身地址

????????指令:AT+ADDR?
????????返回:ADDR:00:13:EF:00:75:E8
????????OK
????????按照以上步骤便可以设置好蓝牙,接下来就是有手机 app 找到 MAC 为 00:13:EF:00:75:E8 的地址连接,输入密码 2829,连接好了就可以下一步了。

2.画原理图,连接实物图

由于实物图有现成的板子只要插好 STC12C5A60S2 系列单片机,连接好蓝牙 HC_05 模块就好了,连接蓝牙 HC_05 模块 VCC 连接 VCC,GND 连接 GND,接下来 就是串口的连接,由于下载口要用到 P3.0;P3.1 这个串口 1,所以我们一般应该 选用串口 2(P1.2,P1.3),因为串口 2 里面的 P1.2 对应 RxD2,P1.3 对应 TxD2, 所以我们用蓝牙模块HC_05 里面的RxD 连接 TxD2 也就是 P1.3;用蓝牙模块 HC_05 里面的 TxD 连接 RxD2 也就是 P1.2;接下来就是选择灯和蜂鸣器,由于在实物板 子里面灯和蜂鸣器都是现成的,灯能选择的只有 P1.0 到 P1.7,而蜂鸣器能选择 的只有 P3.6;为了避免串口 2(P1.2,P1.3)使用而造成干扰,灯模块我选择了 P1.5,P1.6,P1.7 引脚,蜂鸣器只能选择 P3.6 引脚了。

3. 代码设计

(1)波特率设置

????????由于实验中要用到蓝牙模块 HC_05,所以首先要做的就是设置波特率,因为 设置蓝牙的时候波特率设置为了 9600,所以串口 2 中我们也要把波特率设置为 9600。查看 STC12C5A60S2 的 pdf 文件,找到串口 2 控制寄存器发现串口 2 有方式 0,方式 1,方式 2,方式 3,一共四个模式,在这里我们选择了方式 1 模式:
????????????????????????????????????????实现代码为:S2CON = 0X50;
????????查看文档发现串行口 2 的工作方式 1:10 位数据通过 RxD2/P1.2 接收,通过 TxD/P1.3 发送。一帧数据包含一个起 始位(0),8 个数据位和一个停止位(1)。接收时,停止位进入特殊功能寄存器 S2CON 的 S2RB8 位。波特率由独立波特率发生器 BRT 的溢出率决定。 串口 2 波特率在模式 1=(2S2SMOD/32 ) * BRT 独立波特率发生器的溢出率。
????????当 S2SMOD=0 时,串口 2 波特率=BRT 独立波特率发生器的溢出率/32, 当 S2SMOD=1 时,串口 2 波特率=BRT 独立波特率发生器的溢出率/16,BRT 独立波特率发生器的溢出率=SYSclk/12/( 256 - BRT ),当 BRTx12=0 时,BRT 独立波特率发生器的溢出率=SYSclk / ( 256 - BRT ),当 BRTx12=1 时。
????????S2SMOD:串口 2 的波特率加倍控制位:
????????????????0,串口 2 的波特率不加倍;
????????????????1,串口 2 的波特率加倍
????????对于 STC12C5A60S2 系列单片机,串口 2 只能使用独立波特率发生器作为波 特率发生器,不能够选择定时器 1 作为波特率发生器;而串口 1 既可以选择定时器 1 作为波特率发生器,也可以选择独立波特率发生器作为波特率发生器。
????????BRTx12:独立波特率发生器计数控制位: 独立波特率发生器每 12 个时钟计数一次;
1,独立波特率发生器每 1 个时钟计数一次 我们要设置波特率为 9600,要设置串口 2 的波特率加倍控制位,设置波特 率加倍或者是波特率不加倍,我们这里选择波特率不加倍,也就是 S2SMOD=0, 还要设置是 1T 模式,还是 12T 模式,我们这里设置 1T 模式,也就是 BRTx12=1; 查看时钟周期 SYSclk 得到 SYSclk=11.0592MHz。 由此得到串口 2 波特率=SYSclk / ( 256 - BRT )/32;代入公式得: 9600=11059200/ ( 256 - BRT )/32,经过计算得出 BRT=220。 所以这里设置独立波特率发生器 BRT=220。

(2)串口 2 中断的设置

????????S2TI(发送中断请求标志位): 在方式 0,当串行发送数据第 8 位结束时,由内部硬件自动置位,即 S2TI=1, 向主机请求中断,响应中断后 S2TI 必须用软件清零,即 S2TI=0。在其他方式中,
则在停止位开始发送时由内部硬件置位,即 S2TI=1,响应中断后 S2TI 必须用软 件清零。
????????S2RI(接收中断请求标志位): 在方式 0,当串行接收到第 8 位结束时由内部硬件自动置位,即 S2RI=1, 向主机请求中断,响应中断后 S2RI 必须用软件清零,即 S2RI=0。在其他方式中, 串行接收到停止位的中间时刻由内部硬件置位,即 S2RI=1,向 CPU 发中断申请, 响应中断后 S2RI 必须由软件清零。
????????S2CON 的所有位可通过整机复位信号复位为全“0”。S2CON 的字节地址为 9AH,不可位寻址。串行通信的中断请求:当一帧发送完成,内部硬件自动置位 S2TI,即 S2TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位 S2RI, 即 S2RI=1,请求中断处理。由于 S2TI 和 S2RI 以“或逻辑”关系向主机请求中 断,所以主机响应中断时事先并不知道是 S2TI 还是 S2RI 请求的中断,必须在
中断服务程序中查询 S2TI 和 S2RI 进行判别,然后分别处理。因此,两个中断 请求标志位均不能由硬件自动置位,必须通过软件清 0,否则将出现一次请求多次响应的错误。
????????EA 根据中断系统结构示意图可知,要打开串口 2 中断我们首先要打开 ES2 和 EA,所以我们首先把 ES2= 1,打开 ES2 ;打开总中断 EA,把 EA = 1;当中断到 来的时候判断 S2RI(接收中断请求标志位)等于 0 还是等于 1,当 S2RI=1 时,CPU 不响应,当 S2RI=1,向 CPU 发中断申请,响应中断后 S2RI 必须由软件清零。 由于该所以只要做接受部分就可以了,所以 S2TI(发送中断请求标志位)可以 不用理会。

(3)输入字符判断

????????函数原型:extern char *strstr(const char *str1, const char *str2); 语法:* strstr(str1,str2);str1: 被查找目标,str2: 要查找对象; 返回值:该函数返回 str2 第一次在 str1 中的位置,如果没有找到,返回 NULL。
????????输入字符的判断,其主要是运用到 strstr,我们查找 strstr 函数原型发 现,当 str2 在 str1 中的时候,执行相应的语句,如果 str2 不在 str1 中的时 候,返回为空,发送的指令无效。利用 strstr 判断的相应语句如下:
{
    if(strstr(Rec_BufU2,b)!=NULL)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

(4)灯的亮灭及其蜂鸣器的开关

????????查看实验原理图发现,当相应的引脚置 0 的时候灯亮,蜂鸣器响;而相 应的引脚置 1 的时候灯灭,蜂鸣器关。当通过蓝牙控制灯亮和灭的相关语句如 下:
if(HandU2("1"))
{
    led1=0;
    CLR_BufU2();
}

????????当发送的字符为 1 的时候,led1 灯亮,然后清除发送缓存字符,要是缓存字 符没有清除会对该灯的下一次指令造成影响。以此模式把要设置的灯和蜂鸣器开 关起来,由于设置了最大缓存字符为 50 个,在不超出该范围内程序能正确无误 的运行下来,超出该范围是否会出现 bug 我没有试过,不过按照正常逻辑只能连 续发到最大的缓存字符,那超出部分没有缓存进去,所以是不会执行的。要解决 这个问题可以把缓存最大数值调大,应该很多都有限制的吧,一般都不可以超个 100 个缓存字符,仔细想想就算能设置更多的字符命令也没有用,谁没事会会记 这么多命令,一般来说,设置够用就行了。

(5)编译下载

????????编译成功后,然后生成.hex 文件,打开 stc-isp-15xx-v6.87F 软件,设置 好单片机类型为 STC12C5A60S2,设置好串口号,最高、低波特率,打开程序文 件,找到自己设置的.hex 文件,点击下载/编译,重启单片机就可以了。除此之外,我们还可以在 stc-isp-15xx-v6.87F 软件里面查看波特率是否设置正确,点 击波特率计算器发现波特率是 9600,说明我们设置的波特率没有问题。

?

?(三)实验原理图

(四)实验实物图

?

?

五、实验总结

????????通过本次实验我懂得了配置蓝牙,以及设置蓝牙串口波特率 9600,无校验位, 无停止位,修改蓝牙名称、密码,查询自身地址等相关内容;还懂得了如何使用 单片机串口通信,首先要设置的便是波特率,定时器,以及串口中断等;还有就 是如何用 strstr 来判断发送的字符是否是我们指令需要的字符,是返回!NULL, 不是返回 NULL;以及重温了一下单片机引脚高低电平的设置和编译下载。

?

文章来源:https://blog.csdn.net/weixin_66634995/article/details/135671755
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。