找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1421|回复: 2
收起左侧

求大佬教教步进电机的控制 仿真的时候没反应

[复制链接]
ID:314014 发表于 2018-4-23 12:43 | 显示全部楼层 |阅读模式
通过按键控制电机的运行状态,并在led数码管显示状态与实时速度,电路图如下,但我仿真的时候就是没反应,帮忙看看哪里出问题了
QQ图片20180423124052.png
回复

使用道具 举报

ID:314014 发表于 2018-4-23 15:12 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-4-23 14:04
你好!只要仿真,没有程序,怎么检查

不好意思,忘了
  1. #include<red52.h>
  2. sbit ZZ=P3^0;  //正转
  3. sbit FZ=P3^1;        //反转
  4. sbit TZ=P3^4;        //停止
  5. sbit K1=P3^5;        //加速
  6. sbit K2=P3^6;        //减速
  7. sbit shiwei=P2^2//速度的十位
  8. sbit gewei=P2^3//速度的个位
  9. sbit shuru=P2^1//输入正反停这三状态
  10. sbit shuru1=P2^0//输入加减速状态
  11. sbit L1=P2^4;
  12. sbit L2=P2^5;
  13. sbit L3=P2^6;//38译码器的3线输入端
  14. #define uchar unsigned char
  15. #define uchar unsigned int
  16. uchar code zz[4]={0x05,0x06,0x10,0x09};
  17. uchar code fz[4]={0x09,0x10,0x06,0x05};
  18. uchar code xianshi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x5e,0x71,0x31,0x3e};//显示数组值为0~9,D(减速)F(反转)U(加速)T(停止)Z(正转)        
  19. uint time,count,speedlevel//speedlevel为步进电机转速参数,其值越大电机的速度越小,值越小电机转速越大;其范围为1~100;
  20. uint speedcount;//步进电机转速参数计数
  21. uint step=10000;//步数,在本次实验中,设定电机步数为0时到达目的地
  22. uint stepcount;//步数计数
  23. unsigned char keycan=0;                //键值
  24. unsigned char s,i,j,k,z;
  25. /**********************************/
  26. /**P1.0=A ;P1.1=A- ;P1.2=B ; P1.3=B-**/
  27. /**延时t,由于选用的晶振为11.0592MHz,即一个机器周期为1微秒**/
  28. void delay(i)//延时函数
  29.   {
  30.       for(j=0;j<i;j++)
  31.       for(k=0;k<250;k++);
  32.   }
  33. /***正反转程序部分**/
  34. void motor_zhengzhuan()
  35. {
  36.   for(i=0;i<4;i++)
  37.   {P1=zz[i];
  38.   delay(speedlevel);
  39.   }
  40.   }
  41. void motor_fanzhuan()
  42. {
  43.   for(j=0;j<4;j++)
  44.   for(i=0;i<4;i++)
  45.   {P1=fz[i];
  46.   delay(speedlevel);
  47.   }
  48.   }
  49. /**位置控制**/
  50. /**由于步距角为1.8°,故电机转动一圈为200步即200脉冲,并规定正转步数减1,反转加1**/
  51. void weizhi()
  52. {         if(ZZ==0)
  53. { stepcount++;
  54.   step=step-stepcount;
  55.   if(step==0)
  56.   { TZ=0;
  57.   }
  58. }
  59. if(FZ==0)
  60. {stepcount++;
  61. step=step+stepcount;
  62. }
  63. }
  64. /**LED数码管显示部分**/
  65. /**本次实验采用7SEG-MPX4-CC共阴极数码管显示,规定左边2个数码代表状态,右边2个数码管代表speedlevel即步进电机转速参数**/
  66. void xianshi()
  67. {  uint i,j,m,n;
  68. i=speedlevel%10;
  69.   j=speedlevel/10;
  70.   gewei=0;        //开个位数码管
  71.   P0=xianshi[i];
  72.   delay(1);
  73.   geiwei=1;
  74.   shiwei=0;         //开十位数码管
  75.   P0=xianshi[j];
  76.   delay(1);        
  77.   shiwei=1;
  78.   shuru=0;
  79.   if(ZZ==0)
  80. {          P0=xianshi[2];
  81. else if(FZ==0)
  82. {  P0=xianshi[12];
  83. }
  84. else if(TZ==0)
  85. {  P0=xianshi[14];
  86. }
  87. }
  88.   delay(10);
  89.   shuru=1;
  90.   shuru1=0;
  91. if(K1==0)
  92. { P0=xianshi[13];
  93. else if(K2==0)
  94. { P0=xianshi[11];
  95. }
  96. }
  97. delay(10);
  98. shuru1=1;
  99. }
  100. /**主程序部分**/
  101. main()
  102. { //EA=1;          //中断允许
  103.   //IT0=0;//电平触发
  104.   //EX0=1;//外部中断0允许
  105.   //EX1=0; //外部中断1允许
  106.   //TMOD=1; //方式1
  107. // ET0=1;  //定时器0中断允许
  108.   //TH0=0xfe;
  109.   //TL0=0x0c;        //设定0.5ms中断1次
  110.   //TR0=1;        //计数开始
  111.   speedlevel=50;//设定初始步进电机转速等阶为5
  112. while(1)
  113.     {  gewei=1;
  114.        shiwei=1;
  115.        shuru=1;
  116.        shuru1=1;         //关闭LED数码管显示
  117.        if(ZZ==0) //如果电机正转按键按下
  118.       {         delay(2);        //去抖动
  119.             if(ZZ==0)
  120.          {   L1=0;
  121.          L2=0 ;
  122.          L3=0;                 //控制正转LED灯亮
  123.         keycan=1;         //键值等于1
  124.       }
  125.           }
  126.          if(FZ==0) //如果电机反转按键按下
  127.       {         delay(2);        //去抖动
  128.             if(FZ==0)
  129.           {   L1=0;
  130.          L2=0;
  131.          L3=1;                 //控制反转LED灯亮
  132.         keycan=2;         //键值等于2
  133.        }
  134.            }
  135.            if(TZ==0)
  136.            { delay(2);        //去抖动
  137.            {  L1=0;
  138.          L2=1;
  139.          L3=0;                 //控制停止LED灯亮
  140.                  keycan=3;
  141.            }
  142.            }
  143.        switch (keycan)
  144.    {
  145.        case 1: motor_zhengzhuan();  //键值等于1 正转
  146.           break;
  147.       case 2: motor_fanzhuan();  //键值等于2 反转
  148.           break;

  149.     }

  150.              if(K1==0)  //  电机加速
  151.       {          delay(2);        //去抖动
  152.              if(K1==0)
  153.        {  L1=0;
  154.          L2=1;
  155.          L3=1;                 //控制加速LED灯亮
  156.         speedlevel-=5;
  157.                 if(speedlevel<=0)
  158.                 { speedlevel=1;//表示当参数降到0时,电机以speedlevel=1作为最大速度工作
  159.       }
  160.           }
  161.           }
  162.          if(K2==0)           // 电机减速                          
  163.    {    delay(2);        //去抖动
  164.    if(K2==0)
  165.     {    L1=1;
  166.         L2=0;
  167.         L3=0;                 //控制减速LED灯亮
  168.         speedlevel+=5;
  169.         if(speedlevel>=100)
  170.                 { speedlevel=99;//表示当参数降到0时,电机以speedlevel=99作为最小速度工作
  171.                 }
  172.                 }
  173.    }
  174.    xianshi(); //调用显示程序
  175. }        
  176. }
复制代码


回复

使用道具 举报

ID:303383 发表于 2018-4-23 14:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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