C51--WiFi模块ESP8266--AT指令

news2024/11/26 4:21:54

ESP8266
面向物联网应用的,高性价比、高度集成的WiFi MCU

简介:

高度集成: ESP8266EX集成了32位Tensilica 处理器、标准数字外设接口、天线开关、射频balun、功率放大器、底噪放大器、过滤器和电源管理模块,可将所占的PCB空间降低。
32位Tensilica 处理器: 内置低功耗Tensilica L106 32位 RISC处理器、cpu时钟最高达160MHz、支持实时操作系统(RTOS)和wifi协议栈,可将高达80%的处理能力留给应用编程和开发。

WiFi模块–ESP-01s ,通信模块是通过串口调试助手发送AT指令实现联网

AT指令

AT指令集是从终端设备或数字终端设备向终端适配器或数据电路终端设备发送的。

其对传输的数据包大小有定义:即对于AT指令的发送,除AT字符外,最多可接收1056字符长度(包含最后的空字符)

每个AT命令行中只能包含一条AT指令;对于由终端设备主动向pc端报告的URC指示或者response响应,也要求一行最多有1个,不允许上报的一行中有多条指示或响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。

ESP-01s出场波特率正常是115200,注意:AT指令,控制类都要加回车,数据传输时不加回车。

AT指令实操:

(波特率要选择9600,115200不通信)
①初始化设置:
AT指令基本都要勾选发送新行
AT+RST:重启指令,响应ready结束
AT+UART=9600,8,1,0,0:配置9600波特率(8个数据位1个停止位)响应OK结束
②入网设置:
设置工作模式:

    AT+CWMODE=3
    	模式设置1、station(设备)模式
               2、AP(路由)模式
               3、是双模
       响应OK结束,错误为ERROR

以设备模式借入家中路由器配置:

    AT+CWJAP="wifi名","wifi密码"
       响应:WIFI CONNECTED	//连接过会先断开
            WIFI GOT IP
       OK结束

查询ip地址:

    AT+CIFSR
    +CIFSR:APIP,"192.168.4.1"		//ESP-01S作为路由器的时候的网关
	+CIFSR:APMAC,"2e:3a:e8:17:5e:57"
	+CIFSR:STAIP,"0.0.0.0"
	+CIFSR:STAMAC,"2c:3a:e8:17:5e:57"

        响应OK结束

③连接到TCP server(网络调试助手)
打开网络助手,设立TCP服务器
(1)协议类型,选择TCP server
(2)本地ip地址,自己电脑ip地址(cmd中ipconfig查询电脑ip地址)
(3)本地端口号,通信端口号(尽量不用8080)

④连接服务器

    AT+CIPSTART="TCP","10.0.22.249",8880
         响应CONNECT
         OK结束

⑤发送数据
方法一

AT+CIPSEND=4		
 //设置即将发送数据的长度为4字节
    出现>:输入要发送的4个字节的数据(不勾选发送新行)
    网络助手不显示字符,显示代码,去掉16进制显示
    响应SEND OK结束

方法二、透传模式

        AT+CIPMODE=1
    响应OK结束,开启CIPMODE模式
        AT+CIPSEND
    响应>  开始发送模式

退出透传模式:

(不勾选发送新行)发送+++两遍退出,回到AT指令模式

在这里插入图片描述

单片机发送AT指令

定义指令信息:

    // 网络连接
code char LJWL[]="AT+CWJAP=\"WiFi名\",\"WiFi密码\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
	//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
	//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
	//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";

**code**专门存储比较大的数据的空间,否则报错

main函数中执行信息,每项操作之后延时5s

使用白盒测试,检验是否能执行。
电脑用过串口助手查看ESP8266的执行结果。
接线方式:

			 	  连接				         连接
C51 \VCC\GND / TX  ←  VCC\GND\RX/ESP8266 /TX  → RX \ PC串口调试助手
#include "reg52.h"
#include "intrins.h"
#include <string.h>

#define SIZE 12

sfr AUXR = 0x8E;
sbit D5 = P3^7;

char cmd[SIZE];				//数组操作发送字符串

    // 网络连接
code char LJWL[]="AT+CWJAP=\"123456\",\"wbr0729@\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
		//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
		//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
		//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";

//串口初始化
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	EA = 1;			//开启总中断
	ES = 1;			//开启串口中断
}


void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void sendByte(char data_msg)
{
	//往发送缓冲区中写入数据,就完成了数据的发送
	SBUF = data_msg;

	while(!TI);		//超声波中,用while等待,发送成功后T1 == 1
	
	TI = 0;		
}

