找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5009|回复: 3
收起左侧

基于51单片机的步进电机控制以及仿真

[复制链接]
ID:273390 发表于 2018-1-8 19:08 | 显示全部楼层 |阅读模式
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
  1. #include <reg52.h>
  2. unsigned char code F_Rotation[4]={0x08,0x10,0x20,0x40};//正转表格
  3. unsigned char code B_Rotation[4]={0x40,0x20,0x10,0x08};//反转表格

  4. void Delay(unsigned int i)//延时
  5. {
  6. while(--i);
  7. }

  8. main()
  9. {

  10. unsigned char i;

  11. while(1)
  12. {
  13.   for(i=0;i<4;i++)      //4相
  14.      {
  15.      P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
  16.      Delay(500);        //改变这个参数可以调整电机转速
  17.   }
  18.   }
  19. }
复制代码


我编了一个程序 ,让单片机发100个脉冲,之后电机就停止转动。但是把单片机、驱动器、电机连起来,运行的时候,步进电机一直转,没有出现预期的停止。我的驱动器的脉冲负接 P1^2,驱动器的脉冲正接+5V。
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define VALUE  40
  4. sbit sp = P1^2;
  5. unsigned int a;

  6. void delay(unsigned int i)
  7. {
  8.     char j;
  9.     for(i; i > 0; i--)
  10.         for(j = 200; j > 0; j--);
  11. }
  12. void main()

  13. While(1)
  14.   {
  15.      a=0;
  16.    while(1)
  17.          { sp=0;
  18.           delay(10);
  19.           sp=1;
  20.          delay(10);
  21.           a++;
  22.          if(a==100)
  23.          {
  24.     sp=0
  25.     break;
  26.    
  27.     }

  28. }

  29. }
复制代码

电路图:
程序;
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code  s[]={  0x88,0x22,0x44,0x11 };
  5. void delay(uint z)   
  6. { uint x,y;
  7. for(x=z;x>0;x--)
  8.   for(y=110;y>0;y--);
  9. }
  10. void main()   
  11. { int i;
  12.    while(1)   
  13.     {  for(i=0;i<4;i++)
  14.        {   P2=s[i];
  15.            delay(200);
  16.        }
  17.     }
  18. }









  19. #include<reg51.h>
  20. sbit k1=P1^1; //启动
  21. sbit k2=P1^0; //正反转
  22. sbit k3=P1^2; //加速
  23. sbit k4=P1^3; //减速
  24. unsigned int x=50000;  
  25. unsigned char i=0;
  26. unsigned char code table[6]={0x01,0x03,0x02,0x06,0x04,0x05};//单双六拍
  27. void motor();
  28. void main()
  29. {
  30. TMOD=0x01;
  31. TH0=-x>>8;                  //
  32. TL0=-x%256;                  //
  33. TCON=0x10;
  34. IE=0x82;
  35. while(1);
  36. }
  37. void time_0 () interrupt 1
  38. {
  39. EA=0;TR0=0;         
  40. motor();
  41. if(x<65000&&x>36000)          //上下限
  42. {if(!k3) x=x-2000;                  //加速
  43. else if(!k4) x=x+2000;}    //减速
  44. TH0=-x>>8;TL0=-x%256;
  45. TR0=1;EA=1;         
  46. }
  47. void motor()
  48. {
  49. if(!k1)
  50. { if(!k2)                 //正反转
  51. {i+=1;
  52. if(i>5) i=0;}
  53. else
  54. {i-=1;
  55. if(i>5) i=5;}
  56. P2=table;
  57. }
  58. else P2=0;
  59. }
复制代码


