找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4682|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

ESP8266接收51單片機(jī)串口指令無反饋求助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:299121 發(fā)表于 2018-4-22 17:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51單片機(jī)用的是普中開發(fā)板,晶振11.0592MHz,波特率設(shè)置9600
ESP8266RX,TX分別反接單片機(jī)TX,RX端

上電后,串口助手顯示正常,發(fā)送指令時(shí)芯片藍(lán)燈閃爍 ,但ESP8266無反饋ok或者別的信息  TCP調(diào)試助手也無法連接熱點(diǎn)  


代碼如下,求助各位大神。。
  1. #include<reg51.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. uchar i;
  5. sbit RS=P2^6;
  6. sbit RW=P2^5;
  7. sbit E=P2^7;
  8. sbit D1=P1^0;
  9. sbit D2=P1^1;
  10. sbit k1=P2^1;//加按鍵
  11. sbit k2=P2^2;//減按鍵
  12. sbit k3=P2^0;//設(shè)置按鍵
  13. uint th=360;//設(shè)定 高溫
  14. uint tl=350;//設(shè)定 低溫
  15. uint ta;//實(shí)際溫度
  16. uchar code t0[]="WD=  .          ";
  17. uchar code t1[]="TH=  .  TL=  .  ";
  18. uchar code wendu[]="0123456789";        //利用一個(gè)溫度表解決溫度顯示亂碼
  19. sbit DQ=P3^7;//定義DS18B20總線IO
  20. uchar position;//設(shè)置的位置
  21. uchar table1[]="lowtemp ";
  22. uchar table2[]="hightemp";
  23. uchar table3[]="smoke   ";
  24. uchar table4[]="gas     ";
  25. uchar table5[]="help me ";

  26. //延時(shí)子函數(shù)

  27. void delay(uint z)
  28. {
  29.         uint x,y;
  30.         for(x=100;x>1;x--)
  31.                 for(y=z;y>1;y--);

  32. }

  33. void ms_delay(uint t)
  34. {  
  35.         uint i,j;  
  36.         for(i=t;i>0;i--)   
  37.         for(j=110;j>0;j--);
  38. }   
  39. void us_delay(uchar t)
  40. {  
  41.         while(t--);
  42. }  

  43. //LCD1602液晶寫命令子函數(shù)
  44. void write_com(uchar com)
  45. {
  46.         RS=0;
  47.         P0=com;                                       
  48.         delay(5);
  49.         E=1;
  50.         delay(5);
  51.         E=0;
  52. }
  53. //LCD1602液晶寫數(shù)據(jù)子函數(shù)
  54. void write_date(uchar date)
  55. {
  56.         RS=1;
  57.         P0=date;
  58.         delay(5);
  59.         E=1;
  60.         delay(5);
  61.         E=0;
  62. }
  63. //LCD1602液晶初始化子函數(shù)
  64. void LCD1602_init()
  65. {
  66.         E=0;
  67.         RW=0;
  68.         write_com(0x38);
  69.         write_com(0x01);
  70.         write_com(0x0c);
  71.         write_com(0x06);
  72.         write_com(0x80);        
  73.         for(i=0;i<16;i++)
  74.         {
  75.                 write_date(t0[i]);
  76.                 delay(0);
  77.         }
  78.         write_com(0x80+0x40);
  79.         for(i=0;i<16;i++)
  80.         {
  81.                 write_date(t1[i]);
  82.                 delay(0);
  83.         }
  84. }
  85. //延時(shí)子函數(shù)
  86. void tmpDelay(int num)
  87. {
  88.         while(num--);
  89. }        
  90. //DS18B20溫度傳感器初始化子函數(shù)
  91. void DS18B20_init()
  92. {
  93.         uchar x=0;
  94.         DQ=1;    //DQ復(fù)位
  95.         tmpDelay(8);  //稍做延時(shí)
  96.         DQ=0;    //單片機(jī)將DQ拉低
  97.         tmpDelay(80); //精確延時(shí) 大于 480us
  98.         DQ=1;    //拉高總線
  99.         tmpDelay(14);
  100.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  101.         tmpDelay(20);
  102. }
  103. //DS18B20溫度傳感器讀一個(gè)字節(jié)子函數(shù)
  104. uchar ReadOneChar()
  105. {
  106.         uchar i=0;
  107.         uchar dat=0;
  108.         for(i=8;i>0;i--)
  109.         {
  110.                 DQ=0; // 給脈沖信號
  111.                 dat>>=1;
  112.                 DQ=1; // 給脈沖信號
  113.                 if(DQ)
  114.                         dat|=0x80;
  115.                 tmpDelay(4);
  116.         }
  117.         return(dat);
  118. }
  119. //DS18B20溫度傳感器寫一個(gè)字節(jié)子函數(shù)
  120. void WriteOneChar(uchar dat)
  121. {
  122.         uchar i=0;
  123.         for(i=8;i>0;i--)
  124.         {
  125.                 DQ=0;
  126.                 DQ=dat&0x01;
  127.                 tmpDelay(5);
  128.                 DQ=1;
  129.                 dat>>=1;
  130.         }
  131. }
  132. //讀取溫度子函數(shù)
  133. uint Readtemp()
  134. {
  135.         uchar a=0;
  136.         uchar b=0;
  137.         uint t=0;
  138.         float tt=0;        
  139.         DS18B20_init();
  140.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  141.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  142.         DS18B20_init();
  143.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  144.         WriteOneChar(0xBE); //讀取溫度寄存器
  145.         a=ReadOneChar();   //連續(xù)讀兩個(gè)字節(jié)數(shù)據(jù)   //讀低8位
  146.         b=ReadOneChar();                          //讀高8位
  147.         t=b;
  148.         t<<=8;
  149.         t=t|a; //兩字節(jié)合成一個(gè)整型變量。
  150.         tt=t*0.0625;  //得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20可以精確到0.0625度,所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度
  151.         t=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時(shí)進(jìn)行一個(gè)四舍五入操作。
  152.         return(t);
  153. }
  154. //LCD1602液晶顯示子函數(shù)
  155. void display()
  156. {
  157.            uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用unshigned char  字符型則顯示錯(cuò)誤
  158.         shi=th/100;                  //顯示 最高溫度 Th
  159.         ge=th/10%10;
  160.         xiaoshu=th%10;
  161.         write_com(0x80+0x40+3);
  162.         write_date(wendu[shi]);
  163.         write_com(0x80+0x40+4);
  164.         write_date(wendu[ge]);                                       
  165.         write_com(0x80+0x40+6);
  166.         write_date(wendu[xiaoshu]);
  167.         shi=tl/100;          //顯示 最低文帝 Tl  
  168.         ge=tl/10%10;
  169.         xiaoshu=tl%10;
  170.         write_com(0x80+0x40+11);
  171.         write_date(wendu[shi]);
  172.         write_com(0x80+0x40+12);
  173.         write_date(wendu[ge]);                                                
  174.         write_com(0x80+0x40+14);
  175.         write_date(wendu[xiaoshu]);
  176. }


  177. void Uart_Init()                                //使用定時(shí)器1作為波特率發(fā)生器(STC89C52、STC89C51、AT89C51等均可)
  178. {  
  179.     TMOD = 0x21;
  180.     SCON = 0x50;                                 //設(shè)置串行方式
  181.     TH1 = 0xFD;                                         //波特率9600
  182.     TL1 = TH1;
  183.     PCON = 0x00;
  184.     EA = 1;                                                //總中斷打開
  185.     ES = 1;                                                //開串口中斷  
  186.     TR1 = 1;                                        //啟動(dòng)定時(shí)器1
  187. }  

  188. /********************************************************************
  189. 名稱:串口發(fā)送函數(shù)  功能:MCU向無線WIFI模塊ESP8266發(fā)送數(shù)據(jù)  
  190. ********************************************************************/
  191. void Send_Uart(uchar value)
  192. {  
  193.         ES=0;                                                  //關(guān)閉串口中斷  
  194.         TI=0;                                           //清發(fā)送完畢中斷請求標(biāo)志位   
  195.         SBUF=value;                                 //發(fā)送  
  196.         while(TI==0);                                 //等待發(fā)送完畢   
  197.         TI=0;                                           //清發(fā)送完畢中斷請求標(biāo)志位   
  198.         ES=1;                                                  //允許串口中斷
  199.         TH0=0;
  200.         TL0=0;  
  201. }  

  202. /********************************************************************
  203. 名稱:WIFI模塊設(shè)置函數(shù)  作用: 啟動(dòng)模塊,以便可以實(shí)現(xiàn)無線接入和控制  
  204. ********************************************************************/

  205. void ESP8266_Set(uchar *puf)         // 數(shù)組指針*puf指向字符串?dāng)?shù)組               
  206. {   
  207.         while(*puf!='\0')                    //遇到空格跳出循環(huán)  
  208.         {   
  209.                 Send_Uart(*puf);                  //向WIFI模塊發(fā)送控制指令。   
  210.                 us_delay(5);   
  211.                 puf++;   
  212.         }  
  213.         us_delay(5);  
  214.         Send_Uart('\r');                         //回車  
  215.         us_delay(5);  
  216.         Send_Uart('\n');                           //換行  
  217. }





  218. //報(bào)警子函數(shù)
  219. void temp_check()
  220. {
  221.         uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用unshigned char  字符型則顯示錯(cuò)誤
  222.         ta=Readtemp();
  223.         if(ta>th)
  224.         {
  225.                 D1=1;
  226.                 D2=0;
  227.                             ESP8266_Set("AT+CIPSEND=0,10");           ////發(fā)送字符長度  
  228.                         ms_delay(100);        
  229.                         ESP8266_Set(table2);                          //發(fā)送數(shù)組
  230.                         ms_delay(100);      
  231.         }
  232.         else if(ta<tl)
  233.         {
  234.                 D1=0;
  235.                 D2=1;
  236.                                 ESP8266_Set("AT+CIPSEND=0,10");           ////發(fā)送字符長度  
  237.                         ms_delay(100);        
  238.                         ESP8266_Set(table1);                          //發(fā)送數(shù)組
  239.                         ms_delay(100);
  240.         }
  241.         else
  242.         {
  243.                 D1=0;
  244.                 D2=0;
  245.         }
  246.         shi=ta/100;         //顯示 實(shí)際溫度  
  247.         ge=ta/10%10;
  248.         xiaoshu=ta%10;
  249.         write_com(0x80+3);
  250.         write_date(wendu[shi]);
  251.         write_com(0x80+4);
  252.         write_date(wendu[ge]);                                                
  253.         write_com(0x80+6);
  254.         write_date(wendu[xiaoshu]);
  255. }
  256. //按鍵掃描子函數(shù)
  257. void key()
  258. {        
  259.         if(k3==0)                 //set 按鍵 按下
  260.         {
  261.                 delay(1);
  262.                 if(k3==0)
  263.                 {                                                        //設(shè)置位置設(shè)定
  264.                         position++;
  265.                         if(position>2)
  266.                                 position=0;
  267.                         if(position==0)                  // 無設(shè)置位置
  268.                         {
  269.                                 write_com(0x80+0x40+7);
  270.                                 write_date(' ');
  271.                                 write_com(0x80+0x40+15);
  272.                                 write_date(' ');
  273.                         }
  274.                         if(position==1)                //設(shè)置TH 在th后顯示< 標(biāo)識當(dāng)前位置
  275.                         {
  276.                                 write_com(0x80+0x40+7);
  277.                                 write_date('<');
  278.                                 write_com(0x80+0x40+15);
  279.                                 write_date(' ');                  
  280.                         }
  281.                         if(position==2)          //設(shè)置Tl   在tl后顯示< 標(biāo)識當(dāng)前位置
  282.                         {
  283.                                 write_com(0x80+0x40+7);
  284.                                 write_date(' ');
  285.                                 write_com(0x80+0x40+15);
  286.                                 write_date('<');                  
  287.                         }
  288.                         while(k3==0);        
  289.                 }        
  290.         }        
  291.         if(k1==0)
  292.         {
  293.                 delay(1);
  294.                 if(k1==0)
  295.                 {
  296.                         if(position==1)
  297.                         {
  298.                                 th+=5;
  299.                                 if(th>1000)
  300.                                         th=990;
  301.                         }
  302.                         if(position==2)
  303.                         {
  304.                                 tl+=5;                          //tl>th時(shí)  是個(gè)錯(cuò)誤,這里避免此情況發(fā)生
  305.                                 if(tl>=th)
  306.                                         tl=th-5;
  307.                         }        
  308.                         display();
  309.                 }        
  310.                 while(k1==0);
  311.         }
  312.         if(k2==0)
  313.         {
  314.                 delay(1);
  315.                 if(k2==0)
  316.                 {
  317.                         if(position==1)
  318.                         {
  319.                                 th-=5;                         //th<tl時(shí)  是個(gè)錯(cuò)誤,這里避免此情況發(fā)生
  320.                                 if(th<=tl)
  321.                                         th=tl+5;
  322.                         }
  323.                         if(position==2)
  324.                         {        
  325.                                 if(tl<10)
  326.                                         tl=10;
  327.                                 else
  328.                                         tl-=5;
  329.                         }        
  330.                         display();
  331.                 }        
  332.                 while(k2==0);
  333.         }
  334. }



  335. /************按鍵模塊****************/
  336. void delaykey(uint x)  //延時(shí)函數(shù)
  337. {
  338. uint a,b;
  339. for(a=x;a>0;a--)
  340.   for(b=110;b>0;b--);
  341. }

  342. sbit ledrq=P1^2;  //定義LED燈為RD0
  343. sbit keyrq=P3^5;  //定義INT0為RB0(按鍵)
  344. sbit ledone=P1^3;  //定義LED燈為RD0
  345. sbit keyone=P3^6;  //定義INT0為RB0(按鍵)
  346. sbit ledyw=P1^4;  //定義LED燈為RD0
  347. sbit keyyw=P3^7;  //定義INT0為RB0(按鍵)
  348. void keywarn()
  349. {
  350. static bit temp1,temp2,temp3; //定義一個(gè)靜態(tài)的位變量,注意得放在第一行,否則會(huì)提示一堆的錯(cuò)誤
  351. temp1=ledrq;   //把RD0 LED燈的當(dāng)前狀態(tài)賦給變量temp
  352. temp2=ledone;
  353. temp3=ledyw;
  354. if(keyrq==0)  //判斷按鍵是否有被按下,有則為0
  355.   {
  356.   delaykey(10); //去抖
  357.   if(keyrq==0) //去抖完得再判斷一次
  358.    {
  359.    temp1=!temp1;  //每按一次,位變量temp取反一次
  360.    while(!keyrq)  //松手檢測,按下時(shí)為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
  361.    ledrq=temp1;  //把取反后的temp值賦給RD0即LED燈
  362.    ESP8266_Set("AT+CIPSEND=0,10");           ////發(fā)送字符長度  
  363.    ms_delay(100);        
  364.    ESP8266_Set(table4);                          //發(fā)送數(shù)組
  365.    ms_delay(100);
  366.    }
  367.   }
  368. if(keyone==0)  //判斷按鍵是否有被按下,有則為0
  369.   {
  370.   delaykey(10); //去抖
  371.   if(keyone==0) //去抖完得再判斷一次
  372.    {
  373.    temp2=!temp2;  //每按一次,位變量temp取反一次
  374.    while(!keyone)  //松手檢測,按下時(shí)為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
  375.    ledone=temp2;  //把取反后的temp值賦給RD0即LED燈
  376.    ESP8266_Set("AT+CIPSEND=0,10");           ////發(fā)送字符長度  
  377.    ms_delay(100);        
  378.    ESP8266_Set(table5);                          //發(fā)送數(shù)組
  379.    ms_delay(100);
  380.    }
  381.   }
  382.   if(keyyw==0)  //判斷按鍵是否有被按下,有則為0
  383.   {
  384.   delaykey(10); //去抖
  385.   if(keyyw==0) //去抖完得再判斷一次
  386.    {
  387.    temp3=!temp3;  //每按一次,位變量temp取反一次
  388.    while(!keyyw)  //松手檢測,按下時(shí)為0取反為1,一直循環(huán)直至松手為1取反后為0退出循環(huán)
  389.    ledyw=temp3;  //把取反后的temp值賦給RD0即LED燈
  390.    ESP8266_Set("AT+CIPSEND=0,10");           ////發(fā)送字符長度  
  391.    ms_delay(100);        
  392.    ESP8266_Set(table3);                          //發(fā)送數(shù)組
  393.    ms_delay(100);
  394.    }
  395.   }
  396. }






  397. //主函數(shù)
  398. void main()
  399. {         
  400.         uint i;
  401.         LCD1602_init();
  402.         display();
  403.                

  404.            
  405.         Uart_Init();                                                                                        //波特率發(fā)生器
  406.             ms_delay(500);
  407.             ESP8266_Set("AT+CWMODE=2");                                                         //設(shè)置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   設(shè)置前wifi的波特率設(shè)置成9600
  408.             ms_delay(500);
  409.             ESP8266_Set("AT+RST");                                                                         //重新啟動(dòng)wifi模塊            
  410.         ms_delay(500);
  411.             ESP8266_Set("AT+CWSAP=\"HELLO\",\"wodemima\",11,4");          //AT+CWSAP="wifi_yuan","123456789",11,4  設(shè)置模塊SSID:WIFI, PWD:密碼 及安全類型加密模式(WPA2-PSK)
  412.             ms_delay(500);
  413.             ESP8266_Set("AT+CIPMUX=1");                                                                //允許接入
  414.             ms_delay(500);
  415.             ESP8266_Set("AT+CIPSERVER=1,8080");                                          //啟動(dòng)TCP/IP 實(shí)現(xiàn)基于網(wǎng)絡(luò)//控制         ESP8266_Set("AT+CIPSERVER=1,5000");  
  416.             ms_delay(500);
  417.             ESP8266_Set("AT+CIPSTO=0");                                                         //永遠(yuǎn)不超時(shí)
  418.             ms_delay(500);



  419.         while(1)
  420.         {        
  421.                 delay(1);
  422.                                 keywarn();
  423.                 if((++i)>500) //500ms 檢測一次溫度
  424.                 {
  425.                         
  426.                                                  temp_check();
  427.                          i=0;
  428.                 }               
  429.                 key();

  430.                                 
  431.                                           
  432.         }
  433. }


