51单片机通过ESP8266模块与手机进行通讯(单片机)

相关连接和资料下载:

个人博客

资料下载

Step1:配置ESP8266

通过USB转TTL模块把ESP8266模块和电脑连接起来,如图:

把ESP8266模块的VCC,GND,CH_PD,UTXD,URXD口分别接USB转TTL模块的3.3v,地,3.3v,RXD,TXD

连接好后,就准备用电脑用串口调试助手向ESP8266发送AT指令。

串口调试助手下载地址:百度云盘 

设置好串口调试助手的串口和波特率,ESP8266默认波特率为115200,把串口调试助手的波特率调为115200,勾选左下角的发送新行。在输入框中输入 AT+RST 然后点击发送:

如果前面的配置都没错的话,串口调试助手会接收到esp8266返回的信息,AT+RST是复位命令,ESP8266会返回一堆乱码,这时候就说明ESP8266配置成功了。

配置好ESP8266之后就可以更改模块的信息了,按照以下顺序向模块发送AT指令:

AT+CWMODE=2

AT+CWSAP="esp8266","0123456789",11,3     //更改wifi名称,名字最好不要乱改,有些特别的名字是显示不出来的。

AT+RST             //配置完AT+CWMODE要重启以下模块使配置生效

AT+CIPMUX=1

AT+CIPSERVER=1,8080               //8080为端口号,之后手机和单片机进行通讯要用到,可以自己修改。

前面三条绿色的指令配置一次就够了,断电重连配置的信息也不会改变,后面两条红色的指令要每次重启模块之后都要配置一遍。

按顺序配置完之后就可以用手机进行连接,如果手机发现wifi并且输入密码成功连接了,就证明上面的配置成功了。

下载手机网络调试助手:手机网络调试助手

打开手机网络调试助手,把协议类型设置为"TCP Client",IP地址设置为用AT+CIFSR指令查询到的ESP8266的IP,端口号就是前面设置的端口号。

配置好之后点连接(手机要连接好ESP8266的wifi),然后输入任意信息(如:123),点击发送。和ESP8266连接的电脑上的串口调试助手就会收到信息:+IPD,0,3:123(不同的ESP8266收到信息的格式可能会不同)从左到右的数字中,0是代表客户的索引,3是代表收到信息的大小,至于是字节数还是什么的就不清楚了,冒号后面是收到的信息,到时候把ESP8266连接到单片机上面的时候,单片机收到的和电脑一样的字符串,我们需要编写程序解析字符串,把其中需要的信息提取出来(如:+IPD,0,3:123,把123提取出来,单片机就可以得知手机发送了123,就可以在程序里面进行对应的动作)

Step2:连接单片机和ESP8266

上面的配置只是电脑和ESP8266的连接,确保ESP8266运行正常,现在要进行单片机和ESP8266的连接了。

因为51单片机通讯的波特率为9600,所以ESP8266要与单片机进行连接通讯,就要先用电脑吧ESP8266的波特率设置为9600;

AT+CIOBAUD=9600    发送一下指令就可以设置ESP8266波特率为9600了,AT+RST重启一下ESP8266,不要忘了把电脑串口调试助手的波特率也改为9600了,不然电脑连接ESP8266就会出现错误的了。

之前说过ESP8266有些指令配置一次就可以,有些重启之后要重新配置,这些指令是下面这两条:

AT+CIPMUX=1

AT+CIPSERVER=1,8080               //8080为端口号,之后手机和单片机进行通讯要用到,可以自己修改。

这些指令之前是用电脑给ESP8266发送的,但现在ESP8266和单片机连接起来的,这时要用单片机向ESP8266发送AT指令了。

在单片机程序中加入以下代码:

 1 void connect_init()
 2 {
 3     char *a="AT+CIPMUX=1
";
 4     char *b="AT+CIPSERVER=1,8080
";
 5     while(*a!='')
 6     {
 7         SBUF=*a;      //写入要发送的字符
 8         while(!TI);    //等待发送完成
 9         TI=0;          //发送
10         a++;
11     }
12     //这里添加延时函数,延时5ms左右,给ESP8266反应时间
13     while(*b!='')
14     {
15         SBUF=*b;  
16  
17         while(!TI);    //等待发送完成
18         TI=0;
19         b++;
20     }
21 }

在程序的开头,配置串口连接函数的后面加入上面的代码,就可以让单片机每次开机的时候都向ESP8266发送一次指令,如果不会配置单片机串口的话,就百度一下教程,配置串口中断是51单片机基础的知识,这里就不多说了。

烧录好程序之后,然后把ESP8266模块和单片机连接起来,接线方式跟之前的差不多,VCC,GND,CH_PD,UTXD,URXD口分别接3.3v,地,3.3v,单片机芯片的RXD,单片机芯片的TXD,其中,要和单片机共地。

确保连接好ESP8266和烧录好程序,复位一下单片机,此时单片机应该向ESP8266完成发送AT指令了,打开手机的wifi,是否能连接上模块发出的wifi

热点,如果能连接上,证明单片机发送AT指令进行初始化的代码块没问题,如果失败了,检查一下连线和程序是否有问题。

 现在已经完成了单片机与ESP8266的连接与初始化了,之后就进行对ESP8266向单片机发送的信息的解析。

 1 void Uart() interrupt 4
 2 {
 3     char res;
 4     res=SBUF;         //取出接受到的数据
 5     RI=0;              //清除接受中断标志位
 6     if(res==':'||i>0)    //i是全局变量
 7     {
 8         receive[i]=res;   //receive数组也是全局变量
 9         i++;
10         if(res=='
')
11         {
12             i=0;
13             //添加对收到信息的处理代码
14             memset(receive,0,50);
15         }
16     }
17 }

因为单片机每产生一次串口中断,只是接收一个字符,单片机要接收+IPD,0,3:123的话,就会产生多次中断,单片机的中断程序里面就要进行对收到的信息进行筛选和提取。上面代码中 if(res==':'||i>0)  目的是排除掉+IPD,0,3 我不需要用的信息,然后i>0是确保之后程序能运行到if里面, 之后if(res==' ')就是判断ESP8266发送完成一条信息没有,进入if(res==' ')里面之后此时数组里面的信息是:123,然后就可以添加相关的处理函数了(如:LED=0),处理完之后要调用memset(receive,0,50);把数组清空,以便下次使用。

把程序向单片机进行烧录,连接好ESP8266(连接着ESP8266的时候烧录会失败,应该拔下ESP8266的TX和RX端),复位单片机,然后用手机连接上wifi,打开手机网络调试助手,发送自己设定好的信息,看看单片机有没做出对应的处理(如:LED从灭到亮),成功的话就可以在原先的程序上加上自己项目需要的代码就可以进行手机操控单片机了。

原文地址:https://www.cnblogs.com/qimi/p/qimi_scm_esp8266.html