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

[复制链接]
3878|15
 楼主| q1074926748 发表于 2012-5-3 21:36 | 显示全部楼层 |阅读模式
我用按键控制电机,希望当按下K1后反转,按下K2后征战,按下K3后停转,但是出来这样的实验现象:按下K1能实现反转,但是如果再按K2,或者K3这两个按键对应的功能就无法实现了,反之,按下K2也能实现正转,但是如果按下其他的按键,就不能实现对应的功能了,我思考着是不是电机有惯性,按下键后不能迅速的转换,但是等了好一会儿后仍然不行,或者感觉是不是设定转动时,进入了一个无限循环,但我设置了中断,应该没影响吧,谢谢了,求教!!



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

  5. sbit K1=P2^0;
  6. sbit K2=P2^1;
  7. sbit K3=P2^2;
  8. uint8 i=0;
  9. void delay(unsigned int t)
  10. {                           
  11.    unsigned int k;
  12.    while(t--)
  13.    {
  14.      for(k=0; k<80; k++)
  15.      { }
  16.    }
  17. }

  18. void timer1_init()
  19. {
  20.   TMOD=0x10;
  21.   TH1=0xb1;
  22.   TL1=0xe0;
  23.   TR1=1;
  24.   ET1=1;
  25.   EA=1;
  26. }
  27. void main()
  28. {
  29.    timer1_init();
  30.    if(K1==0)
  31.    {
  32.      while(1);
  33.    }
  34.    if(K2==0)
  35.    {
  36.      while(1);
  37.    }
  38.    if(K3==0)
  39.    {
  40.       while(1);
  41.    }
  42. }
  43. void inte() interrupt 3
  44. {
  45.    if(K1==0)
  46.    {
  47.      for(i=0;i<8;i++)
  48.          {
  49.             P1=a[i];
  50.                 if(i==7)
  51.                 {
  52.                  i=0;
  53.                 }
  54.                 delay(10);
  55.          }
  56.           while(K1==0);
  57.    }
  58.     if(K2==0)
  59.    {
  60.      for(i=0;i<8;i++)
  61.          {
  62.             P1=b[i];
  63.                 if(i==7)
  64.                 {
  65.                   i=0;
  66.                 }
  67.             delay(10);
  68.          }
  69.          while(K2==0);
  70.    }
  71.    if(K3==0)
  72.    {
  73.      P1=0xff;
  74.          while(K3==0);
  75.    }
  76. }
 楼主| q1074926748 发表于 2012-5-3 21:40 | 显示全部楼层
希望有过这方面大侠指导指导我啊,,自己顶一个,希望不要沉
ningling_21 发表于 2012-5-3 22:03 | 显示全部楼层
定时器中断不需要给TL,TH赋初值吗?
NE5532 发表于 2012-5-3 22:08 | 显示全部楼层
步进电机么?
 楼主| q1074926748 发表于 2012-5-3 22:39 | 显示全部楼层
3# ningling_21 恩,这个是有的,不知道怎么没有复制上,请问怎么实现转换呢
 楼主| q1074926748 发表于 2012-5-3 22:41 | 显示全部楼层
4# NE5532 恩,是步进马达,,是不是我里面程序中得那个中断里的for循环影响了功能的切换???,请指教!谢谢。
 楼主| q1074926748 发表于 2012-5-3 22:59 | 显示全部楼层
6# q1074926748 那个for 循环俩面加上个比如是按下K1的程序,在里面的那个for循环里加上if(k2==0||k3==0) break; 退出K1的程序,这个不知道可不可以,我试一试,
 楼主| q1074926748 发表于 2012-5-4 23:01 | 显示全部楼层
没能成功,,我还是再仔细思考下,看试一试不用中断的形式能不能成功
yushiqian2012 发表于 2012-5-4 23:59 | 显示全部楼层
我觉得应该是因为你按了第一次按键以后进入了中断,但是再按键的话就进不了中断了,主函数处理的还可以,建议中断把扫描按键状态的函数改一下,同时定时器中断不用重新幅值吧,本身就是自动重装的啊
yushiqian2012 发表于 2012-5-5 00:09 | 显示全部楼层
刚才看了看资料,我还建议你好好看看这个自动重装,应该进入中断时先让TR=0吧,处理完以后在让TR=1,希望能起到作用
 楼主| q1074926748 发表于 2012-5-5 07:39 | 显示全部楼层