void sendString(char* str)
{
	while(*str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{

	D5 = 1;		//D5通电以后为灭的状态
	//配置c51串口的通信方式 
	UartInit();
	while(1){
		Delay1000ms();
		
		sendString("laowang lihai!\r\n");
		sendString(LJWL);				// 网络连接
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(LJFWQ);			//服务器连接
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(KQTCMS);			//开启透传模式
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendString(KSSJCS);			//开始数据传输
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
	}
	
}

//中断函数
void UART_Rountine(void) interrupt 4
{
	static int i = 0;		//静态的局部变量,被初始化一次
	
	if(RI){			//接收中断
		RI = 0;		//软件复位
		cmd[i] = SBUF;		//读数据
		i++;
		if(i == SIZE){
			i = 0;
		}
		
		if(strstr(cmd,"en")){							//strcmp函数,比较函数,两个函数都为open,向下执行
			//查找子串,获得的字符串中间有没有en
			D5 = 0;		//D5点亮
			i = 0;
			memset(cmd,'\0',SIZE);		//清空数组,\0没有任何东西,大小12
		}
		if(strstr(cmd,"se")){
			D5 = 1;		//D5熄灭
			i = 0;
			memset(cmd,'\0',SIZE);
		}
	}
	if(TI);			//发送中断
}

优化:通过TCP通信点亮led

#include "reg52.h"
#include "intrins.h"
#include <string.h>

#define SIZE 12

sfr AUXR = 0x8E;
sbit D5 = P3^7;

char cmd[SIZE];				//数组操作发送字符串


    // 网络连接
code char LJWL[]="AT+CWJAP=\"123456\",\"wbr0729@\"\r\n";
//转义字符,\"保留原本的引号字符意义,否则出错
		//服务器连接
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.43.112\",8880\r\n";
		//开启透传模式
char KQTCMS[]="AT+CIPMODE=1\r\n";
		//开始数据传输
char KSSJCS[]="AT+CIPSEND\r\n";

//串口初始化
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	EA = 1;			//开启总中断
	ES = 1;			//开启串口中断
}


void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void sendByte(char data_msg)
{
	//往发送缓冲区中写入数据,就完成了数据的发送
	SBUF = data_msg;

	while(!TI);		//超声波中,用while等待,发送成功后T1 == 1
	
	TI = 0;		
}

void sendString(char* str)
{
	while(*str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{
	int mark = 0;
	
	D5 = 1;		//D5通电以后为灭的状态
	//配置c51串口的通信方式 
	UartInit();
	
	while(1){
		//Delay1000ms();
		
		//sendString("laowang lihai!\r\n");
		if(mark == 0){
			sendString(LJWL);				// 网络连接
			Delay1000ms();
			sendString(LJFWQ);			//服务器连接
			Delay1000ms();
			sendString(KQTCMS);			//开启透传模式
			Delay1000ms();
			sendString(KSSJCS);			//开始数据传输
			Delay1000ms();
			mark = 1;
		}else{
				sendString("laowang lihai!\r\n");
				Delay1000ms();
			}
	}
	
}

//中断函数
void UART_Rountine(void) interrupt 4
{
	static int i = 0;		//静态的局部变量,被初始化一次
	
	if(RI){			//接收中断
		RI = 0;		//软件复位
		cmd[0] = SBUF;		//读数据

		if(cmd[0] == '1'){			
			D5 = 0;		//D5点亮
			i = 0;		
		}
		if(cmd[0] == '0'){
			D5 = 1;		//D5熄灭
		}
	}
	if(TI);			//发送中断
}

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

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

相关文章

SDL2 播放音频(MP4)

1.简介 这里引入FFmpeg库&#xff0c;获取音频流数据&#xff0c;然后通过FFmpeg将视频流解码成pcm原始数据&#xff0c;再将pcm数据送入到SDL库中实现音频播放。 2.FFmpeg的操作流程 注册API&#xff1a;av_register_all()构建输入AVFormatContext上下文&#xff1a;avform…

超细致Python自动化测试实现的思路

Python自动化测试常用于Web应用、移动应用、桌面应用等的测试 同时&#xff0c;我也为大家准备了一份软件测试视频教程&#xff08;含面试、接口、自动化、性能测试等&#xff09;&#xff0c;就在下方&#xff0c;需要的可以直接去观看&#xff0c;也可以直接点击文末小卡片免…

Python自动化测试之request库详解(三)

做过接口测试的都会发现&#xff0c;现在的接口都是HTTPS协议了&#xff0c;今天就写一篇如何通过request发送https请求。 什么是HTTPS HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer &#xff0c;是以安全为目标的HTTP通道&#xff0c;简单的讲是HTT…

LeetCode【41】缺失的第一个正数

题目&#xff1a; 分析&#xff1a; 第i个位置的数&#xff0c;如果再数组 0到length-1范围内&#xff0c;则将其放到对应的位置&#xff1b; 再遍历一遍数组&#xff0c;找到第一个不在位置i的正数数字&#xff0c;即为所求 思路&#xff1a;https://blog.csdn.net/weixin_45…

基于JavaWeb+SpringBoot+Vue医疗器械商城微信小程序系统的设计和实现

基于JavaWebSpringBootVue医疗器械商城微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 摘 要 目前医疗器械行业作为医药行业的一个分支&#xff0c;发展十分迅速。…

【Java 进阶篇】JQuery 遍历 —— `each()` 方法的奇妙之旅

在前端的世界里&#xff0c;操作元素是我们开发者最为频繁的任务之一。为了更好地操控页面上的元素&#xff0c;JQuery 提供了许多强大的工具&#xff0c;其中 each() 方法是一颗璀璨的明星。本文将深入探讨 each() 方法的原理和用法&#xff0c;带你踏上一场遍历之旅。 起步&…

第四代智能井盖传感器:万宾科技智能井盖位移监测方式一览

现在城市化水平不断提高&#xff0c;每个城市的井盖遍布在城市的街道上&#xff0c;是否能够实现常态化和系统化的管理&#xff0c;反映了一个城市治理现代化水平。而且近些年来住建部曾多次要求全国各个城市加强相关的井盖管理工作&#xff0c;作为基础设施重要的一个组成部分…

JAVA安全之Shrio550-721漏洞原理及复现

前言 关于shrio漏洞&#xff0c;网上有很多博文讲解&#xff0c;这些博文对漏洞的解释似乎有一套约定俗成的说辞&#xff0c;让人云里来云里去&#xff0c;都没有对漏洞产生的原因深入地去探究..... 本文从现象到本质&#xff0c;旨在解释清楚Shrio漏洞是怎么回事&#xff01…

Java学习之路 —— IO、特殊文件

文章目录 1. I/O1.1 常用API1.2 I/O流1.2.1 字节流1.2.2 try-catch-finally和try-with-resource1.2.3 字符流1.2.4 其他的一些流 2. I/O框架3. 特殊文件3.1. Properties3.2 XML 1. I/O 1.1 常用API // 1. 创建文件对象File file new File("E:\\ComputerScience\\java\\…

《C++避坑神器·二十三》C++异常处理exception

有些时候无法设置弹出提示信息或者发送提示信息&#xff0c;时候可以抛出异常来提示各种情况 定义自己的异常 GetPostion()函数内部抛出了异常&#xff0c;所以在捕获异常的时候try要把这个函数包住&#xff0c; Catch()里面写throw后面的类&#xff0c;然后catch内部通过调…

MIB 操作系统Lab: Xv6 and Unix utilities(1)boot xv6

从github中下载xv6代码 $ git clone git://g.csail.mit.edu/xv6-labs-2023 $ cd xv6-labs-2023 编译和运行xv6: $ make qemu 如果在终端输入ls命令&#xff0c;能看到输出。 大多数都是可以直接运行的命令。 xv6没有ps命令&#xff0c;但是可以输入ctrl-p可以看到进程的信…

不加家长好友,如何私密发成绩?

身为老师的你&#xff0c;是否经常收到家长们的询问&#xff0c;要求你告知他们孩子的成绩&#xff1f;而你却因为规定&#xff0c;不能直接将成绩公布&#xff1f;那么&#xff0c;如何解决这个问题呢&#xff1f; 成绩查询系统。是专门为学生和家长提供成绩查询服务的系统。可…

LeetCode - #89 格雷编码

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

转录组测序学习第二弹

安装软件 前面已经安装好了conda&#xff0c;那么我们现在需要安装我们后续需要用到的软件 1.先进入我们前面建立的虚拟环境中 conda activate my_env2.安装软件 conda install -y sra-tools conda install -y trimmomatic conda install -y cutadapt multiqc conda install…

(Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码&#xff1a; 四、完整代码数据说明手册&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台…

docker数据卷详细讲解及数据卷常用命令

docker数据卷详细讲解及数据卷常用命令 Docker 数据卷是一种将宿主机的目录或文件直接映射到容器中的特殊目录&#xff0c;用于实现数据的持久化和共享。Docker 数据卷有以下特点&#xff1a; 数据卷可以在一个或多个容器之间共享和重用&#xff0c;不受容器的生命周期影响。…

易点易动固定资产管理系统:提升企业固定资产领用效率的智慧选择

在现代企业管理中&#xff0c;固定资产的有效管理对于企业的运营和发展至关重要。然而&#xff0c;传统的固定资产领用流程常常繁琐、低效&#xff0c;导致领用效率低下、信息不透明等问题。为了帮助企业解决这些难题&#xff0c;易点易动固定资产管理系统应运而生。本文将介绍…

基于SpringBoot+Vue的新能源汽车充电桩管理系统

基于SpringBootVue的新能源汽车充电桩管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 充电桩详情 管理员界面 摘要 本项目是基于Spring Boot 和 …

C++ 之字符串、字符数组与字符指针(*、**)

C 之字符串、字符数组与字符指针(*、**) 最近频繁使用字符串指针&#xff0c;有时候想取值或者复制&#xff0c;常用到问题&#xff0c;在此总结一下字符串的处理、指针的使用长期更新版~ 1. char 使用相关 1.1 内存使用 首先介绍一下C语言中的数据类型&#xff1a; 下图给…