单片机/MCU论坛
直播中

陈彻

5年用户 13经验值
私信 关注
[问答]

请问为什么步进电机的程序会自己跑起来?

我想要做到按住按钮步进电机就动,现在用我自己的程序和别人写的程序都是导入后端口的电平在自动变化,按钮控制不了。请各位大佬不吝赐教。
我的程序
  1. #include
  2. //按钮p1^6控制正转,p1^7控制反转

  3. unsigned char code table_1[]={0X01,0X02,0X04,0X08};
  4. unsigned char code table_2[]={0X08,0X04,0X02,0X01};

  5. void zhengzhuan()         //正转程序
  6. {
  7.   int e=0;
  8.   if(P1^6==0&&P1^7==1)
  9.   {
  10.    loop1:  e=0;                                // 我的想法是按下按钮后4个引脚通电一轮,没有放开按钮就重新循环
  11.    for(e=0;e<4;e++)
  12.    {
  13.            P2=table_1[e];
  14.         if(e==4)
  15.         e=0;
  16.    }
  17.    if(P1^6==0)
  18.    goto loop1;
  19.   }
  20.   return;
  21. }

  22. void fangzhuan()                         //反转程序
  23. {
  24.   int f=0;
  25.   if(P1^7==0&&P1^6==1)
  26.   {
  27.    loop2: f=0;
  28.    for(f=0;f<4;f++)
  29.    {
  30.            P2=table_2[f];
  31.         if(f==4)
  32.         f=0;
  33.    }
  34.    if(P1^7==0)
  35.    goto loop2;
  36.   }
  37.   return;
  38. }

  39. int main()
  40. {
  41. //int c,d;
  42. while(1)
  43. {
  44. if(P1^6==0&&P1^7==1)
  45.    zhengzhuan();
  46.    else if(P1^6==1&&P1^7==0)
  47.    fangzhuan();
  48. }
  49. }
找的别人的程序
  1.   #include
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define MotorData P2                    //步进电机控制接口定义
  5. ***it K1=P1^5;
  6. ***it K2=P1^6;
  7. ***it K3=P1^7;
  8. //uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
  9. //uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D
  10. uchar phasecw[8] ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//正转 电机导通相序  AD-D-CD-C-BC-B-AB-A
  11. uchar phaseccw[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//反转 电机导通相序 A-AB-B-BC-C-CD-D-DA
  12. //ms延时函数
  13. void Delay_xms(uint x)
  14. {
  15. uint i,j;
  16. for(i=0;i
  17.   for(j=0;j<112;j++);
  18. }

  19. //顺时针转动
  20. void MotorCW(void)
  21. {
  22. uchar i;
  23. for(i=0;i<8;i++)
  24.   {
  25.    MotorData=phasecw[i];
  26.    Delay_xms(4);//转速调节
  27.   }
  28. }

  29. //逆时针转动
  30. void MotorCCW(void)
  31. {
  32. uchar i;
  33. for(i=0;i<8;i++)
  34.   {
  35.    MotorData=phaseccw[i];
  36.   if (i>8) i=0;
  37.    Delay_xms(4);//转速调节
  38.   }
  39. }

  40. //停止转动
  41. void MotorStop(void)
  42. {
  43. MotorData=0x00;
  44. }

  45. //主函数
  46. void main(void)
  47. {
  48. Delay_xms(50);//等待系统稳定
  49. while(1)
  50. {

  51.    if (K1==1)
  52.    {
  53.     Delay_xms(50);
  54.     if (K1==1)//for(i=0;i<500;i++)
  55.    MotorCW();   //顺时针转动

  56.   }
  57.   
  58.   
  59.   
  60.    if (K3==1 )
  61.    {
  62.     Delay_xms(50);
  63.    if (K3==1) MotorStop();  //停止转动
  64.   
  65.   }
  66.   
  67.   
  68.   if (K2==1 )
  69.   {
  70.     Delay_xms(50);
  71.    if (K2==1)
  72.   
  73.    MotorCCW();  //逆时针转动
  74.   
  75.   
  76. }
  77. }
  78. }


  • 捕获.PNG
已退回7积分

回帖(3)

jiciwi

2020-3-6 11:50:26
你再加个if判断不就可以了
举报

陈彻

2020-3-6 15:50:27
现在的问题是运行后在没有按按钮的情况下,输出端会一直跳动
举报

人中狼

2020-3-8 11:46:16
没看出来第二个程序有什么问题,第一个程序的两个转动程序都是死循环,至于所说的运行后,输出端会一直跳动是否能详细说明一下
for(e=0;e<4;e++)
   {
           P2=table_1[e];
        if(e==4)
        e=0;
   }
e=4是退出for的条件,但是在for里又有e=0,应该会形成死循环,无法退出for
举报

更多回帖

发帖
×
20
完善资料,
赚取积分