9# yushiqian2012 恩,我思考了一下,感觉是这个问题,第一次按键后确实在那不往下运行了,问过老师了,老师也这么说。那该怎么样改呢?里面的for循环后加上一个(while(K2==0||K3==0))
行不行?谢谢
yushiqian2012 发表于 2012-5-5 08:34 | 显示全部楼层
可以试一试,我觉得你最大的问题就是while(1);和while(**==0),建议不要这么做吧,“while(1);"会让程序进入死循环的
触觉的爱 发表于 2012-5-5 12:26 | 显示全部楼层
:lol 以前也弄过这类程序来测试步进电机

最简单的办法是在任意一个按键的循环内,都加入其它按键有效时跳出循环的语句
 楼主| q1074926748 发表于 2012-5-5 23:33 | 显示全部楼层
12# yushiqian2012 恩,问老师了,老师也说如果这样按任何 一个按键,到最后执行到while(1)会死在那了1
 楼主| q1074926748 发表于 2012-5-5 23:36 | 显示全部楼层
13# 触觉的爱 恩,多谢了,确实是在这样,以后碰见类似问题也应该朝这方面想想
 楼主| q1074926748 发表于 2012-5-6 15:57 | 显示全部楼层
今天这个步进电机的切换完全实现了,没错,,就是在for循环中加上while(k1==0||k2==0)break;;
加上break就能够实现了,感谢各位对我的帮组尤其是感谢12 楼何13 楼:victory:下面是运行成功后的代码,,嘿嘿
  1. #include <reg51.h>
  2. typedef unsigned char uint8;
  3. code uint8 a[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//反转
  4. code uint8 b[]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//正转

  5. sbit K1=P2^0;
  6. sbit K2=P2^1;
  7. sbit K3=P2^2;
  8. uint8 i=0;
  9. void delay(unsigned int t)
  10. {                           
  11.    unsigned int k;
  12.    while(t--)
  13.    {
  14.      for(k=0; k<80; k++)
  15.      { }
  16.    }
  17. }

  18. void timer1_init()
  19. {
  20.   TMOD=0x10;
  21.   TH1=0xb1;
  22.   TL1=0xe0;
  23.   TR1=1;
  24.   ET1=1;
  25.   EA=1;
  26. }
  27. void main()
  28. {
  29.    timer1_init();
  30.    if(K1==0)
  31.    {
  32.      while(1);
  33.    }
  34.    if(K2==0)
  35.    {
  36.      while(1);
  37.    }
  38.    if(K3==0)
  39.    {
  40.       while(1);
  41.    }
  42. }
  43. void inte() interrupt 3
  44. {
  45.      TH1=0xb1;
  46.      TL1=0xe0;
  47.       TR1=1;
  48.    if(K1==0)
  49.    {
  50.      for(i=0;i<8;i++)
  51.          {
  52.             P1=a[i];
  53.                 if(i==7)
  54.                 {
  55.                  i=0;
  56.                 }
  57.                 delay(10);
  58.                 if(K2==0||K3==0)
  59.             break;
  60.          }
  61.           while(K1==0);
  62.    }
  63.     if(K2==0)
  64.    {
  65.      for(i=0;i<8;i++)
  66.          {
  67.             P1=b[i];
  68.                 if(i==7)
  69.                 {
  70.                   i=0;
  71.                 }
  72.             delay(10);
  73.                  if(K1==0||K3==0)
  74.          {
  75.             break;
  76.          }
  77.          }
  78.        
  79.          while(K2==0);
  80.    }
  81.    if(K3==0)
  82.    {
  83.      for(i=0;i<8;i++)
  84.          {
  85.            P1=0XFF;
  86.            delay(10);
  87.             if(K1==0||K3==0)
  88.             break;
  89.          }
  90.          while(K3==0);
  91.    }
  92. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:郭强

0

主题

58

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部