当前位置:   article > 正文

51单片机(十三)ESP8266无线通讯点亮LED灯_esp8266-01s引脚图及其功能

esp8266-01s引脚图及其功能

        上一章我们学习了52单片机串口的使用,本章我们将使用51单片机的串口连接上ESP8266-01s这个wifi模块来实现网络通信,通过手机连接WIFI,控制51单片机上led亮灭(使用AT指令方式)
        

本实验使用的是安信可公司设计的WIFI模块——ESP-01S,该模块搭载有乐鑫出品的ESP8266EX核心处理器。ESP8266是一款高性能的SOC,其内部除了内嵌有低功耗32位的CPU(80MHz default or 160MHz),还支持WIFI g/g/n协议、TCP/IP协议、WIFI Direct(P2P)、soft-AP和RTOS。在目前物联网飞速发展的年代,其在智能家居等领域有着一席之地,在开发者社区中十分受欢迎。


1、 ESP-01S模块介绍

ESP-01S模组共接出了8个接口,板上除了有一块ESP8266EX的核心处理器,还搭载的有一片外部flash,可以用于存储程序。ESP-01S模块外观及引脚如下图1所示,图片和数据来源于安信可官方文档。

图1 ESP-01S模块外观及引脚图

引脚功能定义如下表所示:

ESP8266的三种工作模式

(1)AP模式(模块作为热点,可以发散出wifi信号,实现手机或电脑直接与模块通讯,实现局域网无线控制)

(2)STA模式(模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制)

(3)STA+AP模式(两种模式的共存即可通过互联网控制可实现无缝对接切换)
 

 2、 ESP8266 AT指令集

        在ESP8266的开发过程中,有两种最主要的方式:SDK方法、AT方法。前者的优势是让系统的成本降低、体积小,因为使用的是芯片内部自带的MCU,劣势是入门时间较长,新手需要一个星期到半月的时间去熟悉开发环境;后者的优势是只需要使用AT指令即可,无需花大量的时间去熟悉环境,开发速度快,劣势是需要额外增加外部CPU成本,体积也相对变大。

        AT指令是以AT开头、结尾的特定字符串,AT后面紧跟的字母和数字表明AT指令的具体功能。AT指令具有以下特点:

①几乎所有的AT指令(除了“A/”及“+++”两个指令外)都以一个特定的命令前缀开始,以一个命令结束标志符结束。命令前缀一般由AT两个字符组成,命令结束符通常为。

②每一条AT指令执行完后,调制解调器都会返回一个结果,以对接收到的命令作出应答。
        

        本章将使用简单的AT指令,来使用ESP-01S,即将串口与ESP-01S连接后,在使用串口发送AT指令到ESP-01S上,即可使用ESP-01S。

说了这么多,接下来开始介绍常用的一些AT指令,数据来源于乐鑫官方文档。

AT指令可以细分为四类:测试指令、查询指令、设置指令和执行指令,其指令格式和描述如下表所示:

 本章将使用到关于ESP-01S的WIFI功能AT指令,如下,可去乐鑫官网查看。

 (3)TCP/IP功能AT指令

 (4)AP模式+TCP client

 

 (注:AT+ CIPMUX=1(多连接)时才能开启服务器;关闭 server 模式需要重启。开启 server 后自动建立server监听,当有client接入会自动按顺序占用一个连接。AT+CIPSTATUS除了用来查看TCP的连接服务,还可以用来查看UDP连接服务)
(3)station模式+TCP client
相比与AP模式+TCP client,不同之处在与2、3两步,变成了三个步骤的同时,操作也不一样了。将下面的操作替换掉AP模式+TCP client的2、3两步即可。

3.ESP8266工作模式的选择及AT指令的刷入

ESP8266配置成服务器(PC或单片机发指令)先将ESP-01S用串口和PC端连接,使用串口助手刷入AT指令:
(1)  测试AT指令:AT
(2)  更改模块波特率: AT+CIOBAUD=9600 (波特率设置成功后要更改后再进行设置其它波特率)
(3)  设置为AP模式:AT+CWMODE=3
(4)  设置name password,加密方式:AT+CWSAP=\"PRECHIN\",\"prechin168\",11,0"
(5)  设置主机端的ip地址:AT+CIPAP=\"192.168.4.2\"(此处的IP地址是模块本身的IP,不是ST模式中加入路由器后分配的IP)

(6)  复位重启模块:AT+RST
(7)  设置为多连接模式,启动模块:AT+CIPMUX=1
(8)  服务器的设置端口:AT+CIPSERVER=1,8080  (TCP client连接server时端口号要保持一致)

