深入探索ESP8266模块在单片机中的应用
目录
ESP8266简介
前言
ESP8266的工作模式
ESP8266引脚说明
ESP8266测试
步骤
单片机与esp8266交互
前言
收到数据的格式
AP模式
服务器模式
外部执行命令
代码内执行命令
代码部分
客户端模式
外部执行命令
内部执行命令
代码部分
STA模式
服务器模式
外部执行命令
代码内部执行命令
代码部分
客户端模式
外部执行命令
内部执行命令
代码部分
ESP8266的烧录
前言
步骤
ESP8266简介
前言
ESP8266的工作模式
ESP8266引脚说明
ESP8266测试
前言:测试ESP8266可以使用51单片机(使用单片机我经过测试不接使能引脚烧录和测试可成功),也可以使用USB转TTL模块
步骤
注意:当我们只是连接ESP模块的VCC引脚,GND引脚和使能引脚,便可以通过电脑或手机搜索出该ESP模块的WIFI信号。
单片机与esp8266交互
前言
AP:测试连接是否成功,连接成功后,模块回想我们返回ok
AT+RESTORE:恢复出厂设置,设置乱了的话恢复默认设置
AT+UART_DEF=波特率,8,1,0,0:将波特率改为自己设备对应的波特率
注意:
收到数据的格式
前言:当使用透传模式时,那么手机发送给单片机什么信息,那么单片机就收到什么信息;当不使用透传模式时,那么手机发送给单片机的信息会被esp8266模块进行封装
不使用透传模式:手机发送:数据——单片机收到:+PID,ID号,发送数据的长度,数据
使用透传模式:手机发送:数据——单片机收到:数据
注意:
AP模式
服务器模式
原理:单片机连接电脑,给esp8266模块供电,esp8266模块释放wifi热点,esp8266作为服务器开放端口给连接esp8266热点的手机客户端进行连接,手机作为客户端只需要填写esp8266的IP地址和端口就能与esp8266进行通信,而esp8266通过串口与单片机进行通信,此时我们就相当于通过手机与单片机进行通信。
外部执行命令
AT+CWMODE=2:开启 AP 模式(1为station模式,2为ap模式,3为混合模式)
AT+CWSAP="wifi名","密码8位",热点通道,加密方式:设置esp8266模块wifi基础设置
加密方式:(0:OPEN,1:WEP, 2:WPA_PSK,3:WPA2_PSK,4:WPA_WPA2_PSK) AT+CIFSR:获取当前模块的IP地址(不用写也可以,这里是为了让手机客户端连接)
AT+RST:设置完成后重启
注意:以上设置最好在esp8266模块使用之前进行配置,那么这样的话就不用在代码中执行了。
代码内执行命令
AT+CIPMUX=1:开启多连接模式
AT+CIPSERVER=1,端口号:开放服务器端口
注意:这里面配置的命令需要单片机向esp8266模块发送。
代码部分
#include <regx52.h>
unsigned char key=0;
unsigned char Receive[15];
unsigned int i=0;
//延时ms函数
void delay_ms(unsigned int ms)
{
unsigned char i,j;
for(i=ms;i>0;i--){
for(j=120;j>0;j--);
}
}
void initscon(){
SCON=0x50; //8位异步通信方式,允许接收数据
TMOD=0x20; //配置波特率发生器T1,工作方式为2
TH1=0xFD; //重置TL1
TL1=0xFD; //设置初值
EA=1; //开启总中断
TR1=1; //打开波特率发生器T1
}
void SENT_At(unsigned char *At_Comd)//指针指向At指令
{
ES = 0;//关闭串口中断
while(*At_Comd!='\0')
{
SBUF = *At_Comd;
while(!TI);//等待该字节发送完毕,发送完后硬件自动置一TI
TI = 0;//硬件之以后必须软件置零才能进行下一次数据传送
delay_ms(5);
At_Comd++;//指向下一个字节
}
}
void WIFI_Init()//通过单片机配置AT指令
{
SENT_At("AT+CIPMUX=1\r\n");//多连接模式
delay_ms(1000); //每发送完一套命令延时1s
SENT_At("AT+CIPSERVER=1,8080\r\n");//开启服务器端口号
delay_ms(1000);
ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
void main(){
while(1){
//第一次按下按键
if(P3_1==0&&key==0){
key=1;
}
//按下按键并抬起
if(key==1&&P3_1==1){
initscon();
WIFI_Init();
key=0;
}
}
}
void scon_isr() interrupt 4
{
if(TI){
TI=0; //数据发送完清TI
}
if(RI){
RI=0;
Receive[i]=SBUF; //读取接受的数据
if(Receive[0]=='+'){
i++;
}else{
i=0;} //超过数组限制i=0后跳出中断
if(i==10){ //因为前面多个i++,所以i=10时判断
i=0;
//取出发送的数据进行判断
switch(Receive[9]){
case 1:P2_0=~P2_0;break;
case 2:P2_1=~P2_1;break;
case 3:P2_2=~P2_2;break;
case 4:P2_3=~P2_3;break;
case 5:P2_4=~P2_4;break;
case 6:P2_5=~P2_5;break;
case 7:P2_6=~P2_6;break;
case 8:P2_7=~P2_7;break;
default:P2=0xff;
}
}
}
}
注意:
客户端模式
原理:单片机连接电脑给esp8266供电,esp8266向外部发送热点,我们的手机连接esp8266发送的热点并通过端口开放自己的服务,那么esp8266模块就可以通过自己发送的热点来访问手机搭建的服务进而实现esp8266与手机的通信,因为esp8266与单片机通过串口通信,那么我们就可以通过我们的手机与单片机实现间接的通信。
外部执行命令
AT+CWMODE=2:设置工作模式为AP模式
AT+CWSAP="模块wifi名称","wifi8位密码",1,4:设置esp8266模块热点基本参数
AT+CIFSR:查询模块IP地址
内部执行命令
AT+CIPMUX=0:开启单连接模式(不写也可)
AT+CIPSTART="TCP","手机服务器IP地址",手机开放的端口:通过端口和手机服务器建立连接
AT+CIPMODE=1:开启透传模式
注意:这种模式下,手机作为服务端,那么必须始终处于监听状态,随时等待esp8266模块的连接
代码部分
#include <regx52.h>
unsigned char key=0;
unsigned char Receive;
//延时ms函数
void delay_ms(unsigned int ms)
{
unsigned char i,j;
for(i=ms;i>0;i--){
for(j=120;j>0;j--);
}
}
void initscon(){
SCON=0x50; //8位异步通信方式,允许接收数据
TMOD=0x20; //配置波特率发生器T1,工作方式为2
TH1=0xFD; //重置TL1
TL1=0xFD; //设置初值
EA=1; //开启总中断
TR1=1; //打开波特率发生器T1
}
void SENT_At(unsigned char *At_Comd)//指针指向At指令
{
ES = 0;//关闭串口中断
while(*At_Comd!='\0')
{
SBUF = *At_Comd;
while(!TI);//等待该字节发送完毕,发送完后硬件自动置一TI
TI = 0;//硬件之以后必须软件置零才能进行下一次数据传送
delay_ms(5);
At_Comd++;//指向下一个字节
}
}
void WIFI_Init()//通过单片机配置AT指令
{
SENT_At("AT+CIPMUX=0\r\n");//单连接模式
delay_ms(1000); //每发送完一套命令延时1s
SENT_At("AT+CIPSTART=\"TCP\",\"192.168.4.2\",8086\r\n");//与192.168.4.2建立连接
delay_ms(1000);
SENT_At("AT+CIPMODE=1\r\n");//开启透传模式
delay_ms(1000);
ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
void main(){
while(1){
//第一次按下按键
if(P3_1==0&&key==0){
key=1;
}
//按下按键并抬起
if(key==1&&P3_1==1){
initscon();
WIFI_Init();
key=0;
}
}
}
void scon_isr() interrupt 4
{
if(TI){
TI=0; //数据发送完清TI
}
if(RI){
RI=0;
Receive=SBUF; //读取接受的数据
switch(Receive){
case 1:P2_0=~P2_0;break;
case 2:P2_1=~P2_1;break;
case 3:P2_2=~P2_2;break;
case 4:P2_3=~P2_3;break;
case 5:P2_4=~P2_4;break;
case 6:P2_5=~P2_5;break;
case 7:P2_6=~P2_6;break;
case 8:P2_7=~P2_7;break;
default:P2=0xff;
}
}
}
注意:因为开启了透传模式,所以串口中断的代码就变得简单了,就不需要从esp8266封装的数据中提取有用的信息了,若你不用透传模式,那么串口中断处代码和上面esp8266模块作为服务器的代码一样
STA模式
服务器模式
原理:单片机连接电脑,给esp8266进行供电,esp8266连接我们局域网中的热点,同时esp8266通过端口在局域网内充当服务器,那么局域网内的手机就可以通过这个局域网访问到esp8266服务器从而对esp8266服务器进行控制,而esp8266与我们的单片机通过串口进行通信,那么我们的手机就可以间接的与单片机进行通信。
外部执行命令
AT+CWMODE=1:开启station工作模式
AT+CWJAP="wifi名称","wifi密码":连接外部wifi热点(尽量连2.4g)
AT+RST:重启模块生效
代码内部执行命令
AT+CIPMUX=1:开启多连接模式(多个设备可以连接esp8266模块)
AT+CIFSR:查询esp8266模块IP地址(用于手机连接esp服务器)
AT+CIPSERVER=1,端口号:通过端口开放服务
代码部分
void WIFI_Init()//通过单片机配置AT指令
{
SENT_At("AT+CIPMUX=1\r\n");//多连接模式
delay_ms(1000); //每发送完一套命令延时1s
SENT_At("AT+CIPSERVER=1,8086\r\n");//开启服务器端口号
delay_ms(1000);
ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
注意:其他的代码和上面服务器模式的代码一样(只是这个wifi初始化的模块变了)。
客户端模式
原理:单片机连接电脑给esp8266进行供电,esp8266连接我们手机所在的局域网,局域网中我们的手机作为服务器开放了端口一直处于外部监听状态,由于esp8266模块和我们的手机在同一个局域网中,那么esp8266就可以主动连接我们的手机和其进行通信,由于esp8266和单片机之间通过串口进行通信,那么我们的手机就间接的与单片机进行通信。
外部执行命令
AT+CWMODE=1:设置工作模式为station模式
AT+CWJAP="wifi名称","wifi密码":连接外部wifi热点(尽量连2.4g)
AT+RST:重启模块生效
内部执行命令
AT+CIPSTART="TCP","手机服务器IP地址",手机端口号:通过端口和手机建立连接
AT+CIPMODE=1:开启透传模式(1为透传,0为非透传)
注意:
代码部分
void WIFI_Init()//通过单片机配置AT指令
{
SENT_At("AT+CIPSTART=\"TCP\",\"192.168.18.9\",8888\r\n");//连接服务器
delay_ms(1000); //每发送完一套命令延时1s
SENT_At("AT+CIPMODE=1\r\n");//开启透传模式
delay_ms(1000);
ES = 1; //前面关中断是为了避免中断对初始化wifi的影响
}
注意:其他的代码和上面客户端模式的代码一样(只是这个wifi初始化的模块变了)。
ESP8266的烧录
前言
步骤
第一个绿方块填写你要烧录固件的文件位置,第二个绿方块填写你烧录固件的起始地址(就写0x0000)
按照上面的填写方式填写后(串口写你自己的串口),先点击ERASE(擦除)后再启动51单片机,当绿方块最后变成完成(擦除完成)后点击START进行烧录
这样就烧录成功了(拔掉ESP模块的GPIO0引脚后就可继续进行测试)。
作者:小白菜00