找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4375|回复: 3
打印 上一主题 下一主题
收起左侧

智能小车和手机蓝牙连接 按键按超过几次后,小车失控

[复制链接]
跳转到指定楼层
楼主
ID:163950 发表于 2017-4-20 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//描述本人制作此小车和手机蓝牙连接后每次开始都能正常前后左右,但按超过几次后,小车失控,再按就一直前进或后退! 请大家看看程序有问题吗? 蓝牙模块没有接错线!!模块用串口调试也是好的,每次都能正常接收,大家看看有什么问题,请指教

  1. /****************************************************************************
  2.          硬件连接
  3.          蓝牙有4条线定义:
  4.           VCC
  5.       GND
  6.           TDX
  7.           RXD
  8.          把蓝牙插入单片机J7接口中         --注意不要接错线,否则烧坏蓝牙模块,不保修,不换货。

  9. 端口模式配置

  10. PXM1     PXM0           模式

  11. 0                  0                  准双向口
  12. 0                  1                  强推挽输出
  13. 1                  0                  高阻输入
  14. 1                  1                  开漏输出
  15. ******************************************************************/  


  16. /*************        功能说明        **************

  17. 串口1全双工中断方式收发通讯程序。本例程使用11.0592MHZ时钟,如要改变,请修改下面的"定义主时钟"的值并重新编译。

  18. 串口设置为:9600,8,n,1.

  19. ******************************************/

  20. /*************        本地常量声明        **************/
  21. #define MAIN_Fosc                11059200L        //定义主时钟
  22. #define        RX1_Lenth                32                        //串口接收缓冲长度
  23. #define        BaudRate1                9600UL            //选择波特率


  24. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重装值, 对应300KHZ
  25. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重装值, 对应300KHZ


  26. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重装值, 对应300KHZ
  27. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重装值, 对应300KHZ

  28. #include        "STC15Fxxxx.H"


  29. //char code str[] =  "收到指令,向前!\n";
  30. //char code str1[] = "收到指令,向后!\n";
  31. //char code str2[] = "收到指令,向左!\n";
  32. //char code str3[] = "收到指令,向右!\n";
  33. //char code str4[] = "收到指令,停止!\n";

  34. bit  flag_REC=0;   
  35. bit  flag    =0; //标志位清零
  36.         
  37. #define left     'C'
  38. #define right    'D'
  39. #define up       'A'
  40. #define down     'B'
  41. #define stop     'F'

  42. unsigned char  i=0;
  43. unsigned char  dat=0;
  44. unsigned char  buff[5]=0; //接收缓冲字节

  45. sbit M1A=P1^0;                            //定义左侧电机驱动A端
  46. sbit M1B=P1^1;                            //定义左侧电机驱动B端

  47. sbit M2A=P1^2;                            //定义右侧电机驱动A端
  48. sbit M2B=P1^3;                            //定义右侧电机驱动B端

  49. /*************        本地变量声明        **************/
  50. u8        idata RX1_Buffer[RX1_Lenth];        //接收缓冲
  51. u8        TX1_Cnt;        //发送计数
  52. u8        RX1_Cnt;        //接收计数
  53. bit        B_TX1_Busy;        //发送忙标志


  54. void tingzhi()
  55. {
  56.    M1A=0;                                   //将M1电机A端初始化为0
  57.    M1B=0;                                   //将M1电机B端初始化为0
  58.    M2A=0;                                   //将M2电机A端初始化为0
  59.    M2B=0;

  60. }

  61. void qianjin()
  62. {
  63.    M1A=1;                                   
  64.    M1B=0;                                   
  65.    M2A=1;                                   
  66.    M2B=0;
  67. }

  68. void houtui()
  69. {
  70.    M1A=0;                                   
  71.    M1B=1;                                   
  72.    M2A=0;                                   
  73.    M2B=1;
  74. }

  75. void zuozhuan()
  76. {
  77.    M1A=0;                                   
  78.    M1B=1;                                   
  79.    M2A=1;                                   
  80.    M2B=0;
  81. }

  82. void youzhuan()
  83. {
  84.    M1A=1;                                   
  85.    M1B=0;                                   
  86.    M2A=0;                                   
  87.    M2B=1;
  88. }
  89. //字符串发送函数
  90. /*          void send_str( )
  91.                    // 传送字串
  92.     {
  93.             unsigned char i = 0;
  94.             while(str[i] != '\0')
  95.            {
  96.                 SBUF = str[i];
  97.                 while(!TI);                                // 等特数据传送
  98.                 TI = 0;                                        // 清除数据传送标志
  99.                 i++;                                        // 下一个字符
  100.            }        
  101.     }
  102.         
  103.                   void send_str1( )
  104.                    // 传送字串
  105.     {
  106.             unsigned char i = 0;
  107.             while(str1[i] != '\0')
  108.            {
  109.                 SBUF = str1[i];
  110.                 while(!TI);                                // 等特数据传送
  111.                 TI = 0;                                        // 清除数据传送标志
  112.                 i++;                                        // 下一个字符
  113.            }        
  114.     }        

  115.                           void send_str2( )
  116.                    // 传送字串
  117.     {
  118.             unsigned char i = 0;
  119.             while(str2[i] != '\0')
  120.            {
  121.                 SBUF = str2[i];
  122.                 while(!TI);                                // 等特数据传送
  123.                 TI = 0;                                        // 清除数据传送标志
  124.                 i++;                                        // 下一个字符
  125.            }        
  126.     }        
  127.                     
  128.                           void send_str3()
  129.                    // 传送字串
  130.     {
  131.             unsigned char i = 0;
  132.             while(str3[i] != '\0')
  133.            {
  134.                 SBUF = str3[i];
  135.                 while(!TI);                                // 等特数据传送
  136.                 TI = 0;                                        // 清除数据传送标志
  137.                 i++;                                        // 下一个字符
  138.            }        
  139.     }        

  140.               void send_str4()
  141.                    // 传送字串
  142.     {
  143.             unsigned char i = 0;
  144.             while(str4[i] != '\0')
  145.            {
  146.                 SBUF = str4[i];
  147.                 while(!TI);                                // 等特数据传送
  148.                 TI = 0;                                        // 清除数据传送标志
  149.                 i++;                                        // 下一个字符
  150.            }        
  151.     }*/        
  152.          

  153. /**********************************************/
  154. void main(void)
  155. {
  156.         B_TX1_Busy = 0;
  157.         RX1_Cnt = 0;
  158.         TX1_Cnt = 0;

  159.         S1_8bit();                                //8位数据
  160.         S1_USE_P30P31();                //UART1 使用P30 P31口        默认


  161.         AUXR &= ~(1<<4);        //Timer stop                波特率使用Timer2产生
  162.         AUXR |= 0x01;                //S1 BRT Use Timer2;
  163.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  164.         TH2 = (u8)(Timer2_Reload >> 8);
  165.         TL2 = (u8)Timer2_Reload;
  166.         AUXR |=  (1<<4);        //Timer run enable

  167.         REN = 1;        //允许接收
  168.         ES  = 1;        //允许中断

  169.         EA = 1;                //允许全局中断
  170.         

  171.         while (1)
  172.         {

  173.           P1M1 = 0;
  174.           P1M0 = 0;
  175.          if(flag_REC==1)                                    //
  176.            {
  177.                 flag_REC=0;
  178.                 if(buff[0]=='O'&&buff[1]=='N')        //第一个字节为O,第二个字节为N,第三个字节为控制码
  179.                 switch(buff[2])
  180.              {
  181.                       case up :                                                    // 前进
  182.                           //send_str( );
  183.                           qianjin();
  184.                           break;

  185.                       case down:                                                // 后退
  186.                           // send_str1( );
  187.                           houtui();
  188.                           break;

  189.                       case left:                                                // 左转
  190.                            //send_str3( );
  191.                           zuozhuan();
  192.                           break;

  193.                       case right:                                                // 右转
  194.                          // send_str2( );
  195.                           youzhuan();
  196.                           break;

  197.                       case stop:                                                // 停止
  198.                           //send_str4( );
  199.                           tingzhi();
  200.                           break;

  201.              }

  202.                                          
  203.          }
  204.         }
  205. }

  206. /********************* UART1中断函数************************/
  207. void UART1_int (void) interrupt UART1_VECTOR
  208. {
  209.         if(RI)        //如果为1接收数据有效 为0未接收到数据
  210.   {
  211.        RI=0;
  212.        dat=SBUF;
  213.        if(dat=='O'&&(i==0)) //接收数据第一帧
  214.          {
  215.             buff[i]=dat;
  216.             flag=1;        //开始接收数据
  217.          }
  218.        else
  219.       if(flag==1)
  220.      {
  221.       i++;
  222.       buff[i]=dat;
  223.       if(i>=2)
  224.       {i=0;flag=0;flag_REC=1 ;}  // 停止接收
  225.      }
  226.          }

  227.         if(TI)
  228.         {
  229.                 TI = 0;
  230.                 B_TX1_Busy = 0;                //清除发送忙标志
  231.         }
  232. }
  233.                            
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:195347 发表于 2017-5-2 22:58 来自手机 | 只看该作者
楼主解决了吗?我也出现这样的情况了
回复

使用道具 举报

板凳
ID:163950 发表于 2017-5-3 08:12 | 只看该作者
现在我怀疑是电源共用了一个电源,电机瞬间停止启动后造成的电压不稳定 ,我想买个带光耦隔离的驱动,把电源分开试试!想了好多天了 ,再试试吧!
回复

使用道具 举报

地板
ID:163950 发表于 2017-8-11 08:14 | 只看该作者
解决了,就是电源干扰,改用减速电机就可以了 ,或者电源分开独立!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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