51单片机控制的4相步进电机的C语言程序
  1. #include <AT89X51.H>

  2. unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00};

  3. unsigned char temp,temp_old;

  4. unsigned char key;

  5. unsigned char i,j,k,m,s;

  6. void delay(int i)

  7.   {

  8.    for(m=i;m>0;m--)

  9.    for(j=250;j>0;j--)

  10.    for(k=10;k>0;k--);

  11.   }

  12. void saomiao()

  13. {

  14. P3=0xff;

  15.   P3_4=0;

  16.   temp=P3;

  17.   temp=temp&0x0f;

  18.   if(temp!=0x0f)

  19.    {

  20.     for(i=50;i>0;i--)

  21.     for(j=200;j>0;j--);

  22.     temp=P3;

  23.     temp=temp&0x0f;

  24.     if(temp!=0x0f)

  25.      {

  26.       temp=P3;

  27.       temp=temp&0x0f;

  28.       switch(temp)

  29.        {

  30.         case 0x0e:

  31.         key=1;

  32.          break;

  33.         case 0x0d:

  34.         key=2;

  35.         break;

  36.         case 0x0b:

  37.         key=3;

  38.         break;

  39.         case 0x07:

  40.         key=4;

  41.         break;

  42.        }

  43.         temp=P3;

  44.         temp=temp&0x0f;

  45.         while(temp!=0x0f)

  46.         {

  47.          temp=P3;

  48.          temp=temp&0x0f;

  49.         }

  50.      }

  51.    }

  52.   P3=0xff;

  53.   P3_5=0;

  54.   temp=P3;

  55.   temp=temp&0x0f;

  56.   if(temp!=0x0f)

  57.    {

  58.     for(i=50;i>0;i--)

  59.     for(j=200;j>0;j--);

  60.     temp=P3;

  61.     temp=temp&0x0f;

  62.     if(temp!=0x0f)

  63.      {

  64.       temp=P3;

  65.       temp=temp&0x0f;

  66.       switch(temp)

  67.        {

  68.         case 0x0d:

  69.         key=5;

  70.         break;

  71.         case 0x0b:

  72.         key=6;

  73.         break;

  74.         case 0x07:

  75.         key=7;

  76.         break;

  77.        }

  78.         temp=P3;

  79.         temp=temp&0x0f;

  80.         while(temp!=0x0f)

  81.         {

  82.          temp=P3;

  83.          temp=temp&0x0f;

  84.         }

  85.      

  86.      }

  87.    }

  88. }

  89. void main(void)

  90. {

  91. while(1)

  92. {   

  93.     saomiao();

  94.     if(key==1)

  95.      { P1=0;

  96.       P2=0;

  97.       saomiao();   

  98.      }

  99.     if(key==2)

  100.      {

  101.       temp_old=key;

  102.       for(s=0;s<8;s++)

  103.            {  P2=table[s];

  104.         P1_4=0;

  105.         delay(13);

  106.         saomiao();

  107.         if(key!=temp_old)

  108.          {

  109.           P1_4=1;

  110.           break;

  111.          }

  112.         }

  113.      }

  114.     if(key==3)

  115.      {

  116.       temp_old=key;  

  117.       for(s=0;s<8;s++)

  118.            {  P2=table[s];

  119.         P1_5=0;

  120.         delay(5);

  121.         saomiao();

  122.         if(key!=temp_old)

  123.          {

  124.           P1_5=1;

  125.           break;

  126.          }

  127.         }

  128.      }

  129.     if(key==4)

  130.      {

  131.          temp_old=key;

  132.       for(s=0;s<8;s++)

  133.            {  P2=table[s];

  134.         P1_6=0;

  135.         delay(20);

  136.         saomiao();

  137.         if(key!=temp_old)

  138.          {

  139.           P1_6=1;

  140.           break;

  141.          }

  142.          

  143.         }

  144.      }

  145.     if(key==5)

  146.      {

  147.         temp_old=key;

  148.       for(s=9;s<17;s++)

  149.            {  P2=table[s];

  150.         P1_7=0;

  151.         delay(13);

  152.         saomiao();

  153.         if(key!=temp_old)

  154.          {

  155.           P1_7=1;

  156.           break;

  157.          }

  158.         }

  159.      }

  160.     if(key==6)

  161.      {

  162.         temp_old=key;

  163.       for(s=9;s<17;s++)

  164.            {  P2=table[s];

  165.         P1_5=0;

  166.         delay(5);

  167.         saomiao();

  168.         if(key!=temp_old)

  169.          {

  170.           P1_5=1;

  171.           break;

  172.          }

  173.         }

  174.      }

  175.     if(key==7)

  176.      {

  177.                temp_old=key;

  178.       for(s=9;s<17;s++)

  179.            {  P2=table[s];

  180.         P1_6=0;

  181.         delay(20);

  182.         saomiao();

  183.         if(key!=temp_old)

  184.          {

  185.           P1_6=1;

  186.           break;

  187.          }

  188.         }

  189.      }

  190. }

  191. }
复制代码


步进电机驱动程序.docx

333.66 KB, 下载次数: 48, 下载积分: 黑币 -5

步进电机驱动程序(51)

回复

使用道具 举报

ID:280125 发表于 2018-1-27 04:31 | 显示全部楼层
好资料,51黑有你更精彩
回复

使用道具 举报

ID:298008 发表于 2020-2-15 12:15 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

ID:298008 发表于 2020-2-15 20:15 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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