基于C51单片机的ESP8266Wifi模块(ESP-01s)编程(详细)

article/2025/10/11 22:28:05

1、模块简介
ESP-01S 是由安信可科技开发的 Wi-Fi 模块,该模块核心处理器为ESP8266。ESP8266 拥有完整的且自成体系的 Wi-Fi 网络功能,既能够独立应用,也可以作为从机搭载于其他主机 MCU 运行。当 ESP8266 独立应用时,能够直接从外接flash 中启动。内置的高速缓冲存储器有利于提高系统性能,并且优化存储系统。另外⼀种情况是, ESP8266 只需通过 SPI/SDIO 接口或UART 接口即可作为Wi-Fi适配器,应用到基于任何微控制器设计中。具体介绍请参照产品官网esp8266详细介绍

2、AT指令介绍
作为一种通信模块,esp-01s同样基于AT指令设计。AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。其对所传输的数据包大小有定义:即对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。
3、调试工具

  • 安信可串口调试助手
  • 网络调试助手

4、模块波特率配置和验证
ESP-01s出厂波特率正常是115200。
(1) 上电后,通过串口输出一串系统开机信息,有的模块可能会出现乱码,以最后输出ready为准。
(2)上电后发送AT指令测试通信及模块功能是否正常。注意:AT指令,控制类都要加回车,数据传输时不加回车。
在这里插入图片描述
(3)通过命令配置成9600波特率
在这里插入图片描述
5、入网设置

(1)设置工作模式
在这里插入图片描述

(2)连接外网
在这里插入图片描述

(3)查询IP地址
在这里插入图片描述
6、连接TCP server,发送数据
(1)打开网络调试助手,设立TCP服务器
在这里插入图片描述

(2)连接服务器
在这里插入图片描述

(3)发送数据
在这里插入图片描述

7、透传模式
连接服务器后即可开启透传模式。
在这里插入图片描述
退出透传
在这里插入图片描述

8、代码编写

功能实现:模块与电脑连接上同一WIFI,位于同一局域网内。通过透传模式,互相通信。
效果展现:刚开始时,单片机D5,D6灭,连接上电脑服务器端后,D5,D6亮,此时网络调试助手上不断出现Hello字样,通过网络调试助手发送L1时,D5亮,发送L0时,D5灭。(ps:注意不同类型C51单片机引脚定义)
代码如下:

#include "reg52.h"
#include "string.h"
#define SIZE 12
sbit D5=P3^7;
sbit D6=P3^6;
sfr AUXR = 0x8E;
char buffer[SIZE];
code char connect[] = "AT+CWJAP=\"WIFI名\",\"密码\"\r\n";
code char connect_server[] = "AT+CIPSTART=\"TCP\",\"联网IP\",端口号\r\n";
char mode[] = "AT+CIPMODE=1\r\n"; //开启透传模式
char send_data[] = "AT+CIPSEND\r\n"; //数据传输开始指令
char AT_OK_Flag = 0; //OK返回值的标志位
char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位
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()		//9600bps@11.0592MHz
{	AUXR = 0x01;SCON = 0x50;//配置串口工作方式1,REN使能接收TMOD &= 0x0F;TMOD |= 0x20;//配置定时器1工作方式8位重载TH1=0xFD;TL1=0xFD; //9600波特率的初值TR1=1;//启动定时器EA = 1;//开启总中断ES = 1;//开启串口中断 
}
void sendByte(char data_msg)
{SBUF = data_msg;while(!TI);TI=0;
}
void sendString(char* str)
{while(*str != '\0'){sendByte(*str);str++;}
}
void Connect_service()
{	int i=1;while(i){sendString(connect);while(!AT_OK_Flag);AT_OK_Flag = 0;//发送连服务器指令并等待成功sendString(connect_server);	while(!AT_OK_Flag);AT_OK_Flag = 0;//发送透传模式指令并等待成功sendString(mode);	while(!AT_OK_Flag);AT_OK_Flag = 0;//发送数据传输指令并等待成功sendString(send_data);while(!AT_OK_Flag);	if(AT_Connect_Net_Flag){D5=0; //点亮D5,代表连接服务器并打开透传模式成功}if(AT_OK_Flag){D6=0; //点亮D6,代表连接服务器并打开透传模式成功i=0;}}
}
void main()
{	D5=D6=1;//灭状态灯UartInit();	//配置C51串口的通信方式Delay1000ms();//给esp8266模块上电时间//发送联网AT指令Connect_service();while(1){Delay1000ms();sendString("hello\r\n");
}
}
void Uart_Handler() interrupt 4
{	static int i=0; //静态变量,被初始化一次char tmp;if(RI) //中断处理函数中,对于接收中断的响应{RI = 0;//清除接收中断标志位tmp = SBUF;if(tmp == 'W' || tmp == 'O' || tmp == 'F' || tmp=='L' || tmp == 'E' || tmp == "?"){i=0;}buffer[i++] = tmp;//连接服务器等OK返回值指令的判断if(buffer[0] == 'O' && buffer[1] == 'K'){AT_OK_Flag = 1;AT_Connect_Net_Flag = 1;memset(buffer,'\0',SIZE);}//联网失败出现FAIL字样捕获if(buffer[0] == 'F' && buffer[1] == 'A'){for(i=0; i<5; i++){D5=0;Delay1000ms();D5=1;Delay1000ms();}Connect_service();memset(buffer,'\0',SIZE);}if(buffer[0]=='E' && buffer[4] =='R'){for(i=0; i<5; i++){D5=0;Delay1000ms();D5=1;Delay1000ms();}Connect_service();memset(buffer,'\0',SIZE);}if(buffer[0]=='0' || buffer[0] =='?'){for(i=0; i<5; i++){D5=0;Delay1000ms();D5=1;Delay1000ms();}Connect_service();memset(buffer,'\0',SIZE);}if(buffer[0] == 'L' && buffer[1] == '1'){D5=0;memset(buffer,'\0',SIZE);}if(buffer[0] == 'L' && buffer[1] == '0'){D5=1;memset(buffer,'\0',SIZE);}	if(i==12) i=0;//发送中断
}
}

