燒錄固件
引腳連接配接
WiFi | 51單片機 |
---|---|
VCC | 3.3V (5V連接配接時間過長可能會燒壞WiFi子產品) |
GND | GND |
CH_PD | 3.3V |
GPIO0 | GND |
UTXD | TXD |
URXD | RXD |
燒錄固件
- 打開燒錄軟體,選擇配置頁籤,點選第二欄的小齒輪圖示 - 加載固件位址
- 點選其他選項的選擇欄,取消選中,隻選擇第二個選項(固件位址)
- 傳回操作頁籤,選擇正确COM端口,點選一鍵燒寫
- 子產品重新上電,下載下傳開始,等待下載下傳完成
序列槽助手測試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 = <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單片機 |
---|---|
VCC | 3.3V (5V連接配接時間過長可能會燒壞WiFi子產品) |
GND | GND |
CH_PD | 3.3V |
UTXD | RXD |
URXD | TXD |
注:此時連接配接狀态 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; //設定定時器初值,波特率為9600
TH1 = 0xfd;
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
EA = 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,端口為333
for (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;
}
}