单片机交流
直播中

算一挂

8年用户 887经验值
私信 关注
[问答]

如何通过单片机的串口将ESP8266EX模块设置AP模式?

如何通过单片机的串口将ESP8266EX模块设置AP模式?

回帖(1)

姜雨孜

2021-10-11 14:54:34
  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=2rn"},
{"AT+RSTrn"},
{"AT+CWSAP="},//这条指令用法参照AT指令用户手册
{"AT+CIPMUX=1rn"},
{"AT+CIPSERVER=1,8080rn"},
{"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!='') //发送字符串
        {
                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==':')
//                        {
//                                flag=dat[i+1]-0x30;
//                                break;               
//                        }
//                        dat=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;
        }
}
举报

更多回帖

×
20
完善资料,
赚取积分