基于8266WIFI模块实现智能手机与51单片机的通信入门

2019-04-15 18:45发布

1  芯片及电路的介绍

1.1  8266WIFI模块

      在文章的最开始我们首先要介绍今天的主角,8266WIFI模块。这是一个非常好用的模块,其他的废话不在多说,我们直接上干货.                                             这是一张我从百度上盗的一张8266WIFI模块的原理图,虽然8个引脚看着很复杂,但实际上我们只会用到最多五个引脚(1.VCC 2.GND 3.UTXD 4.URXD 5.CH_PD)。为什么说最多用到五个引脚呢,因为我在网上查资料的时候很多人只是用到了四个引脚,并没有使用CH_PD这个引脚,但是具体是什么原因呢,我们在这个入门篇就不进行深入的讨论了。咱们只要记住,如果只接了四个引脚不行的话那么我们就考虑一下接五个引脚。       下面我们来说一下五个引脚是如何连接的。首先电源和接地是必须要连的,VCC引脚接3V左右的电源,GND接地,UTXD接单片机的RXD,URXD接单片机的TXD,CH_PD引脚也需要接3V的电源(有的人不需要接也可以工作,但是我的那个模块不行)。这里要说明一下,我们51单片机的工作电压为5V,而8266WIFI模块的工作电压为3V,如果8266WIFI模块也接到5V的电源的话很有可能会烧坏,这里我们需要注意一下。还有在实际的操作时有一个参考电压的问题,在下文我们在详细讲解。下边一张又丑又简单的接线图送给大家。                                                             说完了接线之后我们还需要了解一下关于8266WIFI模块的AT指令,如何让8266WIFI模块工作,这是单片机驱动8266WIFI模块过程中一个必须要了解的问题(敲黑板,划重点了)。8266WIFI模块的AT指令有很多,但是我们用到的其实也就只有那么几个,下边我们来一一介绍。       1、AT+CIOBAUD=4800——这是改变波特率的指令这是非常重要的一个指令,我们买来的8266WIFI模块大多数的波特率都是115200(我买的那个就是),而单片机达不到这么高的波特率,所以我们要做的第一步就是设置波特率。当然了,波特率的设置必须是要在电脑上完成的,我用的软件是安可信串口调试助手这个软件,用这个软件的时候我们要记得把波特率调到115200才可以进行通信,如果各位买到的8266WIFI模块在115200这个波特率下无法与电脑实现通信,那么就需要联系一下卖家了。     2、AT+CWMODE=2——这是模式设定指令,8266WIFI模块有三种工作模式,AT+CWMODE=1为Station模式,AT+CWMODE=2为AP模式,AT+CWMODE=3为Station+AP模式。那么什么是Station模式呢,说白了就是这个WIFI模块可以连接别的WIFI信号,这个模式在我们这一次的设计中应用的不多,所以我们就先不做详细的讲解。AP模式是我们要讲解的重点,AP模式也就是我们可以发射WIFI信号,别的手机呀电脑呀可以连接我们的8266WIFI模块。那Station+AP模式大家就了然于胸了吧,也就是我们既可以连接别的WIFI信号又可以发送信号让别人连,但是由于固件的原因,我们并不能实现8266WIFI模块连接了别的有网的WIFI信号后,有手机在连接8266WIFI模块后手机就可以上网了,这个功能是不能实现的,这段话看着挺绕的,实际上就是8266WIFI模块不能做WIFI网络的信号中继器(具体叫什么功能我也不太清楚,大概就是这个意思吧,哈哈,这不是重点)。实际上在今后的开发中,由于云服务器的存在,我们需要用到Station+AP模式的次数还是很多的。在这个入门设计中我们先不说,大家可以关注我们博客,我还会发别的设计讲解的。       3、AT+CWSAP="名称",“密码”,通道,加密方式——这一指令就是设置WIFI信号名称和密码还有加密方式的一个指令,通道可以设置成3,加密方式建议设置成4,因为某米手机的某些原因导致其他加密方式连不上WIFI信号,这是我在实验过程中遇到的问题,不知道别人是否也遇到过这样的问题。我再来说一下加密方式的数字都代表了什么意思,0是没有密码的意思,1是WEP加密方式,2是WPA_PSK加密方式,3是WPA2_PSK加密方式,4是WPA_WPA2_PSK加密方式。       4、AT+CIPMUX=1——这个指令为设置多路,如果1变为零的话就是设置单路,但是我们在这里必须要设置为多路才能进行以后的工作。       5、AT+CIPSERVER=1,8080——这个指令是设置为服务器模式,数字1代表着开始,数字8080代表着端口号,这个数字可以随便设置,但是为了防止和电脑系统中其他程序的端口冲突我们还是建议设置成大一些的数字。       我们在单片机驱动8266WIFI模块的程序中基本上就只用到了这几个指令,其他指令我们不在多说。有一点我们要特别注意,第一条指令和第三条指令需要在电脑上完成。还有一点很重要,就是WIFI模块断电后第4条指令和第5条指令需要重新设置,所以我们在单片机程序编写的时候要进行编写。

