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

news/2024/11/29 2:48:20/

                                        实验流程

(一)实验流程图

 

(二)实验步骤

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;以及重温了一下单片机引脚高低电平的设置和编译下载。

 


http://www.ppmy.cn/news/1324100.html

相关文章

天拓分享:汽车零部件制造企业如何利用边缘计算网关和数网星平台实现数控机床数据采集分析

一、项目背景 某汽车零部件制造企业为了提高生产效率、降低能耗和提高产品质量,决定引入TDE边缘计算网关和数网星工业互联网平台,对数控机床进行数据采集与分析。 二、解决方案 1、设备选型与配置:考虑到企业生产需求和数控机床的特性&…

金融CRM系统是什么?有哪些功能和作用

今年市场经济下行,投资趋向于保守、人们消费降级,对于金融行业来说影响很大。受经济形式的影响加上行业的数字化转型升级,金融企业都在寻求客户管理的新策略,维护好忠实客户、吸引新客户投资。小编认为CRM系统是管理客户的不二之选…

SpringBoot自动配置(待完善)

EnableAutoConfiguration 开启自动解析配置类 根据 classpath 下的依赖自动配置条件注解自动配置配置文件配置属性spring.autoconfigure.*自定义类加Configuration注解 ImportSelector和DeferredImportSelector 都可以实现配置类分组, DeferredImportSelector可以实现延迟加…

3.系统状态检测命令

1.ifconfig 用于获取网卡配置与网络状态等信息 [rootlocalhost ~]# ifconfig2.uname 用于查看系统内核版本与系统架构等信息 [rootlocalhost ~]# uname -a操作系统 主机名称 内核的版本号 打包时间 系统架构 主板架构 软件版本 3.uptime 用于查看系统的负载信息,相对于t…

【十进制与二进制如何转换?推荐一个超好用的公式编辑器】

在计算机科学和电子工程中,二进制是一种非常重要的数字系统,因为它在数字处理和数据传输中被广泛使用。因此,理解如何将十进制数转换为二进制数是非常重要的。 可以使这个计算过程更加简单和快速。而且还可以用于其他数学方程式的编写和编辑。…

跨越边界,探索未来:给业务研发、测试研发、运维研发的职业发展建议

我在和我的下属和朋友们交流的时候,会经常提到我的 1-3-5-7-10 的“谬论”,具体的含义就是作为一个技术人,我们需要在职业生涯的每个关键阶段(一年、三年、五年、七年、十年),清晰地认识自己的定位和能力水…

外汇天眼:如何避免网络交友投资诈骗,注意这5种迹象就对了!

现在由于网络与通讯科技日渐发达,我们的生活型态与习惯出现极大的变化,无论是购物、交友、投资,都可以靠着一支手机满足各种需求。 然而,这种趋势也助长了电信诈骗的发展,层出不穷的假交友、假投资犯罪造成许多民众莫大…

Kotlin中的委托

在Kotlin中,委托是一种强大的设计模式,它允许一个类将其一些职责委托给另一个类。这种机制通过关键字by来实现。委托有助于代码的重用,降低耦合性,并提供更清晰的类设计。在Kotlin中,有两种主要类型的委托:…