admin管理员组文章数量:1658730
在阅读这篇文章之前,如果过你对ESP8266完全不懂,或者你知道一些指令但是连接串口助手后却发现发送AT指令无效,我建议你先看看http://t.csdn/2jYZR,然后再来看这篇文章。
硬件:STC89C52单片机一块,ESP-01swifi模块一个,USB转ttl模块一个.
先了解一些一会会用到的知识
ESP-01s出厂波特率正常是115200,但是我们的单片机设置的波特率为9600,因此我们要修改wifi模块的波特率。(以下的指令输入均来自安信可串口调试助手)
指令 | 作用 | 命令执行后,wifi反馈给串口的信息 |
AT+RST | 重启wifi模块 | 得到模块的基本信息(有可能是乱码,不影响用),只要显示ready即可 |
AT+UART=9600,8,1,0,0 | 修改ESP-01s的波特率为9600 | OK |
AT+CWMODE=3 | 1. 是station(设备)模式 2.是AP(路由)模式 3.是双模(既有1的功能,又有2的功能) | OK |
AT+CWJAP="无线网名字","无线网密码" | 让wifi模块连接上无线网 | WIFI CONNECTED WIFI GOT IP |
AT+CIPSTART="TCP","无线网的地址",四位本地端口号 | 连接网络调试助手 | CONNECT OK |
AT+CIPMODE=1 | 开启透传模式,发送字节不受限制 | OK |
AT+CIPSEND | 开始穿透模式后必用,使穿透模式有用 | OK |
打开命令控制器(win+r),输入config命令,找到我们电脑和wifi模块共同连接的无线网地址
192.168.1.110就是本地主机地址(也是我们家里的无线网地址),四位本地端口号可以自己编写,只是一个虚拟的,如这里我写8880。
下面看一下通讯
#include "reg52.h"
#include "intrins.h"
#include <string.h>
#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
sbit D6 = P3^6;
char buffer[SIZE];
code char LJWL[] = "AT+CWJAP=\"PEI\",\"jmgcyjs.\"\r\n"; //入网指令
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.1.112\",8880\r\n"; //连接服务器指令
char TCMS[] = "AT+CIPMODE=1\r\n"; //透传指令
char SJCS[] = "AT+CIPSEND\r\n"; //数据传输开始指令
char RESET[] = "AT+RST\r\n"; //重启模块指令
char AT_OK_Flag = 0; //OK返回值的标志位
char AT_Connect_Net_Flag = 0; //WIFI GOT IP返回值的标志位
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50; //配置串口工作方式1,16位,REN使能接收
TMOD &= 0x0F;
TMOD |= 0x20;//定时器1工作方式位8位自动重装
TH1 = 0xFD;
TL1 = 0xFD;//9600波特率的初值
TR1 = 1;//启动定时器
EA = 1;//开启总中断
ES = 1;//开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)//通过写SBUF输入一个字符
{
SBUF = data_msg;
while(!TI);
TI = 0;
}
void sendString(char* str)//发送字符串
while( *str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark = 0;
D5 = D6 = 1;//灭状态灯
//配置C51串口的通信方式
UartInit();
Delay1000ms();//给espwifi模块上电时间
//发送联网AT指令并等待成功
sendString(LJWL);
//while(!AT_Connect_Net_Flag);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
//发送连服务器指令并等待成功
sendString(LJFWQ);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
//发送透传模式指令并等待成功
sendString(TCMS);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
//发送数据传输指令并等待成功
sendString(SJCS);
while(!AT_OK_Flag);
if(AT_Connect_Net_Flag){
D5 = 0;//点亮D5,代表入网成功
}
if(AT_OK_Flag){
D6 = 0;//点亮D6,代表连接服务器并打开透传模式成功
}
while(1){
Delay1000ms();
//“心跳包”
sendString("yangdong is handsome\r\n");
}
}
void Uart_Handler() interrupt 4
{
static int i = 0;//静态变量,被初始化一次
char tmp;
if(RI)//中断处理函数中,对于接收中断的响应
{
RI = 0;//清除接收中断标志位
tmp = SBUF;
if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == 'F'){
i = 0;
}
buffer[i++] = tmp;
//入网成功的判断依据WIFI GOT IP
if(buffer[0] == 'W' && buffer[5] == 'G'){
AT_Connect_Net_Flag = 1;
memset(buffer, '\0', SIZE);
}
//连接服务器等OK返回值指令的判断
if(buffer[0] == 'O' && buffer[1] == 'K'){
AT_OK_Flag = 1;
memset(buffer, '\0', SIZE);
}
//联网失败出现FAIL字样捕获
if(buffer[0] == 'F' && buffer[1] == 'A'){
for(i=0;i<5;i++){
D5 = 0;
Delay1000ms();
D5 = 1;
Delay1000ms();
}
sendString(RESET);
memset(buffer, '\0', SIZE);
}
//灯控指令
if(buffer[0] == 'L' && buffer[2] == '1'){
D5 = 0;//点亮D5
memset(buffer, '\0', SIZE);
}
if(buffer[0] == 'L' && buffer[2] == '0'){
D5 = 1;//熄灭D5
memset(buffer, '\0', SIZE);
}
if(i == 12) i = 0;
}
}
注意:
1.我们这里有两个不同的端口,一个是连接wifi与USB转ttl用,这个端口要连接到安信可串口助手上去;另一个是数据线连接单片机用,这个端口要连接到STC串口助手上去,一定不要把端口号弄错了。
2.大家放大图片仔细观察三个助手,你会发现在单片机向ESP8266发送“AT+CIPSEND”之前,STC串口助手和安信可串口助手显示的命令是相同的。这是因为在没有正式透传之前,单片机作为发送设备,有两个接收设备。一个是STC串口助手,单片机发啥,它收啥,同时不做回应;另一个是ESP8266,但是ESP8266不仅接收还把接受的信息给了安信可串口助手,同时还回复安信可串口助手OK。
在“AT+CIPSEND”之后,我们发现STC串口助手和网络调试助手开始接收相同的内容“yangdong is handsome”,而安信可串口助手却没有任何内容。这是因为开启透传模式之后,作为发送设备的单片机还是有原来的两个接收设备,STC串口助手还是老样子,单片机给啥收啥;但是与之前不一样的是,我们的ESP8266开始开始无线传输数据了,直接把单片机给它的内容无线给了网络调试助手,不经过安信可串口助手了。
3.我要强调的最后一点是在你开始调试之前,请把你的网络调试助手先调制到我图中的状态,否则当你程序开始运行时,你会发现"AT+CIPSTART=\"TCP\",\"192.168.1.110\",8880\r\n";这个指令下面是ERROR,这是因为你没打开网络调试助手的原因。
这里需要说明的是,当我们模拟没有问题之后,需要把wifi模块的TX接回单片机的RX上,同时要将单片机重新上电,不然还是没法使用。
当可以正常使用后,我们就不需要任何串口助手了,仅需要网络助手即可。
版权声明:本文标题:如何通过51单片机模拟wifi模块通讯 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729819203a1213876.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论