找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4938|回復(fù): 3
收起左側(cè)

智能小車和手機(jī)藍(lán)牙連接 按鍵按超過幾次后,小車失控

[復(fù)制鏈接]
ID:163950 發(fā)表于 2017-4-20 10:52 | 顯示全部樓層 |閱讀模式
//描述本人制作此小車和手機(jī)藍(lán)牙連接后每次開始都能正常前后左右,但按超過幾次后,小車失控,再按就一直前進(jìn)或后退! 請(qǐng)大家看看程序有問題嗎? 藍(lán)牙模塊沒有接錯(cuò)線。∧K用串口調(diào)試也是好的,每次都能正常接收,大家看看有什么問題,請(qǐng)指教

  1. /****************************************************************************
  2.          硬件連接
  3.          藍(lán)牙有4條線定義:
  4.           VCC
  5.       GND
  6.           TDX
  7.           RXD
  8.          把藍(lán)牙插入單片機(jī)J7接口中         --注意不要接錯(cuò)線,否則燒壞藍(lán)牙模塊,不保修,不換貨。

  9. 端口模式配置

  10. PXM1     PXM0           模式

  11. 0                  0                  準(zhǔn)雙向口
  12. 0                  1                  強(qiáng)推挽輸出
  13. 1                  0                  高阻輸入
  14. 1                  1                  開漏輸出
  15. ******************************************************************/  


  16. /*************        功能說明        **************

  17. 串口1全雙工中斷方式收發(fā)通訊程序。本例程使用11.0592MHZ時(shí)鐘,如要改變,請(qǐng)修改下面的"定義主時(shí)鐘"的值并重新編譯。

  18. 串口設(shè)置為:9600,8,n,1.

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

  20. /*************        本地常量聲明        **************/
  21. #define MAIN_Fosc                11059200L        //定義主時(shí)鐘
  22. #define        RX1_Lenth                32                        //串口接收緩沖長(zhǎng)度
  23. #define        BaudRate1                9600UL            //選擇波特率


  24. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重裝值, 對(duì)應(yīng)300KHZ
  25. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重裝值, 對(duì)應(yīng)300KHZ


  26. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重裝值, 對(duì)應(yīng)300KHZ
  27. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重裝值, 對(duì)應(yīng)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; //標(biāo)志位清零
  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; //接收緩沖字節(jié)

  45. sbit M1A=P1^0;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)A端
  46. sbit M1B=P1^1;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)B端

  47. sbit M2A=P1^2;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)A端
  48. sbit M2B=P1^3;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)B端

  49. /*************        本地變量聲明        **************/
  50. u8        idata RX1_Buffer[RX1_Lenth];        //接收緩沖
  51. u8        TX1_Cnt;        //發(fā)送計(jì)數(shù)
  52. u8        RX1_Cnt;        //接收計(jì)數(shù)
  53. bit        B_TX1_Busy;        //發(fā)送忙標(biāo)志


  54. void tingzhi()
  55. {
  56.    M1A=0;                                   //將M1電機(jī)A端初始化為0
  57.    M1B=0;                                   //將M1電機(jī)B端初始化為0
  58.    M2A=0;                                   //將M2電機(jī)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. //字符串發(fā)送函數(shù)
  90. /*          void send_str( )
  91.                    // 傳送字串
  92.     {
  93.             unsigned char i = 0;
  94.             while(str[i] != '\0')
  95.            {
  96.                 SBUF = str[i];
  97.                 while(!TI);                                // 等特?cái)?shù)據(jù)傳送
  98.                 TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
  99.                 i++;                                        // 下一個(gè)字符
  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);                                // 等特?cái)?shù)據(jù)傳送
  111.                 TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
  112.                 i++;                                        // 下一個(gè)字符
  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);                                // 等特?cái)?shù)據(jù)傳送
  123.                 TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
  124.                 i++;                                        // 下一個(gè)字符
  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);                                // 等特?cái)?shù)據(jù)傳送
  136.                 TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
  137.                 i++;                                        // 下一個(gè)字符
  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);                                // 等特?cái)?shù)據(jù)傳送
  148.                 TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
  149.                 i++;                                        // 下一個(gè)字符
  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位數(shù)據(jù)
  160.         S1_USE_P30P31();                //UART1 使用P30 P31口        默認(rèn)


  161.         AUXR &= ~(1<<4);        //Timer stop                波特率使用Timer2產(chǎn)生
  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')        //第一個(gè)字節(jié)為O,第二個(gè)字節(jié)為N,第三個(gè)字節(jié)為控制碼
  179.                 switch(buff[2])
  180.              {
  181.                       case up :                                                    // 前進(jìn)
  182.                           //send_str( );
  183.                           qianjin();
  184.                           break;

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

  189.                       case left:                                                // 左轉(zhuǎn)
  190.                            //send_str3( );
  191.                           zuozhuan();
  192.                           break;

  193.                       case right:                                                // 右轉(zhuǎn)
  194.                          // send_str2( );
  195.                           youzhuan();
  196.                           break;

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

  201.              }

  202.                                          
  203.          }
  204.         }
  205. }

  206. /********************* UART1中斷函數(shù)************************/
  207. void UART1_int (void) interrupt UART1_VECTOR
  208. {
  209.         if(RI)        //如果為1接收數(shù)據(jù)有效 為0未接收到數(shù)據(jù)
  210.   {
  211.        RI=0;
  212.        dat=SBUF;
  213.        if(dat=='O'&&(i==0)) //接收數(shù)據(jù)第一幀
  214.          {
  215.             buff[i]=dat;
  216.             flag=1;        //開始接收數(shù)據(jù)
  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;                //清除發(fā)送忙標(biāo)志
  231.         }
  232. }
  233.                            
復(fù)制代碼

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:195347 發(fā)表于 2017-5-2 22:58 來自手機(jī) | 顯示全部樓層
樓主解決了嗎?我也出現(xiàn)這樣的情況了
回復(fù)

使用道具 舉報(bào)

ID:163950 發(fā)表于 2017-5-3 08:12 | 顯示全部樓層
現(xiàn)在我懷疑是電源共用了一個(gè)電源,電機(jī)瞬間停止啟動(dòng)后造成的電壓不穩(wěn)定 ,我想買個(gè)帶光耦隔離的驅(qū)動(dòng),把電源分開試試!想了好多天了 ,再試試吧!
回復(fù)

使用道具 舉報(bào)

ID:163950 發(fā)表于 2017-8-11 08:14 | 顯示全部樓層
解決了,就是電源干擾,改用減速電機(jī)就可以了 ,或者電源分開獨(dú)立!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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