ESP-01s作服务器
USB转TTL插入电脑,接线:TX-RX,RX-TX VCC-3.3V GND-GND
注意:确保电脑连接上ESP-01s,可以去电脑WLAN图标那里查看。连接上模块发出的WIFI信号,WIFI图标上没有带锁的那个。
模块基本配置如下:

//1 配置成双模
AT+CWMODE=2
Response :OK
//2 使能多连接
AT+CIPMUX=1
Response :OK
//3 建立TCPServer(要提前打开网络调试助手,才会连上。连上后会有0:CONNECT字样
AT+CIPSERVER=1 // default port = 333
Response :OK
//4 发送数据
AT+CIPSEND=0,4 // 发送4个字节在连接0通道上
>abcd //输入数据,不带回车
Response :SEND OK
//• 接收数据
+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据
//断开连接
AT+CIPCLOSE=0
Response :0, CLOSED OK

代码书写逻辑与前面部分类似,只需动一下上述配置即可,不再赘述。
9、白盒测试代码可行性
接线图如下:
在这里插入图片描述
通过下图发送模拟:
在这里插入图片描述

10、结语
有什么问题,欢迎留言讨论。遇到问题,莫急莫慌,寻找解决方案,通过现象,查看代码逻辑。学会调试,解决bug。


http://chatgpt.dhexx.cn/article/bOeEUUaQ.shtml

相关文章

(可远程)开源手机app控制c51单片机,附微信小程序控制

开源手机app控制c51单片机 第一 、先上效果图第二、原理讲解第三、下载程序到c51第四 app inventor 开发第五、微信小程序开发第六 可能遇到的一些小问题 第一 、先上效果图 第二、原理讲解 原理简述&#xff1a;利用发布订阅模式。第一步&#xff0c;新建主题&#xff0c;第二…

java实例内部类

内部类&#xff1a;可以将一个类定义在另一个类或者一个方法的内部。描述一个事物的一个完整结构的描述。内部类包括&#xff1a;实例内部类&#xff08;普通内部类&#xff09;&#xff0c;静态内部类&#xff0c;局部内部类&#xff08;定义在方法里&#xff0c;几乎不用&…

Java内部类介绍 - 局部内部类和匿名内部类

文章目录 内部类局部内部类匿名内部类匿名内部类介绍常见的使用形式开发中使用场景 内部类 局部内部类 局部内部类 &#xff08;鸡肋语法&#xff0c;了解即可&#xff09; 局部内部类, 在方法、代码块、构造器等执行体中创建一个类, 称为为局部内部类(但是我们一般都不会这样…

夯实Java基础系列8:深入理解Java内部类及其实现原理

本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、Fork、Watch三连哈&#xff0c;感谢你的支持。 文章首发于我的个人博客&#xff1a; www.how2playlife.c…

初识JAVA内部类

1 内部类概述 如果一个类存在的意义就是为指定的另一个类&#xff0c;可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情况就可以形成内部类的形式。 A类中又定义了B类&#xff0c;B类就是内部类,B类可以当做A类的一个成员看待: 2 特点 1) 内部类可以直接访问外…

java 内部类怎么调用成员变量_JAVA内部类之成员内部类

JAVA有一个特殊的类形式——内部类(这个词有点为难普通话不好的南方朋友)。今天我们就来聊聊内部类的一种&#xff1a;成员内部类。 如何定义成员内部类 那要如何定义成员内部类呢。 既然叫成员内部类&#xff0c;说明和成员变量是有类似的地方。从代码的层次结构上来看他是和成…

Java内部类(匿名内部类)

Java内部类&#xff08;匿名内部类&#xff09; 一、内部类二、静态内部类三、成员内部类四、局部内部类&#xff08;了解即可&#xff09;五、匿名内部类&#xff08;重要&#xff09; 一、内部类 1、概述 内部类就是一个定义在一个类里面的类&#xff0c;里面的类可以理解为…

Java 内部类的四种实现方式

Java 内部类的四种实现方式 前言 今天的话我将为大家介绍Java的四种内部类&#xff0c;他们分别是普通内部类&#xff0c;静态内部类&#xff0c;局部内部类&#xff0c;匿名内部类。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、内部类是什么&…

Java内部类

Java内部类 内部类成员内部类局部内部类匿名内部类静态内部类常规面试案例内部类实例化对象重名变量的引用 内部类 是什么&#xff1f; 字面意思&#xff0c;在类的内部编写的类就叫内部类&#xff01; 为了方便区分、学习、理解我们一般将内部类分为以下几种&#xff01; 内部…

java内部类赋值_详解 Java 内部类

内部类在 Java 里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于 Java 中内部类的相关知识点和一些使用内部类时需要注意的点。 从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看: 普通…

java new 一个内部类_java内部类

java内部类的几种类型:成员内部类,静态内部类,方法内部类,匿名内部类。 成员内部类:成员内部类是类内部的非静态类。成员内部类不能定义静态方法和变量(final修饰的除外)。这是因为成员内部类是非静态的,类初始化的时候先初始化静态成员,如果允许成员内部类定义静态变量…

java中的内部类

java中的内部类主要分为两类四种&#xff1a; 第一类&#xff1a;定义在外部类局部位置上&#xff0c;分为局部内部类( 有 类名)、匿名内部类(没有类名)。 第二类&#xff1a;定义在外部类的成员位置上&#xff0c;分为成员内部类(没有static修饰)、静态内部类(使用static修饰…

java内部类最全详解

1、成员内部类 内部类与外部类的关系 a.成员内部类的创建需要依赖于外部类对象-&#xff08;成员方法必须通过对象调用&#xff09;&#xff0c;在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立&#xff0c;不是is a 的关系&#xff08;发动机-汽车&am…

Java内部类详解(含:成员内部类、局部内部类、匿名内部类、静态内部类)

内部类是什么&#xff1f; 字面意思&#xff0c;在类的内部编写的类就叫内部类&#xff01;即一个类的内部又完整的嵌套了另一个类结构&#xff0c;被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。 内部类是类的第五大成员→【提示:类的五大成员…

分享15款很棒的 JavaScript 开发工具javascript

在开发中,借助得力的工具可以事半功倍。今天,这篇文章向大家分享最新收集的15款非常有用的 javascript 开发工具。 testswarm: continious & distributed js testing testswarm是mozilla实验室推出的一个开源项目,它旨在为开发者提供在多个浏览器版本上快速轻松测试自己j…

27 个面向开发人员的最佳 Vue.js 开发工具

英文 | https://javascript.plainenglish.io/best-27-vuejs-development-tools-for-developers-bd972bb5f573 01、BootstrapVue 地址&#xff1a;https://bootstrap-vue.org/ 一个用于 Vue.js 构建引导接口的开源库。 02、Vuex 地址&#xff1a;https://vuex.vuejs.org/ Vue.js…

15 款非常有用的 JavaScript 开发工具

开发者有个趁手的工具将事半功倍。今天这篇文章分享给大家最新的15款非常有用的JavaScript 开发工具。 列表如下&#xff1a; TestSwarm: Continious & Distributed JS Testing TestSwarm提供分布式的JavaScript持续集成测试。最初它的创造者John Resig只是将它作为…

03【WebStorm开发工具】

上一篇&#xff1a;02【HTML快速入门】 下一篇&#xff1a;04【】 目录&#xff1a;【HTML5系列教程】 文章目录 三、WebStorm开发工具3.1 WebStorm简介3.2 WebStorm安装3.3 WebStorm基本使用3.3.1 创建项目3.3.2 调整字体大小3.3.3 代码自动补全3.3.4 WebStorm常用快捷键 三…

web开发者工具 js

作为Web开发人员&#xff0c;我为什么喜欢Google Chrome浏览器 【原文地址&#xff1a;http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html 】 在Google Chrome浏览器出来之前&#xff0c;我一直使用FireFox&#xff0c;因为FireFox的插件非常丰富&#xff0c;更…

JavaScript 专用开发工具

下载地址&#xff1a;http://soooh.com/3/jsedit.rar javaScript专用编辑工具&#xff0c;免费绿色版&#xff0c;需要.net2.0才能运行。 特色&#xff1a;左侧能列出javascript的函数列表&#xff0c;适合修改很大的js文件。