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

news2024/12/26 12:11:28

什么可以用手机蓝牙控制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 32

char 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 32

sfr 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;
	//打开定时器1
	TR1   = 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秒向电脑发送数据a
	while(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 32

sfr 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;
	//打开定时器1
	TR1   = 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秒向电脑发送数据a
	while(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.coloradmin.cn/o/1424863.html

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

相关文章

【Java程序设计】【C00202】基于(JavaWeb+SSM)的信访管理系统(论文+PPT)

基于(JavaWebSSM)的信访管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的信访管理系统 本系统分为管理员、信访人员和工作人员3个功能模块。 管理员:管理员登录进入信访管理系…

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…

RHEL 9上创建本地Yum/DNF存储库

1.挂载RHEL9 ISO文件或DVD 我们假设RHEL 9 iso文件已经复制到系统中。运行以下mount 命令将 ISO文件挂载到/var/repo文件夹。 $ sudo mkdir /var/repo $ sudo mount -o loop rhel-baseos-9.0-x86_64-dvd.iso /var/repo/ 如果是 DVD,请运行 $ sudo mount /dev/sr0 /var/repo/…

系统架构设计师-22年-下午答案

系统架构设计师-22年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五题中任选两题作答 试题一 (25分) 说明 某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。…

代码随想录 Leetcode669. 修剪二叉搜索树

题目&#xff1a; 代码(首刷看解析 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return root;if (root->val < low) {TreeNode* node trimBST(root->right,low,high);return…

【Linux】yum与vim命令详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. yum命令1.1 基本使用1.2 注意事项1.3 lrzsz软件包示例 2. vim命令2.1 vim的基本概念2.2 vim配置2.3 vim的基本操作2.3…

远程电脑解决突然无法的复制粘贴问题

方法一 - 重新启动RDP剪贴板 结束掉剪切板服务 创建新任务rdplclip.exe任务 重新复制粘贴&#xff0c;即可解决 方法二&#xff1a; 重新启动 Windos 资源管理器 方法三&#xff1a;设置远程桌面连接的本地资源配置&#xff0c;勾选剪切板服务&#xff0c;并在详细信息中勾选…

如何用 python +ddt+excel 实现接口自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 接口自动化测试是指通过编写代码或使用工具&#xff0c;模拟…

计算机网络——网络层(3)

计算机网络——网络层&#xff08;3&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择&#xff1a;BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…

Mysql单行函数练习

数据表 链接&#xff1a;https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码&#xff1a;b0rp --来自百度网盘超级会员V5的分享 单行函数练习 单行函数(一行数据返回一个结果) #1.显示系统时间(注:日期时间) #2.查询员工工号,姓名,工资以及提高百分之20后的结果(new…

消费观念升级,品牌又有哪些新的营销玩法?

一方面在传统消费升级的背景下&#xff0c;国民的消费预期不断改善&#xff0c;购买力持续增强&#xff0c;另一方面&#xff0c;随着Z时代成为消费时代的主力军&#xff0c;他们的需求推动了消费行业向个性化、细分化、多样化的方向发展。那在这一消费环境下&#xff0c;品牌又…

深入解析企业培训教育系统开发:源码探秘与技术实践

当下&#xff0c;为了提高员工的技能水平、促进团队的协同合作&#xff0c;企业培训教育系统成为了一个不可或缺的组成部分。本篇文章&#xff0c;小编将为大家讲述企业培训教育系统的开发&#xff0c;揭示其源码背后的奥秘以及相关的技术实践。 一、概述 企业培训教育系统通常…

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&a…

本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网址的静态码和活码怎么做?学会在线制作更快捷

现在获取信息大多都是在手机上搜索的&#xff0c;所以将现在很多推广信息的链接都会选择生成二维码之后&#xff0c;通过扫码在手机上获取传递的信息&#xff0c;那么如何将网址制作二维码使用呢&#xff1f;其实方法很简单&#xff0c;接着网址二维码生成器就可以轻松完成在线…

小程序定制开发前,应该考虑些什么?

引言 在移动互联网时代&#xff0c;小程序已经成为许多企业和个人推广业务、提供服务的理想平台。然而&#xff0c;在进行小程序定制开发之前&#xff0c;开发者和业务方需要细致入微地考虑一系列关键因素&#xff0c;以确保最终的小程序既能满足用户需求&#xff0c;又能够顺…

【附安装包】Java/JDK介绍、下载、安装、配置与使用(保姆级教程)

目录 一、概述 1、Java历史 2、Java介绍&#xff08;JDK、JRE、JVM&#xff09; 3、Java运行机制 4、Java跨平台性 5、JDK版本选择 二、下载安装 1、JDK下载 2、JDK安装 三、配置环境变量 四、测试与使用 1、测试 2、使用 一、概述 1、Java历史 Java语言诞生于SU…

R语言韦恩图的绘制

韦恩图是一种用于展示多个集合之间的交集和并集关系的图形工具。它由英国数学家约翰韦恩于1880年首次引入&#xff0c;因此得名为"韦恩图"。韦恩图利用圆形的重叠区域来表示集合之间的交集&#xff0c;而圆形的非重叠区域则表示各个集合的独立部分。 韦恩图通常用于…

项目管理中,如何识别和管理依赖关系?

项目过程中&#xff0c;很少有任务是独立存在的。因此&#xff0c;在整个项目管理过程中查看完整的项目时间表、依赖关系和所需资源尤为重要。这将有助于团队直观地了解项目进展的全貌&#xff0c;并评估何时以及如何分配任务和资源。 如何识别项目依赖关系&#xff1f; 就像…

matlab中的图窗属性和坐标轴的属性

图窗的Position和Outerposition Position 指定窗口的尺寸和窗口在屏幕中的位置。 Outerposition 指定窗口外轮廓的大小和位置。 两者都是用一个4维向量来定义&#xff0c;格式为[左 底 宽 高]。 可通过set函数修改Position和Outerposition&#xff0c;如下&#xff1a;在屏幕左…