zoukankan      html  css  js  c++  java
  • 借助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] == '
    '))//判断单片机接收缓存器接收ESP8266 WiFi模块从某设备获取的数据是否有换行。
      { 
         Recive_table[i]='';//单片机接收缓存器接收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
    ");//复位ESP8266 WiFi模块(ESP8266-01S芯片)
       LED();
       Delay(1000) ;
       printf("AT+CWMODE=3
    ");//为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
    ");//为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
    "); //查询ESP8266 WiFi模块(ESP8266-01S芯片)IP
       LED();
       Delay(1000) ;
    //   printf("AT+CWLIF
    ");//查看接入ESP8266 WiFi模块(ESP8266-01S芯片)WiFi热点的某设备IP     
    //   LED();
    //   Delay(1000) ;
       printf("AT+CIPMUX=1
    ");//为ESP8266 WiFi模块(ESP8266-01S芯片)开启多连接模式,指令AT+CIPMUX=1,0:单路连接,1:多路连接。
       LED(); 
       Delay(1000) ;
       printf("AT+CIPSERVER=1,8080
    ");//为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
    ");//修改ESP8266 WiFi模块波特率为9600    
    //   LED();
    //   Delay(1000); 
    //   printf("AT+CIPSTATUS
    "); //查询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=?
    ");
          LED();
          Delay(1000) ;
          printf("AT+CIPSEND=0,10
    ");
          LED();
          Delay(1000) ;
          printf("hello
    ");
          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] == '
    '))//判断单片机接收缓存器接收ESP8266 WiFi模块从某设备获取的数据是否有换行。
      { 
         Recive_table[i]='';//单片机接收缓存器接收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
    ");//复位ESP8266 WiFi模块(ESP8266-01S芯片)
       LED();
       Delay(1000) ;
       printf("AT+CWMODE=3
    ");//为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
    ");//为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
    "); //查询ESP8266 WiFi模块(ESP8266-01S芯片)IP
       LED();
       Delay(1000) ;
    //   printf("AT+CWLIF
    ");//查看接入ESP8266 WiFi模块(ESP8266-01S芯片)WiFi热点的某设备IP     
    //   LED();
    //   Delay(1000) ;
       printf("AT+CIPMUX=1
    ");//为ESP8266 WiFi模块(ESP8266-01S芯片)开启多连接模式,指令AT+CIPMUX=1,0:单路连接,1:多路连接。
       LED(); 
       Delay(1000) ;
       printf("AT+CIPSERVER=1,8080
    ");//为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
    ");//修改ESP8266 WiFi模块波特率为9600    
    //   LED();
    //   Delay(1000); 
    //   printf("AT+CIPSTATUS
    "); //查询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,'',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
    ");//复位ESP8266 WiFi模块(ESP8266-01S芯片)
       LED();
       Delay(1000) ;
       printf("AT+CWMODE=3
    ");//为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
    ");//为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
    "); //查询ESP8266 WiFi模块(ESP8266-01S芯片)IP
       LED();
       Delay(1000) ;
    //   printf("AT+CWLIF
    ");//查看接入ESP8266 WiFi模块(ESP8266-01S芯片)WiFi热点的某设备IP     
    //   LED();
    //   Delay(1000) ;
       printf("AT+CIPMUX=1
    ");//为ESP8266 WiFi模块(ESP8266-01S芯片)开启多连接模式,指令AT+CIPMUX=1,0:单路连接,1:多路连接。
       LED(); 
       Delay(1000) ;
       printf("AT+CIPSERVER=1,8080
    ");//为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
    ");//修改ESP8266 WiFi模块波特率为9600    
    //   LED();
    //   Delay(1000); 
    //   printf("AT+CIPSTATUS
    "); //查询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=?
    ");
          LED();
          Delay(1000) ;
          printf("AT+CIPSEND=0,10
    ");
          LED();
          Delay(1000) ;
          printf("hello
    ");
          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] == '
    '))//判断单片机接收缓存器接收ESP8266 WiFi模块从某设备获取的数据是否有换行。
      { 
         Recive_table[i]='';//单片机接收缓存器接收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
    ");//复位ESP8266 WiFi模块(ESP8266-01S芯片)
       LED();
       Delay(1000) ;
       printf("AT+CWMODE=3
    ");//为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
    ");//为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
    "); //查询ESP8266 WiFi模块(ESP8266-01S芯片)IP
       LED();
       Delay(1000) ;
    //   printf("AT+CWLIF
    ");//查看接入ESP8266 WiFi模块(ESP8266-01S芯片)WiFi热点的某设备IP     
    //   LED();
    //   Delay(1000) ;
       printf("AT+CIPMUX=1
    ");//为ESP8266 WiFi模块(ESP8266-01S芯片)开启多连接模式,指令AT+CIPMUX=1,0:单路连接,1:多路连接。
       LED(); 
       Delay(1000) ;
       printf("AT+CIPSERVER=1,8080
    ");//为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
    ");//修改ESP8266 WiFi模块波特率为9600    
    //   LED();
    //   Delay(1000); 
    //   printf("AT+CIPSTATUS
    "); //查询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,'',20);//将数组Recive_table[]中的数据全部置空
        reciveflag = 0;//接收标志位变量置0
        ES=1;//打开串口中断允许位,允许进入串口中断服务程序。  
       }
        if(0 == send)//通过串口给手机发送字符串hello
     {
         Delay(400);
         if(0 == send)
      {
          ES = 0;
          TI = 1; 
          printf("AT+CIPSEND=?
    ");
          LED();
          Delay(1000) ;
          printf("AT+CIPSEND=0,10
    ");
          LED();
          Delay(1000) ;
          printf("hello
    ");
          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手机网络调试助手)与单片机互相通信调试。

  • 相关阅读:
    TP第2个项目总结
    Qt编写自定义控件10-云台仪表盘
    Qt编写自定义控件9-导航按钮控件
    Qt编写自定义控件8-动画按钮组控件
    Qt编写自定义控件7-自定义可拖动多边形
    Qt编写自定义控件6-指南针仪表盘
    Qt编写自定义控件5-柱状温度计
    Qt编写自定义控件4-旋转仪表盘
    Qt编写自定义控件3-速度仪表盘
    Qt编写自定义控件2-进度条标尺
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/13172497.html
Copyright © 2011-2022 走看看