找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我用单片机操作SG90时,单片机会复位

[复制链接]
跳转到指定楼层
楼主
ID:477828 发表于 2020-4-2 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的单片机和SG90 9g舵机是用的一个电源。信号线接在了P1^0上面。但是我用按键控制舵机方向的时候。遇到了以下问题。困扰许久,还请51黑的大神不吝赐教。

我在程序里采用count来定时。每0.5ms进入一次中断。count == 40为一个周期20ms。用PWM_count 控制方向。初始值为1(转向0度)。2(转向45度)3转向90度。分别用s2 s3 s4按钮对其PWM_count进行修改。但是我在使用中发现。我按下s4后舵机会正常的转到90度,然后会自己又转回到单片机初始值的设置值1也就是0度。按下s3也是转45度又回到0度。通过调试发现是PWM_count的值自动变为了1造成的。这种情况是单片机复位造成的吗?

一个星期了,还是没有解决。下面是程序,大佬们帮看看。
  1. #include<reg52.h>
  2. sbit SG_PWM=P1^0;
  3. unsigned char count=0;
  4. unsigned char PWM_count=1;                  //初始值   1--0度,2--45度,3--90
  5. unsigned char a=0;

  6. sbit s2 = P3^0;
  7. sbit s3 = P3^1;
  8. sbit s4 = P3^2;

  9. sbit led1 = P1^2;
  10. sbit led2 = P1^3;

  11. void Timer_Init()
  12. {
  13.   TMOD=0X01;      //T0定时方式1
  14.   TH0=0xfe;
  15.   TL0=0x33;       //计数初值设置为0.5ms
  16.   ET0=1;          //打开定时器0的中断
  17.   TR0=1;          //打开定时器0
  18.   EA=1;           //开总中断
  19. }

  20. /**
  21. * 延时函数
  22. **/
  23. void delay(unsigned int i)
  24. {
  25.         unsigned int x,y;
  26.         for(x = i; x > 0; x--)
  27.                 for(y = 120; y > 0 ; y--);
  28. }

  29. void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
  30. {
  31.   TR0=0;
  32.   TH0=0xfe;
  33.   TL0=0x33;       //重新赋计数初值为0.5ms
  34.   if(count<=PWM_count)
  35.   {
  36.     SG_PWM=1;
  37.   }
  38.   else
  39.   {
  40.     SG_PWM=0;
  41.   }
  42.   count++;
  43.   if(count>=40)
  44.   {
  45.     count=0;
  46.     a++;
  47.   }
  48.   TR0=1;
  49. }
  50. void main()
  51. {
  52.   Timer_Init();
  53.   while(1){
  54.                         if(s2 == 0){
  55.                                 delay(100);
  56.                                 if(s2 == 0){
  57.                                         count = 0;
  58.                                         PWM_count = 1;
  59.                                 }
  60.                         }
  61.                        
  62.                         if(s3 == 0){
  63.                                 delay(100);
  64.                                 if(s3 == 0){
  65.                                         count = 0;
  66.                                         PWM_count = 2;
  67.                                 }
  68.                         }
  69.                        
  70.                         if(s4 == 0){
  71.                                 delay(100);
  72.                                 if(s4 == 0){
  73.                                         count = 0;
  74.                                         PWM_count = 3;
  75.                                 }
  76.                         }
  77.                        
  78.                         if(PWM_count == 1){
  79.                                 led1 = 0;
  80.                                 led2 = 1;
  81.                         }
  82.                        
  83.                         if(PWM_count == 3){
  84.                                 led1 = 1;
  85.                                 led2 = 0;
  86.                         }
  87.                        
  88.                 }
  89. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:531524 发表于 2020-4-2 18:24 | 只看该作者
从代码上看没什么异常,你判断是单片机复位导致的,你可以在单片机上电时串口发送一个数据,如果舵机旋转过程中出现单片机复位,那一定会有串口数据。你这种情况导致单片机复位的可能性是有的。舵机使用外接5V电压和单片机共地就可以解决。
回复

使用道具 举报

板凳
ID:477828 发表于 2020-4-8 15:29 | 只看该作者
王天星 发表于 2020-4-2 18:24
从代码上看没什么异常,你判断是单片机复位导致的,你可以在单片机上电时串口发送一个数据,如果舵机旋转过 ...

感谢!确实是舵机和单片机共用电源所致。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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