C51-- 蓝牙,WIFI模块
HC-08蓝牙模块:
蓝牙 -- 最好用的 串口透传 模块
透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变,
仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手里
只要通过串口编程 获得数据即可
波特率: 9600 MHZ
// 学会串口 就能使用蓝牙模块
-- 就能通过蓝牙 模块进行交互-- 比如通过蓝牙在串口上发送指令让单片机执行
================================================
通过USB转TTL 来插入电脑,就可以实现手机和电脑的串口数据传输
AT命令修改蓝牙名称:
AT + NAME = 新的名字
wifi模块:
基本概念
通过wifi模块 让 51单片机上网:
使用的wifi模块 -- ESP-8266 -- 高度基础的wifi MCU -- 支持RTOS(实时系统) 和 wifi协议栈
基于AT指令设计:
AT指令 --是从终端设备 or 数据终端设备 or 数据电路终端设备发送的
每条AT命令行,只能包含一条AT指令,对于由终端设备主动向PC段报告的URC or response响应,也要求一行最多有一个,
不允许上限的一行有多条指令 or 响应
-- AT指令以回车作为结尾, 响应 or 上报 以回车 换行作为结尾
===================================
ESP-8266 -- 一般 默认波特率 -- 115200
因为都是AT指令去驱动,so玩wifi模块都是 通过 串口调试助手
接下来玩以下 AT指令:
通过命令 配置 9600 的波特率:
AT + UART =9600,8,1,0,0
//8 个 数据位 , 1 个停止位
=======================
常用AT指令:
1.设置3种工作模式:
AT+CWMODE=3
//1.是station(设备模式) 2.AP(路由模式) 3.双模
2. 以设备模式接入家中的路由器配置:
AT+CWJAP="CU_a2ry","c5m66yaa"
// 第一个“”填wifi名字,第二个“”填 wifi密码
//连接成功 弹出:
WIFI CONNECTED
WIFI GOT IP
==================
3.查询IP地址:
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"ce:50:e3:77:dd:4e"
+CIFSR:STAIP,"192.168.1.17"
+CIFSR:STAMAC,"cc:50:e3:77:dd:4e"
=============================
4.接收发送数据
1.先通过网络调试助手创建服务器
2.在通过AT指令连接服务器:
AT+CIPSTART="TCP","192.168.1.9",8880
//连接成功:
CONNECTOK
3. 发送数据:
AT+CIPSEND=4 //设置即将发送数据的长度--4个字节发出上面AT指令后出现 >
就可以在发送框里面传输 后面传输(注意不能添加新行)---------------------------------------
这种模式效率太低: 每次都 AT+CIPSEND=4
5.透传:
我们就可以设置为透传:1. AT+CIPMODE=1 //开启透传模式
2. AT+CIPSEND //带回车 -- 开始发送接收数据
3. 随便怎么 发送,接收
4.退出透传模式 发送 +++ 不带换新行
程序:
========================================
代码实现 51 和wifi模块的连接
code 关键字 -- 单独空间存储数据#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
D5=1;//配置C51串口的 通信方式:
UartInit();
while(1){
//Delay1000ms();
//往发送缓冲区 写入数据-- 就完成数据的发送
//sendString("mengxianggiegie\r\n");
sendString(LJWL); // 链接网络 Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(LJFWQ); //连接服务器
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(TCMS); //开启透传
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(SJCS); //接收数据
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();
}
}void uartHandler() interrupt 4
{
static i = 0;
if(RI) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
cmd[i] = SBUF;
i++;
if(i==SIZE)
i=0;
if(strstr(cmd,"en")){//收到 o-pen 开灯
D5=0;
i=0;
memset(cmd,'\0',SIZE);
}
else if(strstr(cmd,"se")){//收到c-lose 关灯
D5=1;
i=0;
memset(cmd,'\0',SIZE);
}
}
}
=============================
优化 上面代码 通过TCP 通信点灯:#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;char cmd[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
int mark = 0;
D5=1;//配置C51串口的 通信方式:
UartInit();
while(1){
//Delay1000ms();
//往发送缓冲区 写入数据-- 就完成数据的发送
//sendString("mengxianggiegie\r\n");
if(!mark){ //第一次打开链接服务器 和网络
sendString(LJWL); // 链接网络 Delay1000ms();
Delay1000ms();
Delay1000ms();
Delay1000ms();sendString(LJFWQ); //连接服务器
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(TCMS); //开启透传
Delay1000ms();
Delay1000ms();
Delay1000ms();
sendString(SJCS); //接收数据
Delay1000ms();
Delay1000ms();
Delay1000ms();
mark=1;
}
else{
sendString("mengxianggiegie\r\n");
Delay1000ms();
}
}
}void uartHandler() interrupt 4
{
static i = 0;
if(RI) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
cmd[0] = SBUF;
if(cmd[0] == '1'){//收到 o-pen 开灯
D5=0;
i=0;
}
else if(cmd[0] == '0' ){//收到c-lose 关灯
D5=1;
i=0;
}
}
}
========================
上方代码优化 -- 读取返回 结果以便 观察进度
#include"reg52.h"
#include<string.h>#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;char buffer[SIZE];
code char LJWL[]="AT+CWJAP=\"CU_a2ry\",\"c5m66yaa\"\r\n"; //通过\r\n输出新行 -- 连接网络
code char LJFWQ[] ="AT+CIPSTART=\"TCP\",\"192.168.1.9\",8880\r\n"; // 链接服务器
char TCMS[]="AT+CIPMODE=1\r\n"; //开启透传模式
char SJCS[]="AT+CIPSEND\r\n"; //数据接收
char AT_OK_Flag = 0;
char AT_Connect_Net_Flag = 0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01; //减少定时器辐射 -- 抗干扰
SCON =0x50; //配置 串口口工作方式1,REN 使能接收
//不配 PCON -- 不设置倍数关系
//配置定时器1为 8位自动重装
TMOD &=0xF0; //高位清零
TMOD |=0x20; //00 10 -- 配置为定时器1为: 1 0 模式 -- 8位自动重装
//定义初值
TL1=0xFD;
TH1=0xFD; // 9600 波特率的初值
TR1= 1; // 定时器 -- 启动
EA =1; // 开启总中断
ES=1; // 开启串口中断
}
void sendByte(char a)
{
SBUF = a;
while(!TI);
TI=0;
}
void sendString(char *str)
{while(*str!='\0')
{
sendByte(*str);
str++;
}}
void main()
{
int mark = 0;
D5=1; //状态灯一开始是熄灭状态//配置C51串口的 通信方式:
UartInit();
Delay1000ms(); //给esp wifi 模块上电时间
sendString(LJWL); // 链接网络 Delay1000ms();
while(!AT_Connect_Net_Flag); // 等到有效才去执行下面的代码
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(LJFWQ); //连接服务器
while(!AT_OK_Flag);
AT_OK_Flag=0; //用完清零, 方便下次做判断
sendString(TCMS); //开启透传
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(SJCS); //接收数据
while(!AT_OK_Flag);
if(AT_Connect_Net_Flag){
D5=0; // 通过灯判断是否联网成功 -- 点亮表示成功
}
if(AT_OK_Flag){
D6=0; //代表连接服务器,并且打开 透传 成功
}
while(1){
Delay1000ms();
//往发送缓冲区 写入数据-- 就完成数据的发送
//sendString("mengxianggiegie\r\n");
sendString("mengxianggiegie\r\n");
}
}void uartHandler() interrupt 4
{
static i = 0;
char tmp;
if(RI) // 中断处理函数中,对于接收中断的响应
{
RI=0; //清楚接收中断标志位
tmp = SBUF;
if(tmp == 'W' || tmp == 'O'|| tmp == 'L' ){ //匹配到W开头的时候,把下标定义为0,方便后面的[0] [5]的位置比较
i=0;
}
buffer[i++]=tmp;
if(buffer[0]=='W' && buffer[5]=='G'){//联网成功 WIFI GOT
AT_Connect_Net_Flag=1; //标志修改为联网状态
memset(buffer,'\0',SIZE);
}if(buffer[0]=='O' && buffer[1]=='K'){//联网成功 WIFI GOT
AT_OK_Flag=1;
memset(buffer,'\0',SIZE);
}
/*
if(buffer[0]=='F' && buffer[1]=='A'){//联网失败 FAIL
for(i=0;i<3;++i){
D5=0;
Delay1000ms();
D5=1;
Delay1000ms();
}
sendString(LJWL);
memset(buffer,'\0',SIZE);
}
*/
if(buffer[0] == 'L'&& buffer[2] == '1'){//收到 o-pen 开灯
D5=0;
memset(buffer,'\0',SIZE);
}
else if(buffer[0] == 'L'&& buffer[2] == '0'){//收到c-lose 关灯
D5=1;
memset(buffer,'\0',SIZE);
}
if(i==12)
i=0;
}
}注释部分为进一步优化,没能连接成功就 AT+RET -- 重启 or 重新连接
==============================
相关文章:
C51-- 蓝牙,WIFI模块
HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变, 仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手…...

