通过手机与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.youkuaiyun.com/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)