ESP2866_20170221

ESP2866_20170221的详细介绍

创作者:果冻汇源 | 更新日期:2017-05-20 | 在线时长:5时
果冻汇源的第一个设备,来自贝壳物联 这是一个测试设备,本来是用来做我们学校low爆了的科研成长导师项目,由于队长(myLazy室友)拖延问题,就被一直搁置,最后迫不得已他掏了一款STM32的板子(汗)导致本C51项目流产(哭),顶着被队长骂的风险冒死完成了一部分功能(与贝壳的连接部分)功能没时间进一步完善了,我就先公布一下我的成果吧。

功能介绍

APP控制STC89C51单片机

硬件组成

AndroidAPP  STC89C51以及keil、STCISP等软件、ESP8266(01s)

代码说明

/*
  基于贝壳物联的单片机控制系统
  public by 果冻汇源 2017.5.20 zju
 
  前期工作:ESP8266的WIFI设置好(可以用smartlink来做),通讯频率为4800Hz
*/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
void uartconfig();
void delay10ms(unsigned int c) ;
void keypros();
void init();
void send(unsigned char *str);
void function(uchar s);
void receive();
uchar dat0[]="AT+RST\r\n";
uchar dat1[]="AT+CIPSTART=\"TCP\",\"www.bigiot.net\",8181\r\n";
uchar dat2[]="AT+CIPSEND=60\r\n";                                                   //建立TCP连接和轮徇发送指令,保持不掉线
uchar dat3[]="\r\n{\"M\":\"checkin\",\"ID\":\"1450\",\"K\":\"9c85f0bf6\"}\r\n";      //注册信息:到贝壳物联去注册一个
uchar i;
uchar temp[120],j=0,i=0,k=0,m=0,n;
uchar s[10];
uint flag=0;
 sbit k1 = P1^3;
 sbit k2 = P1^0;
void main()
{
        uartconfig(); //init f=4800Hz
        while(1){
        init();          //login "www.bigiot.net" with passwd
        while(1){
              keypros();   //send "AT+RST" when K1=P1^3==0
              send(dat2);  // keep login
            for(n=0;n<40;n++){    //延迟中加监听
              delay10ms(10);
              receive();}
          }
        }
}
 //判断接收的字符串flag字符串接收完成标志,temp寄存器,
void receive(){        
      if(flag){
         while(temp[j]!='C'&&m>=j){
             j++;
             m=j;
             if(temp[j]=='\0'||j>=120){
                for(j=0;j<=120;j++)
                    temp[j]='\0';
                j=0;
                m=0;
                   }
              }
          if(j!=0&&j<=120){
              if(temp[j]=='C'){j=j+4;}
            while(temp[j]!='\"'){
                    s[k]=temp[j];
                    SBUF=s[k];
                    j++;k++;
                    while(!TI);
                      TI=0;}
            flag=0;
            m=j;
            function(*s);
              }
        }                  //判断完成flag=0,下次while(1)跳到else完成jmk串口初始化;
        else {
            j=0;
            m=0;
            k=0;
          }
    
}
//执行功能,将不同字符串转化为不同输出(指针实现)
void function(uchar s){        
  if (s=='p'){
     P0=10010010;

  }
  else {
      P0=11111111;
  }
}
//登录贝壳网的初始化
void init(){
    send(dat1);
    delay10ms(100);
    send(dat2);
    delay10ms(100);
    send(dat3);
    send(dat3);
    delay10ms(100);
}
//按键的延时消抖程序(100ms)
void keypros()
{
       if(k1==0){
    delay10ms(10);
    if(k1==0){
         send(dat0);  //发送AT+RST指令,初始化ESP8266
    delay10ms(100);    
      init();        //发送登录命令
        }
    }
}
//发送字符串命令到ESP8266串口
void send(unsigned char *str){
    i=0;
     while(str[i]!='\0'){
         SBUF=str[i];
        while(!TI);
        TI=0;
        i++;
    }
}
//单片机初始化  通讯频率4800Hz,开串行口ES中断
void uartconfig()
{
        SM0=0;
        SM1=1;
        REN=1;
        TMOD=0x20;
        PCON=0x80;
        TL1=0xf3;
        TH1=0xf3;
        TR1=1;
        EA=1;
        ES=1;
}
//ES中断命令,接收字符并保存,接收完成发送flag=1(每次中断接收一个字符)
void ser() interrupt 4
{       
    if(RI){
    RI=0;
    temp[i]=SBUF;
    i++;
    if(SBUF=='}'){
        i=0;
        flag=1;
        }
    }            
}
//延时程序(粗略)
void delay10ms(unsigned int c)   
{
    uchar a, b;
       for (;c>0;c--)
         for (b=38;b>0;b--)
            for (a=130;a>0;a--);      
}

Readme:

硬件连接:
STC89C51——ESP8266-01s

  K1——> P1^4
  P3^0(RX)——>TX(ESP)
  P3^1(RX)——>RX(ESP)
  P0(程序可以自己修改)——>LED

测试的时候可能会不稳定(点击发送的时候单片机可能在延时之中,如果多次发送无效,尝试reset单片机程序)