我是靠谱客的博主 整齐故事,最近开发中收集的这篇文章主要介绍【51单片机STC89C52】ESP8266 ESP-01S模块使用 一、部分AT指令二、建立TCP服务器三、编程实现设备模式接入路由器配置四、ESP-01S AP(路由)模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

蓝牙,ESP-01sZigbee, NB-Iot等通信模块都是基于AT指令的设计

目录

一、部分AT指令

二、建立TCP服务器

三、编程实现设备模式接入路由器配置

1、编程分析

2、代码分析

 指令

返回值标志位

中断处理服务函数

主函数

3、整体代码

四、ESP-01S AP(路由)模式

1、AP模式配置

2、接收数据

3、编程实现AP模式


 一、部分AT指令

AT
上电后发送AT指令测试通信及模块功能是否正常
AT+RST重启
AT+UART=9600,8,1,0,0设置波特率
AT+CWMODE=1

设置工作模式

1. 是station(设备)模式  2.是AP(路由)模式  3.是双模

AT+CIFSR
查询IP地址
station(设备)模式
AT+CWJAP="OnePlus9R","qwertyuiop"以设备模式接入路由器配置
AT+CIFSR
查询IP地址

AT+CIPSTART="TCP","192.168.67.162",8880

Response :OK

连接到 TCP server
AT+CIPSEND=4
设置即将发送数据的长度 (这里是4个字节)
AT+CIPMODE=1
Response : OK
开启透传模式(+++退出透传)
AT+CIPSEND
Response : OK
随意发送接收数据

AP(路由)模式
AT+CIPMUX=1
Response : OK
使能多链接
AT+CIPSERVER=1
Response : OK
建立TCPServer,default port = 333
AT+CIPSEND=0,4
>abcd //输入数据,不带回车
Response : SEND OK
发送4个字节在连接0通道上
AT+CIPCLOSE=0
Response : 0 , CLOSED OK
断开连接

注意:AT指令,控制类勾选发送新行,传输数据时不需要

二、建TCP服务器

 注:ESP-01S和主机要在同一wifi网络下

三、编程实现设备模式接入路由器配置

1、编程分析

ESP-01S连接网络后重启自动连接网络,并且返回WIFI GOT IP。

这里暂不考虑联网失败,后面再通过AT指令再次联网就可以。

以设备模式接入路由器配置,发送AT+CWJAP="OnePlus9R","qwertyuiop"指令 

入网成功返回WIFI GOT IP等,最终返回值为OK

入网失败返回值为FAIL

连接到 TCP server,发送AT+CIPSTART="TCP","192.168.67.162",8880指令

开启透传模式,发送AT+CIPMODE=1指令

开始发送接收数据,发送AT+CIPSEND指令

以上操作成功的话,返回值均为OK

连接 TCP 服务器失败,返回ERROR等,最终返回值为CLOSED,但是代码并未考虑

 2、代码分析

 指令

code char LJWL[]  = "AT+CWJAP="OnePlus9R","qwertyuiop"rn";	  //连接网络
code char LJFWQ[] = "AT+CIPSTART="TCP","192.168.67.162",8880rn";//连接服务器
char TCMS[]  = "AT+CIPMODE=1rn";  //透传模式指令
char SJCS[]  = "AT+CIPSENDrn";	//数据传输开始指令
char RESET[] = "AT+RSTrn";		//重启模块指令

返回值标志位

char AT_OK_Flag = 0;				//OK返回值的标志位
char AT_Connect_Net_Flag = 0;		//WIFI GOT IP返回值的标志位

