找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2397|回复: 2
收起左侧

51单片机与esp8266联手控制电机和led程序 调试出现问题

[复制链接]
ID:219317 发表于 2017-9-15 00:08 | 显示全部楼层 |阅读模式
我用stc89单片机与esp8266联手控制led和电机,发现必须直接在串口或者对esp8266发送两次同样信息才能让panduan()选择另一分支,如果只发一次信息,无变化;但是当我把panduan()中每个分支下的data_cls();删除了,就只发一次信息就可以改变分支了。试了好久始终不得要领,不知到是什么原因。恳请大神解惑。程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>                     
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define RELOAD_COUNT 0xFA
  7. uchar Receive;                             
  8. uchar Recive_table[15];
  9. static uchar i=0;
  10. sbit LED0=P2^1;
  11. sbit LED1=P2^2;
  12. sbit ji0=P0^0;
  13. sbit ji1=P0^1;
  14. sbit ji2=P0^2;
  15. sbit ji3=P0^3;
  16. void ms_delay(uint z)
  17. {
  18.       uint x,j;
  19.       for(x=z;x>0;x--)
  20.        for(j=110;j>0;j--);
  21. }

  22. void Uart_Init()//使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51或者STC12C560S2等均可)
  23. {
  24.       SCON=0x50;     //设置为串行口以方式1工作,8位异步通讯,允许接收中断。//一帧信息为10位,1位起始位,8位数据位(低位在先),1位停止位。
  25.       PCON=0x80;     //SMOD波特率选择位为1,SMOD=1.
  26.       TMOD=0x21;     //设置定时器1为波特率发生器,工作在模式2,8位自动装载
  27.       TH1=RELOAD_COUNT;//波特率9600 ,TH1=256-FOSC/16/12/波特率
  28.       TL1=TH1;
  29.       EA=1;                            //总中断打开
  30.       ES=0;                             //关闭串口中断
  31.       TR1=1;                     //启动定时器1
  32. }
  33. void led(void)
  34. {
  35. LED0=0;
  36. LED1=0;
  37. ms_delay(100);
  38. LED0=1;
  39. LED1=1;
  40. }

  41. void SendString(char *s)                //串口发送程序
  42. {
  43.         while(*s != '\0')
  44.         {
  45.                 SBUF = *(s++);
  46.                 while(!TI);
  47.                 TI = 0;
  48.         }
  49. }
  50. void zhengzhuan()          //用的是电机驱动模块
  51. {
  52. ji0=0;
  53. ji1=0; //先停电机
  54. ji0=1; //
  55. ji1=0;
  56. ji2=0; //第二个控制没用
  57. ji3=0;
  58. }

  59. void fanzhuan()
  60. {
  61. ji0=0;
  62. ji1=0; //先停电机
  63. ji0=0;
  64. ji1=1;
  65. ji2=0; //第二个控制没用
  66. ji3=0;
  67. }

  68. void stop()           //停电机
  69. {
  70. ji0=0;
  71. ji1=0;
  72. ji2=0;
  73. ji3=0;
  74. LED0=1;
  75. LED1=1;
  76. }

  77. void data_cls()           //数组清零
  78. {
  79. uint  l;
  80. for(l = 0; l < 15; l ++)
  81. Recive_table[l]=0;
  82. }
  83. void panduan()                //根据信息判断采用哪个分支
  84. {            
  85. if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
  86.              {   
  87.                    //if((Recive_table[3]=='1')&&(Recive_table[4]=='2'))
  88.                                           
  89.                                           uint s;
  90.                                           s=Recive_table[10];
  91.                                           switch(s)
  92.                       {
  93.                                             case '1':   
  94.                                                         {
  95.                                   data_cls();
  96.                                                                   LED0=0;
  97.                                                                   LED1=1;//1 灯灭
  98.                                                                   zhengzhuan();
  99.                                                                   break;            
  100.                                                         }
  101.                          case '2':
  102.                             {                                
  103.                                 data_cls();
  104.                                                                 LED0=1;
  105.                                                                 LED1=0;  //1 灯亮
  106.                                                                 fanzhuan();
  107.                                                                 break;                     
  108.                                          }
  109.                                               case '3':
  110.                             {                                
  111.                                 data_cls();
  112.                                                                 stop();
  113.                                                                 break;                  
  114.                                          }
  115.                                                    
  116.                                                   default:
  117.                                                     {
  118.                                                            data_cls();
  119.                                                         stop();
  120.                                                         LED0=0;
  121.                                                         LED1=0;
  122.                                                         break;
  123.                                                     }
  124.                                           
  125.                                             }  
  126.                         }
  127.                          else
  128.                          {}

  129. }
  130. void main()
  131. {   
  132.       Uart_Init();//使用独立的波特率发生器
  133.           led();
  134.           ms_delay(1000);
  135.           SendString("AT+CIPMUX=1");
  136.           SendString("\r\n");
  137.           led();
  138.           ms_delay(1000);
  139.           SendString("AT+CIPSERVER=1,8080");
  140.           SendString("\r\n");
  141.           EA=1;
  142.           ES=1;                                //允许串口中断
  143.           while(1)
  144.       {         
  145.            
  146.            EA=1;
  147.            ES=1;
  148.            panduan();
  149.           }         
  150. }

  151. void Uart_Interrupt() interrupt 4
  152. {
  153.                    if(RI==1)
  154.     {   
  155.            RI=0;
  156.            Receive=SBUF;        //MCU接收wifi模块反馈回来的数据
  157.            Recive_table[i]=Receive;      
  158.            i++;         
  159.                  if(Recive_table[i-1]=='\n')
  160.                    {
  161.                    i=0;  //遇到换行 重新装值
  162.                       }
  163.                    else
  164.                         {}
  165.                   
  166.      }
  167.          else
  168.           {}   
  169. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2017-9-15 23:57 | 显示全部楼层
画个流程图或许能看出问题
回复

使用道具 举报

ID:219317 发表于 2017-9-16 10:32 | 显示全部楼层
yzwzfyz 发表于 2017-9-15 23:57
画个流程图或许能看出问题

谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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