復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:314506 發(fā)表于 2018-4-23 15:19 | 只看該作者
你這是什么項(xiàng)目?有原理圖嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:314506 發(fā)表于 2018-4-26 16:28 | 只看該作者
/****************************************************
名稱:ESP8266發(fā)送數(shù)據(jù)函數(shù)
功能:用于與wifi模塊相連的終端發(fā)送數(shù)據(jù)
*****************************************************/
void ESP8266_Sent(uchar *puf)      // 數(shù)組指針*puf指向字符串?dāng)?shù)組               
{
      ESP8266_Set("AT+CIPSEND=0,4");
      while(*puf!='\0')    //遇到空格跳出循環(huán)
      {
           Send_Uart(*puf);   //向WIFI模塊發(fā)送控制指令。
           us_delay(5);
           puf++;      
      }
      us_delay(5);
      Send_Uart('\n');   //換行
      ms_delay(10);
}   

回復(fù)

使用道具 舉報(bào)

地板
ID:1020959 發(fā)表于 2022-8-22 12:21 | 只看該作者
我也是,不知道為什么,串口助手可以,單片機(jī)就不行
回復(fù)

使用道具 舉報(bào)

5#
ID:1020959 發(fā)表于 2022-8-22 16:15 | 只看該作者
ESP8266與串口助手通信正常,單片機(jī)發(fā)AT返回值不是ok ,只能收到發(fā)出的指令,比如用單片機(jī)發(fā)AT\r\n,收到的只有AT,在串口助手上發(fā)就能收到OK
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表