如何通过51单片机模拟wifi模块通讯

在阅读这篇文章之前,如果过你对ESP8266完全不懂,或者你知道一些指令但是连接串口助手后却发现发送AT指令无效,我建议你先看看http://t.csdn.cn/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的波特率为9600OK
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上,同时要将单片机重新上电,不然还是没法使用。

当可以正常使用后,我们就不需要任何串口助手了,仅需要网络助手即可。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值