標題: 51單片機語音和舵機程序調(diào)試問題 [打印本頁]

作者: 電子浪人    時間: 2022-7-7 16:58
標題: 51單片機語音和舵機程序調(diào)試問題
我有一個LD3320它是一個語音模塊,我只要給它一個命令詞,例如我說開啟,他就發(fā)送0xAA給我的51單片機,然后我想的是我單片機通過串口讀取到它發(fā)給我的數(shù)據(jù),也就是0xAA,然后去控制舵機去做一些操作。現(xiàn)在的問題是當我說完后0xAA會在STC-ISP的串口助手的接收緩沖區(qū)顯示,但是舵機沒有任何反應,且舵機是鎖死的狀態(tài),我需要在發(fā)送緩沖區(qū)手動輸入AA才可以讓舵機動起來但是它又會轉(zhuǎn)回去。簡單來說就是我讀到串口的數(shù)據(jù)就可以對舵機進行操作,而不是我還要手動輸入才可以進行操作,請問怎么辦啊?

單片機源程序如下:
  1. #include <reg52.h>
  2. sbit SG_PWM=P1^0;
  3. unsigned char count=0;
  4. unsigned char temp;
  5. unsigned char PWM_count=1;             //1--0度,2--45度,3--90度,4--135度,5--180度
  6. void Uart1Init(void)                //9600bps@11.05926MHz
  7. {
  8.         SCON = 0x50;                //
  9.         TMOD &= 0x0F;
  10.         TMOD |= 0x20;                //
  11.         TL1 = 0xFD;                  //
  12.         TH1 = 0xFD;                  //
  13.         ET1 = 0;                    //
  14.         TR1 = 1;                    //
  15.   ES=1;                                        //
  16.         EA = 1;
  17. }
  18. void UART_SendData(unsigned char dat)
  19. {
  20.                 SBUF=dat;                        
  21.                 while(!TI);        //等待發(fā)送成功
  22.                 TI=0;                                        //清除發(fā)送中斷標志
  23. }
  24. void Timer_Init()
  25. {
  26.   TMOD &= 0xF0;               
  27.         TMOD |= 0x01;                //
  28.   TH0=0Xfe;
  29.   TL0=0X33;       //計數(shù)初值設(shè)置為0.5ms          每0.5ms進入一次中斷,晶振頻率:11.0592MHZ
  30.   ET0=1;          //打開定時器0的中斷
  31.   TR0=1;          //打開定時器0
  32. }
  33. void main()
  34. {
  35.                 Timer_Init();
  36.                 Uart1Init();        
  37.                 while(1)
  38.                 {
  39.                                 
  40.                 }
  41. }
  42. void Timer0_Interrupt() interrupt 1
  43. {
  44.                 TR0=0;
  45.                 TH0=0Xfe;
  46.                 TL0=0X33;       //重新賦計數(shù)初值為0.5ms
  47.                 if(count<=PWM_count)
  48.                 {
  49.                         SG_PWM=1;
  50.                 }
  51.                 else
  52.                 {
  53.                         SG_PWM=0;
  54.                 }
  55.           count++;
  56.                 if(count>=40)
  57.                 {
  58.                         count=0;
  59.                 }
  60.                 TR0=1;
  61. }
  62. void Uart_Interrupt() interrupt 4
  63. {
  64.                 if(RI)
  65.                 {
  66.                                 RI = 0;
  67.                                 temp = SBUF;
  68.                                 if(temp==0xAA)
  69.                                 {
  70.                                                 PWM_count=1;
  71.                                                 count=0;
  72.                                 }
  73.                                 else if(temp==0xBB)
  74.                                 {
  75.                                                 PWM_count=3;
  76.                                                 count=0;
  77.                                 }
  78.                 }
  79.                 if(TI)
  80.                 {
  81.                                 TI = 0;
  82.                 }
  83. }  
復制代碼

作者: lkc8210    時間: 2022-7-7 17:44
當我說完后0xAA會在STC-ISP的串口助手的接收緩沖區(qū)顯示,
但是舵機沒有任何反應,且舵機是鎖死的狀態(tài),
我需要在發(fā)送緩沖區(qū)手動輸入AA才可以讓舵機動起來但是它又會轉(zhuǎn)回去

