esp8266引腳圖及功能
ESP8266特性
*802.11 b/g/n
*內(nèi)置低功耗32位CPU:可以兼作應(yīng)用處理器
*內(nèi)置TCP/IP協(xié)議棧
*內(nèi)置TR開關(guān)、balun、LNA、功率放大器和匹配網(wǎng)絡(luò)
*內(nèi)置PLL、穩(wěn)壓器和電源管理組件
*支持天線分集
*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設(shè)備)
*SDIO 2.0、(H) SPI、UART、I2C、I2S、IR Remote Control、PWM、GPIO
*深度睡眠保持電流為10 uA,關(guān)斷電流小于5 uA
*2 ms之內(nèi)喚醒、連接并傳遞數(shù)據(jù)包
*802.11b模式下+20 dBm的輸出功率
*待機狀態(tài)消耗功率小于1.0 mW (DTIM3)
*工作溫度范圍:-40°C - 125°C
*通過 FCC, CE, TELEC, WiFi Alliance 及 SRRC 認證
5V單片機與3.3V的ESP8266串口連接
ESP8266最小系統(tǒng)與單片機最小系統(tǒng)連接
在正常使用的時候,固件刷寫開關(guān)不需要打開,如果需要熱刷寫固件,可以考慮將刷寫固件的引腳與單片機的引腳相連。
ESP8266內(nèi)是一塊單片機,也可以通過模塊本身直接控制開關(guān),本文僅使用模塊的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];
//接收計數(shù)變量
u8 RX_num;
/**********預(yù)定義字符串**************/
//握手連接指令,返回“OK”
u8 code esp_at[]=“AT ”;
//設(shè)置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服務(wù)器,返回“Linked”
//192.168.0.149為服務(wù)器IP地址 6000為服務(wù)器端口號 不同電腦不同軟件可能會不一樣的
u8 code esp_cipsta[]=“AT+CIPSTART=”TCP“,”192.168.0.149“,6000 ”;
// 設(shè)置發(fā)送數(shù)據(jù)長度
u8 code esp_cipsend[]=“AT+CIPSEND=5 ”;
//設(shè)置多鏈接
u8 code esp_DuoLianjie []=“AT+CIPMUX=1 ”;
//設(shè)置端口號
u8 code esp_Port []=“AT+CIPSERVER=1,3122 ”;
//查詢模塊自身IP,返回IP地址
u8 code esp_IP []=“AT+CIFSR ”;
//服務(wù)器發(fā)送 握手數(shù)據(jù)
u8 code esp_Woshou []=“:test”;
//服務(wù)器發(fā)送 LED檢測數(shù)據(jù)
u8 code esp_test_LED []=“:LED”;
//服務(wù)器發(fā)送 打開LED
u8 code esp_LED_ON []=“:LED ON”;
//服務(wù)器發(fā)送 關(guān)閉LED
u8 code esp_LED_OFF []=“:LED OFF”;
//復(fù)位重啟
u8 code esp_Rst []=“AT+RST ”;
//發(fā)送數(shù)據(jù)長度
u8 code esp_DATA []=“AT+CIPSEND=1024 ”; 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
接下來是緩存字符串比較函數(shù),用于判斷返回值中是否含有OK等來自ESP8266模塊的工作標識。如需用到更復(fù)雜的匹配,可以將之替換為正則表達式引擎。
//指定字符串與緩存數(shù)組數(shù)據(jù)進行數(shù)據(jù)比較
//*p 要比較的指定字符串指針數(shù)據(jù)
//返回:1 數(shù)據(jù)一致 0 數(shù)據(jù)不一致
u8 Data_compare(u8 *p)
{
if(strstr(RX_buffer,p)!=NULL)
return 1;
else
return 0;
}12345678910
程序的變量已經(jīng)定義完,接下來是介紹主程序的部分。
(2)端口初始化
51單片機部分無需初始化端口,另一部分需要初始化端口才能使用:
//針對 IAP15W4K61S4 STC15W4K56S4 系列 IO口初始化
//io口初始化 P0 P1 P2 P3 P4 為準雙向IO口
//注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關(guān)的IO口均為
// 高阻態(tài),需將這些口設(shè)置為準雙向口或強推挽模式方可正常使用
//相關(guān)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位數(shù)據(jù),可變波特率
AUXR |= 0x04; //定時器2時鐘1為FOSC,即1T
T2L=(65536-(11059200/4/115200)); //設(shè)置定時初值
T2H=(65536-(11059200/4/115200))》》8; //設(shè)置定時初值
AUXR |= 0x10; //啟動定時器2
}
//串口2發(fā)送串口數(shù)據(jù)(字節(jié))
void Uart2SendByte(u8 ch)
{
S2BUF = ch; //寫數(shù)據(jù)到UART2數(shù)據(jù)寄存器
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
//串口2發(fā)送字符串
void Uart2SendStr(u8 *s)
{
IE2 = 0x00;
while (*s) //檢測字符串結(jié)束標志
{
Uart2SendByte(*s++); //發(fā)送當前字符
}
IE2 = 0x01;
}
//串口2中斷
void Uart2() interrupt 8 using 1
{
IE2 = 0x00; //關(guān)閉串口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
調(diào)用這一段代碼中的UartInit(void) 函數(shù)初始化串口。
全部初始化完畢后,就可以使用代碼對ESP8266配置了。
// 1 發(fā)送AT 進行握手
while(1)
{
Uart2SendStr(esp_at); //串口2對wifi模塊發(fā)送握手指令 即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);//清緩存數(shù)據(jù)
RX_num=0; //接收計數(shù)變量清0
// 2 配置wifi工作模式為SA模式
while(1)
{
Uart2SendStr(esp_cwmode); //串口2對wifi模塊工作模式進行設(shè)置
if(Data_compare(“OK”)||Data_compare(“no change”))break;
delay1ms(600);
}
memset(RX_buffer, 0, tbuf);//清緩存數(shù)據(jù)
RX_num=0; //接收計數(shù)變量清0
// 3 連接熱點wifi wifi名 密碼 如果失敗 延時繼續(xù)連接
while(1)
{
Uart2SendStr(esp_cwjap); //串口2發(fā)送 指點wifi名 密碼 等待模塊連接
if(Data_compare(“OK”))break;
delay1ms(3000);
}
memset(RX_buffer, 0, tbuf);//清緩存數(shù)據(jù)
RX_num=0; //接收計數(shù)變量清0
// 4 設(shè)置多鏈接
while(1)
{
Uart2SendStr(esp_DuoLianjie); //設(shè)置多鏈接
if(Data_compare(“OK”))break;
delay1ms(3000);
}
memset(RX_buffer, 0, tbuf);//清緩存數(shù)據(jù)
RX_num=0; //接收計數(shù)變量清0
// 5 設(shè)置端口號
while(1)
{
Uart2SendStr(esp_Port); //設(shè)置端口號
if(Data_compare(“OK”))
{
delay1ms(3000);
break;
}
delay1ms(3000);
}
Uart1SendStr(“OK,Succeed esp_Port ”);
memset(RX_buffer, 0, tbuf);//清緩存數(shù)據(jù)
RX_num=0; //接收計數(shù)變量清0
esp8266串口wifi實例
引腳連接:
GND:接地
GPIO16:其實是RST,低電平復(fù)位,所以為了正常工作,直接連接VCC即可
VCC:接3.3V,看過其他教程說不能接5V,不過小編有試過直接用5V來把玩,玩了一段時間都沒啥問題,可以正常使用。但是有個問題就是芯片很燙,所以用久了可能會燒壞模塊,而且wifi模塊一過熱,連接會很慢。所以,盡量用3.3V。
UTXD、URXD:前者接單片機或USB轉(zhuǎn)串口模塊的RXD,后者接TXD。這兩個可以和5V單片機的RXD、TXD連接,經(jīng)測試通信正常,無需5V轉(zhuǎn)3,3V
GPIO2、GPIO0:懸空
CH_PD:看一些教程說可以直接接VCC,但經(jīng)測試不行,電流太大了,所以要經(jīng)電阻連接到VCC,也就是串聯(lián)個電阻然后電阻再接到VCC,電阻的阻值:數(shù)k。小編用4.7k,其實這個沒什么嚴格限制
調(diào)試:
調(diào)試用的是USB轉(zhuǎn)串口模塊,根據(jù)上面的引腳連接配合面包板進行連接。然后就可以插電腦開串口助手來調(diào)試了。波特率的話得自己試,有可能是9600或115200,甚至是其他的。小編有一塊是9600一塊是115200。怎么試呢?在串口助手勾發(fā)送新行,然后發(fā)送AT+RST,如果先出現(xiàn)一堆亂碼最后帶個ready則說明試對了。然后說明該模塊正常是什么大問題了,還不放心的話還可以嘗試其他AT指令配合TCP調(diào)試工具來測試。
示例:
用單片機通過該模塊和上位機通信的例子(AP模式)
code uchar at_1[14]={‘A’,‘T’,‘+’,‘C’,‘I’,‘P’,‘M’,‘U’,‘X’,‘=’,‘1’,0x0D,0x0A,‘