当前位置:   article > 正文

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

esp01s模块介绍

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;//发送中断
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/163464?site
推荐阅读
相关标签
  

闽ICP备14008679号