文章目录
- 一、ESP8266
-
- 1、ESP8266
- 2、ESP8266模块
- 3、工作模式
- 4、测试模块
- 二、AT指令
-
- 1、命令型式
- 2、基础AT命令
-
- 1)、AT:测试 AT 启动
- 2)、AT+RST:重启模块
- 3)、AT+GMR:查看版本信息
- 3、WIFI功能命令
-
- 1)、AT+CWMODE:选择 WIFI 应用模式
- 2)、AT+CWJAP:加入AP
- 3)、AT+CWLAP:列出当前可用 AP
- 4)、AT+CWQAP:退出与 AP 的连接
- 5)、AT+CWSAP:设置 AP 模式下的参数
- 6)、AT+CWLIF:查看已接入设备的 IP
- 4、TCP/IP工具箱命令
-
- 1)、AT+CIPSTATUS:获得连接状态
- 2)、AT+CIPSTART:建立TCP 连接或注册 UDP 端口号
- 3)、AT+CIPSEND:发送数据
- 4)、AT+CIPCLOSE:关闭 TCP 或 UDP
- 5)、AT+CIFSR:获取本地 IP 地址
- 6)、AT+CIPMUX:启动多连接
- 7)、AT+CIPSERVER:配置为服务器
- 8)、AT+CIPMOD:设置模块传输模式
- 9)、AT+CIPSTO:设置服务器超时时间
- 5、其它命令
-
- 1)、+IPD:接收到网络数据
- 2)、AT+CIOBAUD:设置波特率
- 三、代码实例
-
- 1、ESP8266作为客户端
- 2、ESP8266作为服务器
一、ESP8266
1、ESP8266
ESP8266 是一个完整且成体系的Wi-Fi网络解决方案,能够搭载软件应用,或通过另一个应处理器卸载所有Wi-Fi网络功能。
2、ESP8266模块

VCC:3.3V 电源,开发板上丝印已经标了。
RST:ES8266 复位管脚,可做外部硬件复位使用。
CH_PD:使能管脚,高电平有效。
UTXD:串口发送管脚,与开发板上串口的RXD相连。
URXD:串口接收管脚,与开发板上串口的TXD相连。
GPIO0:GPIO0 为高电平代表从 FLASH 启动, GPIO0 为低电平代表进入系统升级状态,此时可以经过串口升级内部固件,这里我们不需要对此管脚操作。
GPIO2:此管脚为ESP8266引出的一个IO口,这里我们不需要对此管脚操作。
GND:GND。
3、工作模式
ESP8266-WIFI 模块支持 STA/AP/STA+AP 三种工作模式。
STA 模式:ESP8266 模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。
AP 模式:默认模式 PZ_ESP8266 模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。
STA+AP 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。
4、测试模块
USBtoTLL模块:
VCC(3.3v)-->3.3V
CH_PD(EN)-电阻->3.3V
TXD-->RXD
RXD-->TXD
GND-->GND
打开串口调试窗口,输入AT回复OK说明模块可以正常使用:

修改波特率指令 :
AT+UART_DEF=9600,8,1,0,0
如果出现\0\0\0\0\0则说明波特率已改为9600,不能再使用115200了。
二、AT指令
1、命令型式

2、基础AT命令
1)、AT:测试 AT 启动

2)、AT+RST:重启模块