HN热帖|替换Redis的一场赛跑
3 月 21 日, Redis Ltd. 宣布了一项重大决定:Redis “内存数据存储”项目从 Redis 7.4 版本开始将以非自由的、源代码可用的许可证发布。这一消息并不受欢迎,但也并非完全意外。这次的变化的不同寻常之处是市面上已经有了多个 Redis 替代品可…...

Kubernetes(k8s):网络插件之Calico安装与详解
Kubernetes(k8s):网络插件之Calico安装与详解 1、什么是Calico?2、安装和配置Calico(控制节点-master执行)3、配置网络策略4、 Calico 的 yaml 文件部分详解1、ConfigMap配置2、DaemonSet 配置 5、calico-k…...
Chrome base 库详解:工具类和常用类库
Chrome浏览器使用了一个强大的库名为base,它包括了许多工具类和常用类库,以支持Chrome的底层功能和性能优化。在本文中,我们将详细阐述base库中的每个子项,并提供示例代码来展示其用法。 base 库的基本结构 Chrome的base库是一个…...

Nginx开发实战三:替换请求资源中的固定数据
文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址,我们通过nginx可以很便捷的将其改为外网访问,但是在外网访问这个地址后,…...
如何在Python中实现多线程和多进程?
如何在Python中实现多线程和多进程? 在Python中,多线程和多进程是实现并发编程的两种主要方式。它们各自有其特点和适用场景。下面将分别介绍如何在Python中实现多线程和多进程,并探讨它们的优缺点。 一、多线程 Python的标准库提供了thre…...
Redis面试题10道
1、什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作…...
vue3从精通到入门6:v-memo指令
v-memo是一个用于优化组件渲染性能的指令。它允许你根据某个条件来缓存组件的虚拟 DOM 树,从而在条件没有变化时避免不必要的重新渲染。这对于那些接收大量 props 且渲染成本较高的组件来说非常有用。 用法 v-memo 指令接受一个表达式或一个数组作为参数࿰…...
【算法集训】基础算法:双指针
344. 反转字符串 // 双指针思路 void reverseString(char* s, int sSize) {int i 0,j sSize - 1;while(i < j) {char tmp s[i];s[i] s[j];s[j] tmp;i , j --;} }392. 判断子序列 // 双指针 bool isSubsequence(char* s, char* t) {// 定义s和t的下标指针int i 0, j …...
李白打酒加强版(c++实现)
题目 话说大诗人李白,一生好饮。 幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。 他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,…...

