借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信。


一、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信原理分析。

 通過給單片機編寫串口通信函數(用來實現單片機與ESP8266 WiFi模塊(ESP8266-01S芯片)通信)、激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能的AT命令函數(用來把ESP8266 WiFi模塊(ESP8266-01S芯片)設置成具有端口號能發射WiFi的服務器端)和實現功能函數(用來給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)控制單片機去點亮熄滅LED燈或操作單片機上的硬件給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)發送單片機程序所編好的信息),並把這些單片機函數燒入單片機。先讓Android手機連上ESP8266 WiFi模塊(ESP8266-01S芯片)發射出的WiFi,通過查看Android手機連上ESP8266 WiFi模塊(ESP8266-01S芯片)所發射出WiFi的相關信息,可以獲取ESP8266 WiFi模塊(ESP8266-01S芯片)所發射出WiFi的IP地址和端口號。然后在Android手機上的有人網絡調試助手(或Android手機網絡調試助手)服務器端(tcp server)界面輸入ESP8266 WiFi模塊(ESP8266-01S芯片)所發射出WiFi的端口號,用來激活ESP8266 WiFi模塊(ESP8266-01S芯片)所設置的端口。再切換到Android手機上的有人網絡調試助手(或Android手機網絡調試助手)客戶端(tcp client )界面,在該界面下輸入ESP8266 WiFi模塊(ESP8266-01S芯片)所發射WiFi的IP地址和端口,點擊增加,讓Android手機上的有人網絡調試助手(或Android手機網絡調試助手)連接上ESP8266 WiFi模塊(ESP8266-01S芯片)所發射出的WiFi。當Android手機上的有人網絡調試助手(或Android手機網絡調試助手)客戶端(tcp client )連接ESP8266 WiFi模塊(ESP8266-01S芯片)發射出的WiFi成功后,可在Android手機上的有人網絡調試助手(或Android手機網絡調試助手)客戶端(tcp client )界面輸入框輸入控制信息,經ESP8266 WiFi模塊(ESP8266-01S芯片)接收后,再傳送給單片機來控制單片機去點亮熄滅LED燈,也可在操作單片機上的硬件給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)客戶端(tcp client )界面發送單片機程序所編好的信息,經ESP8266 WiFi模塊(ESP8266-01S芯片)接收后,再傳送給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)客戶端(tcp client )接收,從而實現Android手機上的有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信。

二、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信接線圖。

三、給單片機編寫串口通信函數(用來實現單片機與ESP8266 WiFi模塊(ESP8266-01S芯片)通信)、激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能的AT命令函數(用來把ESP8266 WiFi模塊(ESP8266-01S芯片)設置成具有端口號能發射WiFi的服務器端)和實現功能函數(用來給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)控制單片機去點亮熄滅LED燈或操作單片機上的硬件給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)發送單片機程序所編好的數據)。

1、單片機與ESP8266 WiFi模塊(ESP8266-01S芯片)通信的串口通信程序

  void UART_Init(void)//單片機串口初始化函數
{  
   TMOD=0x20;//0010 0000定時器工作方式為方式2,8位自動重裝。
   TH1=0xfd;//初始化計數器高8位:1111 1101
   TL1=0xfd;//初始化計數器低8位
   TR1=1;//啟動定時器1
   SM0=0;//設定串口工作方式為方式1(10位異步通信)
   SM1=1;//設定串口工作方式
   REN=1;//打開串口中斷接收允許
   EA=1;//打開全局中斷
   ES=1;//打開串口中斷允許位
  }
  void UART_Interrupt() interrupt 4//單片機串口中斷函數         
{   
   static char i=0; 
   if(RI==1)//判斷串口接收中斷標志位是否為1,若串口接收中斷標志位為1,表示單片機接收數據緩存寄存器接收數據結束。  
 {  
    ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某設備獲取的數據結束后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序,形成固定循環,導致無法運行其他程序。
    RI=0;//表示單片機接收數據緩存寄存器可重新接收數據,不可申請串口中斷。         
    Recive_table[i]=SBUF;//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據賦給數組變量Recive_table[]       
    i++; 
    if((Recive_table[i-1] == '\n'))//判斷單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據是否有換行。
  { 
     Recive_table[i]='\0';//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據在i這個位置結束。
     i=0; 
     reciveflag = 1;//接收標志位變量置1
    }
    ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。      
  }
   else
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。     
 } 