中断处理服务函数

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'){
				i = 0;
			}
			buffer[i++] = tmp;
			
			if(buffer[0] == 'W' && buffer[5] == 'G'){		//入网成功的判断依据WIFI GOT IP
				AT_Connect_Net_Flag	= 1;
				memset(buffer, '', SIZE);
			}			
			if(buffer[0] == 'O' && buffer[1] == 'K'){		//连接服务器等OK返回值指令的判断
				AT_OK_Flag	= 1;
				memset(buffer, '', SIZE);
			}			
			if(buffer[0] == 'F' && buffer[1] == 'A'){		//联网失败出现FAIL字样
				for(i=0;i<5;i++){
					D5 = 0;
					Delay1000ms();
					D5 = 1;
					Delay1000ms();
				}
				sendString(RESET);
				memset(buffer, '', SIZE);
			}
			
			if(buffer[0] == 'L' && buffer[2] == '1'){		//灯控指令
				D5 = 0;//点亮D5
				memset(buffer, '', SIZE);
			}
			if(buffer[0] == 'L' && buffer[2] == '0'){
				D5 = 1;//熄灭D5
				memset(buffer, '', SIZE);
			}
			if(i == 12) i = 0;
	}
		
}

主函数

void main()
{
	int mark = 0;
	D5 = 1;
	D6 = 1;//灭状态灯

	UartInit();
	Delay1000ms();//给espwifi模块上电时间
	
	
	sendString(LJWL);//发送联网AT指令并等待成功
	//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;//点亮D5,代表入网成功
	}
	if(AT_OK_Flag){
		D6 = 0;//点亮D6,代表连接服务器并打开透传模式成功
	}
	while(1){
		Delay1000ms();//“心跳包”
		sendString("连接成功rn");
	}
}

3、整体代码

#include "reg52.h"
#include "intrins.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="OnePlus9R","qwertyuiop"rn";	  //连接网络
code char LJFWQ[] = "AT+CIPSTART="TCP","192.168.67.162",8880rn";//连接服务器
char TCMS[]  = "AT+CIPMODE=1rn";  //透传模式指令
char SJCS[]  = "AT+CIPSENDrn";	//数据传输开始指令
char RESET[] = "AT+RSTrn";		//重启模块指令

char AT_OK_Flag = 0;				//OK返回值的标志位
char AT_Connect_Net_Flag = 0;		//WIFI GOT IP返回值的标志位
 
void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; 	//配置串口工作方式1,REN使能接收
	TMOD &= 0xF0;
	TMOD |= 0x20;	//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;		//9600波特率的初值
	TR1 = 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);
	TI = 0;
}

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

void main()
{
	int mark = 0;
	D5 = 1;
	D6 = 1;//灭状态灯

	UartInit();
	Delay1000ms();//给espwifi模块上电时间
	
	
	sendString(LJWL);//发送联网AT指令并等待成功
	//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;//点亮D5,代表入网成功
	}
	if(AT_OK_Flag){
		D6 = 0;//点亮D6,代表连接服务器并打开透传模式成功
	}
	while(1){
		Delay1000ms();//“心跳包”
		sendString("连接成功rn");
	}
}

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'){
				i = 0;
			}
			buffer[i++] = tmp;
			
			if(buffer[0] == 'W' && buffer[5] == 'G'){		//入网成功的判断依据WIFI GOT IP
				AT_Connect_Net_Flag	= 1;
				memset(buffer, '', SIZE);
			}			
			if(buffer[0] == 'O' && buffer[1] == 'K'){		//连接服务器等OK返回值指令的判断
				AT_OK_Flag	= 1;
				memset(buffer, '', SIZE);
			}			
			if(buffer[0] == 'F' && buffer[1] == 'A'){		//联网失败出现FAIL字样
				for(i=0;i<5;i++){
					D5 = 0;
					Delay1000ms();
					D5 = 1;
					Delay1000ms();
				}
				sendString(RESET);
				memset(buffer, '', SIZE);
			}
			
			if(buffer[0] == 'L' && buffer[2] == '1'){		//灯控指令
				D5 = 0;//点亮D5
				memset(buffer, '', SIZE);
			}
			if(buffer[0] == 'L' && buffer[2] == '0'){
				D5 = 1;//熄灭D5
				memset(buffer, '', SIZE);
			}
			if(i == 12) i = 0;
	}
		
}