平价运动蓝牙耳机哪个品牌好?必选的5个爆款品牌,超高性价比!
蓝牙耳机,作为连接我们与音乐的桥梁,其重要性不言而喻,特别是平价运动蓝牙耳机,更是广大消费者的心头好,作为一位长期关注数码产品,特别是对蓝牙耳机有深入研究的爱好者,我深知在琳琅满目的市场…...

Android ImageView以及实现截图
实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…...

剑指offer--数组中重复的数字
一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…...

【THM】SQL Injection(SQL注入)-初级渗透测试
简介 SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据…...

数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…...
vue3性能提升主要通过哪几方面?
📝个人主页:爱吃炫迈 💌系列专栏:Vue 🧑💻座右铭:道阻且长,行则将至💗 文章目录 编译优化diff算法优化提取动态节点 静态提升预字符串化缓存内联事件处理函数SSR优化 源…...

跨境电商IP防关联是什么?有什么作用?
做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢?今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中,通过采取一系列技术手段,确保每个跨境电商账号使用独立的IP地址,以避免账号之间因为IP地址…...

git仓库太大只下载单个文件或文件夹
有没有这样的苦恼:仓库太大,只想下载其中某些文件(夹)? 一招解决: ./down_folder_from_git.sh https://github.com/facebook/infer main Makefile FILES.md scripts examples ./down_folder_from_git.sh https://github.com/Ten…...

OpenHarmony实战:RK3568 开发板镜像烧录指南
前言 烧录开发板是每个开发者的必修课,每次对系统的修改务必进行烧录测试,确保修改正确和不会引入新问题。 本文基于 Windows10,以 RK3568 开发板为例,指导如何烧录 OpenHarmony 镜像,镜像也叫固件。Hihoopÿ…...
Asp.net Core 中一键注入接口
Asp.net Core 中一键注入接口 前言准备开始使用 前言 在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入. 准备 IDE: Visual studio 2022 .Net版本:.Net …...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...