這代表了你單片機的Tx/Rx引腳接錯了
STC-ISP收到0xAA:語音模塊(Tx)->(Rx)STC-ISP
舵機動起來:STC-ISP(Tx)->(Rx)單片機




作者: 電子浪人    時間: 2022-7-7 18:34
lkc8210 發(fā)表于 2022-7-7 17:44
當我說完后0xAA會在STC-ISP的串口助手的接收緩沖區(qū)顯示,
但是舵機沒有任何反應,且舵機是鎖死的狀態(tài),
...

大佬厲害,確實是接錯了,我把名字給記錯了,接對后舵機確實能按著話來動,但是它動到另一邊之后馬上又返回去,在此期間語音模塊概率性出現(xiàn)說話只說一半就不說的情況,無論后面我怎么說話舵機和語音模塊都沒反應,需要我重新再說一遍命令詞才有反應,但是這又陷入了前面的循環(huán),這怎么搞?
作者: 電子浪人    時間: 2022-7-8 09:14
串口和定時器好像有沖突但是試了很久也沒搞好,咋搞
作者: xmcolong    時間: 2022-7-8 09:42
電子浪人 發(fā)表于 2022-7-7 18:34
大佬厲害,確實是接錯了,我把名字給記錯了,接對后舵機確實能按著話來動,但是它動到另一邊之后馬上又返 ...

定時、記次,在一定時間內(nèi)接收的0xAA, 不管接收幾次, 只算一次就可以了。
作者: man1234567    時間: 2022-7-8 11:00
電子浪人 發(fā)表于 2022-7-7 18:34
大佬厲害,確實是接錯了,我把名字給記錯了,接對后舵機確實能按著話來動,但是它動到另一邊之后馬上又返 ...

1、"我需要在發(fā)送緩沖區(qū)手動輸入AA才可以讓舵機動起來但是它又會轉(zhuǎn)回去"與語音指令一樣疑似編程有問題
2、“在此期間語音模塊概率性出現(xiàn)說話只說一半就不說的情況”更換其他類型的語音模塊更好用

作者: lkc8210    時間: 2022-7-8 11:04
電子浪人 發(fā)表于 2022-7-7 18:34
大佬厲害,確實是接錯了,我把名字給記錯了,接對后舵機確實能按著話來動,但是它動到另一邊之后馬上又返 ...

這樣改看看

  1. #include <reg52.h>
  2. sbit SG_PWM=P1^0;
  3. unsigned char count=0;
  4. unsigned char temp;
  5. unsigned char PWM_count=1;             //1--0度,2--45度,3--90度,4--135度,5--180度
  6. void Uart1Init(void)                //9600bps@11.05926MHz
  7. {
  8.     SCON = 0x50;                //
  9.     TMOD &= 0x0F;
  10.     TMOD |= 0x20;                //
  11.     TL1 = 0xFD;                  //
  12.     TH1 = 0xFD;                  //
  13.     ET1 = 0;                    //
  14.     TR1 = 1;                    //
  15.     ES=1;                                        //
  16.     EA = 1;
  17. }
  18. void UART_SendData(unsigned char dat)
  19. {
  20.     SBUF=dat;
  21.     while(!TI);        //等待發(fā)送成功
  22.     TI=0;                                        //清除發(fā)送中斷標志
  23. }
  24. void Timer_Init()
  25. {
  26.     TMOD &= 0xF0;
  27.     TMOD |= 0x01;                //
  28.     TH0=0Xfe;
  29.     TL0=0X33;       //計數(shù)初值設(shè)置為0.5ms          每0.5ms進入一次中斷,晶振頻率:11.0592MHZ
  30.     ET0=1;          //打開定時器0的中斷
  31.     TR0=1;          //打開定時器0
  32. }
  33. void main()
  34. {
  35.     Timer_Init();
  36.     Uart1Init();
  37.     while(1)
  38.     {

  39.         if(temp==0xAA)
  40.         {
  41.             PWM_count=1;
  42.             temp=0;
  43.         }
  44.         if(temp==0xBB)
  45.         {
  46.             PWM_count=3;
  47.             temp=0;
  48.         }
  49.     }
  50. }
  51. void Timer0_Interrupt() interrupt 1
  52. {
  53.     TH0=0Xfe;
  54.     TL0=0X33;       //重新賦計數(shù)初值為0.5ms
  55.     if(count<=PWM_count)
  56.     {
  57.         SG_PWM=1;
  58.     }
  59.     else
  60.     {
  61.         SG_PWM=0;
  62.     }
  63.     count++;
  64.     if(count>=40)
  65.     {
  66.         count=0;
  67.     }
  68. }
  69. void Uart_Interrupt() interrupt 4
  70. {
  71.     if(RI)
  72.     {
  73.         RI = 0;
  74.         temp = SBUF;
  75.     }
  76.     if(TI)
  77.     {
  78.         TI = 0;
  79.     }
  80. }


