智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 11862|回复: 5
打印 上一主题 下一主题

编写程序51mcu控制wifi模块esp8266(新人求助帖)

[复制链接]

12

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2321
威望
1771
贡献
454
兑换币
191
注册时间
2016-6-4
在线时间
48 小时
毕业学校
社会中成长
跳转到指定楼层
1#
发表于 2017-11-27 21:34:57 | 只看该作者 回帖奖励 |正序浏览 |阅读模式




各位道友你们好!我是一名在校学生,目前在做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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

7

主题

135

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2813
威望
1378
贡献
859
兑换币
812
注册时间
2015-11-3
在线时间
288 小时
毕业学校
地高
6#
发表于 2017-12-16 03:19:24 | 只看该作者
51不做输出重定向你确定能用printf?
回复 支持 反对

使用道具 举报

12

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2321
威望
1771
贡献
454
兑换币
191
注册时间
2016-6-4
在线时间
48 小时
毕业学校
社会中成长
5#
 楼主| 发表于 2017-12-1 10:55:19 | 只看该作者

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

使用道具 举报

282

主题

1780

帖子

1

精华

管理员

曾经的智能车人……

Rank: 11Rank: 11Rank: 11Rank: 11

积分
28420

特殊贡献奖章资源大师奖章论坛骨干奖章论坛元老奖章优秀版主奖章推广达人奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
10441
贡献
11685
兑换币
4726
注册时间
2009-9-7
在线时间
3147 小时
4#
发表于 2017-11-28 17:33:20 | 只看该作者
追步者 发表于 2017-11-28 15:47
你的意思是先让mcu通过串口能发出东西,然后再和8266连接对吗?通过使用串口工具来检测

是的
回复 支持 反对

使用道具 举报

12

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2321
威望
1771
贡献
454
兑换币
191
注册时间
2016-6-4
在线时间
48 小时
毕业学校
社会中成长
3#
 楼主| 发表于 2017-11-28 15:47:59 | 只看该作者
凌心 发表于 2017-11-28 09:44
没明白什么意思。如果可以直接用串口助手控制8266,那就可能是单片机端发送的问题,把串口助手接单片机上调 ...

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

回复 支持 反对

使用道具 举报

282

主题

1780

帖子

1

精华

管理员

曾经的智能车人……

Rank: 11Rank: 11Rank: 11Rank: 11

积分
28420

特殊贡献奖章资源大师奖章论坛骨干奖章论坛元老奖章优秀版主奖章推广达人奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
10441
贡献
11685
兑换币
4726
注册时间
2009-9-7
在线时间
3147 小时
2#
发表于 2017-11-28 09:44:23 | 只看该作者
没明白什么意思。如果可以直接用串口助手控制8266,那就可能是单片机端发送的问题,把串口助手接单片机上调试一下就好了嘛。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 11:13 , Processed in 0.073031 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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