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");
		        }
		}
相关推荐
xxwxx__13 天前
51单片机 + ESP8266 TCP通信实战:从零实现WiFi远程控制
c语言·嵌入式硬件·tcp/ip·51单片机
智者知已应修善业14 天前
【51单片机串口通信甲机四个按键模拟四位二进制值发送乙机以十进制显示2位数码管】2024-6-14
c++·经验分享·笔记·算法·51单片机
深圳市晶科鑫实业有限公司15 天前
国产TCXO温补晶振是否可以完美替代欧美日系主流型号
人工智能·stm32·单片机·物联网·51单片机·信息与通信
xxwxx__15 天前
51单片机串口通信完全指南:从原理到实战(发送、接收、回环与控制)
c语言·单片机·嵌入式硬件·51单片机
智者知已应修善业16 天前
【51单片机2个外部中断显示中断历时,初始化8左移3位共阳数码管】2024-6-6
c++·经验分享·笔记·算法·51单片机
智者知已应修善业17 天前
【51单片机8位数码管同时倒计时从9999】2024-1-25
c++·经验分享·笔记·算法·51单片机
H__Rick17 天前
C51学习-DAY4
嵌入式硬件·学习·51单片机·硬件工程
H__Rick17 天前
C51学习-DAY7
单片机·嵌入式硬件·学习·51单片机