×
单片机 > 单片机程序设计 > 详情

ESP8266 wifi模块与51单片机通信入门教程,模块出厂固件烧录

发布时间:2020-08-27 发布时间:
|

前段时间在某宝买了个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=,,,(设置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

#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,这个比较容易上手,有兴趣的可以去学习一下。





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机中RC电容触摸的感应原理解析