什么可以用手机蓝牙控制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.rhkb.cn/news/249946.html

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

相关文章

MIT6.5830 实验0

前置 本次实验使用 Golang 语言实现,在之前的年份中,都是像 cs186 那样使用 Java 实现。原因: Golang 语言作为现代化语言,简单易上手但功能强大。 使参加实验的同学有同一起跑线,而不是像Java那样,有些同…

LeetCode.189. 轮转数组

题目 题目链接 分析 首先能想到的就是可以用一个新数组,先保存原数组的后 k 个元素,再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间,那么就需要在原数组上做操作。 我们可以先把整个数组翻转一下,这样后半段元…

CANoe学习笔记——窗口类型

CANoe中的窗口类型,共分为三种 1:MDI windows 2:Standard Windows 3:Docking Windows 窗口有多种类型,每种类型都定义了特定的窗口行为。通过点击窗口顶部的区域,可以更改窗口类型。 如下图&#xff0…

QT自制软键盘 最完美、最简单、支持中文输入(二)

目录 一、前言 二、本自制虚拟键盘特点 三、中文输入原理 四、组合键输入 五、键盘事件模拟 六、界面 七、代码 7.1 frmKeyBoard 头文件代码 7.2 frmKeyBoard 源文件代码 八、使用示例 九、效果 十、结语 一、前言 由于系统自带虚拟键盘不一定好用,也不一…

政安晨的机器学习笔记——演绎一个TensorFlow官方的Keras示例(对服装图像进行分类,很全面)

导语 Keras是一个高级API接口,用于构建和训练神经网络模型。它是TensorFlow的一部分,提供了一种简洁、直观的方式来创建深度学习模型。 Keras的主要特点如下: 简洁易用:Keras提供了一组简单的函数和类,使模型的创建和…

深⼊理解指针1(指针和数组)

⽬录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. ⼆级指针 6. 指针数组 7. 指针数组模拟⼆维数组 正文开始&#xff1a; 1.数组名的理解 首先我们已经知道应该如何用指针来访问数组 #define _CRT_SECURE_NO_WARNINGS #include <…

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…

Task05:PPO算法

本篇博客是本人参加Datawhale组队学习第五次任务的笔记 【教程地址】https://github.com/datawhalechina/joyrl-book 【强化学习库JoyRL】https://github.com/datawhalechina/joyrl/tree/main 【JoyRL开发周报】 https://datawhale.feishu.cn/docx/OM8fdsNl0o5omoxB5nXcyzsInGe…

微服务—RabbitMQ

目录 初识MQ 同步和异步通讯 同步通讯的优缺点 异步调用方案 异步通信优缺点 常见MQ技术对比 RabbitMQ快速入门 安装RabbitMQ RabbitMQ整体架构与相关概念 常见消息模型​编辑 入门案例 SpringAMQP 基本介绍 SpringAMQP案例——模拟HelloWorld消息模型 Sprin…

如何在Shopee平台上进行手机类目选品?

在Shopee平台上进行手机类目的选品是一个关键而复杂的任务。卖家需要经过一系列的策略和步骤&#xff0c;以确保选品的成功和销售业绩的提升。下面将介绍一些有效的策略&#xff0c;帮助卖家在Shopee平台上进行手机类目选品。 先给大家推荐一款shopee知虾数据运营工具知虾免费…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

Pytorch从零开始实战18

Pytorch从零开始实战——人脸图像生成 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——人脸图像生成环境准备模型定义开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118&#…

[力扣 Hot100]Day20 旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 出处 思路 旋转时每四个位置为一组进行swap操作&#xff0c;找好对…

【蓝桥杯51单片机入门记录】LED

目录 一、基础 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09;编写前准备 二、LED &#xff08;1&#xff09;点亮LED灯 &#xff08;2&#xff09;LED闪烁 延时函数的生成&#xff08;stc-isp中生成&#xff09; 实现 &#xff08;3&#xff09;流水灯…

OpenHarmony—开发及引用动态共享包

对于企业大型应用开发&#xff0c;有部分公共的资源和代码&#xff0c;只能在开发态静态共享&#xff0c;并且打包到每个依赖的HAP里&#xff0c;这样导致包体积较大&#xff0c;且有重复多份公共资源和代码重复打包到应用中。 为了解决运行态状态无法共享&#xff0c;以及减少…

2024美赛B题保姆级分析完整思路代码数据教学

2024美国大学生数学建模竞赛B题保姆级分析完整思路代码数据教学 B题&#xff1a;Searching for Submersibles 搜索潜水器 从给定的背景信息中&#xff0c;我们知道MCMS是一家位于希腊的公司&#xff0c;他们制造能够将人类运送到海洋深处的潜水艇。他们现在希望使用他们的潜水…

UML---用例图,类图

用例图 用例图&#xff08;Use Case Diagram&#xff09;主要描述系统的功能需求和参与者与系统之间的交互。它是用户与系统交互的最简表示形式&#xff0c;展现了用户和与他相关的用例之间的关系。用例图被视为系统的蓝图&#xff0c;通过它&#xff0c;人们可以获知系统不同种…

C语言·贪吃蛇游戏(下)

上节我们将要完成贪吃蛇游戏所需的前置知识都学完了&#xff0c;那么这节我们就开始动手写代码了 1. 程序规划 首先我们应该规划好我们的代码文件&#xff0c;设置3个文件&#xff1a;snack.h 用来声明游戏中实现各种功能的函数&#xff0c;snack.c 用来实现函数&#xff0c;t…

C# 根据USB设备VID和PID 获取设备总线已报告设备描述

总线已报告设备描述 DEVPKEY_Device_BusReportedDeviceDesc 模式 winform 语言 c# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Window…

2024美赛数学建模C题思路分析 - 网球的动量

1 赛题 问题C&#xff1a;网球的动量 在2023年温布尔登绅士队的决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自2013年以来首次在温布尔登公开赛失利&#xff0c;并结束了他在大满贯赛事中历史上最伟大的球员之一的非凡表…