前段时间在某宝买了个ESP8266模块,用来实现和51单片机的通信,现在将大致过程分享一下,希望能帮助到那些想学习的小白
三部分内容:配置模块、模块与51单片机简单通信、出厂固件的烧录
附件里有pdf教程,跟帖子内容一样的,浏览体验可能会更好一点
我买的是8266-01,引脚图如下
引脚说明:
• VCC接3.3v,接5v时间长了可能会烧
• UTXD,URXD和其它的TXD,RXD接时注意交叉接就行了
• CH_PD要给高电平模块才工作
• GPIO0一般不用管,烧录固件时要接地
• RST低电平复位,高电平工作(默认高)
• GPIO2必须为高电平,内部默认已拉高,不用管
一、配置模块:
一般接线如下,图为模块与usb转ttl模块的接线,与单片机的接线也类似
下图为我的连接图,我这个usb转ttl模块的VCC引脚是输出3.3v的
接到电脑usb口,打开串口调试助手,wifi模块买回来的时候波特率应该都是115200,所以要把串口助手的波特率设置为115200,然后点击打开串口。
用到的AT指令如下:
• AT(返回ok表示通信成功)
• AT+CIOBAUD=X(改模块的波特率,X为要改成的波特率,因单片机达不到太高的波特率所以要更改一下波特率,因为我学习板上的晶振是12MHZ的,所以我这里改成4800,原因后面会说到,一般改9600就行,改完之后记得把串口助手的波特率也设置成新波特率,再发AT,有ok表明通信成功)
• AT+CWMODE=X(设置工作模式指令,X可以是1、2、3,具体如下:
1:Station模式
2:AP模式
3:Station+AP模式
Station可理解为让wifi模块去连接路由器或热点,此时模块作为客户端
AP模式可理解为模块本身是一个热点,手机或电脑可以连接这个热点,此时模块作为服务器。
这里讲的是AP模式,Station模式不讲,可以自己去了解。
• AT+RST(重启指令,设置新的工作模式后需重启才能生效。发送完这条指令后再发送其它指令可能会显示串口无效,需要退出串口调试助手再重新进入。)
• AT+CWSAP= 这里我不设置,用默认的 • AT+CWSAP?(可以查看当前AP模式下模块热点的具体信息) • AT+CIFSR(查看IP地址,好像都是192.168.4.1) • AT+CIPMUX=1(开启多连接,貌似最多可以有5台设备连接这个模块,设备id分别分配为0到4) • AT+CIPSERVER=1,X(1表示开启服务器,X为自己设置的端口号,一般设3或4位。也可以只开启服务器而不设置端口号,默认端口是333好像) 注:倒数的这两条指令在模块掉电后需要重新配置,其它那几条配置过一次不用再重新配置了。 到这里拿出手机,打开wifi并连接上模块的热点,如果搜不到热点可以试一下拔了重插,再重新发那两条指令。 连接热点成功后打开网络调试助手这个软件,右滑进入设置,协议设置为TCP Client,即客户端模式,IP地址为192.168.4.1,端口为刚才设置的,然后点连接,连接成功后就能通信了。 这里发送了hello和hello66666666,可以看到电脑上的串口调试助手显示到手机发送过去的信息,这里注意到信息前还附带了+IPD,0,X:这里的0表示设备id号,表示第0台设备发送过来的信息,然后X表示信息包含的字符数量。 二、模块与51单片机通信 程序比较简单,实现的功能:手机发一个A,学习板上的灯亮,发B灭灯,简单地测试一下。下图是我的连线,很乱,主要注意接对就行了,学习板没有3.3v,接了一个降压模块给模块供电。 程序: #include #include "intrins.h" sbit LED1=P2^0; typedef unsigned int u16; typedef unsigned char u8; u8 receive[2]; u8 sign=0; void delay1s(void) //误差 0us { u8 a,b,c; for(c=46;c>0;c--) for(b=152;b>0;b--) for(a=70;a>0;a--); _nop_(); //if Keil,require use intrins.h } //初始化串口 void Init() { SCON = 0x50; //串口模式1,允许接收 TMOD = 0x20; //T1工作模式2,自动重装 PCON = 0x80; //波特率倍增 REN = 1; //根据实际选择 // TH1 = 0xfa; //波特率9600(11.0592) TH1 = 0xf3; //波特率4800(12.0000) // TH1 = 0xf4; //波特率4800(11.0592) TL1 = TH1; RI=0; EA = 1; ES = 0; TR1 = 1; } //发送字符 void send(u8 value) { ES=0; //关闭串口中断 TI=0; //清发送完毕中断请求标志位 SBUF=value; //发送 while(!TI); //等待发送完毕 TI=0; //清发送完毕中断请求标志位 ES=1; //允许串口中断 } //单片机向模块发送AT指令 void wifi_init() { u8 j=0; u8a[]="AT+CIPMUX=1rn"; //那两条掉电要重新配置的指令 u8b[]="AT+CIPSERVER=1,6666rn"; while(a[j]!='