復制代碼


作者: 電子浪人    時間: 2022-7-8 14:14
lkc8210 發(fā)表于 2022-7-8 11:04
這樣改看看

我喊開啟時,模塊會發(fā)送0xBB給我的單片機,我喊了之后,舵機動是動起來了,但是它自動又往回走
作者: 電子浪人    時間: 2022-7-8 18:10
lkc8210 發(fā)表于 2022-7-8 11:04
這樣改看看

這是我在網(wǎng)上找到的代碼,穩(wěn)定性還可以吧
作者: 電子浪人    時間: 2022-7-8 18:11
lkc8210 發(fā)表于 2022-7-8 11:04
這樣改看看
  1. /*
  2.                         模擬舵機控制原理:0~180°
  3.                                 0.5ms-----0度
  4.                                 1.0ms-----45度
  5.                                 1.5ms-----90度
  6.                                 2.0ms-----135度
  7.                                 2.5ms-----180度
  8. */

  9. #include <REGX52.H>
  10. #include "timer0.h"
  11. #include "Uart.h"

  12. sbit SG_PWM=P2^0;                                                        //信號控制引腳
  13. unsigned char count=0;                                             //計次  賦初值為0
  14. unsigned char PWM_count=0;                  //0--0度,2--45度,4--90度,6--135度,8--180度

  15. void main()
  16. {
  17.   Timer0_Init();
  18.   Uart_Init();
  19.   while(1)
  20.   {
  21.                
  22.    }
  23. }

  24. void Timer0() interrupt 1      //特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
  25. {
  26.   
  27.   TL0 = 0x33;               
  28.   TH0 = 0xFE;                                 //重新賦計數(shù)初值為0.5ms
  29.   
  30.   count++;                                        //計次,每500us  count+1
  31.         count%=40;                                //周期為20ms
  32.        
  33.   if(count<PWM_count)
  34.   {                                                                       
  35.     SG_PWM=1;
  36.   }
  37.   else
  38.   {
  39.     SG_PWM=0;
  40.   }
  41. }


  42. void UART_Routine()  interrupt 4        //串口中斷服務函數(shù)
  43. {       
  44.         if(RI==1)                                                //如果接收中斷標志位為1
  45.         {       
  46.           P1=SBUF;                                           //發(fā)送的數(shù)據(jù)SBUF,賦給P1
  47.          if(P1==0XAA)                                   //0x01這個值可以通過藍牙調(diào)試器編輯模式設(shè)置
  48.          {
  49.            PWM_count=1;
  50.          }
  51.          if(P1==0X02)                                  
  52.          {
  53.            PWM_count=2;
  54.          }
  55.          if(P1==0XBB)                                 
  56.          {
  57.            PWM_count=3;
  58.          }
  59.          if(P1==0X04)                                  
  60.          {
  61.            PWM_count=4;
  62.          }
  63.          if(P1==0X05)                                  
  64.          {
  65.            PWM_count=5;
  66.          }
  67.          
  68.           RI=0;                                                //接收中斷標志位軟件清零
  69.         }
  70. }
復制代碼





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1