手机与ESP8266控制单片机,ESP8266相互通信(有代码)

通过手机与2个ESP8266控制单片机
一、材料
2个ESP8266,一台手机,2台51开发板(芯片为STC89C52)
二、实现手机控制单片机LED的亮灭
1)、首先ESP8266波特率一般为115200,而单片机的波特率跑不了那么高,所以改9600,通过指令AT+CIOBAUD=9600 (波特率改9600),下次打开串口的时候波特率就选9600。注意单片机串口波特率也要设置为9600。

void UART_Init()//设置波特率为9600
{
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0xFA;	//计数器初始值设置
	TL1=TH1;
	ES=1;				//开启接收中断
	EA=1;				//打开总中断
	TR1=1;				//打开计数器
}

2)、编写代码
(1)、首先要知道初始化

//ESP8266-WIFI模块工作模式初始化AP模式
void ESP8266_ModeInit(void)
{
	ESP8266_SendCmd("AT+CWMODE=2");//设置路由器模式
	ESP8266_SendCmd("AT+CWSAP=\"ESP8266\",\"12345678\",11,3"); //设置WIFI配置
	ESP8266_SendCmd("AT+CIPAP=\"192.168.4.1\"");//设置ESP8266的IP地址
//	ESP8266_SendCmd("AT+RST");//重新启动wifi模块(可省略)
	ESP8266_SendCmd("AT+CIPMUX=1");	//开启多连接模式,允许多个各客户端接入
	ESP8266_SendCmd("AT+CIPSERVER=1,8080");	//启动TCP/IP 端口为8080 	
}

(2)、要知道AT指令要发送一条新行才可以,新行为\r\n
在这里插入图片描述

所以没发送一条指令后我们要为其配上"\r\n",同时在AT指令中要注意逗号和双引号的表达要写上“\”号在前面,这样表示字符,其代码为

void UART_SendByte(char dat)
{
//	ES=0; //关闭串口中断
	TI=0; //清发送完毕中断请求标志位
	SBUF=dat; //发送
	while(TI==0); //等待发送完毕
	TI=0; //清发送完毕中断请求标志位
//	ES=1; //允许串口中断
}

void ESP8266_SendCmd(char *pbuf)
{
	while(*pbuf!='\0') //遇到空格跳出循环	
	{
		UART_SendByte(*pbuf);
		delay_10us(5);//延迟5us,自己弄一下函数模块
		pbuf++;	
	}
	delay_10us(5);
	UART_SendByte('\r');//回车
	delay_10us(5);
	UART_SendByte('\n');//换行
	delay_ms(1000);
}

(3)、进行判断与LED的操作

char RecBuf[50];//u8表示char  u16表示int
char recFlagOK=0;
void Usart() interrupt 4
{
	static char i=0;//因为是一位一位接收,所以用static,防止i重置为0
	if(RI)
	{
		RI=0;	
		RecBuf[i++]=SBUF;//要注意最后i的取值,实为字符串字符长度。
		//一位一位传送数据,并通过RecBuf储存
		if(RecBuf[i-1]=='\n')//最后一位数据在i-1位
			i=0;
		recFlagOK=1;//相当于OK的标志,及输完数据的标志
		if(recFlagOK==1)
		{
			recFlagOK=0;
				if(RecBuf[9]=='1')//RecBuf[9]相当于跳过了"+IPD,x,x:"这0到8这9个字符
					{
					P1_1=0;//灯1亮
					}
					if(RecBuf[9]=='2')
					{
						
						P1_1=1;//灯1灭
					}	
				
				if(RecBuf[9]=='3')	//led控制
					{
						
						P1_2=0;
					}
					if(RecBuf[9]=='4')
					{
						P1_2=1;				
					}
					if(RecBuf[9]=='5')
					{
						P1_1=0;
					}	
	memset(RecBuf,'\0',50);//其实不写影响也不大
				}
		}
	}

(4)、编写主函数

void main()
{	

	P1_1=P1_2=1;

	UART_Init(); //串口初始化
	ESP8266_ModeInit();
	while(1)
	{
		
	}		
}

以上的代码就可以实现基本的LED控制,如果还要进行相互发送数据可以点击以下百度云链接
链接:https://pan.baidu.com/s/1uKQnzKzcybkgJU7ZaLqPyQ
提取码:esp8
代码有点乱,有原代码(参考别人的https://blog.csdn.net/qq_32171385/article/details/109363279 可以看看,但代码有些BUG),也有整理好的ESP8266部分的初始化模块,编译时有时要移除ESP8266模块。(ES=1其实可以一直开启,百度文件中的代码有些部分与本博客中的代码有些不同,但都能实现功能,就是程度、理解不同)
在STA模式是要注意两点
1、AT+RST重启ESP8266后会使ESP8266更容易连接到服务端(个人感觉加试验),但要注意重启后要给足够多的时间使ESP8266连接WIFI,GET IP ;
2、客户端收到数据的格式为+IPD,x: ,故代码中为RecBuf[7].

WIFI模块的模块化完成了,已放入云盘。(6.8)
基于STM32F407ZGT6 芯片 ESP8266+DMA+空闲中断,实现上位机发送数据,单片机就回什么数据的功能,欢迎大家指出不足,并优化代码
【微笑】(9/15)

  • 4
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wxs_hello

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

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

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

打赏作者

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

抵扣说明:

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

余额充值