找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3116|回复: 1
收起左侧

按键控制步进电机并在数码管显示

[复制链接]
ID:79544 发表于 2015-10-28 19:40 | 显示全部楼层 |阅读模式
步进电机任意角度控制并显示
  1. /*****************************************************
  2.                                     程序说明
  3.     通过改变脉冲个数改变步进电机的角度,通过按键可以让步进
  4. 电机停在任意角度及正反转 并在数码管显示,正转显示1,反转显示2

  5.         单片机        :STC12C5A60S2
  6.         晶振            :11.0592MHZ
  7.         步进电机驱动芯片:ULN2003A
  8.         作者            :苏义江
  9.         时间            :2015年6月5日
  10.         八拍方式驱动    :顺序为A AB B BC C CD D DA
  11. zhengzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
  12. fanzhuan[]  ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

  13. *****************************************************/
  14. #include<12c5a.H>
  15. //#include <reg52.h>
  16. //#define uchar unsigned char
  17. //#define uint unsigned int

  18. sbit key=P1^0; //按键控制步进电机的正转方向  
  19. sbit key1=P1^1; //按键控制步进电机的反转方向
  20. sbit dula  =P0^7;    //段锁存使能
  21. sbit wela  =P0^6;    //位锁存使能


  22. uchar code zhengzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
  23. uchar code fanzhuan[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
  24. //共阳段码
  25. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  26.                                 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
  27.                                 0xa1,0x86,0x8e,0x89};

  28. uchar code tab_f[]={0x0c,0x06,0x03,0x09,
  29.                                                 0x0c,0x06,0x03,0x09};//2相励磁 反传
  30. uchar code tab_z[]={0x09,0x03,0x06,0x0c,
  31.                                                 0x09,0x03,0x06,0x0c};//2相励磁 正传

  32. void Delay( uint i)//延时
  33. {
  34.         uint x,y;
  35.         for(x=i;x>0;x--)
  36.         for(y=300;y>0;y--);

  37. }
  38. void display()
  39. {
  40.         wela=1;
  41.         P2=0xfe;
  42.         wela=0;       
  43.         dula  =1;
  44.         P2=0xf9;//正转显示1
  45.         Delay( 10);

  46.         P2=0xff;
  47.         dula  =0;
  48. }
  49. void display1()
  50. {
  51.         wela=1;
  52.         P2=0xf7;
  53.         wela=0;
  54.         dula  =1;
  55.         P2=0xa4;//反转显示2
  56.         Delay( 10);

  57.         P2=0xff;
  58.         dula  =0;
  59. }
  60. void main()  
  61. {
  62.    uint i,j;//j代表脉冲.i代表数据
  63.         P0M1=0;        //设置P0口为强推免输出模式,下同
  64.         P0M0=0XFF;
  65.         while(1)
  66.         {
  67.        
  68.                 //j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
  69.                 for(j=3;j>0;j--)//正转4分之一周
  70.                 {
  71.                         for(i=0;i<8;i++)
  72.                           {
  73.                                 display();                               
  74.                                  P0=zhengzhuan[i];//正转数组
  75.                                    Delay(5);//5秒旋转一周 改变延时改变速度                                       
  76.                         }       
  77.                 }
  78.                 Delay(200);//正反转之间延时
  79.                 for(j=3;j>0;j--)//反转4分之一周
  80.                 {
  81.                         for(i=0;i<8;i++)
  82.                           {
  83.                                 display1();                               
  84.                                  P0=fanzhuan[i];//反转数组
  85.                                    Delay(5);//5秒旋转一周 改变延时改变速度                                               
  86.                         }       
  87.                 }
  88.                 Delay(200);               
  89.         }
  90. /********下面程序都正常控制步进电机状态*****************/       
  91. /*        while(1)
  92.         {
  93.                 if(!key)
  94.                 Delay(10);
  95.                 {
  96.                         if(!key)
  97.                         {
  98.                                 display();
  99.                                 Delay(10);
  100.                                 for(j=7;j>0;j--)//j=7个脉冲,正转半周
  101.                                 {
  102.                                         for(i=0;i<8;i++)
  103.                                           {
  104.                                          P0=zhengzhuan[i];//正转数组
  105.                                                    Delay(10);       
  106.                                         }       
  107.                                 }
  108.                         }
  109.                         while(!key);       
  110.                 }

  111.                 if(!key1)
  112.                 Delay(10);
  113.                 {
  114.                         if(!key1)

  115.                         {
  116.                                 display1();
  117.                                 Delay(10);
  118.                                 for(j=7;j>0;j--)//j=7个脉冲,反转半周
  119.                                 {
  120.                                         for(i=0;i<8;i++)
  121.                                           {
  122.                                          P0=fanzhuan[i];//反转数组
  123.                                                    Delay(10);       
  124.                                         }       
  125.                                 }                               
  126.                         }
  127.                         while(!key1);       
  128.                 }
  129.                
  130.         }*/
  131. /*        while(1)
  132.         {
  133.        
  134.                 //j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
  135.                 for(j=13;j>0;j--)//正转一周
  136.                 {
  137.                         for(i=0;i<8;i++)
  138.                           {
  139.                                 display();                               
  140.                                  P0=zhengzhuan[i];//正转数组
  141.                                    Delay(5);//6秒旋转一周                                       
  142.                         }       
  143.                 }
  144.                 Delay(2000);
  145.                 for(j=13;j>0;j--)//反转一周
  146.                 {
  147.                         for(i=0;i<8;i++)
  148.                           {
  149.                                 display1();                               
  150.                                  P0=fanzhuan[i];//反转数组
  151.                                    Delay(5);//6秒旋转一周                                       
  152.                         }       
  153.                 }
  154.                 Delay(2000);               
  155.         }
  156.         */
  157.        
  158. /*        while(1)
  159.         {
  160.        
  161.                 //j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
  162.                 for(j=25;j>0;j--)//正转二周
  163.                 {
  164.                         for(i=0;i<8;i++)
  165.                           {
  166.                                 display();
  167.                        
  168.                                  P0=zhengzhuan[i];//正转数组
  169.                                    Delay(3);
  170.                                        
  171.                         }       
  172.                 }
  173.                 Delay(2000);
  174.                 for(j=25;j>0;j--)//反转一周
  175.                 {
  176.                         for(i=0;i<8;i++)
  177.                           {
  178.                                 display1();
  179.                                
  180.                                  P0=fanzhuan[i];//反转数组
  181.                                    Delay(3);
  182.                                        
  183.                         }       
  184.                 }
  185.                 Delay(2000);
  186.         }*/
  187.        
  188.        
  189. /*        while(1)
  190.         {
  191.        
  192.                 //j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
  193.                 for(j=250;j>0;j--)//正转二十周
  194.                 {
  195.                         for(i=0;i<8;i++)
  196.                           {
  197.                                 display();                               
  198.                                  P0=zhengzhuan[i];//正转数组
  199.                                    Delay(6);        //延时控制转速不能小于500
  200.                                
  201.                         }       
  202.                 }
  203.                 Delay(2000);
  204.                 for(j=250;j>0;j--)//反转二十周
  205.                 {
  206.                         for(i=0;i<8;i++)
  207.                           {
  208.                                 display1();
  209.                                  P0=fanzhuan[i];//反转数组
  210.                                    Delay(6);        //延时控制转速不能小于500
  211.                                
  212.                         }       
  213.                 }
  214.                 Delay(20000);
  215.         }*/

  216. /* while(1)
  217.   {

  218.        
  219.            for(i=0;i<8;i++)
  220.           {
  221.                   if(key)       //按键未按下,正转
  222.                  {
  223.                            P0=zhengzhuan[i];//正转数组
  224.                            Delay(8);
  225.                    }
  226.            else      //按键按下,反转
  227.                  {
  228.                           P0=fanzhuan[i];//反转数组
  229.                            Delay(8);
  230.                   }
  231.             }   
  232.    }*/
  233. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:711365 发表于 2020-3-24 18:20 | 显示全部楼层
请问有没有仿真图呢?谢谢啦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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