找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1460|回复: 9
收起左侧

51单片机语音和舵机程序调试问题

[复制链接]
ID:966442 发表于 2022-7-7 16:58 | 显示全部楼层 |阅读模式
150黑币
我有一个LD3320它是一个语音模块,我只要给它一个命令词,例如我说开启,他就发送0xAA给我的51单片机,然后我想的是我单片机通过串口读取到它发给我的数据,也就是0xAA,然后去控制舵机去做一些操作。现在的问题是当我说完后0xAA会在STC-ISP的串口助手的接收缓冲区显示,但是舵机没有任何反应,且舵机是锁死的状态,我需要在发送缓冲区手动输入AA才可以让舵机动起来但是它又会转回去。简单来说就是我读到串口的数据就可以对舵机进行操作,而不是我还要手动输入才可以进行操作,请问怎么办啊?

单片机源程序如下:
  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);        //等待发送成功
  22.                 TI=0;                                        //清除发送中断标志
  23. }
  24. void Timer_Init()
  25. {
  26.   TMOD &= 0xF0;               
  27.         TMOD |= 0x01;                //
  28.   TH0=0Xfe;
  29.   TL0=0X33;       //计数初值设置为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;       //重新赋计数初值为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. }  
复制代码

回复

使用道具 举报

ID:161164 发表于 2022-7-7 17:44 | 显示全部楼层
当我说完后0xAA会在STC-ISP的串口助手的接收缓冲区显示,
但是舵机没有任何反应,且舵机是锁死的状态,
我需要在发送缓冲区手动输入AA才可以让舵机动起来但是它又会转回去

这代表了你单片机的Tx/Rx引脚接错了
STC-ISP收到0xAA:语音模块(Tx)->(Rx)STC-ISP
舵机动起来:STC-ISP(Tx)->(Rx)单片机
WhatsApp Image 2022-07-07 at 5.43.09 PM.jpeg


回复

使用道具 举报

ID:966442 发表于 2022-7-7 18:34 | 显示全部楼层
lkc8210 发表于 2022-7-7 17:44
当我说完后0xAA会在STC-ISP的串口助手的接收缓冲区显示,
但是舵机没有任何反应,且舵机是锁死的状态,
...

大佬厉害,确实是接错了,我把名字给记错了,接对后舵机确实能按着话来动,但是它动到另一边之后马上又返回去,在此期间语音模块概率性出现说话只说一半就不说的情况,无论后面我怎么说话舵机和语音模块都没反应,需要我重新再说一遍命令词才有反应,但是这又陷入了前面的循环,这怎么搞?
回复

使用道具 举报

ID:966442 发表于 2022-7-8 09:14 | 显示全部楼层
串口和定时器好像有冲突但是试了很久也没搞好,咋搞
回复

使用道具 举报

ID:13282 发表于 2022-7-8 09:42 | 显示全部楼层
电子浪人 发表于 2022-7-7 18:34
大佬厉害,确实是接错了,我把名字给记错了,接对后舵机确实能按着话来动,但是它动到另一边之后马上又返 ...

定时、记次,在一定时间内接收的0xAA, 不管接收几次, 只算一次就可以了。
回复

使用道具 举报

ID:584814 发表于 2022-7-8 11:00 | 显示全部楼层
电子浪人 发表于 2022-7-7 18:34
大佬厉害,确实是接错了,我把名字给记错了,接对后舵机确实能按着话来动,但是它动到另一边之后马上又返 ...

1、"我需要在发送缓冲区手动输入AA才可以让舵机动起来但是它又会转回去"与语音指令一样疑似编程有问题
2、“在此期间语音模块概率性出现说话只说一半就不说的情况”更换其他类型的语音模块更好用
回复

使用道具 举报

ID:161164 发表于 2022-7-8 11:04 | 显示全部楼层
电子浪人 发表于 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);        //等待发送成功
  22.     TI=0;                                        //清除发送中断标志
  23. }
  24. void Timer_Init()
  25. {
  26.     TMOD &= 0xF0;
  27.     TMOD |= 0x01;                //
  28.     TH0=0Xfe;
  29.     TL0=0X33;       //计数初值设置为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;       //重新赋计数初值为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. }


复制代码

回复

使用道具 举报

ID:966442 发表于 2022-7-8 14:14 | 显示全部楼层

我喊开启时,模块会发送0xBB给我的单片机,我喊了之后,舵机动是动起来了,但是它自动又往回走
回复

使用道具 举报

ID:966442 发表于 2022-7-8 18:10 | 显示全部楼层

这是我在网上找到的代码,稳定性还可以吧
回复

使用道具 举报

ID:966442 发表于 2022-7-8 18:11 | 显示全部楼层
  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;                                 //重新赋计数初值为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        //串口中断服务函数
  43. {       
  44.         if(RI==1)                                                //如果接收中断标志位为1
  45.         {       
  46.           P1=SBUF;                                           //发送的数据SBUF,赋给P1
  47.          if(P1==0XAA)                                   //0x01这个值可以通过蓝牙调试器编辑模式设置
  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. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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