700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 51单片机连接ESP8266串口WiFi模块

51单片机连接ESP8266串口WiFi模块

时间:2019-11-02 19:20:12

相关推荐

51单片机连接ESP8266串口WiFi模块

烧录固件

引脚连接

烧录固件

打开烧录软件,选择配置选项卡,点击第二栏的小齿轮图标 - 加载固件地址

点击其他选项的选择栏,取消选中,只选择第二个选项(固件地址)

返回操作选项卡,选择正确COM端口,点击一键烧写模块重新上电,下载开始,等待下载完成

串口助手测试ESP8266串口WiFi模块

引脚连接

注:此时连接状态 WiFi模块–>51单片机–>串口助手(PC),由于WiFi模块和单片机的TXD和RXD处于正接状态,单片机和WiFi模块并不通信,相当于WiFi模块直连串口助手。

AT常用指令

ESP8266串口WiFi模块分为三种工作模式:Station模式(类似无线终端),AP模式(提供无线接入服务),AP模式兼Station模式。

通过串口助手测试WiFi模块时,

测试

发送指令:AT

响应:OK

重启模块

发送命令:AT+RST

响应 :OK

设置模块

发送指令:AT+CWMODE = <mode>

说明:需重启后生效(AT+RST)

<mode>:1-Station模式,2-AP模式,3-AP兼Station模式。

响应:OK

配置AP参数

发送命令:

指令:AT+ CWSAP= <ssid>,<pwd>,<chl>, <ecn>

说明:指令只有在AP模式开启后有效

<ssid>:字符串参数,接入点名称 <pwd>:字符串参数,密码最长64字节,ASCII<chl>:通道号 <ecn>:加密模式,0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK

示例:AT+CWSAP=”TEST”,”123456123456”,1,3

响应:OK

开启多连接模式

发送命令:AT+CIPMUX=<mode>

说明:<mode>:0-单路连接模式,1-多路连接模式

响应:OK

创建服务器

发送命令:AT+CIPSERVER=<mode>,<port>

说明:AT+ CIPMUX=1时才能开启服务器;关闭server模式需要重启。开启server后自动建立server监听,当有client接入会自动按顺序占用一个连接。

<mode>:0-关闭server模式,1-开启server模式 <port>:端口号,缺省值为333

响应:OK

通过51单片机初始化WiFi模块

通过串口助手测试AT指令可以发现,部分AT指令断电不会保存,因此需要在代码中进行初始化设置。

引脚连接

注:此时连接状态 WiFi模块–>51单片机–>串口助手(PC),由于WiFi模块和单片机的TXD和RXD处于反接状态,单片机和WiFi模块可以进行串口通信。

实现代码

#include<reg52.h>//51单片机常用的头文件#define uchar unsigned char//宏定义一个无符号的char类型#define uint unsigned int//宏定义一个无符号的int类型//发送一字节void sendByte(uchar b){SBUF = b;while(!TI);TI=0;}//发送字符串void sendString(uchar *s){while(*s != '\0')//字符串默认结尾'\0',以此来判断字符串的结束{sendByte(*s);s++;}}//初始化ESP8266WiFi模块void initEsp(){uint a;SCON = 0x50; //8位数据,可变波特率TMOD = 0x20; //设置定时器1位16位自动重装模式TL1 = 0xfd;//设置定时器初值,波特率为9600TH1 = 0xfd;ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1EA = 1;for (a=0; a<50000; a++);//延时几秒,让模块有时间启动sendString("AT+CWMODE=2\n");//设置为softAP和station共存模式//WiFi热点不能通过代码设置,可使用串口助手进行设置,该设置断电不丢失/*for (a=0; a<20000; a++);sendString("AT+CWSAP='TEST','12345678',1,3\n"); //建立WiFi热点*/for (a=0; a<50000; a++); sendString("AT+CIPMUX=1\n"); //启动多连接for (a=0; a<20000; a++);sendString("AT+CIPSERVER=1,333\n");//建立server,端口为333for (a=0; a<20000; a++);sendString("AT+CIPSTO=50\n");//服务器超时时间设置RI=0;ES=1; //初始化完成,串行口中断打开}//主函数 void main() {initEsp();}

注:代码中波特率应和串口助手的波特率相符,且部分AT命令如重启模块,设置WiFi热点等指令无法使用。

获取WiFi传输的数据

ESP8266WiFi模块作为TCP服务器接受来自客户端的信息前默认会加上+IPD,n,<string.length>:这样的字符,处理时应注意。

实现代码

//获取数据,数据格式示例:+IPD,0,14:"time":"11:11"void getData(){uint a;if(receiveFlag){for(i=0; i<2; i++){Hour[i]=Buffer[17+i];}Hour[2]='\0';for(i=0; i<2; i++){Minute[i]=Buffer[20+i];}Minute[2]='\0';//将获取到的数据发送到串口助手上显示for (a=0; a<10000; a++);//需要延时,负责会造成数据错乱导致丢包sendString(Hour);for (a=0; a<10000; a++);sendString(Minute);receiveFlag=0;count=0;for(i=0; i<22; i++){Buffer[i]=0;}}}//主函数void main(){initEsp();//初始化WiFi模块receiveFlag = 0;//receiveFlag判断执行getData() 的标志count = 0;//count缓冲区RXDdata[count]的索引 while(1){getData();}}//利用中断接收信息,且舍弃无效信息void uart() interrupt 4 {if(RI == 1){ES = 0;//关闭串行中断RI = 0;//清除串口接收标志位temp = SBUF; //从串口缓冲区取得数据if(count<20)//满足需接收的信息长度,将数据存入缓冲区{Buffer[count]=temp;count++;if(Buffer[0]=='+') //判断是否为无效数据,由于WiFi模块会自动加上"+PID.."开头的字符串{receiveFlag = 1; }else{receiveFlag = 0;count = 0;}} ES = 1; }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。