四、ESP-01S AP(路由)模式

1、AP模式配置

 2、接收数据

+ IPD , 0 , n : xxxxxxxxxx //+IPD 是固定字符串 0 是通道, n 是数据长度, xxx 是数据

3、编程实现AP模式

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


#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;

char buffer[SIZE];

char LYMO[] = "AT+CWMODE=2rn";	//工作在路由模式
char DLJ[] = "AT+CIPMUX=1rn"; 	//使能多链接
char JLFW[] = "AT+CIPSERVER=1rn"; //建立TCPServer,default port = 333 
char FSSJ[] = "AT+CIPSEND=0,5rn"; //发送数据

char AT_OK_Flag = 0;				//OK返回值的标志位
char AT_Connect_Net_Flag = 0;		//WIFI GOT IP返回值的标志位
char Client_Connect_Flag = 0;
 
void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; 	//配置串口工作方式1,REN使能接收
	TMOD &= 0xF0;
	TMOD |= 0x20;	//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;		//9600波特率的初值
	TR1 = 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);
	TI = 0;
}

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

void main()
{	
	D5 = 1;
	D6 = 1;//灭状态灯

	UartInit();
	Delay1000ms();//给espwifi模块上电时间
	
	sendString(LYMO);//工作在路由模式
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(DLJ);//使能多链接
	while(!AT_OK_Flag);
	AT_OK_Flag = 0;
	
	sendString(JLFW);//建立TCPServer
	while(!Client_Connect_Flag){	
		D6 = 0;
		Delay1000ms();
		D6 = 1;
		Delay1000ms();
	}

	if(Client_Connect_Flag){
		D6 = 0;//点亮D6,代表有客户端接入
	}
	
	while(1){
		sendString(FSSJ);//发送数据
		Delay1000ms();
		Delay1000ms();
		sendString("Hello");
		Delay1000ms();
		Delay1000ms();
	}
}

void Uart_Handler() interrupt 4
{
	static int i = 0;//静态变量,被初始化一次
	char tmp;

	if(RI)//中断处理函数中,对于接收中断的响应
	{
			RI = 0;//清除接收中断标志位
			tmp = SBUF;
			if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == '0' || tmp == ':'){
				i = 0;
			}
			buffer[i++] = tmp;
			
			if(buffer[0] == 'W' && buffer[5] == 'G'){//入网成功的判断依据WIFI GOT IP
				AT_Connect_Net_Flag	= 1;
				memset(buffer, '', SIZE);
			}
			if(buffer[0] == 'O' && buffer[1] == 'K'){//连接服务器等OK返回值指令的判断
				AT_OK_Flag	= 1;
				memset(buffer, '', SIZE);
			}
			if(buffer[0] == '0' && buffer[2] == 'C'){//连接成功返回值0,CONNECT的判断
				Client_Connect_Flag	= 1;
				memset(buffer, '', SIZE);
			}
		
			//灯控指令
			if(buffer[0] == ':' && buffer[1] == 'o' && buffer[2] == 'p'){
				D5 = 0;//点亮D5 
				memset(buffer, '', SIZE);
			}
			if(buffer[0] == ':' && buffer[1] == 'c' && buffer[2] == 'l'){
				D5 = 1;//熄灭D5
				memset(buffer, '', SIZE);
			}
			if(i == 12) i = 0;
	}
		
}

最后

以上就是整齐故事为你收集整理的【51单片机STC89C52】ESP8266 ESP-01S模块使用 一、部分AT指令二、建立TCP服务器三、编程实现设备模式接入路由器配置四、ESP-01S AP(路由)模式的全部内容,希望文章能够帮你解决【51单片机STC89C52】ESP8266 ESP-01S模块使用 一、部分AT指令二、建立TCP服务器三、编程实现设备模式接入路由器配置四、ESP-01S AP(路由)模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部