注:把以上AT指令刷入ESP8266模块,刷入成功都会返回ok,蓝色部分的指令掉电后不会被抹去,红色部分的指令掉电后会被自动抹去,每次重启模块都要进行配置一遍,故在ESP初始化函数中都要加上红色部分的指令.

4.ESP8266与51单片机的连接(附加外接电源的连接)

ESP8266的  RXD TXD VCC   GND

51单片机的  TXD RXD VCC GND 

5.实现ESP8266对51单片机的LED灯的无线控制

ESP8266在AP模式下发散出来一个热点,模块作为服务器TCP server.

手机APP或网络调试助手作为客服端TCP client 去访问服务器,从而实现无线控制.

这里介绍一下手机APP对LED无线控制的具体操作过程:

(1)手机上下载一个TCP连接或NetAssist的APP

(2)打开手机WiFi可以搜索到ESP8266点击连接,连接成功后会有提示说"此热点无上网功能,是否切换"点击否.

(3)打开手机APP,点击TCP client 连接,输入AT指令中获取的IP地址,选择端口号,点击连接.

(4)连接成功后,输入字符大写的A就会打开LED灯,输入大写字符B关闭LED灯.
 

6.代码实现

1.串口的初始化

  1. #define RELOAD_COUNT 0xFA //宏定义波特率发生器的载入值 9600
  2. void UART_Init()
  3. {
  4. SCON=0X50; //设置为工作方式1
  5. TMOD=0X20; //设置计数器工作方式2
  6. PCON=0X80; //波特率加倍
  7. TH1=RELOAD_COUNT; //计数器初始值设置
  8. TL1=TH1;
  9. ES=0; //关闭接收中断
  10. EA=1; //打开总中断
  11. TR1=1; //打开计数器
  12. }

2.串口发送数据函数

  1. void UART_SendByte(u8 dat)
  2. {
  3. ES=0; //关闭串口中断
  4. TI=0; //清发送完毕中断请求标志位
  5. SBUF=dat; //发送
  6. while(TI==0); //等待发送完毕
  7. TI=0; //清发送完毕中断请求标志位
  8. ES=1; //允许串口中断
  9. }

3.串口发送AT命令函数

  1. void ESP8266_SendCmd(u8 *pbuf)
  2. {
  3. while(*pbuf!='\0') //遇到空格跳出循环
  4. {
  5. UART_SendByte(*pbuf);
  6. delay_10us(5);
  7. pbuf++;
  8. }
  9. delay_10us(5);
  10. UART_SendByte('\r');//回车
  11. delay_10us(5);
  12. UART_SendByte('\n');//换行
  13. delay_ms(1000);
  14. }

