笔记学习:关于如何使用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 <regx52.h>
#include <string.h>
#include <stdio.h>
#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;		//设定定时初值	   //4800bps
	TH1 = 0xFD;		//设定定时器重装值
	REN=1;           //打开中断允许
	SM0=0;			// 设置串口工作方式
	SM1=1;          //设置串口工作方式
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;         //开启串口中断
	EA=1;
}

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

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

void ESP_Init()
{
	ES=0;
	TI=1;

	printf("AT+RST\r\n");		     //复位
	LED();
	delay(1000);     延迟1s

	printf("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,是设置字符串的初始化修改值得,第一个参数得字符串的首地址,第二个是需要初始化得值或修改得值,第三个是修改多少位

  • 5
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c-tion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值