> 文档中心 > 笔记学习:关于如何使用ESPwifi模块与51单片机通信

笔记学习:关于如何使用ESPwifi模块与51单片机通信

首先准备号ESP模块和51单片机,把两个模块的RXT和TXD交叉连接,然后通电,但是ESP模块只能使用3.3V免得电流5V会烧毁。

然后把ESP模块的波特率设置为9600,一般默认是115200的,由于单片机的波特率最高只能是9600.因为需要通信,所以波特率必须一致,利用串口软件与ESP连接这个时候需要USB转TTL连接然后把串口软件的波特率也设置好于ESP模块的波特率一样,发送AT显示OK则是一样波特率,如果不一样可以更换波特率逐个尝试。这个时候波特率设置一样了,就可以发送AT+UART_DEF=9600,8,1,0,0这串指令更改波特率就行了。

顶部代码:

#include #include #include #include "uart.h"#include "ESP8266.h"#include "led.h" sbit LED0=P2^0;sbit LED1=P3^3;sbit Sand=P3^2;/*****************相关变量**************/unsigned char Recive_table[20]=""; //用于接收wifi模块反馈到MCU上的数据char Recive_state = 0; //当前状态是否可以接收void ESP_Flag();void ESP_Sand();

接好之后就编写代码:利用keil软件编写51单片机烧录的代码,这里是初始化串口的模式以及工作方式,,也可以用STC_ISP软件直接生成波特率,只有设置好工作方式就可以

void UartInit(void)//9600bps@11.0592MHz{TMOD &= 0x0F;//清除定时器1模式位TMOD |= 0x20;//设定定时器1为8位自动重装方式TL1 = 0xFD;//设定定时初值   //4800bpsTH1 = 0xFD;//设定定时器重装值REN=1;    //打开中断允许SM0=0;// 设置串口工作方式SM1=1;   //设置串口工作方式ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1ES=1;  //开启串口中断EA=1;}

下面就可以编写与ESP模块通信的代码了:这里是利用c语言的stdio库函数里面的printf打印。

也可以用模块的SBUF利用指针输出字符串

void ESP_Init(){ES=0;TI=1;printf("AT+RST\r\n");     //复位LED();delay(1000);     延迟1sprintf("AT+CWMODE=3\r\n");   //设置模式LED();delay(1000);printf("AT+CWSAP=\"ESP8266\",\"88888888\",1,3\r\n");   //设置WIFI名称和密码LED();delay(1000);printf("AT+CIFSR\r\n");   //查看接入设置LED();delay(1000);printf("AT+CIPMUX=1\r\n");  //设置多链接模式LED();delay(1000);printf("AT+CIPSERVER=1,8080\r\n");  //设置一个服务器端口LED();delay(1000);while(!TI);//判断串口发送中断标志位是否为1,若为1则单片机发送数据缓存寄存器给PC端串口调试助手发送数据结束。为什么在此编写while(!TI)?由于需要把单片机发送数据缓存寄存器保存的数据发送给PC端串口调试助手。TI=0;  //TI(即串口发送中断标志位)=0,表示单片机发送数据缓存寄存器可重新给PC端串口调试助手发送数据,不可申请串口中断ES=1;  //打开串口中断允许位,允许进入串口中断服务程序。}

这里是定时器中断判断代码:需要放在mian.c里面即是mian函数的下方,这个是用来判断单片机接收到ESPwifi模块AT指令反馈回来的函数。

void Uart_Interrupt() interrupt 4 {static unsigned char i=0;      if(RI==1)      {ES=0;    RI=0;    Recive_table[i]=SBUF;    //MCU接收wifi模块反馈回来的数据     i++;      if(Recive_table[i-1]=='\n')   {   Recive_table[i]='\0';   i=0;  //遇到换行 重新装值   Recive_state = 1;      }ES = 1;  }else TI=0;   }

接下来就是与手机通信的代码,这里是判断Recive_state的响应标志位。如果是1的时候我才可以执行手机发送过来的识别标志。

void ESP_Flag()   //手机发送数字让WiFi控制单片机亮灯{ if(Recive_state == 1){ES=0; //进入状态串口中断关闭等待操作完下一个中断的到来   if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭     {  if((Recive_table[3]=='D')&&(Recive_table[6]==','))  {    if(Recive_table[9]=='0') //这里的标志是接到的标志是否与协议的标志一致 {    LED0=1;//0 灯灭   } else if (Recive_table[9]=='1') { LED0=0;    //1 灯亮}    }    }   memset(Recive_table,'\0',20);  //接收完情况等待下一个标志Recive_state=0;   //状态重新设置ES=1;    //打开串口中断允许位,允许进入串口中断服务程序。}}

当烧录代码进去之后打开手机的的网络调试软件,首先在TCP server激活ESPwifi设置的端口。这里是8080,然后点到TCP client添加ESPwifi模块的IP地址和端口号,IP地址在手机连接ESPWiFi之后点击热点连接那里就可以看到。添加成功之后就可以在发送1和0之间控制灯亮灭,

同时这个代码是比较重要的,用来判断手机发过来的指令来控制IO口,同时也可以在这个代码上修改需要执行的操作,利用灯,各个IO口。各种指令操作等等,

void ESP_Flag()   //手机发送数字让WiFi控制单片机亮灯{ if(Recive_state == 1){ES=0; //进入状态串口中断关闭等待操作完下一个中断的到来   if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭     {  if((Recive_table[3]=='D')&&(Recive_table[6]==','))  {    if(Recive_table[9]=='0') //这里的标志是接到的标志是否与协议的标志一致 {    LED0=1;//0 灯灭   } else if (Recive_table[9]=='1') { LED0=0;    //1 灯亮}    }    }   memset(Recive_table,'\0',20);  //接收完情况等待下一个标志Recive_state=0;   //状态重新设置ES=1;    //打开串口中断允许位,允许进入串口中断服务程序。}}

这里有个比较少见用的函数memset,是设置字符串的初始化修改值得,第一个参数得字符串的首地址,第二个是需要初始化得值或修改得值,第三个是修改多少位