找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10098|回复: 13
打印 上一主题 下一主题
收起左侧

51单片机控制步进电机的转动,加减速,停止,反转

  [复制链接]
跳转到指定楼层
#
ID:51773 发表于 2013-7-19 02:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
51单片机控制步进电机的转动,加减速,停止,反转,单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
  1. #include <reg52.h>
  2. sbit inc=P3^2;
  3. sbit dec=P3^3;
  4. sbit zhzhd=P3^6;
  5. sbit fazhd=P3^7;

  6. bit flag=1;
  7. unsigned char t=0x00; //表正反速度
  8. void delay(unsigned int t);
  9. void  motor_ffw();

  10. unsigned char code led7code[]=
  11. {0x81,0xe7,0x92,0xc2,0xe4,0xc8,0x88,0xe3,0x00,0xc0};
  12. unsigned int num=0;

  13. unsigned char code FFW[8]={0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x48};
  14. unsigned char code FFZ[8]={0x48,0x08,0x18,0x10,0x30,0x20,0x60,0x40};  //反转

  15. void main()
  16. {
  17.      
  18.     EA=1;
  19.     IT0=1;
  20.     EX0=1;
  21.     IT1=1;
  22.     EX1=1;

  23.     TMOD=0x06;
  24.     TL0=0xff;
  25.     TH0=0xff;
  26.     TR0=1;
  27.     ET0=1;

  28.     P3=0x3f;
  29.     P0=led7code[num%10];
  30.     while(1)
  31.     {
  32.      motor_ffw();
  33.     }

  34. }

  35. void  motor_ffw()  /* 步进电机驱动*/ //
  36. {
  37.    unsigned char i;
  38.    int j;
  39.         while(1)
  40.         {
  41.             
  42.             for(j=0;j<12;j++)     //12个周期转一圈
  43.            {    for (i=0; i<8; i++)       //一个周期转30度
  44.                  {  
  45.             if(flag==1)
  46.                 P2 = FFW[i];  //取数据
  47.              else
  48.                 P2 = FFZ[i];
  49.                delay(t);                   //t调节转速
  50.                 }
  51.             }
  52.         }
  53. }

  54. void int0(void) interrupt 0
  55. {
  56.     EX0=0;
  57.     delay(10);
  58.     if(inc==0)
  59.     {
  60.     num++;
  61.      
  62.     P0=led7code[num%10];
  63.     if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
  64.     else if (num%10==0){zhzhd=0;fazhd=0;}
  65.     else {zhzhd=1;fazhd=0;}
  66.      
  67.     switch(num%10)
  68.     {
  69.         case 0:t=0x00;break;
  70.         case 1:t=0x12;break;
  71.         case 2:t=0x11;break;
  72.         case 3:t=0x10;break;
  73.         case 4:t=0x09;break;
  74.         case 5:t=0x08;break;
  75.         case 6:t=0x07;break;
  76.         case 7:t=0x06;break;
  77.         case 8:t=0x05;break;
  78.         case 9:t=0x04;break;
  79.      
  80.     }
  81.      
  82.     }
  83.     while(!inc);
  84.     EX0=1;
  85. }

  86. void int1(void) interrupt 2
  87. {
  88.     EX1=0;
  89.     delay(10);
  90.     if(dec==0)
  91.     {
  92.     num--;
  93.     if(num==65535)num=65529;
  94.     P0=led7code[num%10];
  95.     if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
  96.     else if (num%10==0){zhzhd=0;fazhd=0;}
  97.     else {zhzhd=1;fazhd=0;}

  98.      
  99.     if(num==65535)num=65529;
  100.     switch(num%10)
  101.     {
  102.         case 0:t=0x00;break;
  103.         case 1:t=0x12;break;
  104.         case 2:t=0x11;break;
  105.         case 3:t=0x10;break;
  106.         case 4:t=0x09;break;
  107.         case 5:t=0x08;break;
  108.         case 6:t=0x07;break;
  109.         case 7:t=0x06;break;
  110.         case 8:t=0x05;break;
  111.         case 9:t=0x04;break;
  112.      
  113.     }
  114.     }
  115.     while(!dec);
  116.     EX1=1;
  117. }


  118. void huanx(void) interrupt 1
  119. {   
  120.     ET0=0;
  121.     TR0=0;
  122.     delay(10);
  123.     if(P3^4==0)
  124.     {
  125.     if(flag==1) {flag = 0;zhzhd=1;delay(500);fazhd=0;}
  126.     else  {flag = 1;fazhd=1;delay(500);zhzhd=0;}
  127.     }

  128.     while(!(P3^4));
  129.     ET0=1;
  130.     TR0=1;
  131. }


  132. //    延时程序
  133. void delay(unsigned int t)
  134. {                           
  135.    unsigned int k;
  136.    while(t--)
  137.    {
  138.      for(k=0; k<80; k++);
  139.       
  140.    }
  141. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

13#
ID:221601 发表于 2018-5-21 21:21 | 只看该作者
强   6666666666

回复

使用道具 举报

12#
ID:335245 发表于 2018-5-21 21:15 | 只看该作者
开发板的,不错,多谢楼主
回复

使用道具 举报

11#
ID:247495 发表于 2018-5-21 16:55 | 只看该作者
代码先复制去试试了
回复

使用道具 举报

10#
ID:320751 发表于 2018-5-20 21:41 | 只看该作者
初学者在此谢过
回复

使用道具 举报

9#
ID:327273 发表于 2018-5-11 00:28 来自触屏版 | 只看该作者
请问楼主,点触式限位开关怎样接在单片机上实现往复运动哦?
回复

使用道具 举报

8#
ID:143646 发表于 2016-10-20 20:41 | 只看该作者
请问上面的数组是什么意思呢
回复

使用道具 举报

7#
ID:90625 发表于 2015-9-20 16:39 | 只看该作者
漂亮    这就是我想要的
回复

使用道具 举报

6#
ID:68477 发表于 2015-4-12 14:24 | 只看该作者
学习了。谢谢。
回复

使用道具 举报

5#
ID:76408 发表于 2015-4-8 10:12 | 只看该作者
学习来了,正在学习呢
回复

使用道具 举报

地板
ID:74784 发表于 2015-3-31 14:44 | 只看该作者
星期天 发表于 2013-7-25 14:43
**** 作者被禁止或删除 内容自动屏蔽 ****

我也买了一个28BYJ-48电机
正在学习呢
能把你的代码发来看看吗?
谢谢
回复

使用道具 举报

板凳
ID:74784 发表于 2015-3-31 14:43 | 只看该作者
楼主有汇编的吗?
没学过c
看不懂呀
回复

使用道具 举报

沙发
ID:50788 发表于 2013-7-25 14:43 | 只看该作者
昨天用的28BYJ-48电机做了一个实验,四相八拍的,但转速特别慢,一分钟最多十圈的样子,问下楼主这款电机额定转速就是这么多么?
回复

使用道具 举报

楼主
ID:40961 发表于 2013-7-22 09:26 | 只看该作者
楼主用的是仿真还是开发板的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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