久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4665|回復: 4
收起左側

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

[復制鏈接]
ID:299121 發表于 2018-4-22 17:30 | 顯示全部樓層 |閱讀模式
51單片機用的是普中開發板,晶振11.0592MHz,波特率設置9600
ESP8266RX,TX分別反接單片機TX,RX端

上電后,串口助手顯示正常,發送指令時芯片藍燈閃爍 ,但ESP8266無反饋ok或者別的信息  TCP調試助手也無法連接熱點  


代碼如下,求助各位大神!!!
  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;//設置按鍵
  13. uint th=360;//設定 高溫
  14. uint tl=350;//設定 低溫
  15. uint ta;//實際溫度
  16. uchar code t0[]="WD=  .          ";
  17. uchar code t1[]="TH=  .  TL=  .  ";
  18. uchar code wendu[]="0123456789";        //利用一個溫度表解決溫度顯示亂碼
  19. sbit DQ=P3^7;//定義DS18B20總線IO
  20. uchar position;//設置的位置
  21. uchar table1[]="lowtemp ";
  22. uchar table2[]="hightemp";
  23. uchar table3[]="smoke   ";
  24. uchar table4[]="gas     ";
  25. uchar table5[]="help me ";

  26. //延時子函數

  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液晶寫命令子函數
  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液晶寫數據子函數
  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液晶初始化子函數
  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. //延時子函數
  86. void tmpDelay(int num)
  87. {
  88.         while(num--);
  89. }        
  90. //DS18B20溫度傳感器初始化子函數
  91. void DS18B20_init()
  92. {
  93.         uchar x=0;
  94.         DQ=1;    //DQ復位
  95.         tmpDelay(8);  //稍做延時
  96.         DQ=0;    //單片機將DQ拉低
  97.         tmpDelay(80); //精確延時 大于 480us
  98.         DQ=1;    //拉高總線
  99.         tmpDelay(14);
  100.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  101.         tmpDelay(20);
  102. }
  103. //DS18B20溫度傳感器讀一個字節子函數
  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溫度傳感器寫一個字節子函數
  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. //讀取溫度子函數
  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); // 啟動溫度轉換
  142.         DS18B20_init();
  143.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  144.         WriteOneChar(0xBE); //讀取溫度寄存器
  145.         a=ReadOneChar();   //連續讀兩個字節數據   //讀低8位
  146.         b=ReadOneChar();                          //讀高8位
  147.         t=b;
  148.         t<<=8;
  149.         t=t|a; //兩字節合成一個整型變量。
  150.         tt=t*0.0625;  //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
  151.         t=tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
  152.         return(t);
  153. }
  154. //LCD1602液晶顯示子函數
  155. void display()
  156. {
  157.            uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用unshigned char  字符型則顯示錯誤
  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()                                //使用定時器1作為波特率發生器(STC89C52、STC89C51、AT89C51等均可)
  178. {  
  179.     TMOD = 0x21;
  180.     SCON = 0x50;                                 //設置串行方式
  181.     TH1 = 0xFD;                                         //波特率9600
  182.     TL1 = TH1;
  183.     PCON = 0x00;
  184.     EA = 1;                                                //總中斷打開
  185.     ES = 1;                                                //開串口中斷  
  186.     TR1 = 1;                                        //啟動定時器1
  187. }  

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

  202. /********************************************************************
  203. 名稱:WIFI模塊設置函數  作用: 啟動模塊,以便可以實現無線接入和控制  
  204. ********************************************************************/

  205. void ESP8266_Set(uchar *puf)         // 數組指針*puf指向字符串數組               
  206. {   
  207.         while(*puf!='\0')                    //遇到空格跳出循環  
  208.         {   
  209.                 Send_Uart(*puf);                  //向WIFI模塊發送控制指令。   
  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. //報警子函數
  219. void temp_check()
  220. {
  221.         uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用unshigned char  字符型則顯示錯誤
  222.         ta=Readtemp();
  223.         if(ta>th)
  224.         {
  225.                 D1=1;
  226.                 D2=0;
  227.                             ESP8266_Set("AT+CIPSEND=0,10");           ////發送字符長度  
  228.                         ms_delay(100);        
  229.                         ESP8266_Set(table2);                          //發送數組
  230.                         ms_delay(100);      
  231.         }
  232.         else if(ta<tl)
  233.         {
  234.                 D1=0;
  235.                 D2=1;
  236.                                 ESP8266_Set("AT+CIPSEND=0,10");           ////發送字符長度  
  237.                         ms_delay(100);        
  238.                         ESP8266_Set(table1);                          //發送數組
  239.                         ms_delay(100);
  240.         }
  241.         else
  242.         {
  243.                 D1=0;
  244.                 D2=0;
  245.         }
  246.         shi=ta/100;         //顯示 實際溫度  
  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. //按鍵掃描子函數
  257. void key()
  258. {        
  259.         if(k3==0)                 //set 按鍵 按下
  260.         {
  261.                 delay(1);
  262.                 if(k3==0)
  263.                 {                                                        //設置位置設定
  264.                         position++;
  265.                         if(position>2)
  266.                                 position=0;
  267.                         if(position==0)                  // 無設置位置
  268.                         {
  269.                                 write_com(0x80+0x40+7);
  270.                                 write_date(' ');
  271.                                 write_com(0x80+0x40+15);
  272.                                 write_date(' ');
  273.                         }
  274.                         if(position==1)                //設置TH 在th后顯示< 標識當前位置
  275.                         {
  276.                                 write_com(0x80+0x40+7);
  277.                                 write_date('<');
  278.                                 write_com(0x80+0x40+15);
  279.                                 write_date(' ');                  
  280.                         }
  281.                         if(position==2)          //設置Tl   在tl后顯示< 標識當前位置
  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時  是個錯誤,這里避免此情況發生
  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時  是個錯誤,這里避免此情況發生
  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)  //延時函數
  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; //定義一個靜態的位變量,注意得放在第一行,否則會提示一堆的錯誤
  351. temp1=ledrq;   //把RD0 LED燈的當前狀態賦給變量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)  //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
  361.    ledrq=temp1;  //把取反后的temp值賦給RD0即LED燈
  362.    ESP8266_Set("AT+CIPSEND=0,10");           ////發送字符長度  
  363.    ms_delay(100);        
  364.    ESP8266_Set(table4);                          //發送數組
  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)  //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
  375.    ledone=temp2;  //把取反后的temp值賦給RD0即LED燈
  376.    ESP8266_Set("AT+CIPSEND=0,10");           ////發送字符長度  
  377.    ms_delay(100);        
  378.    ESP8266_Set(table5);                          //發送數組
  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)  //松手檢測,按下時為0取反為1,一直循環直至松手為1取反后為0退出循環
  389.    ledyw=temp3;  //把取反后的temp值賦給RD0即LED燈
  390.    ESP8266_Set("AT+CIPSEND=0,10");           ////發送字符長度  
  391.    ms_delay(100);        
  392.    ESP8266_Set(table3);                          //發送數組
  393.    ms_delay(100);
  394.    }
  395.   }
  396. }






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

  404.            
  405.         Uart_Init();                                                                                        //波特率發生器
  406.             ms_delay(500);
  407.             ESP8266_Set("AT+CWMODE=2");                                                         //設置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   設置前wifi的波特率設置成9600
  408.             ms_delay(500);
  409.             ESP8266_Set("AT+RST");                                                                         //重新啟動wifi模塊            
  410.         ms_delay(500);
  411.             ESP8266_Set("AT+CWSAP=\"HELLO\",\"wodemima\",11,4");          //AT+CWSAP="wifi_yuan","123456789",11,4  設置模塊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");                                          //啟動TCP/IP 實現基于網絡//控制         ESP8266_Set("AT+CIPSERVER=1,5000");  
  416.             ms_delay(500);
  417.             ESP8266_Set("AT+CIPSTO=0");                                                         //永遠不超時
  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. }


