前段时间在某宝买了个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=<ssid>,<pwd>,<chl>,<ecn>(设置AP模式下的参数,简单点说就是设置热点的名字,密码之类的,例如AT+CWSAP=”8266”,“66666666”,0,3)
这里我不设置,用默认的 • 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 <reg52.h>
- #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=1\r\n"; //那两条掉电要重新配置的指令
- u8b[]="AT+CIPSERVER=1,6666\r\n";
- while(a[j]!='\0')
- {
- send(a[j]);
- j++;
- }
- j=0; //清零准备发第二条指令
- delay1s(); //延时一下
- while(b[j]!='\0')
- {
- send(b[j]);
- j++;
- }
- delay1s();
- }
- void wifi_data()
- {
- if(receive[0]=='A') LED1=0; //亮
- if(receive[0]=='B') LED1=1; //灭
- }
- void main()
- {
- Init();
- wifi_init();
- while(1)
- {
- wifi_data();
- }
- }
- //中断程序,此程序只把+IPD,x,x:后的有用数据存进receive数组里
- void ZD() interrupt 4
- {
- if(RI)
- {
- RI=0;
- if(sign==1)
- {
- receive[0]=SBUF;
- sign=0; //保存receive[0]的数据
- }
- if(SBUF==':') sign=1;
- }
- }
复制代码
上面提到的波特率问题,简单地说,11.0592是最适合通信的,如果用12的话会有误差,12的晶振在波特率为4800且加倍时(即SMOD为1),误差会比较小,所以这也是我设置波特率为4800的原因,详细可以看一下下面这张图。
三、烧录出厂AT固件 刚接触8266模块的时候,有些地方不是很懂,一顿乱操作之后啥也没搞成,当时烧录了一个我也不知道有什么用的固件,然后经常傻傻的,有很多奇怪的情况,后来烧录了出厂固件功能就正常了,在这也写一下具体操作。
接线方面,如下图,主要是绿色那条,GPIO0接低电平时为下载模式。
电脑打开烧写软件
选中文件夹里面bin后缀的固件
按下图配置好,选择对应串口,点击START即可烧写
瞎说一些: • 本人小白一个,也有很多不懂的地方,说的可能不是很对 • 如想了解更多,链接: wiki.ai-thinker点com/esp8266 • 对于不会java和安卓开发之类的又想弄个小app来实现控制硬件的,可以去了解一下E4A,中文编程,软件里面有很多例程,例如客户端,服务器之类的例程,可以参考一下然后自己整一个app,这个比较容易上手,有兴趣的可以去学习一下。
全部资料51hei下载地址:
所有资料.zip
(14.59 MB, 下载次数: 1196)
|