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");
		        }
		}
相关推荐
智者知已应修善业15 小时前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
点灯小铭18 小时前
基于51单片机的LED点阵汉字显示系统设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
清风6666661 天前
基于单片机的罐体压力控制器设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
wengqidaifeng1 天前
嵌入式小白第三站:UART、I2C、SPI、ADC 怎么学?从传感器读数到完整小项目
stm32·单片机·嵌入式硬件·51单片机
智者知已应修善业3 天前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
智者知已应修善业3 天前
【51单片机0.1秒计时到21.0时点亮LED】2024-1-5
c++·经验分享·笔记·算法·51单片机
智者知已应修善业4 天前
【51单片机按键控制1分钟正计时倒计时暂停复位】2024-1-2
c++·经验分享·笔记·算法·51单片机
F137298015574 天前
WD5081,85V转5V,1A异步降压芯片
stm32·单片机·嵌入式硬件·51单片机
iCxhust4 天前
如何查看一个51单片机的库文件内容
单片机·嵌入式硬件·51单片机
Lucky_ldy4 天前
51单片机的学习下(结合中科协的个人自用笔记)
笔记·学习·51单片机