2、激活ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi功能的AT命令程序

void WiFi_Init(void)//ESP8266 WiFi模塊發射WiFi初始化函數,相當於在PC端串口調試助手軟件界面輸入激活ESP8266 WiFi模塊發射WiFi的AT指令這一過程。
{
   ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束后,TI(即串口發送中斷標志位)=1,若ES不設置為0,在TI(即串口發送中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行串口中斷服務程序。
   TI = 1;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可給PC端串口調試助手發送數據結束,申請串口中斷。
   printf("AT+RST\r\n");//復位ESP8266 WiFi模塊(ESP8266-01S芯片)
   LED();
   Delay(1000) ;
   printf("AT+CWMODE=3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置工作模式,指令AT+CWMODE=<mode>,其中<mode>:1:Station模式(充當客戶端,用來連接其他無線網絡熱點。),2:AP模式(充當服務器,用來發射無線網絡熱點,供其他設備連接。),3:Station模式+AP模式混合模式(即可充當服務器又可充當客戶端,可用來發射無線網絡熱點,供其他設備連接,也可用來連接其他無線網絡熱點。)
   LED();
   Delay(1000);
   printf("AT+CWSAP=\"ESP8266_01S\",\"88888888\",1,3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置WiFi名和WiFi密碼,指令AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> ,其中<ssid>為"無線網絡熱點名稱",<pwd>為"無線網絡熱點密碼",至少有8位數密碼,<chl>為通道號,<ecn>為加密方式(加密方式:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK)。
   LED();
   Delay(1000) ;
   printf("AT+CIFSR\r\n"); //查詢ESP8266 WiFi模塊(ESP8266-01S芯片)IP
   LED();
   Delay(1000) ;
//   printf("AT+CWLIF\r\n");//查看接入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi熱點的某設備IP     
//   LED();
//   Delay(1000) ;
   printf("AT+CIPMUX=1\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟多連接模式,指令AT+CIPMUX=1,0:單路連接,1:多路連接。
   LED(); 
   Delay(1000) ;
   printf("AT+CIPSERVER=1,8080\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟服務器模式,指令AT+CIPSERVER=1(0:關閉服務器模式,1:開啟服務器模式),8080(端口號,缺省值為333)。注意:當AT+CIPMUX=1時才能開啟服務器,關閉服務器模式需要重啟。開啟服務器后自動建立服務器監聽,當有客戶端接入會自動按順序占用一個連接。        
   LED();
   Delay(1000) ;
//   printf("AT+UART_DEF=9600,8,1,0,0\r\n");//修改ESP8266 WiFi模塊波特率為9600    
//   LED();
//   Delay(1000); 
//   printf("AT+CIPSTATUS\r\n"); //查詢ESP8266 WiFi模塊當前連接情況,指令AT+CIPSTATUS;響應:+ CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>,其中<id>為連接的id號,有0-4,<type>為字符串參數,類型TCP或UDP,<addr>為字符串參數,IP地址,<port>為端口號,<tetype>: 0-本模塊作客戶端連接,1-本模塊作服務器連接。
//   LED();
//   Delay(1000) ;
   while(!TI);//判斷串口發送中斷標志位是否為1,若為1則單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束。為什么在此編寫while(!TI)?由於需要把單片機發送數據緩存寄存器保存的數據發送給PC端串口調試助手。
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。
   ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。
  }

3、實現Android手機上的有人網絡調試助手(或Android手機網絡調試助手)控制單片機去點亮熄滅LED燈的功能程序

    if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第1、第2、第3、第4、第7的數據是否為:+IPD,x,x:y
  {
     if((Recive_table[3]=='D')&&(Recive_table[6]==','))
   {   
      if(Recive_table[9]=='0')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為0
      led = 0;//點亮LED燈
      if(Recive_table[9]=='1')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為1
      led = 1;//熄滅LED燈
     }
    }

4、實現操作單片機上的硬件給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)發送單片機程序所編好的數據程序

    if(0 == send)
 {
     Delay(400);
     if(0 == send)
  {
      ES = 0;
      TI = 1; 
      printf("AT+CIPSEND=?\r\n");
      LED();
      Delay(1000) ;
      printf("AT+CIPSEND=0,10\r\n");
      LED();
      Delay(1000) ;
      printf("hello\r\n");
      LED(); 
      Delay(1000) ;
      LED();
      Delay(1000) ;
      LED();
      Delay(1000) ;
      while(!TI);
      TI = 0;
      ES = 1;
     }
     while(0 == send);
   } 

5、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機上的有人網絡調試助手(或Android手機網絡調試助手)控制單片機去點亮熄滅LED燈的全部程序。

#include <reg52.h>
#include <string.h>
#include <stdio.h>
sbit led=P2^0;//位定義P2^0為LED燈端口
char Recive_table[20]="";//接收數據數組變量
char reciveflag = 0;//接收標志位變量
  void UART_Init(void)//單片機串口初始化函數
{  
   TMOD=0x20;//0010 0000定時器工作方式為方式2,8位自動重裝。
   TH1=0xfd;//初始化計數器高8位:1111 1101
   TL1=0xfd;//初始化計數器低8位
   TR1=1;//啟動定時器1
   SM0=0;//設定串口工作方式為方式1(10位異步通信)
   SM1=1;//設定串口工作方式
   REN=1;//打開串口中斷接收允許
   EA=1;//打開全局中斷
   ES=1;//打開串口中斷允許位
  }
  void UART_Interrupt() interrupt 4//單片機串口中斷函數         
{   
   static char i=0; 
   if(RI==1)//判斷串口接收中斷標志位是否為1,若串口接收中斷標志位為1,表示單片機接收數據緩存寄存器接收數據結束。  
 {  
    ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某設備獲取的數據結束后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序,形成固定循環,導致無法運行其他程序。
   RI=0;//表示單片機接收數據緩存寄存器可重新接收數據,不可申請串口中斷。         
    Recive_table[i]=SBUF;//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據賦給數組變量Recive_table[]       
    i++; 
    if((Recive_table[i-1] == '\n'))//判斷單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據是否有換行。
  { 
     Recive_table[i]='\0';//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據在i這個位置結束。
     i=0; 
     reciveflag = 1;//接收標志位變量置1
    }
    ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。      
  }
   else
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。     
 } 
  void Delay(int t)//延時函數 
{  
   int i,j; 
   for(i=t;i>0;i--)   
    for(j=110;j>0;j--); 
  }
  void LED(void)//LED燈指示函數,用來提示單片機是在給ESP8266 WiFi模塊發送激活WiFi功能的AT指令。
{
   P2 = 0;
   Delay(100);
   P2 = 0xff;
   Delay(100);
  }
  void WiFi_Init(void)//ESP8266 WiFi模塊發射WiFi初始化函數,相當於在PC端串口調試助手軟件界面輸入激活ESP8266 WiFi模塊發射WiFi的AT指令這一過程。
{
   ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束后,TI(即串口發送中斷標志位)=1,若ES不設置為0,在TI(即串口發送中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行串口中斷服務程序。
   TI = 1;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可給PC端串口調試助手發送數據結束,申請串口中斷。
   printf("AT+RST\r\n");//復位ESP8266 WiFi模塊(ESP8266-01S芯片)
   LED();
   Delay(1000) ;
   printf("AT+CWMODE=3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置工作模式,指令AT+CWMODE=<mode>,其中<mode>:1:Station模式(充當客戶端,用來連接其他無線網絡熱點。),2:AP模式(充當服務器,用來發射無線網絡熱點,供其他設備連接。),3:Station模式+AP模式混合模式(即可充當服務器又可充當客戶端,可用來發射無線網絡熱點,供其他設備連接,也可用來連接其他無線網絡熱點。)
   LED();
   Delay(1000);
   printf("AT+CWSAP=\"ESP8266_01S\",\"88888888\",1,3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置WiFi名和WiFi密碼,指令AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> ,其中<ssid>為"無線網絡熱點名稱",<pwd>為"無線網絡熱點密碼",至少有8位數密碼,<chl>為通道號,<ecn>為加密方式(加密方式:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK)。
   LED();
   Delay(1000) ;
   printf("AT+CIFSR\r\n"); //查詢ESP8266 WiFi模塊(ESP8266-01S芯片)IP
   LED();
   Delay(1000) ;
//   printf("AT+CWLIF\r\n");//查看接入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi熱點的某設備IP     
//   LED();
//   Delay(1000) ;
   printf("AT+CIPMUX=1\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟多連接模式,指令AT+CIPMUX=1,0:單路連接,1:多路連接。
   LED(); 
   Delay(1000) ;
   printf("AT+CIPSERVER=1,8080\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟服務器模式,指令AT+CIPSERVER=1(0:關閉服務器模式,1:開啟服務器模式),8080(端口號,缺省值為333)。注意:當AT+CIPMUX=1時才能開啟服務器,關閉服務器模式需要重啟。開啟服務器后自動建立服務器監聽,當有客戶端接入會自動按順序占用一個連接。        
   LED();
   Delay(1000) ;
//   printf("AT+UART_DEF=9600,8,1,0,0\r\n");//修改ESP8266 WiFi模塊波特率為9600    
//   LED();
//   Delay(1000); 
//   printf("AT+CIPSTATUS\r\n"); //查詢ESP8266 WiFi模塊當前連接情況,指令AT+CIPSTATUS;響應:+ CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>,其中<id>為連接的id號,有0-4,<type>為字符串參數,類型TCP或UDP,<addr>為字符串參數,IP地址,<port>為端口號,<tetype>: 0-本模塊作客戶端連接,1-本模塊作服務器連接。
//   LED();
//   Delay(1000) ;
   while(!TI);//判斷串口發送中斷標志位是否為1,若為1則單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束。為什么在此編寫while(!TI)?由於需要把單片機發送數據緩存寄存器保存的數據發送給PC端串口調試助手。
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。
   ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。
  }
  int main (void)
{ 
   UART_Init();//串口初始化,波特率為9600
   Delay(1000) ;
   WiFi_Init(); //wifi初始化
   led=0;
   while(1)
 { 
    Delay(10) ;
   if(reciveflag == 1)//判斷接收標志位變量是否為1,接收標志位變量為1時,單片機通過串口通信接收ESP8266 WiFi模塊從某終端獲取的數據。
 {
    ES=0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行reciveflag=1,又得回來再次判斷if(reciveflag==1),形成固定循環,導致無法運行其他程序。
    if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第1、第2、第3、第4、第7的數據是否為:+IPD,x,x:y
  {
     if((Recive_table[3]=='D')&&(Recive_table[6]==','))
   {   
      if(Recive_table[9]=='0')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為0
      led = 0;//點亮LED燈
      if(Recive_table[9]=='1')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為1
      led = 1;//熄滅LED燈
     }
    }
    memset(Recive_table,'\0',20);//將數組Recive_table[]中的數據全部置空
    reciveflag = 0;//接收標志位變量置0
    ES=1;//打開串口中斷允許位,允許進入串口中斷服務程序。  
   }
  }      
 }

6、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現操作單片機上的硬件給Android手機上的有人網絡調試助手(或Android手機網絡調試助手)發送單片機程序所編好的數據的全部程序。

#include <reg52.h>
#include <string.h>
#include <stdio.h>
sbit send=P3^2;//位定義P3^2為發送端口
  void UART_Init(void)//單片機串口初始化函數
{  
   TMOD=0x20;//0010 0000定時器工作方式為方式2,8位自動重裝。
   TH1=0xfd;//初始化計數器高8位:1111 1101
   TL1=0xfd;//初始化計數器低8位
   TR1=1;//啟動定時器1
   SM0=0;//設定串口工作方式為方式1(10位異步通信)
   SM1=1;//設定串口工作方式
   REN=1;//打開串口中斷接收允許
   EA=1;//打開全局中斷
   ES=1;//打開串口中斷允許位
  }
  void UART_Interrupt() interrupt 4//單片機串口中斷函數         
{   
        
 } 
  void Delay(int t)//延時函數 
{  
   int i,j; 
   for(i=t;i>0;i--)   
    for(j=110;j>0;j--); 
  }
  void LED(void)//LED燈指示函數,用來提示單片機是在給ESP8266 WiFi模塊發送激活WiFi功能的AT指令。
{
   P2 = 0;
   Delay(100);
   P2 = 0xff;
   Delay(100);
  }
  void WiFi_Init(void)//ESP8266 WiFi模塊發射WiFi初始化函數,相當於在PC端串口調試助手軟件界面輸入激活ESP8266 WiFi模塊發射WiFi的AT指令這一過程。
{
   ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束后,TI(即串口發送中斷標志位)=1,若ES不設置為0,在TI(即串口發送中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行串口中斷服務程序。
   TI = 1;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可給PC端串口調試助手發送數據結束,申請串口中斷。
   printf("AT+RST\r\n");//復位ESP8266 WiFi模塊(ESP8266-01S芯片)
   LED();
   Delay(1000) ;
   printf("AT+CWMODE=3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置工作模式,指令AT+CWMODE=<mode>,其中<mode>:1:Station模式(充當客戶端,用來連接其他無線網絡熱點。),2:AP模式(充當服務器,用來發射無線網絡熱點,供其他設備連接。),3:Station模式+AP模式混合模式(即可充當服務器又可充當客戶端,可用來發射無線網絡熱點,供其他設備連接,也可用來連接其他無線網絡熱點。)
   LED();
   Delay(1000);
   printf("AT+CWSAP=\"ESP8266_01S\",\"88888888\",1,3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置WiFi名和WiFi密碼,指令AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> ,其中<ssid>為"無線網絡熱點名稱",<pwd>為"無線網絡熱點密碼",至少有8位數密碼,<chl>為通道號,<ecn>為加密方式(加密方式:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK)。
   LED();
   Delay(1000) ;
   printf("AT+CIFSR\r\n"); //查詢ESP8266 WiFi模塊(ESP8266-01S芯片)IP
   LED();
   Delay(1000) ;
//   printf("AT+CWLIF\r\n");//查看接入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi熱點的某設備IP     
//   LED();
//   Delay(1000) ;
   printf("AT+CIPMUX=1\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟多連接模式,指令AT+CIPMUX=1,0:單路連接,1:多路連接。
   LED(); 
   Delay(1000) ;
   printf("AT+CIPSERVER=1,8080\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟服務器模式,指令AT+CIPSERVER=1(0:關閉服務器模式,1:開啟服務器模式),8080(端口號,缺省值為333)。注意:當AT+CIPMUX=1時才能開啟服務器,關閉服務器模式需要重啟。開啟服務器后自動建立服務器監聽,當有客戶端接入會自動按順序占用一個連接。        
   LED();
   Delay(1000) ;
//   printf("AT+UART_DEF=9600,8,1,0,0\r\n");//修改ESP8266 WiFi模塊波特率為9600    
//   LED();
//   Delay(1000); 
//   printf("AT+CIPSTATUS\r\n"); //查詢ESP8266 WiFi模塊當前連接情況,指令AT+CIPSTATUS;響應:+ CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>,其中<id>為連接的id號,有0-4,<type>為字符串參數,類型TCP或UDP,<addr>為字符串參數,IP地址,<port>為端口號,<tetype>: 0-本模塊作客戶端連接,1-本模塊作服務器連接。
//   LED();
//   Delay(1000) ;
   while(!TI);//判斷串口發送中斷標志位是否為1,若為1則單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束。為什么在此編寫while(!TI)?由於需要把單片機發送數據緩存寄存器保存的數據發送給PC端串口調試助手。
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。
   ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。
  }
  int main (void)
{ 
   UART_Init();//串口初始化,波特率為9600
   Delay(1000) ;
   WiFi_Init(); //wifi初始化
   led=0;
   while(1)
 { 
    Delay(10) ;
    if(0 == send)//通過串口給手機發送字符串hello
 {
     Delay(400);
     if(0 == send)
  {
      ES = 0;
      TI = 1; 
      printf("AT+CIPSEND=?\r\n");
      LED();
      Delay(1000) ;
      printf("AT+CIPSEND=0,10\r\n");
      LED();
      Delay(1000) ;
      printf("hello\r\n");
      LED(); 
      Delay(1000) ;
      LED();
      Delay(1000) ;
      LED();
      Delay(1000) ;
      while(!TI);
      TI = 0;
      ES = 1;
     }
     while(0 == send);
   } 
  }      
 }

7、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信的全部程序。

#include <reg52.h>
#include <string.h>
#include <stdio.h>
sbit led=P2^0;//位定義P2^0為LED燈端口
//sbit send=P3^2;//位定義P3^2為發送端口
char Recive_table[20]="";//接收數據數組變量
char reciveflag = 0;//接收標志位變量
  void UART_Init(void)//單片機串口初始化函數
{  
   TMOD=0x20;//0010 0000定時器工作方式為方式2,8位自動重裝。
   TH1=0xfd;//初始化計數器高8位:1111 1101
   TL1=0xfd;//初始化計數器低8位
   TR1=1;//啟動定時器1
   SM0=0;//設定串口工作方式為方式1(10位異步通信)
   SM1=1;//設定串口工作方式
   REN=1;//打開串口中斷接收允許
   EA=1;//打開全局中斷
   ES=1;//打開串口中斷允許位
  }
  void UART_Interrupt() interrupt 4//單片機串口中斷函數         
{   
   static char i=0; 
   if(RI==1)//判斷串口接收中斷標志位是否為1,若串口接收中斷標志位為1,表示單片機接收數據緩存寄存器接收數據結束。  
 {  
    ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某設備獲取的數據結束后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序,形成固定循環,導致無法運行其他程序。
   RI=0;//表示單片機接收數據緩存寄存器可重新接收數據,不可申請串口中斷。         
    Recive_table[i]=SBUF;//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據賦給數組變量Recive_table[]       
    i++; 
    if((Recive_table[i-1] == '\n'))//判斷單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據是否有換行。
  { 
     Recive_table[i]='\0';//單片機接收緩存器接收ESP8266 WiFi模塊從某設備獲取的數據在i這個位置結束。
     i=0; 
     reciveflag = 1;//接收標志位變量置1
    }
    ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。      
  }
   else
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。     
 } 
  void Delay(int t)//延時函數 
{  
   int i,j; 
   for(i=t;i>0;i--)   
    for(j=110;j>0;j--); 
  }
  void LED(void)//LED燈指示函數,用來提示單片機是在給ESP8266 WiFi模塊發送激活WiFi功能的AT指令。
{
   P2 = 0;
   Delay(100);
   P2 = 0xff;
   Delay(100);
  }
  void WiFi_Init(void)//ESP8266 WiFi模塊發射WiFi初始化函數,相當於在PC端串口調試助手軟件界面輸入激活ESP8266 WiFi模塊發射WiFi的AT指令這一過程。
{
   ES = 0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束后,TI(即串口發送中斷標志位)=1,若ES不設置為0,在TI(即串口發送中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行串口中斷服務程序。
   TI = 1;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可給PC端串口調試助手發送數據結束,申請串口中斷。
   printf("AT+RST\r\n");//復位ESP8266 WiFi模塊(ESP8266-01S芯片)
   LED();
   Delay(1000) ;
   printf("AT+CWMODE=3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置工作模式,指令AT+CWMODE=<mode>,其中<mode>:1:Station模式(充當客戶端,用來連接其他無線網絡熱點。),2:AP模式(充當服務器,用來發射無線網絡熱點,供其他設備連接。),3:Station模式+AP模式混合模式(即可充當服務器又可充當客戶端,可用來發射無線網絡熱點,供其他設備連接,也可用來連接其他無線網絡熱點。)
   LED();
   Delay(1000);
   printf("AT+CWSAP=\"ESP8266_01S\",\"88888888\",1,3\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)設置WiFi名和WiFi密碼,指令AT+CWSAP=<ssid>,<pwd>,<chl>,<ecn> ,其中<ssid>為"無線網絡熱點名稱",<pwd>為"無線網絡熱點密碼",至少有8位數密碼,<chl>為通道號,<ecn>為加密方式(加密方式:0-OPEN,1-WEP,2-WPA_PSK,3-WPA2_PSK,4-WPA_WPA2_PSK)。
   LED();
   Delay(1000) ;
   printf("AT+CIFSR\r\n"); //查詢ESP8266 WiFi模塊(ESP8266-01S芯片)IP
   LED();
   Delay(1000) ;
//   printf("AT+CWLIF\r\n");//查看接入ESP8266 WiFi模塊(ESP8266-01S芯片)WiFi熱點的某設備IP     
//   LED();
//   Delay(1000) ;
   printf("AT+CIPMUX=1\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟多連接模式,指令AT+CIPMUX=1,0:單路連接,1:多路連接。
   LED(); 
   Delay(1000) ;
   printf("AT+CIPSERVER=1,8080\r\n");//為ESP8266 WiFi模塊(ESP8266-01S芯片)開啟服務器模式,指令AT+CIPSERVER=1(0:關閉服務器模式,1:開啟服務器模式),8080(端口號,缺省值為333)。注意:當AT+CIPMUX=1時才能開啟服務器,關閉服務器模式需要重啟。開啟服務器后自動建立服務器監聽,當有客戶端接入會自動按順序占用一個連接。        
   LED();
   Delay(1000) ;
//   printf("AT+UART_DEF=9600,8,1,0,0\r\n");//修改ESP8266 WiFi模塊波特率為9600    
//   LED();
//   Delay(1000); 
//   printf("AT+CIPSTATUS\r\n"); //查詢ESP8266 WiFi模塊當前連接情況,指令AT+CIPSTATUS;響應:+ CIPSTATUS:<id>,<type>,<addr>,<port>,<tetype>,其中<id>為連接的id號,有0-4,<type>為字符串參數,類型TCP或UDP,<addr>為字符串參數,IP地址,<port>為端口號,<tetype>: 0-本模塊作客戶端連接,1-本模塊作服務器連接。
//   LED();
//   Delay(1000) ;
   while(!TI);//判斷串口發送中斷標志位是否為1,若為1則單片機發送數據緩存寄存器給PC端串口調試助手發送數據結束。為什么在此編寫while(!TI)?由於需要把單片機發送數據緩存寄存器保存的數據發送給PC端串口調試助手。
   TI = 0;//TI(即串口發送中斷標志位)=0,表示單片機發送數據緩存寄存器可重新給PC端串口調試助手發送數據,不可申請串口中斷。
   ES = 1;//打開串口中斷允許位,允許進入串口中斷服務程序。
  }
  int main (void)
{ 
   UART_Init();//串口初始化,波特率為9600
   Delay(1000) ;
   WiFi_Init(); //wifi初始化
   led=0;
   while(1)
 { 
    Delay(10) ;
   if(reciveflag == 1)//判斷接收標志位變量是否為1,接收標志位變量為1時,單片機通過串口通信接收ESP8266 WiFi模塊從某終端獲取的數據。
 {
    ES=0;//關閉串口中斷允許位,阻止進入串口中斷服務程序。為什么要設置ES=0?由於單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據后,RI(即串口接收中斷標志位)=1,申請串口中斷,若ES不設置為0,在RI(即串口接收中斷標志位)=1時,申請串口中斷進入串口中斷服務程序執行reciveflag=1,又得回來再次判斷if(reciveflag==1),形成固定循環,導致無法運行其他程序。
    if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第1、第2、第3、第4、第7的數據是否為:+IPD,x,x:y
  {
     if((Recive_table[3]=='D')&&(Recive_table[6]==','))
   {   
      if(Recive_table[9]=='0')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為0
      led = 0;//點亮LED燈
      if(Recive_table[9]=='1')//判斷單片機接收數據緩存寄存器接收ESP8266 WiFi模塊從某終端獲取的數據賦給數組變量Recive_table[]中第10的數據是否為1
      led = 1;//熄滅LED燈
     }
    }
    memset(Recive_table,'\0',20);//將數組Recive_table[]中的數據全部置空
    reciveflag = 0;//接收標志位變量置0
    ES=1;//打開串口中斷允許位,允許進入串口中斷服務程序。  
   }
    if(0 == send)//通過串口給手機發送字符串hello
 {
     Delay(400);
     if(0 == send)
  {
      ES = 0;
      TI = 1; 
      printf("AT+CIPSEND=?\r\n");
      LED();
      Delay(1000) ;
      printf("AT+CIPSEND=0,10\r\n");
      LED();
      Delay(1000) ;
      printf("hello\r\n");
      LED(); 
      Delay(1000) ;
      LED();
      Delay(1000) ;
      LED();
      Delay(1000) ;
      while(!TI);
      TI = 0;
      ES = 1;
     }
     while(0 == send);
   } 
  }      
 }

8、

9、

10、

11、

12、

 

 

四、借助ESP8266 WIFI模塊(ESP8266-01S芯片),實現Android手機有人網絡調試助手(或Android手機網絡調試助手)與單片機互相通信調試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM