找回密码
 立即注册

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 单片机教程网

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