C51_ESP8266_WIFI

文章目录

  • 一、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");
		        }
		}
相关推荐
v先v关v住v获v取3 小时前
丰田凯美瑞悬挂系统有限元分析cad6张+三维图+设计说明书
科技·单片机·51单片机
就是蠢啊1 天前
51单片机——DAC数模转换实验(二)
单片机·嵌入式硬件·51单片机
Arciab1 天前
51单片机学习板PCB制作
嵌入式硬件·学习·51单片机
就是蠢啊2 天前
51单片机——DAC数模转换实验(一)
单片机·嵌入式硬件·51单片机
就是蠢啊2 天前
51单片机——ADC数模转换实验(二)
单片机·嵌入式硬件·51单片机
电子工程师-C512 天前
基于51单片机的环境监测及窗帘控制系统
单片机·嵌入式硬件·51单片机
一杯原谅绿茶2 天前
51单片机TM1804控制RGB灯闪烁的问题及例程
单片机·嵌入式硬件·51单片机
悠闲漫步者3 天前
第2章 MCS-51单片机的串口和最小系统(学习笔记)
笔记·学习·51单片机
v先v关v住v获v取3 天前
汽车起重机大扭矩回转减速器设计“cad32张+三维图+设计说明书
科技·单片机·51单片机