找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于舵机的问题,卡住三天了,求教论坛大触!!!

[复制链接]
跳转到指定楼层
楼主
ID:77522 发表于 2015-4-20 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想用3个按键实现舵机3个角度的旋转,写下了如下程序,仿真达到了要求,但是烧进单片机却出现下列问题:舵机只能按顺序转,比如舵机在中间位置,我想让他左转,按键按了没反应,右转却可以。请大神帮忙看下程序有什么问题,尤其是按键扫描函数。


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

使用道具 举报

沙发
ID:77522 发表于 2015-4-20 15:18 | 只看该作者
#include<stc12c5a60s2.h>

#define uchar unsigned char
#define uint unsigned int
sbit PWM=P1^0;
sbit k0=P0^0;
sbit k1=P0^1;
sbit k2=P0^2;
uchar num,jd;
void mydelay(uint i)
{
uint j,k;
for(j=i;j>0;j--)
for(k=110;k>0;k--);




}
void Time0_int()
{
           P1M1=0;
        P1M0=0x01;
  
         AUXR|=0X00;
         TMOD=0x01;
         TH0=0xfe;
         TL0=0x33;
         IE=0x82;
         EA=1;
         ET0=1;
         TR0=1;

}
          void key()
{
   if(k0==0)
   {  mydelay(10);
                if(k0==0)
                {  
                num=0;
                jd=5;                               //+90度
                while(k0==0);
               
                }
   
   }
                     if(k2==0)
   {  mydelay(10);
                if(k2==0)
                {  
                num=0;
                jd=3;                                          //回中
               
                while(k2==0);
                }
   
   }
          if(k1==0)
   {  mydelay(10);
                if(k1==0)
                {
                num=0;
                jd=1;                                          //-90度
               
                while(k1==0);
                }
   
   }

  }
  void main()
  {                jd=3;      //                开机转到中间
        num=0;
                 Time0_int();
       
         while(1)
         {
                  key();
         }
         
  
  
  
  }
  void T0_time()interrupt 1
  {
           TH0=0xfe;
         TL0=0X33;
         if(num<jd)
         {PWM=1;
         }
           else
         PWM=0;
         num=(num+1);
         num=num%40;
回复

使用道具 举报

板凳
ID:77522 发表于 2015-4-20 15:20 | 只看该作者
}


附带仿真文件。

fangzhen.zip

47.53 KB, 下载次数: 20

仿真

回复

使用道具 举报

地板
ID:76800 发表于 2015-4-20 18:24 | 只看该作者
你这家伙,看你的附件还要黑币。
回复

使用道具 举报

5#
ID:77546 发表于 2015-4-20 18:27 | 只看该作者
不知道
回复

使用道具 举报

6#
ID:76800 发表于 2015-4-20 18:37 | 只看该作者
用的什么晶体?如果是约12M的晶体的话,你这输出不对啊,脉冲范围成了0.5ms-2.5ms了,中心1.5ms是对的

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:76800 发表于 2015-4-20 19:02 | 只看该作者
本帖最后由 8055 于 2015-4-20 19:05 编辑

在你的代码基础上修改了一下,为了方便看输出,我调整了IO配置,你自己改一下。
  1. #include<REG52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit PWM=P1^7;
  5. sbit k0=P1^0;
  6. sbit k1=P1^1;
  7. sbit k2=P1^2;
  8. uchar num,jd;
  9. void mydelay(uint i)
  10. {
  11.     uint j,k;
  12.     for(j=i; j>0; j--)
  13.         for(k=110; k>0; k--)
  14.         {
  15.             ;
  16.         }
  17. }
  18. void Time0_int()
  19. {
  20. //           P1M1=0;
  21. //        P1M0=0x01;
  22. //         AUXR|=0X00;
  23.     TMOD=0x01;
  24.     TH0=0xfe;
  25.     TL0=0x33;
  26.     IE=0x82;
  27.     EA=1;
  28.     ET0=1;
  29.     TR0=1;
  30. }
  31. void key()
  32. {
  33.     if(k0==0)
  34.     {
  35.         mydelay(10);
  36.         if(k0==0)
  37.         {
  38.             num=0;
  39.             jd=4;                               //+90度
  40.             while(k0==0)
  41.             {
  42.                 ;
  43.             }
  44.         }
  45.     }
  46.     if(k2==0)
  47.     {
  48.         mydelay(10);
  49.         if(k2==0)
  50.         {
  51.             num=0;
  52.             jd=3;                                          //回中
  53.             while(k2==0)
  54.             {
  55.                 ;
  56.             }
  57.         }
  58.     }
  59.     if(k1==0)
  60.     {
  61.         mydelay(10);
  62.         if(k1==0)
  63.         {
  64.             num=0;
  65.             jd=2;                                          //-90度
  66.             while(k1==0)
  67.             {
  68.                 ;
  69.             }
  70.         }
  71.     }
  72. }
  73. void main()
  74. {
  75.     jd=3;      //                开机转到中间
  76.     num=0;
  77.     Time0_int();
  78.     while(1)
  79.     {
  80.         key();
  81.     }
  82. }
  83. void T0_time()interrupt 1
  84. {
  85.     TH0=0xfe;
  86.     TL0=0X33;
  87.     if(num<jd)
  88.     {
  89.         PWM=1;
  90.     }
  91.     else
  92.         { PWM=0; }
  93.     num++;
  94.     num=num%40;
  95. }
复制代码



评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:76800 发表于 2015-4-20 20:03 | 只看该作者
卡了3天了,现在你倒是出来坑个声儿呐
回复

使用道具 举报

9#
ID:77522 发表于 2015-4-21 10:33 来自手机 | 只看该作者
8055 发表于 2015-4-20 20:03
卡了3天了,现在你倒是出来坑个声儿呐

大神,昨天和女朋友吵架来着。看了你的回复好感动,真是有爱的大神啊,我把仿真问件重新发下,新手让您见笑了!!!
回复

使用道具 举报

10#
ID:77522 发表于 2015-4-21 10:40 来自手机 | 只看该作者
8055 发表于 2015-4-20 20:03
卡了3天了,现在你倒是出来坑个声儿呐

大神,我仿真是对的,在一个位置可以转两个角度,但是考进单片机测试的时候,舵机在一个位置只能转一个角度,比如我的舵机在90度的位置,我想让他回到0度位置,但是按了键就是没反应,只有按了负90度的键才有反应。等他到了负90度的位置,想让他到正90又没反应了,只有0度键才可以。表达能力不足,大神看懂了吗?我反复看程序,看不出问题在哪啊,纠结!!!
回复

使用道具 举报

11#
ID:76800 发表于 2015-4-21 12:33 | 只看该作者
beijiluokasi 发表于 2015-4-21 10:40
大神,我仿真是对的,在一个位置可以转两个角度,但是考进单片机测试的时候,舵机在一个位置只能转一个角 ...

你用7楼的程序试一试,这3个按键就只是-90, 0, 90的位置,程序里你也没写自动回中的代码啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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