51单片机与ESP8266EX模块相互通信;注意事项及常见问题解决办法;使用单片机串口将ESP8266设置为AP,STA.AP+STA模式教程及C程序源码编写;单片机发送数据ESP8266始终接收不到

使用51单片机驱动ESP8266相关问题讲解

ESP8266有三种模式:STA,AP,AP+STA

通过单片机的串口将ESP8266EX模块设置AP模式,然后通过手机网络调试助手(连接上ESP8266)发送数据,单片机收到以后,处理数据,并点灯

举例:AP模式
注意事项:

1,ESP8266与单片机串口连接,即交叉连线:RX-TX TX-RX

2,ESP8266与单片机的波特率设置为一样
注意:单片机串口(实际中晶振11.0592M or 12M)波特率不能设置为115200
需要通过AT指令将ESP8266的波特重新设置(一般设置为9600),单片机串口波特率也设置为9600

3,程序中,单片机发送的数据要有换行符

4,单片机下载程序的时候,需要将ESP8266断开,(简单方法:就是ESP8266的电源线拔掉或拔掉串口的某根线)

5,注意观察ESP8266的指示灯,(蓝色灯会闪烁)

6,手机网络调试助手 协议类型:TCP client 服务器IP地址:192.168.4.1 服务器端口:8080

7,ESP8266的数据处理,收到数据格式:+IPD,X,X:有效数据

8,ESP8266接收的数字是数字ASCII码,需要处理数字时,需要将接收的数据-0x30,即减去该0的ASCII码

一般情况:
ESP8266:正常模式(运行模式)115200
单片机串口波特率:9600
因此需要使用AT指令将ES8266的波特率重新设置,设置视频教程:
设置ESP8266的波特率

详细的视频教程及演示:

详细视频教程

视频教程中的程序源码:


/*
*作者:逗比小憨憨
*说明:程序只是基础使用单片机+ESP8266EX,还可以进一步扩展使用
*程序中ESP8266模式设置为AP模式,设置其它模式所需的AT指令,即单片机串口需要发送的字符串
*可以看这里面相关ESP8266的讲解,链接:https://space.bilibili.com/314404732
*/
#include <reg52.h>

unsigned char code str[][30]={
    
    
{
    
    "AT+CWMODE=2\r\n"},
{
    
    "AT+RST\r\n"},
{
    
    "AT+CWSAP="},//这条指令用法参照AT指令用户手册
{
    
    "AT+CIPMUX=1\r\n"},
{
    
    "AT+CIPSERVER=1,8080\r\n"},
{
    
    "AT+CIPSEND=0,10"}
};

unsigned char dat[10],cnt=0,flag=66;
//函数声明区
void delay_ms(unsigned int i);
void init(void);
void send_char(unsigned char d);
void send_str(unsigned char *str);
/

void delay_ms(unsigned int i)
{
    
    
	unsigned int j,k;
	for(j=i;j>0;j--)
		for(k=118;k>0;k--);
}

void init(void)				//串口初始化
{
    
    
	TMOD=0x20;    //定时器1工作在模式2,自动重装模式
	SCON=0x50;     //串口工作在模式1
	TH1=0xfd;  //计算定时器重装值	//11.0592 9600
	TL1=0xfd;
	PCON=0x00;    //串口波特率加倍
	ES=0;         //串行中断关闭
	TR1=1;        //启动定时器1
	REN=1;        //允许接收 
	EA=1;         //允许中断
}

void send_char(unsigned char d)		  //发送一个字节的数据
{
    
    
	SBUF=d; //将数据写入到串口缓冲
	while(!TI); //等待发送完毕
	TI=0;
	RI=0;
}

void send_str(unsigned char *str)
{
    
    
	while(*str!='\0') //发送字符串
	{
    
    
		send_char(*str); //发送一个字符
		str++;  //移动到下一个字符
	}
//	send_char(0x0A);
//	send_char(0x0D);
}

//mode: 1:STA  2:AP  3:AP+STA
void esp8266_init(char mode)
{
    
    
	char i=0;
	ES=0;
	if(mode==2)
	{
    
    
		for(i=0;i<4;i++)
		{
    
    
			send_str(str[3]);
			delay_ms(1000);
			send_str(str[4]);
			delay_ms(1000);
		}
	}
	ES=1;
}

void main(void)
{
    
    
	int i=0;
	init();
	send_str(str[2]);
	delay_ms(1000);
	esp8266_init(2);
	delay_ms(100);
	while(1)
	{
    
    
//		for(i=0;i<cnt;i++)
//		{
    
    
//			if(dat[i]==':')
//			{
    
    
//				flag=dat[i+1]-0x30;
//				break;		
//			}
//			dat[i]=0;
//		}
		flag=dat[cnt-1]-0x30;       // 位	‘0’
		//2   ESP8266        +IPD,0,X:   2
		if((flag>=0)&&(flag<=9))
		{
    
    
			cnt=0;
			ES=0;
			switch(flag)
			{
    
    
				case 0:	P1=0;
				break;
				case 1:	P1=0XAA; 
				break;
				case 2:	P1=0X55;
				break;
				case 3:	P1=0XFF;
				break;
				case 4:	P1=0X0F;
				break;
				case 5:	P1=0XF0;
				break;
				default:
				break;
			}
			ES=1;
		 }
	}
}

void uart(void) interrupt 4		 //串口发送中断
{
    
    
	if(RI)    //收到数据
	{
    
    
		RI=0;   //清中断请求
		dat[cnt++]=SBUF;
	}
	else      //发送完一字节数据
	{
    
    
		TI=0;
	}
}

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/107250421