4.ESP8266AT指令,工作模式初始化

  1. //ESP8266-WIFI模块工作模式初始化
  2. void ESP8266_ModeInit(void)
  3. {
  4. ESP8266_RST_Pin=1;
  5. ESP8266_CH_PD_Pin=1;
  6. ESP8266_SendCmd("AT");
  7. ESP8266_SendCmd("AT+CWMODE=3");//设置路由器模式 1 staTIon模式 2 AP点 路由器模式 3 station+AP混合模式
  8. ESP8266_SendCmd("AT+CWSAP=\"PRECHIN\",\"prechin168\",11,0"); //设置WIFI热点名及密码
  9. ESP8266_SendCmd("AT+CIPAP=\"192.168.4.2\"");//重新启动wifi模块
  10. ESP8266_SendCmd("AT+RST");//重新启动wifi模块
  11. ESP8266_SendCmd("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入
  12. ESP8266_SendCmd("AT+CIPSERVER=1,8080"); //启动TCP/IP 端口为8080 实现基于网络控制
  13. }

5.串口接收数据中断函数

  1. u8 RecBuf[50];
  2. u8 recFlagOK=0;
  3. void Uart() interrupt 4
  4. {
  5. static u8 i=0;
  6. if(RI)
  7. {
  8. RI=0;
  9. RecBuf[i]=SBUF; //+IPD,0,1:F
  10. if(RecBuf[0]=='+')i++;
  11. else i=0;
  12. if(i==10)
  13. {
  14. i=0;
  15. if(RecBuf[0]=='+'&&RecBuf[1]=='I'&&RecBuf[2]=='P'&&RecBuf[3]=='D')
  16. {
  17. switch(RecBuf[9])
  18. {
  19. case 'A': led1=0;break;//点亮led1
  20. case 'B': led1=1;break;//关闭led1
  21. case 'C': led4=0;break;//继电器
  22. case 'D': led4=1;break;//
  23. }
  24. }
  25. }
  26. }
  27. }

注(当 ESP8266 设备接收到服务器器发来的数据,将提示如下信息:+IPD,0,F:xxxxxxxxxx // received n bytes, data=xxxxxxxxxxx)故数据判断从RecBuf[9]开始。

完整示例:

  1. #include <reg52.h>
  2. sbit ESP8266_RST_Pin=P2^5;
  3. sbit ESP8266_CH_PD_Pin=P2^6;
  4. sbit led1=P2^0;
  5. sbit led2=P2^1;
  6. sbit led3=P2^2;
  7. sbit led4=P2^3;
  8. typedef unsigned long u32; //对数据类型进行声明定义
  9. typedef unsigned int u16;
  10. typedef unsigned char u8;
  11. #define RELOAD_COUNT 0xFA //宏定义波特率发生器的载入值 9600
  12. u8 RecBuf[50];
  13. u8 recFlagOK=0;
  14. void delay_10us(u16 us)
  15. {
  16. while(us--);
  17. }
  18. void delay_ms(u16 ms)
  19. {
  20. u16 i,j;
  21. for(i=ms;i>0;i--)
  22. for(j=114;j>0;j--);
  23. }
  24. void UART_Init()
  25. {
  26. SCON=0X50; //设置为工作方式1
  27. TMOD=0X20; //设置计数器工作方式2
  28. PCON=0X80; //波特率加倍
  29. TH1=RELOAD_COUNT; //计数器初始值设置
  30. TL1=TH1;
  31. ES=0; //关闭接收中断
  32. EA=1; //打开总中断
  33. TR1=1; //打开计数器
  34. }
  35. void UART_SendByte(u8 dat)
  36. {
  37. ES=0; //关闭串口中断
  38. TI=0; //清发送完毕中断请求标志位
  39. SBUF=dat; //发送
  40. while(TI==0); //等待发送完毕
  41. TI=0; //清发送完毕中断请求标志位
  42. ES=1; //允许串口中断
  43. }
  44. void ESP8266_SendCmd(u8 *pbuf)
  45. {
  46. while(*pbuf!='\0') //遇到空格跳出循环
  47. {
  48. UART_SendByte(*pbuf);
  49. delay_10us(5);
  50. pbuf++;
  51. }
  52. delay_10us(5);
  53. UART_SendByte('\r');//回车
  54. delay_10us(5);
  55. UART_SendByte('\n');//换行
  56. delay_ms(1000);
  57. }
  58. //ESP8266-WIFI模块工作模式初始化
  59. void ESP8266_ModeInit(void)
  60. {
  61. ESP8266_RST_Pin=1;
  62. ESP8266_CH_PD_Pin=1;
  63. ESP8266_SendCmd("AT");
  64. ESP8266_SendCmd("AT+CWMODE=3");//设置路由器模式 1 staTIon模式 2 AP点 路由器模式 3 station+AP混合模式
  65. ESP8266_SendCmd("AT+CWSAP=\"PRECHIN\",\"prechin168\",11,0"); //设置WIFI热点名及密码
  66. ESP8266_SendCmd("AT+CIPAP=\"192.168.4.2\"");//重新启动wifi模块
  67. ESP8266_SendCmd("AT+RST");//重新启动wifi模块
  68. ESP8266_SendCmd("AT+CIPMUX=1"); //开启多连接模式,允许多个各客户端接入
  69. ESP8266_SendCmd("AT+CIPSERVER=1,8080"); //启动TCP/IP 端口为8080 实现基于网络控制
  70. }
  71. void Uart() interrupt 4
  72. {
  73. static u8 i=0;
  74. if(RI)
  75. {
  76. RI=0;
  77. RecBuf[i]=SBUF; //+IPD,0,1:F
  78. if(RecBuf[0]=='+')i++;
  79. else i=0;
  80. if(i==10)
  81. {
  82. i=0;
  83. if(RecBuf[0]=='+'&&RecBuf[1]=='I'&&RecBuf[2]=='P'&&RecBuf[3]=='D')
  84. {
  85. switch(RecBuf[9])
  86. {
  87. case 'A': led1=0;break;//点亮led1
  88. case 'B': led1=1;break;//关闭led1
  89. case 'C': led4=0;break;//继电器
  90. case 'D': led4=1;break;//
  91. }
  92. }
  93. }
  94. }
  95. }
  96. void main()
  97. {
  98. u16 i=0;
  99. led1=0;
  100. led2=0;
  101. led3=0;
  102. led4=0;
  103. UART_Init(); //串口初始化
  104. ESP8266_ModeInit();
  105. ES=1; //允许串口中断
  106. while(1)
  107. {
  108. i++;
  109. if(i%10==0)
  110. {
  111. led3=!led3;
  112. }
  113. delay_ms(100);
  114. }
  115. }

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

闽ICP备14008679号