天天看點

51單片機連接配接ESP8266序列槽WiFi子產品

燒錄固件

引腳連接配接

WiFi 51單片機
VCC 3.3V (5V連接配接時間過長可能會燒壞WiFi子產品)
GND GND
CH_PD 3.3V
GPIO0 GND
UTXD TXD
URXD RXD

燒錄固件

  1. 打開燒錄軟體,選擇配置頁籤,點選第二欄的小齒輪圖示 - 加載固件位址
    51單片機連接配接ESP8266序列槽WiFi子產品
  2. 點選其他選項的選擇欄,取消選中,隻選擇第二個選項(固件位址)
    51單片機連接配接ESP8266序列槽WiFi子產品
  3. 傳回操作頁籤,選擇正确COM端口,點選一鍵燒寫
  4. 子產品重新上電,下載下傳開始,等待下載下傳完成
    51單片機連接配接ESP8266序列槽WiFi子產品

序列槽助手測試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; 
  }
}
           

繼續閱讀