3)、AT+GMR:查看版本信息
)
3、WIFI功能命令
1)、AT+CWMODE:选择 WIFI 应用模式
)
2)、AT+CWJAP:加入AP
)
3)、AT+CWLAP:列出当前可用 AP
)
4)、AT+CWQAP:退出与 AP 的连接
)
5)、AT+CWSAP:设置 AP 模式下的参数
)
6)、AT+CWLIF:查看已接入设备的 IP
)
4、TCP/IP工具箱命令
1)、AT+CIPSTATUS:获得连接状态
)
2)、AT+CIPSTART:建立TCP 连接或注册 UDP 端口号
)
3)、AT+CIPSEND:发送数据
)
4)、AT+CIPCLOSE:关闭 TCP 或 UDP
)
5)、AT+CIFSR:获取本地 IP 地址
)
6)、AT+CIPMUX:启动多连接
)
7)、AT+CIPSERVER:配置为服务器
)
8)、AT+CIPMOD:设置模块传输模式
)
9)、AT+CIPSTO:设置服务器超时时间
)
5、其它命令
1)、+IPD:接收到网络数据
)
2)、AT+CIOBAUD:设置波特率
)
三、代码实例
1、ESP8266作为客户端
c
#include <REGX52.H>
#include <string.h>
sbit LED1 = P2 ^ 0;
sbit LED8 = P2 ^ 7;
unsigned char AT_OK_Flag = 0;
#define SIZE 12
char buffer[SIZE];
// 串口中断======================================================
void UART_init() // 设置串行通信 本晶振为11.0592MHZ
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; // 波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; // 串口允许接收
TR1 = 1;
EA = 1;
ES = 1; // 串口中断
}
void UART_SendByte(unsigned char Byte) // 字节的发送
{
ES = 0; // 关闭串口中断
TI = 0; // 清发送完毕中断请求标志位
SBUF = Byte;
while (TI == 0)
; // 当数据发送完成时,TI会变为一
TI = 0; // 清发送完毕中断请求标志位
ES = 1; // 允许串口中断
}
void UART_INTERRUPT() interrupt 4
{
static int i = 0; // 静态变量,初始化1次
char tmp;
if (RI)
{ // 中断函数中对接收中断的响应
RI = 0; // RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
tmp = SBUF;
if (tmp == 'W' || tmp == 'O' || tmp == 'L')
{
i = 0; // 强制W字符为第一位
}
buffer[i++] = tmp; // 数据偏移
}
if (buffer[0] == 'O' && buffer[1] == 'K')
{ // 连接服务器等OK返回值指令的判断
AT_OK_Flag = 1;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '1')
{ // 指令L1灯亮
LED1 = 0;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '0')
{ // 指令L0灯灭
LED1 = 1;
memset(buffer, '\0', SIZE);
}
}
// 延时函数======================================================
void Delay10us(unsigned char t) //@11.0592MHz
{
while (t--)
{
unsigned char i;
i = 2;
while (--i);
}
}
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
// ESP8266======================================================
// ESP8266 WIFI发送AT指令
// pbuf:AT指令,字符串格式,如:"AT"
void ESP8266_SendCmd(unsigned char *pbuf)
{
while (*pbuf != '\0') // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
Delay10us(5);
pbuf++;
}
Delay10us(5);
UART_SendByte('\r'); // 回车
Delay10us(5);
UART_SendByte('\n'); // 换行
Delay(1000);
}
// ESP8266 WIFI发送数据到APP
// pbuf:数据
void ESP8266_SendData(unsigned char *pbuf)
{
while (*pbuf != '\0') // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
Delay10us(5);
pbuf++;
}
}
// ESP8266-WIFI模块工作模式初始化
void ESP8266_ModeInit(void)
{
UART_init();
Delay(1000);
// 连接网络
ESP8266_SendCmd("AT+CWMODE=1"); // 设定esp8266模块为客户端模式
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CWJAP=\"007\",\"dajidali\""); // 连接网络,双引号为转译
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPSTART=\"TCP\",\"192.168.7.108\",8880"); // 连接服务器
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPMODE=1"); // 透传模式指令
while (!AT_OK_Flag);
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPSEND"); // 数据传输开始指令
while (!AT_OK_Flag);
if (AT_OK_Flag)
{
LED8 = 0; // 点亮LED8灯,代表连接服务器并打开透传模式成功
}
}
void main()
{
LED1 = 1, LED8 = 1;
ESP8266_ModeInit();
while (1)
{
Delay(1000);
ESP8266_SendData("TEST ESP 8266 \r\n");
}
}
2、ESP8266作为服务器
c
#include <REGX52.H>
#include <string.h>
sbit LED1 = P2 ^ 0;
sbit LED8 = P2 ^ 7;
unsigned char AT_OK_Flag = 0;
#define SIZE 12
char buffer[SIZE];
// 串口中断======================================================
void UART_init() // 设置串行通信 本晶振为11.0592MHZ
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; // 波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; // 串口允许接收
TR1 = 1;
EA = 1;
ES = 1; // 串口中断
}
void UART_SendByte(unsigned char Byte) // 字节的发送
{
ES = 0; // 关闭串口中断
TI = 0; // 清发送完毕中断请求标志位
SBUF = Byte;
while (TI == 0)
; // 当数据发送完成时,TI会变为一
TI = 0; // 清发送完毕中断请求标志位
ES = 1; // 允许串口中断
}
void UART_INTERRUPT() interrupt 4
{
static int i = 0; // 静态变量,初始化1次
char tmp;
if (RI)
{ // 中断函数中对接收中断的响应
RI = 0; // RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
tmp = SBUF;
if (tmp == 'W' || tmp == 'O' || tmp == 'L')
{
i = 0; // 强制W字符为第一位
}
buffer[i++] = tmp; // 数据偏移
}
if (buffer[0] == 'O' && buffer[1] == 'K')
{ // 连接服务器等OK返回值指令的判断
AT_OK_Flag = 1;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '1')
{ // 指令L1灯亮
LED1 = 0;
memset(buffer, '\0', SIZE);
}
if (buffer[0] == 'L' && buffer[1] == '0')
{ // 指令L0灯灭
LED1 = 1;
memset(buffer, '\0', SIZE);
}
}
// 延时函数======================================================
void Delay10us(unsigned char t) //@11.0592MHz
{
while (t--)
{
unsigned char i;
i = 2;
while (--i);
}
}
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
// ESP8266======================================================
// ESP8266 WIFI发送AT指令
// pbuf:AT指令,字符串格式,如:"AT"
void ESP8266_SendCmd(unsigned char *pbuf)
{
while (*pbuf != '\0') // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
Delay10us(5);
pbuf++;
}
Delay10us(5);
UART_SendByte('\r'); // 回车
Delay10us(5);
UART_SendByte('\n'); // 换行
Delay(1000);
}
// ESP8266 WIFI发送数据到APP
// pbuf:数据
void ESP8266_SendData(unsigned char *pbuf)
{
while (*pbuf != '\0') // 遇到空格跳出循环
{
UART_SendByte(*pbuf);
Delay10us(5);
pbuf++;
}
}
// ESP8266-WIFI模块工作模式初始化
void ESP8266_ModeInit(void)
{
UART_init();
Delay(1000);
// 连接网络
ESP8266_SendCmd("AT+CWMODE=2");//设置路由器模式 1 staTIon模式 2 AP点 路由器模式 3 station+AP混合模式
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CWSAP=\"TEST_WIFI\",\"dajidali\",11,0"); //设置WIFI热点名及密码
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPAP=\"192.168.4.1\"");
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入
while (!AT_OK_Flag); // OK返回值的标志位
AT_OK_Flag = 0;
ESP8266_SendCmd("AT+CIPSERVER=1,8080"); //启动TCP/IP 端口为8080 实现基于网络控制
while (!AT_OK_Flag); // OK返回值的标志位
if (AT_OK_Flag)
{
LED8 = 0; // 点亮LED8灯,代表连接服务器并打开透传模式成功
}
}
void main()
{
LED1 = 1, LED8 = 1;
ESP8266_ModeInit();
while (1)
{
ESP8266_SendCmd("AT+CIPSEND=0,12");
Delay(1000);
ESP8266_SendData("TEST ESP 8266 \r\n");
}
}