×
单片机 > 单片机程序设计 > 详情

AT89C51控制ESP8266WIFI模块程序

发布时间:2020-09-03 发布时间:
|

AT89C51控制ESP8266WIFI模块程序一:



#include "AT89X51.H"

#include "stdio.h"

unsigned int a;

int b=1;

int c =1;

int d =1;

int e=1;

int f=0;

void main(void)  

{

        unsigned char ldat;

         //PCON |=0X80;                //是否波特率倍增

        SCON=0x50;

        TMOD=0X20;                                //设置定时器1为模式2,做为波特率发生器

        TL1=0xFD;                                //9600波特率的初值,板子使用11.592M晶振,初值=256-12000000/32/12/2400

        TH1=0xFD;                                //

        TI = 1;

        TR1=1;                                        //启动波特率发生

                        //设置串口方式2

                 do{

for (a=0; a<50000; a++);        //延时几秒,让模块有时间启动

printf ("AT+CIPMUX=1\n"); //发送命令AT+CIPMUX=1,让模块进入多连接模式

        if(RI){                                //查询是否有数据接收

                        ldat=SBUF;                //数据暂存于变量中

                        RI=0;

                                if (ldat=='K')//命令执行成功,就会返回OK,这里就是查询是否有K返回,若有K返回,就说明执行成功,可以执行下一条,否则继续循环

                                {b=0 ;

                                d=0;}

                           c++;

                        if (c==1000)

                        {c=1;

                        d=0;}}

  }while (d);   

        }while(b) ;

b=1;

c =1;

d =1;//b、c、d复位,便于执行下一条命令

                   do{

for (a=0; a<10000; a++);

printf ("AT+CIPSERVER=1,7671\n"); 

        do{

        if(RI){                                //查询是否有数据接收

                        ldat=SBUF;                //数据暂存于变量中

                        RI=0;

                                if (ldat=='K')//同上

                                {b=0 ;

                                d=0;}

                           c++;

                        if (c==1000)

                        {c=1;

                        d=0;}}

  }while (d);   

        }while(b) ;         

b=1;

c =1;

d =1;

                 do{

for (a=0; a<10000; a++);

printf ("AT+CIPSTO=50\n"); 

        do{

        if(RI){                                //查询是否有数据接收

                        ldat=SBUF;                //数据暂存于变量中

                        RI=0;

                                if (ldat=='K')//同上

                                {b=0 ;

                                d=0;}

                           c++;

                        if (c==1000)

                        {c=1;

                        d=0;}}

  }while (d);   

        }while(b) ;

b=1;

c =1;

d =1;

//执行上述命令,模块进入服务模式,下面单片机就可以接收远程发来的数据

        while(1)

        {        

                  if(RI){                                //查询是否有数据接收

                        ldat=SBUF;                //数据暂存于变量中

                        RI=0;                        //重新清0等待接收

                        

                        

//命令接收开始

                        if (ldat=='}')        

                        { char k[50] ;//设置接收数据缓冲

            

              do{

           

           if(RI){                                //查询是否有数据接收

                        ldat=SBUF;                //数据暂存于变量中

                        RI=0;                        //重新清0等待接收

                     k[f]=ldat;//一个个字符接收

        f++        ;

        if(ldat==0x0A){e=0;}        //若有新行字符,则结束接收,则说明命令接收完毕

                }

           } while        (e)        ;

            printf("%s\n", k);//执行远程发来的命令

         f=0;

         e=1;

                        for (a=0; a<50; a++){

                        k[a]=0;

                        

                        }

           

}

//命令结束

                

                        if (ldat==']')

{P1_4=1;

  printf ("AT+CIPSEND=0,1\n");

for (a=0; a<10000; a++);

printf ("A");

}

                        if (ldat=='-')

{P1_4=!P1_4;

}

                                 if (ldat=='[')

{P1_4=0;

  printf ("AT+CIPSEND=0,1\n");

for (a=0; a<10000; a++);

printf ("B");

}

                        if (ldat=='{')

{

if(P1_4==0){

printf ("AT+CIPSEND=0,1\n");

for (a=0; a<10000; a++);

printf ("B");

}

else{

  printf ("AT+CIPSEND=0,1\n");

for (a=0; a<10000; a++);

printf ("A");

}

}

        

                }

        }

        

}

