什么可以用手机蓝牙控制LED???#串口通信【下】

什么可以用手机蓝牙控制LED???#串口通信【下】

    • 前言
    • 预备知识
    • 1.小白玩串口控制的ASSII避坑
      • 1.1问题引入
      • 1.2解决问题
    • 2.串口支持单词型指令控制
      • 2.1实现串口支持单词型指令控制的核心思路
      • 2.2利用字符数组来承接单词型指令
      • 2.3利用strstr函数来查找指令并执行
      • 2.4完整程序代码
      • 2.5补充知识
    • 3.串口原理协议概念收尾
      • 3.1串行口工作模式1:8位UART,波特率可变
      • 3.2串行口工作模式1:8位UART,波特率可变时序图
      • 3.3串口结构框图
    • 4.通过手机蓝牙控制LED
      • 4.1向单片机中烧入串口支持单词型指令控制代码
      • 4.2将蓝牙模块HC-08连接单片机
      • 4.3通过蓝牙串口助手小程序连接蓝牙模块
      • 4.4在发送对话框发送开灯即可打开LED灯,发送关闭即可关闭LED灯。
    • 5.HC-08蓝牙模块
      • 5.1蓝牙模块简介
      • 5.2 HC-08蓝牙串口通信模块接线
    • 6.AT指令修改蓝牙名字
      • 6.1 AT指令表
      • 6.2将USB转TTL转接器与蓝牙模块HC-08连接
      • 6.3把USB转TTL转接器连接电脑通过单片机下载器修改蓝牙名称
    • 结束语

前言

  本篇博文介绍的是用51单片机的串口通信【下】,包含小白玩串口控制的ASSII避坑,串口支持单词型指令控制,串口原理协议概念收尾,通过手机蓝牙控制LED,HC-08蓝牙模块,AT指令修改蓝牙名字。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、数学分数计算。
  二、数字电子时序图

  三、数字电子中与或运算
  四、计算机中的进制转换
  五、C变量
  六、基本输入输出
  七、流程控制
  八、函数

  九、指针
  十,字符串

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1.小白玩串口控制的ASSII避坑

1.1问题引入

  如果要用1控制开灯,0控制关灯。那么是直接改判断条件还是怎么做呢?

1.2解决问题

  • 显然是不行的,直接用1开灯,0关灯单片机上是没有任何反应的。因为中的是文本模式发送。

在这里插入图片描述

  • 尝试改到HEX模式呢?

在这里插入图片描述

  实验后观察可以开灯,也可以关灯

  这是为什么呢?我们想一想,在C语言中为什么int型和char型是可以互通的呢?其实是因为ASSII码的存在。也就是说计算机在处理文本时是用ASSII码来处理,所以在代码为1开灯0关灯时在文本模式下输入1开灯0关灯不执行,是因为代码下的1和0不是文本下的1和0的ASSII码。若要实现在文本模式下输入1开灯0关灯,那么就要在代码内写49和48来控制开关灯,因为49是1的ASSII码,48是0的ASSII码。当使用HEX模式时,在计算机中把16进制的1和二进制的1是互通的,也就是此时输入1能被单片机识别并执行开灯。

  • ASSI码对照表

在这里插入图片描述

2.串口支持单词型指令控制

2.1实现串口支持单词型指令控制的核心思路

  • 利用字符数组来承接单词型指令
  • 利用strstr函数来查找指令并执行

2.2利用字符数组来承接单词型指令

  • 将接收电脑开关灯的指令变量定义为一个大小为32的字符数组,并用宏定义定义出大小为32
#define SIZE 32char LEDStatus[SIZE];
  • 在串口中断函数中定义一个静态变量,因为在多次函数调用中只被执行一次初始化
static int i = 0;
  • 让SBUF寄存器的数据赋给LEDStatus[i]的第i个元素,并入让i自增。为了方便一个字符一个字符的存入字符数组
LEDStatus[i] = SBUF;
i++; //数组标号增加,方便存放字符串

2.3利用strstr函数来查找指令并执行

  • 选用strstr字符查找函数是因为:如果选用strcmp字符串比较函数,必须一致才成立,但在传送字符串是会把字符顺序搞乱。所以使用查找函数来查找,查找函数只需要查找含有相应字符即可,不必顺序一致。
  • 使用strstr函数必须包含头文件string.h
#include "string.h"
  • 在if判断内将i软件置零,使用memset函数将LEDStatus变量清零
