打印

电机停转,正转,反转的转换,出现的具体问题在内容中

[复制链接]
2903|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
q1074926748|  楼主 | 2012-5-3 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用按键控制电机,希望当按下K1后反转,按下K2后征战,按下K3后停转,但是出来这样的实验现象:按下K1能实现反转,但是如果再按K2,或者K3这两个按键对应的功能就无法实现了,反之,按下K2也能实现正转,但是如果按下其他的按键,就不能实现对应的功能了,我思考着是不是电机有惯性,按下键后不能迅速的转换,但是等了好一会儿后仍然不行,或者感觉是不是设定转动时,进入了一个无限循环,但我设置了中断,应该没影响吧,谢谢了,求教!!



#include <reg51.h>
typedef unsigned char uint8;
code uint8 a[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//反转
code uint8 b[]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转

sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
uint8 i=0;
void delay(unsigned int t)
{                           
   unsigned int k;
   while(t--)
   {
     for(k=0; k<80; k++)
     { }
   }
}

void timer1_init()
{
  TMOD=0x10;
  TH1=0xb1;
  TL1=0xe0;
  TR1=1;
  ET1=1;
  EA=1;
}
void main()
{
   timer1_init();
   if(K1==0)
   {
     while(1);
   }
   if(K2==0)
   {
     while(1);
   }
   if(K3==0)
   {
      while(1);
   }
}
void inte() interrupt 3
{
   if(K1==0)
   {
     for(i=0;i<8;i++)
         {
            P1=a[i];
                if(i==7)
                {
                 i=0;
                }
                delay(10);
         }
          while(K1==0);
   }
    if(K2==0)
   {
     for(i=0;i<8;i++)
         {
            P1=b[i];
                if(i==7)
                {
                  i=0;
                }
            delay(10);
         }
         while(K2==0);
   }
   if(K3==0)
   {
     P1=0xff;
         while(K3==0);
   }
}

相关帖子

沙发
q1074926748|  楼主 | 2012-5-3 21:40 | 只看该作者
希望有过这方面大侠指导指导我啊,,自己顶一个,希望不要沉

使用特权

评论回复
板凳
ningling_21| | 2012-5-3 22:03 | 只看该作者
定时器中断不需要给TL,TH赋初值吗?

使用特权

评论回复
地板
NE5532| | 2012-5-3 22:08 | 只看该作者
步进电机么?

使用特权

评论回复
5
q1074926748|  楼主 | 2012-5-3 22:39 | 只看该作者
3# ningling_21 恩,这个是有的,不知道怎么没有复制上,请问怎么实现转换呢

使用特权

评论回复
6
q1074926748|  楼主 | 2012-5-3 22:41 | 只看该作者
4# NE5532 恩,是步进马达,,是不是我里面程序中得那个中断里的for循环影响了功能的切换???,请指教!谢谢。

使用特权

评论回复
7
q1074926748|  楼主 | 2012-5-3 22:59 | 只看该作者
6# q1074926748 那个for 循环俩面加上个比如是按下K1的程序,在里面的那个for循环里加上if(k2==0||k3==0) break; 退出K1的程序,这个不知道可不可以,我试一试,

使用特权

评论回复
8
q1074926748|  楼主 | 2012-5-4 23:01 | 只看该作者
没能成功,,我还是再仔细思考下,看试一试不用中断的形式能不能成功

使用特权

评论回复
9
yushiqian2012| | 2012-5-4 23:59 | 只看该作者
我觉得应该是因为你按了第一次按键以后进入了中断,但是再按键的话就进不了中断了,主函数处理的还可以,建议中断把扫描按键状态的函数改一下,同时定时器中断不用重新幅值吧,本身就是自动重装的啊

使用特权

评论回复
10
yushiqian2012| | 2012-5-5 00:09 | 只看该作者
刚才看了看资料,我还建议你好好看看这个自动重装,应该进入中断时先让TR=0吧,处理完以后在让TR=1,希望能起到作用

使用特权

评论回复
11
q1074926748|  楼主 | 2012-5-5 07:39 | 只看该作者
9# yushiqian2012 恩,我思考了一下,感觉是这个问题,第一次按键后确实在那不往下运行了,问过老师了,老师也这么说。那该怎么样改呢?里面的for循环后加上一个(while(K2==0||K3==0))
行不行?谢谢

使用特权

评论回复
12
yushiqian2012| | 2012-5-5 08:34 | 只看该作者
可以试一试,我觉得你最大的问题就是while(1);和while(**==0),建议不要这么做吧,“while(1);"会让程序进入死循环的

使用特权

评论回复
13
触觉的爱| | 2012-5-5 12:26 | 只看该作者
:lol 以前也弄过这类程序来测试步进电机

最简单的办法是在任意一个按键的循环内,都加入其它按键有效时跳出循环的语句

使用特权

评论回复
14
q1074926748|  楼主 | 2012-5-5 23:33 | 只看该作者
12# yushiqian2012 恩,问老师了,老师也说如果这样按任何 一个按键,到最后执行到while(1)会死在那了1

使用特权

评论回复
15
q1074926748|  楼主 | 2012-5-5 23:36 | 只看该作者
13# 触觉的爱 恩,多谢了,确实是在这样,以后碰见类似问题也应该朝这方面想想

使用特权

评论回复
16
q1074926748|  楼主 | 2012-5-6 15:57 | 只看该作者
今天这个步进电机的切换完全实现了,没错,,就是在for循环中加上while(k1==0||k2==0)break;;
加上break就能够实现了,感谢各位对我的帮组尤其是感谢12 楼何13 楼:victory:下面是运行成功后的代码,,嘿嘿
#include <reg51.h>
typedef unsigned char uint8;
code uint8 a[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//反转
code uint8 b[]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转

sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
uint8 i=0;
void delay(unsigned int t)
{                           
   unsigned int k;
   while(t--)
   {
     for(k=0; k<80; k++)
     { }
   }
}

void timer1_init()
{
  TMOD=0x10;
  TH1=0xb1;
  TL1=0xe0;
  TR1=1;
  ET1=1;
  EA=1;
}
void main()
{
   timer1_init();
   if(K1==0)
   {
     while(1);
   }
   if(K2==0)
   {
     while(1);
   }
   if(K3==0)
   {
      while(1);
   }
}
void inte() interrupt 3
{
     TH1=0xb1;
     TL1=0xe0;
      TR1=1;
   if(K1==0)
   {
     for(i=0;i<8;i++)
         {
            P1=a[i];
                if(i==7)
                {
                 i=0;
                }
                delay(10);
                if(K2==0||K3==0)
            break;
         }
          while(K1==0);
   }
    if(K2==0)
   {
     for(i=0;i<8;i++)
         {
            P1=b[i];
                if(i==7)
                {
                  i=0;
                }
            delay(10);
                 if(K1==0||K3==0)
         {
            break;
         }
         }
       
         while(K2==0);
   }
   if(K3==0)
   {
     for(i=0;i<8;i++)
         {
           P1=0XFF;
           delay(10);
            if(K1==0||K3==0)
            break;
         }
         while(K3==0);
   }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:郭强

0

主题

58

帖子

1

粉丝