esp8266引脚图及功能
ESP8266特性
*802.11 b/g/n
*内置TCP/IP协议栈
*内置PLL、稳压器和电源管理组件
*支持天线分集
*STBC、1x1 MIMO、2x1 MIMO
*A-MPDU、A-MSDU的聚合和0.4 s的保护间隔
*WiFi @ 2.4 GHz,支持 WPA/WPA2 安全模式
*支持STA/AP/STA+AP工作模式
*支持Smart Config功能(包括Android和iOS设备)
*SDIO 2.0、(H) SPI、UART、I2C、I2S、IR Remote Control、PWM、GPIO
*深度睡眠保持电流为10 uA,关断电流小于5 uA
*2 ms之内唤醒、连接并传递数据包
*802.11b模式下+20 dBm的输出功率
*待机状态消耗功率小于1.0 mW (DTIM3)
*工作温度范围:-40°C - 125°C
*通过 FCC, CE, TELEC, WiFi Alliance 及 SRRC 认证
5V单片机与3.3V的ESP8266串口连接
ESP8266最小系统与单片机最小系统连接
在正常使用的时候,固件刷写开关不需要打开,如果需要热刷写固件,可以考虑将刷写固件的引脚与单片机的引脚相连。
ESP8266内是一块单片机,也可以通过模块本身直接控制开关,本文仅使用模块的TCP透传功能,这里不再展开。
单片机程序编写
(1)首先定义如下变量/常量:
/**********类型定义**************/
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define code const
/***********IO定义***************/
//定义P5.5口 LED指示灯
sbit LED=P2^4;
/**********缓存变量**************/
//串口接受缓存
u8 xdata RX_buffer[tbuf];
//接收计数变量
u8 RX_num;
/**********预定义字符串**************/
//握手连接指令,返回“OK”
u8 code esp_at[]=“AT ”;
//设置ESP8266的工作模式1 Station,返回“OK”或者“no change”
u8 code esp_cwmode[]=“AT+CWMODE=1 ”;
//连接到WiFi热点或无线路由上,NXP为无线路由名称,12345678为密码;连接成功返回“OK”
u8 code esp_cwjap[]=“AT+CWJAP=”NXP“,”123456789“ ”;
//本机IP地址查询指令
u8 code esp_cifsr[]=“AT+CIFSR ”;
//连接到TCP服务器,返回“Linked”
//192.168.0.149为服务器IP地址 6000为服务器端口号 不同电脑不同软件可能会不一样的
u8 code esp_cipsta[]=“AT+CIPSTART=”TCP“,”192.168.0.149“,6000 ”;
// 设置发送数据长度
u8 code esp_cipsend[]=“AT+CIPSEND=5 ”;
//设置多链接
u8 code esp_DuoLianjie []=“AT+CIPMUX=1 ”;
//设置端口号
u8 code esp_Port []=“AT+CIPSERVER=1,3122 ”;
//查询模块自身IP,返回IP地址
u8 code esp_IP []=“AT+CIFSR ”;
//服务器发送 握手数据
u8 code esp_Woshou []=“:test”;
//服务器发送 LED检测数据
u8 code esp_test_LED []=“:LED”;
//服务器发送 打开LED
u8 code esp_LED_ON []=“:LED ON”;
//服务器发送 关闭LED
u8 code esp_LED_OFF []=“:LED OFF”;
//复位重启
u8 code esp_Rst []=“AT+RST ”;
//发送数据长度
u8 code esp_DATA []=“AT+CIPSEND=1024 ”; 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
接下来是缓存字符串比较函数,用于判断返回值中是否含有OK等来自ESP8266模块的工作标识。如需用到更复杂的匹配,可以将之替换为正则表达式引擎。
//指定字符串与缓存数组数据进行数据比较
//*p 要比较的指定字符串指针数据
//返回:1 数据一致 0 数据不一致
u8 Data_compare(u8 *p)
{
if(strstr(RX_buffer,p)!=NULL)
return 1;
else
return 0;
}12345678910
程序的变量已经定义完,接下来是介绍主程序的部分。
(2)端口初始化
51单片机部分无需初始化端口,另一部分需要初始化端口才能使用:
//针对 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化
//io口初始化 P0 P1 P2 P3 P4 为准双向IO口
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
void IO_init(void)
{
P0M0 = 0X00;
P0M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P3M0 = 0X00;
P3M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
}1234567891011121314151617181920212223
串口配置及中断配置:
void UartInit(void)
{
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟1为FOSC,即1T
T2L=(65536-(11059200/4/115200)); //设置定时初值
T2H=(65536-(11059200/4/115200))》》8; //设置定时初值
AUXR |= 0x10; //启动定时器2
}
//串口2发送串口数据(字节)
void Uart2SendByte(u8 ch)
{
S2BUF = ch; //写数据到UART2数据寄存器
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
//串口2发送字符串
void Uart2SendStr(u8 *s)
{
IE2 = 0x00;
while (*s) //检测字符串结束标志
{
Uart2SendByte(*s++); //发送当前字符
}
IE2 = 0x01;
}
//串口2中断
void Uart2() interrupt 8 using 1
{
IE2 = 0x00; //关闭串口2中断
if (S2CON & S2RI)
{
S2CON &= ~S2RI;
RX_buffer[RX_num] = S2BUF;
RX_num++;
if(RX_num》tbuf) RX_num = 0;
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI;
}
IE2 = 0x01; //开启串口2中断
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
调用这一段代码中的UartInit(void) 函数初始化串口。
全部初始化完毕后,就可以使用代码对ESP8266配置了。
// 1 发送AT 进行握手
while(1)
{
Uart2SendStr(esp_at); //串口2对wifi模块发送握手指令 即AT
if(Data_compare(“OK”))break;
else Uart1SendStr(“ERROR1,some problems with ESP8266 ”);
delay1ms(600);
}
Uart1SendStr(“OK,mcu connection success with ESP8266! ”);
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
// 2 配置wifi工作模式为SA模式
while(1)
{
Uart2SendStr(esp_cwmode); //串口2对wifi模块工作模式进行设置
if(Data_compare(“OK”)||Data_compare(“no change”))break;
delay1ms(600);
}
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
// 3 连接热点wifi wifi名 密码 如果失败 延时继续连接
while(1)
{
Uart2SendStr(esp_cwjap); //串口2发送 指点wifi名 密码 等待模块连接
if(Data_compare(“OK”))break;
delay1ms(3000);
}
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
// 4 设置多链接
while(1)
{
Uart2SendStr(esp_DuoLianjie); //设置多链接
if(Data_compare(“OK”))break;
delay1ms(3000);
}
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
// 5 设置端口号
while(1)
{
Uart2SendStr(esp_Port); //设置端口号
if(Data_compare(“OK”))
{
delay1ms(3000);
break;
}
delay1ms(3000);
}
Uart1SendStr(“OK,Succeed esp_Port ”);
memset(RX_buffer, 0, tbuf);//清缓存数据
RX_num=0; //接收计数变量清0
esp8266串口wifi实例
引脚连接:
GND:接地
GPIO16:其实是RST,低电平复位,所以为了正常工作,直接连接VCC即可
VCC:接3.3V,看过其他教程说不能接5V,不过小编有试过直接用5V来把玩,玩了一段时间都没啥问题,可以正常使用。但是有个问题就是芯片很烫,所以用久了可能会烧坏模块,而且wifi模块一过热,连接会很慢。所以,尽量用3.3V。
UTXD、URXD:前者接单片机或USB转串口模块的RXD,后者接TXD。这两个可以和5V单片机的RXD、TXD连接,经测试通信正常,无需5V转3,3V
GPIO2、GPIO0:悬空
CH_PD:看一些教程说可以直接接VCC,但经测试不行,电流太大了,所以要经电阻连接到VCC,也就是串联个电阻然后电阻再接到VCC,电阻的阻值:数k。小编用4.7k,其实这个没什么严格限制
调试:
调试用的是USB转串口模块,根据上面的引脚连接配合面包板进行连接。然后就可以插电脑开串口助手来调试了。波特率的话得自己试,有可能是9600或115200,甚至是其他的。小编有一块是9600一块是115200。怎么试呢?在串口助手勾发送新行,然后发送AT+RST,如果先出现一堆乱码最后带个ready则说明试对了。然后说明该模块正常是什么大问题了,还不放心的话还可以尝试其他AT指令配合TCP调试工具来测试。
示例:
用单片机通过该模块和上位机通信的例子(AP模式)
code uchar at_1[14]={‘A’,‘T’,‘+’,‘C’,‘I’,‘P’,‘M’,‘U’,‘X’,‘=’,‘1’,0x0D,0x0A,‘ ’};
code uchar at_2[17]={‘A’,‘T’,‘+’,‘C’,‘I’,‘P’,‘S’,‘E’,‘R’,‘V’,‘E’,‘R’,‘=’,‘1’,0x0D,0x0A,‘ ’};
经过上一步的调试,测试后觉得该模块没问题,就可以直接根据引脚连接和单片机连接了。
在单片机的初始化程序中要发这两个字符串到wifi模块,先发at_1[14],延时100ms,再发at_2[17]。当然不一定要在初始化程序中发这两串,也可以在按键中断中发送,需要建立连接的时候按下按键行了。
这两个AT指令就当做是在创建连接就行。发送完这两句之后就可以用上位机连接wifi模块了。
wifi模块的IP为:192.168.4.1 端口号:333 ;
ESP8266的出产设置都这个IP和端口,一般不会出错。如果不放心
可以用串口调试发AT+CIFSR=? ,会返回模块的IP和端口号。
PS:后面的0x0d,0x0a相当于发送新行的功能,不加的话AT指令无效!
做完这几步就可以和上位机进行wifi连接了!
注意:关于单片机接收来自上位机的字符串,由于wifi会自动在接收的内容前面自动加“+IPD,x,x:“的字符,所以接收的时候记得加个判断,截掉”:“前面的字符,留下后面的就是来自上位机的内容了。
补:常用的几个AT指令
AT+CWMODE=3 :STA+AP模式
AT+RST :复位
AT+CIPMUX=1 :多连接
AT+CIPSERVER=1 :建立服务器
AT+CIFSR :查询模块IP端口
AT+CIPSERVER=1,6000 :建立服务器的同时顺便设端口号
AT+CIPMUX=0 :单连接
AT+CIPSEND=0,1 :向连接序号为0的连接发1个字节