找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9627|回复: 6
打印 上一主题 下一主题
收起左侧

51单片机使用8266wifi(esp12s)实验例程(含源程序)

  [复制链接]
跳转到指定楼层
楼主
软件准备:1.net assist网络调试助手
2.串口调试助手

主要问题以及解决方案
1.采用12M晶振,波特率设置为9600时,通信误差率过大
解决方法:
                (1)换11.0592Mhz晶振
                (2)使用T2寄存器,算出初始值
                        SCON=0X50;               
                                T2CON=0X34;            
                                PCON=0X80;               
                                RCAP2H=(65536-39)/256;               
                                RCAP2L=(65536-39)%256;


2.STC52单片机存放不下要发送给8266WIFI的太多指令
解决方法:
                在target的option里选为large in XDATA,意思为使用单片机的64KBRAM空间,程序内定义的所有变量都会存放到此空间。
                同时选用use Xram,只用加stc的keil扩展包才会有这个选项,选用AT89C51不会有。


                                          


3.单片机接受所数字如何转整形?
解决方案:
              (1)可以看我另一个帖子的回复
              (2)将串口接收信息定义为整型,上位机发送字母或数字,相应ASCII码的二进制转十进制的值就是串口接收到的数据,例如,发送0收到48,发送A收到65。

4.字符串的发送
解决方案:
               采用指针反复调用发送单一字符的程序
                              void send_byte(uchar by)   //发送单一字符的函数
                           {
                              SBUF = by;
                              while(!TI);
                              TI = 0;      
                            }


                             void send_string(uchar *p)  //发送字符串的函数
                           {
                              while(*p!= '\0')
                             {
                                send_byte(*p);   //反复调用发送单一字符的函数
                                p++;
                             }
                         }


5.如何使用8266wifi模块?
  解决方案:                      
                  8266wifi有AT指令集,我放在附件

                  51单片机通过串口TXD向8266wifi的RXD发送指令,8266wifi模块进行相应操作
                  所以要在51内存放相应字符串指令(末尾一定要加回车符和换行符
                  uchar rst[]="AT+RST\r\n"; //wifi模块复位esp12s初始波特率为9600
                  uchar mod[]="AT+CWMODE=3\r\n";//设置为AP和ST模式,可连接网络,也开启热点
                  uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";//“Nick”为所要链接网络wifi名,"qweasdzxc"为wifi密码
                  uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n"//TCP为网络传输协议,192.168.43.31为上位机端口号,输入正确即可和上位机无线通信
                  uchar mods[]="AT+CIPMODE=1\r\n"; //开启发送模式
                  uchar sen[]="AT+CIPSEND\r\n";//开始发送,执行完此指令后,单片机向wifi模块发送的任何信息自动默认为所要发送给上位机的信息



5.发送信息后跳到串口中断程序,误操作接收程序怎么办?
解决方案:
发送信息前关闭串口中断,发送信息后打开串口中断



6.发送连接相应wifi的指令后,还没连接成功就进行下一条指令操作怎么办?

解决方案:

                   设置延时,连接端口指令建议延时长一点



源程序如下(我使用的是精准延时,如果要拷贝的话看我另一个帖子,添加c.lib)

#include "reg52.h"

#include "stdio.h"

#include "string.h"

#define uchar unsigned char

#define uint unsigned int

void send_byte(uchar by);

void send_string(uchar *p);

void delay(uint n);        


uchar rst[]="AT+RST\r\n";

uchar mod[]="AT+CWMODE=3\r\n";

uchar wico[]="AT+CWJAP=\"Nick\",\"qweasdzxc\"\r\n";

uchar sev[]="AT+CIPSTART=\"TCP\",\"192.168.43.31\",8080\r\n";

uchar mods[]="AT+CIPMODE=1\r\n";

uchar sen[]="AT+CIPSEND\r\n";

uchar in[]="in\r\n";

uchar copa[]="bye\r\n";

uint g,y,r;

sbit ght=P2^0;

sbit yht=P2^1;

sbit rht=P2^2;

void UsartInit()

{

                SCON=0X50;               

                T2CON=0X34;            

                PCON=0X80;               

                RCAP2H=(65536-39)/256;               

                RCAP2L=(65536-39)%256;

                ES=0;                                

                EA=1;

                 ET0=1;

                ET1=1;

                EX0=1;

                IT0=1;

                EX1=1;

                IT1=1;

}


void main()

{

        

        UsartInit();

        send_string(rst);

        delay(1);

        send_string(mod);

        delay(1);

        send_string(wico);

        delay(10);

        send_string(sev);

        delay(10);

        send_string(mods);

        delay(5);

        send_string(sen);

        delay(3);

        ES=1;

        g=5;

        y=2;

        r=5;

        while(1)

        {

                ght=0;

                yht=1;

                rht=1;

                delay(g);

                ght=1;

                yht=0;

                rht=1;

                delay(y);

                ght=1;

                yht=1;

                rht=0;

                delay(r);

        }

}        



void send_byte(uchar by)

{

                SBUF = by;

    while(!TI);

    TI = 0;      

}


void send_string(uchar *p)

{

    while(*p!= '\0')

                        {

        send_byte(*p);

        p++;

    }

}



void delay(uint n)

{

        unsigned int i=0;

  for(i=0;i<n;i++)

        {

                #pragma asm

                DEL3:MOV R0,#100

                DEL2:MOV R1,#100

                DEL1:MOV R2,#25

          DEL0:NOP

               NOP

               DJNZ R2,DEL0

               DJNZ R1,DEL1

               DJNZ R0,DEL2

        #pragma endasm

        }

}

void Usart() interrupt 4

{

        uint str1;

        str1=SBUF;

        g=str1;

        r=str1;

        RI = 0;//

}

void Iny0()        interrupt 0        

{

        ES=0;

        send_string(in);

        ES=1;

}

void Iny1()        interrupt 2

{

        ES=0;

        send_string(copa);

        ES=1;

}


at指令集:

AT指令集018.pdf (690.8 KB, 下载次数: 60)




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:76201 发表于 2019-3-27 13:14 来自手机 | 只看该作者
帖子不错,怎么没人顶啊!谢谢分享!
回复

使用道具 举报

板凳
ID:349355 发表于 2019-3-27 16:07 | 只看该作者
可以的,ESP8266的好资料。
回复

使用道具 举报

地板
ID:403593 发表于 2019-3-27 19:52 | 只看该作者
好帖子,好资料!感谢楼主分享!
回复

使用道具 举报

5#
ID:992634 发表于 2023-4-26 20:00 | 只看该作者
请问采用12MHz的晶振,波特率设为4800,应该也可以吧
回复

使用道具 举报

6#
ID:1064915 发表于 2023-4-27 10:14 | 只看该作者
这个例程实验输出是什么
回复

使用道具 举报

7#
ID:398219 发表于 2023-4-28 15:54 | 只看该作者
贴子不错,请问一下楼主。
我用单片机通过串口连接8266获取时间及天气。通常前几次可以正常的获取到时间及天气信息。但是出现异常时(未找到原因),单片机串口发送给ESP01S模块的数据,未接收到WIFI模块的返回(感觉就像8266死机的样子),解决办法只有给单片机和WIFI模块重新上电才能又可以工作几次 。
感觉是不是ESP01S模块串口数据通信多了,导致模块工作异常了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表