使用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
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
//{
//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;
}
}