前段时间在某宝买了个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]!='')
{
send(a[j]);
j++;
}
j=0; //清零准备发第二条指令
delay1s(); //延时一下
while(b[j]!='')
{
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,这个比较容易上手,有兴趣的可以去学习一下。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』