復制代碼



回復

使用道具 舉報

ID:314506 發表于 2018-4-23 15:19 | 顯示全部樓層
你這是什么項目?有原理圖嗎?
回復

使用道具 舉報

ID:314506 發表于 2018-4-26 16:28 | 顯示全部樓層
/****************************************************
名稱:ESP8266發送數據函數
功能:用于與wifi模塊相連的終端發送數據
*****************************************************/
void ESP8266_Sent(uchar *puf)      // 數組指針*puf指向字符串數組               
{
      ESP8266_Set("AT+CIPSEND=0,4");
      while(*puf!='\0')    //遇到空格跳出循環
      {
           Send_Uart(*puf);   //向WIFI模塊發送控制指令。
           us_delay(5);
           puf++;      
      }
      us_delay(5);
      Send_Uart('\n');   //換行
      ms_delay(10);
}   

回復

使用道具 舉報

ID:1020959 發表于 2022-8-22 12:21 | 顯示全部樓層
我也是,不知道為什么,串口助手可以,單片機就不行
回復

使用道具 舉報

ID:1020959 發表于 2022-8-22 16:15 | 顯示全部樓層
ESP8266與串口助手通信正常,單片機發AT返回值不是ok ,只能收到發出的指令,比如用單片機發AT\r\n,收到的只有AT,在串口助手上發就能收到OK
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜电影日韩 | 国产欧美一区二区三区日本久久久 | 丝袜美腿一区二区三区 | 视频三区| 欧美精品91爱爱 | 成人免费视频在线观看 | 日韩欧美亚洲 | 国产免费播放视频 | 亚洲先锋影音 | 国产精品免费一区二区三区 | 97超碰在线免费 | 蜜桃久久 | 亚洲人成在线播放 | 黄色av免费| 91中文视频| 亚洲在线一区 | 欧美日韩淫片 | 特级黄一级播放 | 国产一区二区麻豆 | 狠狠躁18三区二区一区 | 亚洲福利视频一区二区 | 亚洲视频1区 | 欧美在线网站 | 国产精品一区二区av | 国产精品欧美一区二区三区不卡 | 亚洲国产精品福利 | 亚洲免费在线观看 | 午夜资源 | 亚洲人成人一区二区在线观看 | 欧美精品一区二区免费 | 亚洲精品免费视频 | 久久精品中文字幕 | 国产97碰免费视频 | 欧美a在线 | 国产一区二区三区四区区 | 国产九九精品 | 午夜视频网站 | 欧美a区| 欧美精品一二区 | 亚洲精品一二三 | 国内精品久久精品 |