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

2020-08-22 19:13发布

烧录固件

引脚连接

WiFi 51单片机 VCC 3.3V (5V连接时间过长可能会烧坏WiFi模块) GND GND CH_PD 3.3V GPIO0 GND UTXD TXD URXD RXD

烧录固件

  1. 打开烧录软件,选择配置选项卡,点击第二栏的小齿轮图标 - 加载固件地址
    777
  2. 点击其他选项的选择栏,取消选中,只选择第二个选项(固件地址)
    888
  3. 返回操作选项卡,选择正确COM端口,点击一键烧写
  4. 模块重新上电,下载开始,等待下载完成
    999

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

引脚连接

WiFi 51单片机 VCC 3.3V (5V连接时间过长可能会烧坏WiFi模块) GND GND CH_PD 3.3V UTXD TXD URXD RXD

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

AT常用指令

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

测试

发送指令:

AT

响应:OK

重启模块

发送命令:

AT+RST

响应 :OK

设置模块

发送指令:

AT+CWMODE =

说明:需重启后生效(AT+RST):1-Station模式,2-AP模式,3-AP兼Station模式。

响应:OK

配置AP参数

发送命令: 指令:AT+ CWSAP=,,,

说明:指令只有在AP模式开启后有效:字符串参数,接入点名称 :字符串参数,密码最长64字节,ASCII :通道号 :加密模式,0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK

示例:

AT+CWSAP=”TEST”,”123456123456”,1,3

响应:OK

开启多连接模式

发送命令:

AT+CIPMUX=

说明::0-单路连接模式,1-多路连接模式 响应:OK

创建服务器

发送命令:

AT+CIPSERVER=,

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

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

响应:OK

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

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

引脚连接

WiFi 51单片机 VCC 3.3V (5V连接时间过长可能会烧坏WiFi模块) GND GND CH_PD 3.3V UTXD RXD URXD TXD

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

实现代码

#include //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!= '') //字符串默认结尾'',以此来判断字符串的结束 
{ 
sendByte(*s);
s++; 
} 
} 

//初始化ESP8266WiFi模块 
void initEsp() 
{
uint a;
SCON= 0x50; //8位数据,可变波特率
TMOD= 0x20; //设置定时器1位16位自动重装模式
TL1= 0xfd; //设置定时器初值,波特率为9600
TH1= 0xfd;
ET1= 0; //禁止定时器1中断
TR1= 1; //启动定时器1
EA= 1; 

for (a=0;a<50000;a++); //延时几秒,让模块有时间启动 
sendString("AT+CWMODE=2 "); //设置为softAP和station共存模式 //WiFi热点不能通过代码设置,可使用串口助手进行设置,该设置断电不丢失 /* 
for (a=0; a<20000; a++); 
sendString("AT+CWSAP='TEST','12345678',1,3 "); //建立WiFi热点 */ 
for (a=0;a<50000;a++); 
sendString("AT+CIPMUX=1 "); //启动多连接 
for (a=0;a<20000a++); 
sendString("AT+CIPSERVER=1,333 ");//建立server,端口为333 
for (a=0;a<20000;a++); 
sendString("AT+CIPSTO=50 "); //服务器超时时间设置
RI=0;
ES=1; //初始化完成,串行口中断打开 } //主函数 

void main()
 { 
initEsp(); 
}

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

获取WiFi传输的数据

ESP8266WiFi模块作为TCP服务器接受来自客户端的信息前默认会加上

+IPD,n,:

这样的字符,处理时应注意。

实现代码

//获取数据,数据格式示例:+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]=''; 
for(i=0;i<2;i++) 
{
Minute[i]=Buffer[20+i]; 
}
Minute[2]=''; //将获取到的数据发送到串口助手上显示 
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()
interrupt4 { 
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; 
} 
}