AT89C51控制ESP8266WIFI模块程序二:

#include                       //包含头文件

#define uint unsigned int

#define uchar unsigned char

#define RELOAD_COUNT 0xFA         //宏定义波特率发生器的载入值

//define RELOAD_COUNT (256-(((11520000/16)/12)/9600)) 也可以或波特率9600 //256-晶振频率/波特率x16=BRT

sbit LED0=P3^2;

sfr AUXR=0x8E;

sfr BRT=0x9C;

sfr AUXR1=0xA2;

uchar Receive,i;                             

uint n;

uchar Recive_table[15];        //用于接收wifi模块反馈到MCU上的数据

void ms_delay(uint t)

{

      uint i,j;

      for(i=t;i>0;i--)

       for(j=110;j>0;j--);

}

void us_delay(uchar t)

{

      while(t--);

}

void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)

{

      SCON=0x50;     //设置为串行口以方式1工作,8位异步通讯,允许接收中断。

      //一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。

      PCON=0x80;     //SMOD波特率选择位为1,SMOD=1.

      TMOD=0x21;     //设置定时器1为波特率发生器,工作在模式2,8位自动装载

      TH1=RELOAD_COUNT;//波特率9600 ,TH1=256-FOSC/16/12/波特率

      TL1=TH1;

      EA=1;                            //总中断打开

      ES=0;                             //关闭串口中断

      TR1=1;                     //启动定时器1

}

void Send_Uart(uchar value)

{

      ES=0;         //关闭串口中断

      TI=0;         //清发送完毕中断请求标志位

      SBUF=value;     //发送

      while(TI==0);   //等待发送完毕

      TI=0;         //清发送完毕中断请求标志位

      ES=1;         //允许串口中断

}

void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组               

{

      while(*puf!='\0')    //遇到空格跳出循环

      {

           Send_Uart(*puf);  //向WIFI模块发送控制指令。

           us_delay(5);

           puf++;      

      }

      us_delay(5);

      Send_Uart('\r');//回车

      us_delay(5);

      Send_Uart('\n');   //换行

      ms_delay(1000);

}   

void ESP8266_Sent(uchar *puf)      // 数组指针*puf指向字符串数组               

{

      ESP8266_Set("AT+CIPSEND=0,4");

      while(*puf!='\0')    //遇到空格跳出循环

      {

           Send_Uart(*puf);   //向WIFI模块发送控制指令。

           us_delay(5);

           puf++;      

      }

      us_delay(5);

      Send_Uart('\n');   //换行

      ms_delay(10);

}   

void main()

{

      LED0=0;//关闭LED灯

      Uart_Init();//使用独立的波特率发生器

ESP8266_Set("AT+CWMODE=2"); //设置路由器模式 1 station模式 2 AP

//点 路由器模式 3 station+AP混合模式

      ESP8266_Set("AT+RST");     //重新启动wifi模块

          ESP8266_Set("AT+CWSAP=\"WIFI\",\"1234567890\",11,4");

//设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)

ESP8266_Set("AT+CIPMUX=1");//开启多连接模式,允许多个各客户端接入

ESP8266_Set("AT+CIPSERVER=1,5000");  //启动TCP/IP 端口为8080 实现基于网络//控制

      ES=1;                                                           //允许串口中断

      while(1)

      {         

if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭

            {

                if((Recive_table[3]=='D')&&(Recive_table[6]==','))

                     {   

                      if(Recive_table[9]=='0')

                            {

                                  LED0=0;//0 灯灭               

ESP8266_Sent("灯灭");

//wifi模块向pc端或手机端 发送"灯灭

}

                           else if (Recive_table[9]=='1')

                            {                                

                                  LED0=1;    //1 灯亮

                                 ESP8266_Sent("灯亮");     

//wifi模块向pc端或手机端 发送"灯亮"            

                 }

           }   

        }      

}         

}

void Uart_Interrupt() interrupt 4        

{

  static uchari=0;

      if(RI==1)

      {

           RI=0;

           Receive=SBUF;        //MCU接收wifi模块反馈回来的数据

           Recive_table=Receive;     

           i++;         

           if((Recive_table[i-1]=='\n'))i=0;  //遇到换行 重新装值

}

      else TI=0;        

}





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码