i    = 0;                    //清零是为了方便存放下一次指令
memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量

2.4完整程序代码

#include "reg52.h"
#include "string.h"
#define SIZE 32sfr AUXR = 0x8e;   //声明AUXR寄存器地址
sbit LED1 = P3^7;  //使用位定义声明LED1//建立接收电脑开关灯的指令变量
char LEDStatus[SIZE];void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//自己配
{//配置串口工作方式为方式1,从只收不发改为能收能发SCON =  0x50;//配置辅助寄存器,减少电磁辐射,稳定晶振频率  AUXR =  0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD &= 0x0F;TMOD |= 0x20;//设置串口波特率为9600,0误差TH1   = 0xFD;TL1   = 0xFD;//打开定时器1TR1   = 1;//打开总中断EA = 1;//打开串口中断ES = 1;
}void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0;          //一定要软件置零,不然会出现乱序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{//初始化灯的状态LED1 = 1;//初始化串口,配置波特率UartInit();//每延时1秒向电脑发送数据awhile(1){Delay1000ms();		sendString("一起来学串口通信!!!\r\n");  //\r\n 为串口中的换行,缺一不可//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯}
} void UART_handler() interrupt 4
{//定义一个静态整型变量,在多次函数调用中只被执行一次初始化static int i = 0;//在串口中段函数中可以对发送接收中断标志进行处理if(RI == 1){RI = 0;     //必须软件置零LEDStatus[i] = SBUF;i++; //数组标号增加,方便存放字符串//如果用开灯指令开灯,关灯指令关灯if(strstr(LEDStatus,"开灯")) //运用C语言字符串知识,使用的是字符串查找函数,查找到即返回1{LED1 = 0;i    = 0;                    //清零是为了方便存放下一次指令memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量}if(strstr(LEDStatus,"关灯")){LED1 = 1;i    = 0;memset(LEDStatus,'\0',SIZE); }}if(TI);}

2.5补充知识

  • 在字符串中是支持中文的,计算机内部会把中文转换为相应的编码,方便使用

3.串口原理协议概念收尾

3.1串行口工作模式1:8位UART,波特率可变

  当软件设置SCON的SM0、SM1为“01”时,串行通信则以模式1工作。此模式为8位UART格式,**一帧信息为10位:1位起始位,8位数据位(低位在先)和1位停止位。**波特率可变,即可根据需要进行设置。TxD(TxD/P3.1)为发送信息,RxD(RxD/P3.0)为接收端接收信息,串行口为全双工接受/发送串行口。

3.2串行口工作模式1:8位UART,波特率可变时序图

3.3串口结构框图

在这里插入图片描述

4.通过手机蓝牙控制LED

4.1向单片机中烧入串口支持单词型指令控制代码

#include "reg52.h"
#include "string.h"
#define SIZE 32sfr AUXR = 0x8e;   //声明AUXR寄存器地址
sbit LED1 = P3^7;  //使用位定义声明LED1//建立接收电脑开关灯的指令变量
char LEDStatus[SIZE];void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//自己配
{//配置串口工作方式为方式1,从只收不发改为能收能发SCON =  0x50;//配置辅助寄存器,减少电磁辐射,稳定晶振频率  AUXR =  0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD &= 0x0F;TMOD |= 0x20;//设置串口波特率为9600,0误差TH1   = 0xFD;TL1   = 0xFD;//打开定时器1TR1   = 1;//打开总中断EA = 1;//打开串口中断ES = 1;
}void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0;          //一定要软件置零,不然会出现乱序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{//初始化灯的状态LED1 = 1;//初始化串口,配置波特率UartInit();//每延时1秒向电脑发送数据awhile(1){Delay1000ms();		sendString("一起来学串口通信!!!\r\n");  //\r\n 为串口中的换行,缺一不可//怎么知道PC发了数据:由手册可知RI位为接受中断标志位,所以用查询的方法来判断RI是否等于1来开关灯}
} void UART_handler() interrupt 4
{//定义一个静态整型变量,在多次函数调用中只被执行一次初始化static int i = 0;//在串口中段函数中可以对发送接收中断标志进行处理if(RI == 1){RI = 0;     //必须软件置零LEDStatus[i] = SBUF;i++; //数组标号增加,方便存放字符串//如果用开灯指令开灯,关灯指令关灯if(strstr(LEDStatus,"开灯")) //运用C语言字符串知识,使用的是字符串查找函数,查找到即返回1{LED1 = 0;i    = 0;                    //清零是为了方便存放下一次指令memset(LEDStatus,'\0',SIZE); //字符串清零函数,实参为清零的字符串变量,清理成什么字符,清理的大小或数量}if(strstr(LEDStatus,"关灯")){LED1 = 1;i    = 0;memset(LEDStatus,'\0',SIZE); }}if(TI);}

4.2将蓝牙模块HC-08连接单片机

  • 将蓝牙模块HC-08TXD连接51单片机的RXD
  • 将蓝牙模块HC-08RXD连接51单片机的TXD
  • 将蓝牙模块HC-08VCC连接51单片机的5V
  • 将蓝牙模块HC-08GND连接51单片机的GND

4.3通过蓝牙串口助手小程序连接蓝牙模块

  • 微信小程序搜索HCBLE串口助手
  • 打开HCBLE串口助手
  • 点击附近设备
  • 找到HC-08的设备并点击连接。
  • 在弹出的页面中可以看到单片机发送的字符。也可以发送字符给单片机。

4.4在发送对话框发送开灯即可打开LED灯,发送关闭即可关闭LED灯。

5.HC-08蓝牙模块

5.1蓝牙模块简介

  • 蓝牙模块,又叫做蓝牙串口模块
  • 串口透传技术

  透传即透明传送,是指在数据的传输过程中,通过无线的方式这组数据不发生任何形式的改变,仿佛传输过程是透明的一样,同时保证传输的质量,原封不动地到了最终接收者手里。

  • 以太网,蓝牙,Zigbee, GPRS 等模块玩法一样,对嵌入式程序员来说,不需要关心通讯模块内部数据及协议栈工作原理,只要通过串口编程获得数据即可
  • HC-08蓝牙串口通信模块为一对一连接透传,主从机一体。(用户可根据需求,用AT指令切换模块主从)
  • HC-08的参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.2 HC-08蓝牙串口通信模块接线

在这里插入图片描述

6.AT指令修改蓝牙名字

6.1 AT指令表

在这里插入图片描述

6.2将USB转TTL转接器与蓝牙模块HC-08连接

  • 将蓝牙模块HC-08TXD连接USBTTL转接器的RXD
  • 将蓝牙模块HC-08RXD连接USBTTL转接器的TXD
  • 将蓝牙模块HC-08VCC连接USBTTL转接器的5V
  • 将蓝牙模块HC-08GND连接USBTTL转接器的GND

6.3把USB转TTL转接器连接电脑通过单片机下载器修改蓝牙名称

  • 在单片机下载器中打开串口助手
  • 接收和发送缓冲区都设置为文本模式
  • 串口设置为相应串口,波特率为9600,校验位为无校验,停止位为1位
  • *在发送缓冲区发送AT+NAME=* * 即可修改蓝牙名字
  • 特别注意在修改蓝牙名字时,不用用手机端蓝牙助手连接蓝牙模块,不然会修改失败。

在这里插入图片描述

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Time Series】LSTM代码实战

一、简介 还是那句话,"时间序列金融"是一个很有"钱"景的话题,还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络(LSTM)是一种特殊的循环神经…

如何衡量代码的复杂度

圈复杂度概要 最近的培训中了解到了一个概念,叫做圈复杂度。 圈复杂度(Cyclomatic Complexity)是一种衡量程序复杂度的度量方法。它由美国计算机科学家 Thomas J. McCabe 在 1976 年提出。圈复杂度通过统计程序的控制流图中的决策结构&…

linux有关安全的几个基本配置,禁止root登录,新建root权限账号

一、不安装多余的软件,能最小化安装就不要安装图形化界面,然后根据需求安装需要的软件。 二、防火墙要启用,如果您的这台服务器对外有服务只要放开服务就好了,就是说白了白名单,切忌一上来第一件事儿就是关闭防火墙&a…

Mobileye CES 2024 自动驾驶新技术新方向

Mobileye亮相2024年国际消费类电子产品展览会推出什么自动驾驶新技术? Mobileye再次亮相CES,展示了我们的最新技术,并推出了Mobileye DXP--我们全新的驾驶体验平台。 与往年一样,Mobileye是拉斯维加斯展会现场的一大亮点,让参观…

一文读懂Prodigal教程

2.prodigal教程 2.1 介绍 Prodigal 由橡树岭国家实验室和田纳西大学诺克斯维尔分校于2007年在能源部联合基因组研究所的主持下联合开发,是一种用于细菌和古细菌基因组的蛋白质编码基因预测软件工具,Prodigal 已成为世界上最受欢迎的微生物基因预测算法…

day28 节点操作——克隆节点、删除节点

目录 克隆节点删除节点 克隆节点 特殊情况下新增节点按以下操作: 复制一个原有的节点把复制的节点放入到指定的元素内部 克隆节点 元素.cloneNode(布尔值) cloneNode会克隆出一个跟原标签一样的元素,括号内传入布尔值 若为true,则代表克隆时…

Vue3批量异步更新是如何实现

文章目录 一、什么是调度执行二、如何实现可调度?三、批量更新 & 异步更新四、Vue原理五、最后 一、什么是调度执行 多次修改数据(例如自身num10次),只进行一次页面渲染(页面只会渲染最后一次num10) 指的是响应式数据发生变化…

C++ copy()函数详细介绍

copy() 是一个标准库函数,位于 头文件中。它用于将一个容器中的元素复制到另一个容器中,或者将一个范围内的元素复制到另一个范围中。 函数参数介绍 copy( first, last, d_first );first 和 last:表示输入范围的迭代器。 first 指向要复制的…

centos7 安装 java17 安装 idea

删除旧版本的java或者说是自带的,免得干扰 查找java [wanglcentos7 java]$ rpm -qa|grep javajava-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 javapackages-tools-3.4.1-11.el7.noarch tzdata-java-2020a-1.el7.noarch python-javapackages-3.4.1-11.el7.noarch …

展台设计搭建中6个关键元素

一、哪种风格的会展展台设计更显示设计感 从已有的展台布置局面可以看出,不同展台设计有着不同的标准与选择原则,现有的一系列展台设计标识会随着现代化会展的提升重新进入更新诉求阶段。 二、展台设计一般会有那种可以选择的类别 从出现在展台设计优化阶…

React实现组件扩展机制

在java中,SPI机制是Java中提供的一种服务发现机制。同样,前端也很需要这种机制,这样可以做到组件可插拔,可替换,减少相互冗余。 快速使用 1.扩展点使用 通过使用Extension组件定义扩展点,通过name标记扩展…

2023爱分析·知识库问答市场厂商评估报告:爱数

01 研究范围定义 研究范围: 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来,ChatGPT引爆全球大模型市场。国内众多大模型先后公测,众多互联网领军者投身大模型事业,使得大模型…

C++ //练习 3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。

C Primer(第5版) 练习 3.39 练习 3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*******…

每日一道Java面试题:说一说Java中的异常

写在开头 任何一个程序都无法保证100%的正常运行,程序发生故障的场景,我们称之为:异常,在Java中对于异常的处理有一套完善的体系,今天我们就来一起学习一下。老样子,用一段简单的代码开始今天的学习。 我&a…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…

源聚达科技:开一家抖音小店有没有风险

在数字化浪潮的推动下&#xff0c;抖音小店如雨后春笋般涌现&#xff0c;成为众多创业者眼中的香饽饽。然而&#xff0c;“盛名之下&#xff0c;其实难副”&#xff0c;开设一家抖音小店并非只有风光无限&#xff0c;其背后的风险也不容小觑。 首要的风险源自激烈的市场竞争。抖…

力扣之2629.复合函数(reduceRight )

/*** param {Function[]} functions* return {Function}*/ var compose function(functions) {return function(x) {return functions.reduceRight((result, func) > func(result), x);} };/*** const fn compose([x > x 1, x > 2 * x])* fn(4) // 9*/ 说明&#x…

大模型ReAct智能体开发实战

哆啦A梦是很多人都熟悉的角色&#xff0c;包括我自己。 在成长过程中&#xff0c;我常常对他口袋里的许多小玩意感到惊讶&#xff0c;而且他知道何时使用它们。 随着大型语言模型 (LLM) 的发展趋势&#xff0c;你也可以构建一个具有相同行为方式的模型&#xff01; 我们将构建…

DHCP简介

定义 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络&#xff0c;通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP&#xff08;BOOTstrap Protoc…

linux 04 进程管理

02.进程管理 ps 在命令行输入ps后按回车键就能查看当前系统中正在运行的进程。 第一. 查看进程ps 进程的状态STAT 进程的周期 fork&#xff0c;产生一个新进程 第二.排序进程表 ps aux --sort -%cpu 降序cpu %cpu 增序cpu 第三.父子关系 ps ef 第四.自定义 五.动态查看…