智能车制作

标题: 编写程序51mcu控制wifi模块esp8266(新人求助帖) [打印本页]

作者: 追步者    时间: 2017-11-27 21:34
标题: 编写程序51mcu控制wifi模块esp8266(新人求助帖)
[attach]91635[/attach]



各位道友你们好!我是一名在校学生,目前在做esp8266与单片机的通信,可是遇到了一些困难,希望有道友帮我答疑,小子在这里感激不尽。

我的线路连接图如上图所示;
我可以直接使用串口工具,用pc直接给8266发送AT指令,可以设置相关参数;
使用c语言为51mcu编程,使51mcu向8266发送AT指令。可是我不能做到这点,希望各位前辈同行们可以帮我解答,再次感谢!!


我的程序大意是:使用8266station模式,建立终端server,生成WIFI信号,使用手机或者电脑连接8266发出的WIFI,然后打开网络调试助手,建立客服端,连接server(需要使用终端server的网址:19.168.4.1),然后发送相应数字,点亮相应的小灯(P1接小灯)。





下面写下我的代码:使用printf函数语句输出指令,或者使用SendString函数发送指令,使用"//"符号隔开:
#include"reg52.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char

#define led P1



int flag=0,a=0,d=0;

/*
uchar code esp_at[]="AT+RST\r\n";
uchar code esp_cwmode[]="AT+CWMODE=1\r\n";
uchar code esp_cipmux[]="AT+CIPMUX=1\r\n";
uchar code esp_cipserver[]="AT+CIPSERVER=1,8080\r\n";
uchar code esp_cipsend[]="AT+CIPSEND=0,19\r\n";
*/


//void delay(int x)
//{
//    int i,j;
//        for(i=0;i<x;i++)
//          for(j=0;j<110;j++);
//}


//void SendByte(uchar b);
//void SendString(uchar *s);

void init_esp()
{

      uint a;
     uchar ldat;
     int d =1;

     SCON=0x50; //串口工作方式1,8位UART,波特率可变  
     TH2=0xFF;           
     TL2=0xFD;    //波特率:115200 晶振=11.0592MHz
     RCAP2H=0xFF;   
     RCAP2L=0xFD; //16位自动再装入值

     TCLK=1;   
     RCLK=1;   
     C_T2=0;   
     EXEN2=0; //波特率发生器工作方式

    TR2=1 ; //定时器2开始            //
    TI = 1;

    REN=1;       //使能串口允许接收
    SM0=0;      //工作在串口的工作方式1
    SM1=1;
    ES=0;       //串口中断关闭,待初始化后再打开
    EA=1;       //总中断打开
        for (a=0; a<8000; a++);
                printf ("AT+RST\n");                    //SendString(esp_at);
       do{
           if(RI)
             {            
                   ldat=SBUF;        
                    RI=0;
                    if (ldat=='K')
                        d=0;
              }
             }while (d);
        d =1;
                for (a=0; a<1000; a++);  

        printf ("AT+CWMODE=2\n");                          //SendString(esp_cwmode);
       do{
           if(RI)
             {            
                   ldat=SBUF;        
                    RI=0;
                    if (ldat=='K')
                        d=0;
              }
             }while (d);
        d =1;
               
                for (a=0; a<1000; a++);  
        printf ("AT+CIPMUX=1\n");                   // SendString(esp_cipmux);
       do{
           if(RI)
             {            
                   ldat=SBUF;        
                    RI=0;
                    if (ldat=='K')
                        d=0;
              }
             }while (d);
        d =1;
               

        for (a=0; a<1000; a++);
        printf ("AT+CIPSERVER=1,8080\n");     //SendString(esp_cipserver);
         do{
            if(RI)
            {            
                ldat=SBUF;        
                RI=0;
                if (ldat=='K')
                    d=0;
            }
          }while (d);
        d =1;
       
        for (a=0; a<10000; a++);
        ES=1;   //串行口中断打开
}

void remote_control(unsigned char ldat)
{
         unsigned int a;

            switch(ldat)
            {
                case '1':                     //感叹号表示1楼,当然你也可以用其他表示方式,你也可以先接收到1,然后再进行其他的判断
                        printf ("AT+CIPSEND=0,19\n");               //发送语句的命令        //SendString(esp_cwmode);
                        for (a=0; a<10000; a++);
                        printf ("%c\nturn on the light");   //需要发送的语句
                                                led=0X80;
                        break;
                case '2':
                        printf ("AT+CIPSEND=0,20\n");
                        for (a=0; a<10000; a++);
                        printf("%c\nturn off the lights");
                                            led=0X40;
                        break;                        
                case '3':
                        printf ("AT+CIPSEND=0,18\n");
                        for (a=0; a<10000; a++);
                        printf("%c\nopen the window");
                                                led=0X20;
                        break;
                case '4':
                        printf("AT+CIPSEND=0,19\n");
                        for (a=0; a<10000; a++);
                        printf ("%c\nclose the window");
                                                led=0X10;
                        break;
                case '5':
                        printf ("AT+CIPSEND=0,19\n");
                        for (a=0; a<10000; a++);
                        printf ("%c\nopen the exhaust");
                                                led=0X08;
                        break;
                                case '6':
                        printf ("AT+CIPSEND=0,20\n");
                        for (a=0; a<10000; a++);
                        printf ("%c\nclose the exhaust");
                                                led=0X04;
                        break;
                                case '7':
                        printf ("AT+CIPSEND=0,20\n");
                        for (a=0; a<10000; a++);
                        printf ("%c\nclose the exhaust");
                                                led=0X20;
                        break;
                                case '8':
                        printf ("AT+CIPSEND=0,20\n");
                        for (a=0; a<10000; a++);
                        printf("%c\nclose the exhaust");
                                                led=0XFF;
                        break;
            }
            ES=0;
}



/*
void SendByte(uchar b)
{
  SBUF=b;
  while(!TI);
  TI=0;
}
void SendString(uchar *s)
{
  while(*s!='\0');
  {  
    SendByte(*s);
        s++;
  }
}
*/



void main()
{       

  led=0X00;
  init_esp();  //初始化ESP8266   
  while(1)
  {
     if(flag==1)
         {
        remote_control(a);       
            flag=0;
         }
         ES=1;
  }
         
       
}
//**********串口中断程序***************
void ser() interrupt 4
{
     RI=0;//
         a=SBUF;
         flag=1;
}


作者: 凌心    时间: 2017-11-28 09:44
没明白什么意思。如果可以直接用串口助手控制8266,那就可能是单片机端发送的问题,把串口助手接单片机上调试一下就好了嘛。
作者: 追步者    时间: 2017-11-28 15:47
凌心 发表于 2017-11-28 09:44
没明白什么意思。如果可以直接用串口助手控制8266,那就可能是单片机端发送的问题,把串口助手接单片机上调 ...

你的意思是先让mcu通过串口能发出东西,然后再和8266连接对吗?通过使用串口工具来检测


作者: 凌心    时间: 2017-11-28 17:33
追步者 发表于 2017-11-28 15:47
你的意思是先让mcu通过串口能发出东西,然后再和8266连接对吗?通过使用串口工具来检测

是的

作者: 追步者    时间: 2017-12-1 10:55
凌心 发表于 2017-11-28 17:33
是的

现在可以先使用串口工具试单片机发送出at指令了,可是接上8266以后还是没有反应

作者: 萌小凡    时间: 2017-12-16 03:19
51不做输出重定向你确定能用printf?




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2