标题: 51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示) [打印本页]

作者: yx876157737    时间: 2017-9-20 23:40
标题: 51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)
自己写的,不规范还望包含,keil和protues文件


单片机源程序如下:
  1. #include <reg52.h>      
  2.    
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. uint speed = 100;                                                //初始转速
  6. uint max = 200;                                                        //最慢转速
  7. uint min = 20;                                                        //最快转速

  8. sbit swich = P2^0;                                           //总开关
  9. sbit dir = P2^1;                                        //电机旋转方向
  10. sbit le1=P2^6;
  11. sbit le2=P2^7;
  12. sbit speedadd=P3^2;
  13. sbit speedsub=P3^3;                                  

  14. unsigned char uca_MotorStep[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};    //励磁电流数组。
  15.                                                                                                              

  16. uchar leddata[]={

  17.                 0x3F,  //"0"
  18.                 0x06,  //"1"
  19.                 0x5B,  //"2"
  20.                 0x4F,  //"3"
  21.                 0x66,  //"4"
  22.                 0x6D,  //"5"
  23.                 0x7D,  //"6"
  24.                 0x07,  //"7"
  25.                 0x7F,  //"8"
  26.                 0x6F,  //"9"
  27.                 0x40,  //"-"
  28.                 0x00,  //熄灭
  29.                          };


  30. void delay1ms(void)   //误差 0us
  31. {
  32.     unsigned char a,b,c;
  33.     for(c=1;c>0;c--)
  34.         for(b=142;b>0;b--)
  35.             for(a=2;a>0;a--);
  36. }

  37. void delay(uint x )                          //多功能毫秒延时
  38. {
  39.     uint i;
  40.         for(i=0;i<x;i++)
  41.         {
  42.           delay1ms();
  43.         }
  44. }



  45. void display(void)
  46. {       
  47.   if(swich==1)
  48.   {
  49.                    P0=        leddata[11];
  50.                 delay(1);
  51.                 le2=1;
  52.                 le1=1;
  53.                 delay(1);
  54.                 le2=0;               
  55.                 le1=0;

  56.   }       
  57.   else
  58.   {
  59.   if(dir==1)
  60.                 {
  61.                 P0=        leddata[11];
  62.                 delay(1);
  63.                 le2=1;
  64.                 delay(1);
  65.                 le2=0;
  66.                 }
  67.         else
  68.             {
  69.                 P0 =leddata[10];
  70.                 delay(1);
  71.                 le2=1;
  72.                 delay(1);
  73.                 le2=0;
  74.                 }  

  75.         P0=leddata[9-(speed-20)/20];
  76.         delay(30);
  77.         le1=1;
  78.         delay(5);
  79.         le1=0;
  80.                   
  81. }       
  82. }


  83. void Init_INT0()
  84. {
  85. EX0=1;    //开启外部中断 0
  86. IT0=1;          //设置成低电平触发,1为下降沿触发
  87. EX1=1;    //开启外部中断 1
  88. IT1=1;          //设置成低电平触发,1为下降沿触发
  89. EA=1;   //开启总中断
  90. }

  91. void Interrupt0_handler() interrupt 0
  92. {
  93.     EA=0;   //首先关闭总中断,以消除按键出现的抖动所产生的干扰
  94.     delay(20); //同样是为了消除抖动而产生新的中断
  95.     if(speed>min)
  96.        {speed=speed-20;}        //限制最快转速
  97.         else
  98.                 {speed=min;}
  99.         while(speedadd==0);
  100.     EA=1;            //恢复中断
  101. }


  102. void Interrupt1_handler() interrupt 2
  103. {
  104.     EA=0;   //首先关闭总中断,以消除按键出现的抖动所产生的干扰
  105.     delay(20); //同样是为了消除抖动而产生新的中断
  106.     if(speed<max)
  107.        {speed=speed+20;}
  108.         else
  109.                 {speed=max;}         //限制最慢转速
  110.         while(speedsub==0);
  111.     EA=1;            //恢复中断
  112. }

  113. void main()
  114. {
  115. int i;                                   //初始化
  116. dir=1;
  117. le1=0;
  118. le2=0;


  119. start:
  120. if(swich==0)
  121.      {Init_INT0();}                  //总开关开启,初始化中断,开始转动
  122.    else
  123.          {display(); goto start;        }


  124.         if(dir==1)
  125.   seq:
  126.         {
  127.           while(1)
  128.           {         
  129.              display();
  130.                  for (i=0; i<8; i++)   
  131.                 {
  132.                   P1 = uca_MotorStep[i];         //取数据
  133.                   delay(speed);            //调节转速
  134.                 }
  135.                  if(dir==0)                                                         //是否换向
  136.                     {
  137.                         delay(5);                                                 //        换向延时
  138.                         goto oppo;                                                 //换向
  139.                         }
  140.                 if(swich==1)                                                 //总开关运行中关闭
  141.                    goto start;                                                 //等待开启
  142.          
  143.           }
  144.          
  145.         }
  146.         else
  147.         oppo:
  148. ……………………

  149. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
abc.zip (116.04 KB, 下载次数: 210)



作者: chaoself    时间: 2018-1-27 10:11
谢谢分享
作者: bV_Vd    时间: 2018-1-30 14:06
感谢分享

作者: 烟花丝雨    时间: 2018-1-30 14:50

感谢分享
作者: lsc_nj    时间: 2018-1-31 08:26
感谢分享
作者: 906267461    时间: 2018-4-27 10:16
谢谢分享
作者: qq131855    时间: 2018-12-25 15:30
感谢分享
作者: zhtech    时间: 2018-12-26 19:11
来干货了
作者: 寒香折    时间: 2018-12-27 12:13
谢谢分享
作者: chuan.yang    时间: 2019-5-13 21:58
学习学习谢谢
作者: 榆林上校    时间: 2019-5-25 14:32
正需要,谢谢
作者: 飞天123    时间: 2019-5-31 11:32
不错,................
作者: OS0204    时间: 2019-7-11 01:33
原理图.doc (56.5 KB, 下载次数: 12)
作者: 铁血龙鹏    时间: 2019-7-12 08:42
感谢分享
作者: 上流男子涛少    时间: 2019-7-12 10:14
感谢分享,下载来学习下
作者: DUCSJSCS    时间: 2019-11-18 17:50
感谢分享,要是有四相的就好了,其实也差多,哈哈,反正谢谢了。
作者: qiuyuleil    时间: 2019-11-18 21:18
谢谢分享!
作者: 1435哈哈哈    时间: 2019-11-22 10:20
感谢楼主

作者: 18813907253    时间: 2020-5-5 06:14
chaoself 发表于 2018-1-27 10:11
谢谢分享

这是三相的?看着好像两相四线的
作者: shi582747518    时间: 2021-5-14 11:23
不明白电机的六根线代表什么意思啊?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1