標題: 51單片機驅(qū)動esp8266代碼 [打印本頁]

作者: 漸逝音璃    時間: 2018-5-2 00:26
標題: 51單片機驅(qū)動esp8266代碼
#include<reg52.h>               //51單片機常用的頭文件
#define uchar unsigned char     //宏定義一個無符號的char類型
#define uint unsigned int       //宏定義一個無符號的int類型

//發(fā)送一字節(jié)
void sendByte(uchar b)
{
  SBUF = b;
  while(!TI);
  TI=0;
}

//發(fā)送字符串
void sendString(uchar *s)
{
  while(*s != '\0') //字符串默認結(jié)尾'\0',以此來判斷字符串的結(jié)束
  {
    sendByte(*s);
    s++;
  }
}

//初始化ESP8266WiFi模塊
void initEsp()
{
  uint a;
  SCON = 0x50;    //8位數(shù)據(jù),可變波特率
  TMOD = 0x20;    //設置定時器1位16位自動重裝模式
  TL1 = 0xfd;     //設置定時器初值,波特率為9600
  TH1 = 0xfd;
  ET1 = 0;        //禁止定時器1中斷
  TR1 = 1;        //啟動定時器1
  EA = 1;

  for (a=0; a<50000; a++);      //延時幾秒,讓模塊有時間啟動
  sendString("AT+CWMODE=2\n");  //設置為softAP和station共存模式

  //WiFi熱點不能通過代碼設置,可使用串口助手進行設置,該設置斷電不丟失
  /*
  for (a=0; a<20000; a++);
  sendString("AT+CWSAP='TEST','12345678',1,3\n"); //建立WiFi熱點
  */

  for (a=0; a<50000; a++);   
  sendString("AT+CIPMUX=1\n"); //啟動多連接

  for (a=0; a<20000; a++);
  sendString("AT+CIPSERVER=1,333\n");//建立server,端口為333

  for (a=0; a<20000; a++);
  sendString("AT+CIPSTO=50\n");     //服務器超時時間設置

  RI=0;
  ES=1;   //初始化完成,串行口中斷打開
}

//獲取數(shù)據(jù),數(shù)據(jù)格式示例:+IPD,0,14:"time":"11:11"
void getData()
{
  uint a;
  if(receiveFlag)
  {
    for(i=0; i<2; i++)
    {
      Hour[i]=Buffer[17+i];
    }
    Hour[2]='\0';

    for(i=0; i<2; i++)
    {
      Minute[i]=Buffer[20+i];
    }
    Minute[2]='\0';

    //將獲取到的數(shù)據(jù)發(fā)送到串口助手上顯示
    for (a=0; a<10000; a++);    //需要延時,負責會造成數(shù)據(jù)錯亂導致丟包
    sendString(Hour);
    for (a=0; a<10000; a++);
    sendString(Minute);

    receiveFlag=0;
    count=0;
    for(i=0; i<22; i++)
    {
      Buffer[i]=0;
    }
  }
}

//主函數(shù)
void main()
{
  initEsp();            //初始化WiFi模塊
  receiveFlag = 0;      //receiveFlag判斷執(zhí)行g(shù)etData() 的標志
  count = 0;            //count緩沖區(qū)RXDdata[count]的索引  
  while(1)
  {
    getData();
  }
}

//利用中斷接收信息,且舍棄無效信息
void uart() interrupt 4  
{
  if(RI == 1)   
  {
    ES = 0;     //關閉串行中斷
    RI = 0;     //清除串口接收標志位
    temp = SBUF; //從串口緩沖區(qū)取得數(shù)據(jù)

    if(count<20)    //滿足需接收的信息長度,將數(shù)據(jù)存入緩沖區(qū)
    {
      Buffer[count]=temp;
      count++;
      if(Buffer[0]=='+')  //判斷是否為無效數(shù)據(jù),由于WiFi模塊會自動加上"+PID.."開頭的字符串
      {
        receiveFlag = 1;
      }
      else
      {
        receiveFlag = 0;
        count = 0;
      }
    }
    ES = 1;
  }
}


作者: 付小熊    時間: 2020-1-3 00:36
樓主大神好,我在使用單片機控制esp8622連接另一個esp8622過程中發(fā)現(xiàn),使用單片機控制連接不上,但是通過電腦串口的AT指令能連接上。這是什么原因?是不是您所說的不能通過51控制連接服務器,這個問題現(xiàn)在可以解決嗎?有伸手黨嫌疑,樓主見諒~




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1