1.2 51单片机

      我用的51单片机是STM公司出的单片机,这款单片机有一个好处就是可以直接从RXD和TXD引脚直接进行通信,最小系统的构建相对来说比较简单,只涉及到了晶振电路、复位电路以及EA/VPP端的高电平。下面我们直接上图,哈哈,原理图非常简单,我就又盗了一张,大家将就着看。       这张原理图基本上已经是比较全的了,不过我在EA/VPP端接高电平的时候还加了一个10K欧姆的电阻进行限流。在这张原理图中,我们需要注意的就是晶振电路一定要有,不过这都是常识了,没有晶振单片机就不工作啦。其实单片机我们在学校的学习中已经是非常的熟悉了。在本设计中,对于单片机的知识也就只涉及到了中断、波特率的设置、IO口的输出还有RXD端口和TXD端口的数据读写。就这些知识点而言可以说是非常简单了,任何一本教科书都有讲解。

2  软件编写

2.1 单片机软件编写

      废话不多说,直接上程序。这是一个非常简单的测试程序,可以直接跑通。在这个程序里有一点要注意,就是单片机波特率的设置问题。 #include #include sbit L1 = P1^0; sbit kaiguan = P3^4; sbit L2 = P1^1; sbit L3 = P1^2; sbit L4 = P1^3; sbit L5 = P1^4; sbit L6 = P1^5; sbit L7 = P1^6; sbit L8 = P1^7; unsigned char Usart_Receive[20]={0}; unsigned char Usart_Cnt=0; bit Usart_AT_flage; unsigned char code RST[]="AT+RST ";  unsigned char code CWMODE2[]="AT+CWMODE=2 "; unsigned char code CIPMUX[]="AT+CIPMUX=1 "; unsigned char code CIFSR[]="AT+CIFSR "; unsigned char code CIPSERVER[]="AT+CIPSERVER=1,8080 "; /**********************************************************/ void delay_ms(unsigned long t) { unsigned int x,y; for(x=t;x>0;x--) { for(y=110;y>0;y--) { } } } /**********************************************************/ void delays(void) { unsigned char a,b,c; for(c=95;c>0;c--) { for (b=26;b>0;b--) { for (a=185;a>0;a--) { } } } } /***************中断设置***********************************/ void InitUART(void) { TMOD=0x20; SCON=0x50; /***************波特率设置*********************************/ TH1=0xFA; TL1=TH1; PCON=0x00; EA=1; ES=1; TR1=1; } /*************发送数据***************************************/ void Send_Uart(unsigned char value) { ES=0; TI=0; SBUF=value; while(TI==0); TI=0; ES=1; } /*************接受数据***************************************/ void UARTInterrupt(void)interrupt 4 { if(RI) { RI=0; Usart_Receive[Usart_Cnt]=SBUF; Usart_Cnt++; if(Usart_Receive[Usart_Cnt-2]==' '&&Usart_Receive[Usart_Cnt-1]==' '&&Usart_Cnt>=2) { Usart_Cnt=0; Usart_AT_flage=1; } else if(Usart_Cnt>20) { Usart_Cnt=0; } } } /*****************发送设置**********************************/ void ESP8266_Set(unsigned char *puf) {     while(*puf!='