找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 42765|回复: 57
收起左侧

42步进电机控制单片机程序和原理图

  [复制链接]
ID:143400 发表于 2016-10-21 17:04 | 显示全部楼层 |阅读模式
下面是仿真图:

XHU(HM~O1K0PE0%K6MG2X3J.png M8]W2B5VQ8JE1({Z3{3K`CD.png KCTJ3Y9RT~G%RE0}6S19.png `KD}JT)M(50C}J]M84J5(B1.png

  1. /****************************************Copyright (c)**************************************************                           
  2. **                                    
  3. ** -----------------------------------------------------------------------------------------------------
  4. ** File Name    :
  5. ** Version      : V1.0.0
  6. ** Description  :                                 
  7. * 【外部晶振】: 11.0592mhz        
  8. * 【主控芯片】: STC89C52
  9. * 【编译环境】: Keil μVisio4        
  10. * 【程序功能】:                                                                                                   
  11. * 【使用说明】:
  12. ** -----------------------------------------------------------------------------------------------------
  13. ** Author       : Creavalia
  14. ** Date         : 2016年10月19日
  15. ** -----------------------------------------------------------------------------------------------------
  16. ** Modify Person:
  17. ** Modify Date  :
  18. ** Description  :
  19. *********************************************************************************************************/
  20. // Includes --------------------------------------------------------------------------------------------
  21. #include<reg51.h>
  22. /********************************************************************************************************
  23. **                         Marcos define
  24. *********************************************************************************************************/
  25. #define MotorTabNum 5
  26. unsigned char T0_NUM;
  27. //IO设置
  28. sbit K1 = P3^5;        // 启动
  29. sbit K2 = P3^4;        // 反向
  30. sbit K3 = P3^3;        // 加速
  31. sbit K4 = P3^2;        // 减速

  32. sbit FX      = P2^4;     // 方向
  33. sbit MotorEn = P2^5;     // 使能
  34. sbit CLK     = P2^6;     // 脉冲

  35. //----数码管---------------
  36. sbit SMG1 = P2^0;                                        //数码管第一位定义
  37. sbit SMG2 = P2^1;                                        //数码管第二位定义
  38. sbit SMG3 = P2^2;                                        //数码管第三位定义
  39. sbit SMG4 = P2^3;                                        //数码管第四位定义

  40. int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           //共阴极数码管段值
  41. //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,};           //共阳极数码管段值


  42. unsigned char g_MotorSt = 0;     // 启停
  43. unsigned char g_MotorDir = 0;    // 正反

  44. //unsigned char MotorTab[6] = {200, 160, 120, 80, 40, 20};
  45. unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
  46. //unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};

  47. signed char g_MotorNum = 0;

  48. //--------------
  49. void delayms(xms);
  50. void mDelay(unsigned int DelayTime);                //延时函数
  51. void T0_Init();

  52. void KeyScan(void);
  53. void Display(void);


  54. // 主程序  main()
  55. void main(void)
  56. {
  57.         unsigned char i;
  58.         T0_Init();             // 定时器0 初始化
  59.         MotorEn = 0;     // L297 使能(只有智能,才能正常工作,否则停止)
  60.         FX = 0;
  61.         while(1)
  62.         {
  63.                 KeyScan();              // 按键
  64.                 for(i=0; i<10; i++)
  65.                 Display();
  66.         }

  67. }

  68. /********定时器初始化***********************************************************/
  69. void T0_Init()
  70. {
  71.         TMOD = 0x01;
  72.         TH0 = (65535-100)/256;  // 1ms
  73.         TL0 = (65535-100)%256;
  74.         EA = 1;
  75.         ET0 = 1;
  76. //        TR0 = 1;

  77. }

  78. /********定时器中断*****************/
  79. void T0_time() interrupt 1
  80. {
  81. //        TR0 = 0;
  82.         TH0 = (65535-100)/256;   
  83.         TL0 = (65535-100)%256;
  84.         T0_NUM++;
  85.         if(T0_NUM >= MotorTab[g_MotorNum])        // 增加按键g_MotorNum++   减小按键g_MotorNum--
  86.         {
  87.                 T0_NUM = 0;
  88.                 CLK=CLK^0x01;               //   输出脉冲
  89.         }
  90. //        TR0 = 1;
  91. }         


  92. //-----按键控制---------------------
  93. void KeyScan(void)
  94. {
  95.         if(K1 == 0)
  96.         {
  97.                 delayms(5);   // 软件延时消抖
  98.                 if(K1 == 0)
  99.                 {
  100.                         while(!K1){Display();};
  101.                         g_MotorSt = g_MotorSt ^ 0x01;
  102.                         MotorEn ^= 1;
  103.                         TR0 = 1;
  104.                 }
  105.         }

  106.         if(K2 == 0)
  107.         {
  108.                 delayms(10);   // 软件延时消抖
  109.                 if(K2 == 0)
  110.                 {
  111.                 //        while(!K2){Display();};        
  112.                         g_MotorDir = g_MotorDir ^ 0x01;
  113.                         FX ^= 1;
  114.                         while(!K2){Display();};        
  115.                 }
  116.         }

  117.         if(K3 == 0)  // 加速
  118.         {
  119.                 delayms(5);   // 软件延时消抖
  120.                 if(K3 == 0)
  121.                 {
  122.                         while(!K3){Display();};        
  123.                         g_MotorNum++;
  124.                         if(g_MotorNum > MotorTabNum)
  125.                                 g_MotorNum = MotorTabNum;
  126.                 }
  127.         }

  128.         if(K4 == 0)  // 减速
  129.         {
  130.                 delayms(5);   // 软件延时消抖
  131.                 if(K4 == 0)
  132.                 {
  133.                         while(!K4){Display();};        
  134.                         g_MotorNum--;
  135.                         if(g_MotorNum < 0)
  136.                                 g_MotorNum = 0;
  137.                 }
  138.         }


  139. }


  140. /******************************************************************************
  141. * 名称: Set_Display()
  142. * 功能: 数码管显示函数
  143. * 输入: 无
  144. * 输出: 无
  145. * 说明:
  146. ******************************************************************************/
  147. void Display(void)
  148. {
  149.         unsigned char b1, b2;
  150.         b1=g_MotorNum/10;               
  151.     b2=g_MotorNum%10;
  152.         if(FX == 0)
  153.                 P0=0x71;//显示F
  154.     else
  155.                 P0=0x79;
  156.         SMG1=0;                                                         
  157.     delayms(3);
  158.     SMG1=1;

  159.         P0=0x40;
  160.     SMG2=0;                                                         //显示--
  161.     delayms(3);
  162.     SMG2=1;

  163.         P0=table[b1];
  164.         SMG3=0;                                                         //显示十位
  165.         delayms(3);
  166.         SMG3=1;

  167.         P0=table[b2];
  168.     SMG4=0;
  169.     delayms(3);                                                 //显示个位
  170.     SMG4=1;
  171. }



  172. /********************************延时函数***********************************************************/
  173. void delayms(xms)
  174. {
  175.          unsigned int x,y;
  176.          for(x=xms;x>0;x--)
  177.                  for(y=110;y>0;y--);
  178. }
  179. /*********************************************************************************************************
  180. **                            End Of File
  181. ********************************************************************************************************/


复制代码



1、步进电机控制系统的主程序在对整个系统初始化后主要完成读键盘和处理键盘的功能,如图3-1所示:
图3-1 步进电机控制系统主程序流程图
系统上电复位后,先调用初始化子程序,对步进电机各端口,相关参数进行初始化,设置T0、T1工作方式控制字和时间常数。初始化完成后,步进电机处于停止状态,T0、T1定时器处于关闭状态。然后循环调用读键盘子程序和键盘处理子程序,等待中断,以便实现步进电机转动控制和转速的动态显示。

2、读键盘子程序流程图
读键盘子程序流程图如图3-2所示:
图3-2读键盘子程序流程图
首先初始化实际键值参数为0FH,然后扫描P3口,与初始值比较,相等则说明没有键按下,不相等则软件消抖,以便确认是否真的有键按下。延时10ms后再次扫描P3口,第二次与初始值比较,若相等则表明前一次比较不相等是由抖动产生;如果相等则表明确实有键按下。此时保存键值到临时变量。接着第三次扫描键盘并与临时变量比较,若相等则循环,这是为了确保每一次按键只执行一次相应的处理程序。最后从临时变量取出键值送实际键值参数,为键盘处理子程序做准备。
3、 键盘处理子程序流程图
按键处理子程序流程图如图3-3所示:
图3-3键盘处理子程序流程图
键盘处理子程序开始时要从存放实际键值的参数中取出刚读取到的键值送到累加器A,依次判断累加器A的低四位。若检测到低电平,则说明与该位对应的按键按下,从而转到相应的处理子程序段,完成相应的操作,实现相应的功能后返回。若没有检测到高电平,则返回。
步进电机的启停控制通过启停定时器0来实现,因为定时器0控制着脉冲信号的输出,关闭定时器0也就阻止了脉冲信号的输出。
4、 电机控制中断程序流程图
定时器中断0服务程序流程图如图3-4所示:
图3-4定时器中断0服务程序流程图
定时器中断0服务程序的中断时间由当前的转速决定。进入中断程序后,首先要保护现场,再根据当前速度进行计算并查表得到T0定时时间常数,设置TH0和TL0的值。然后判断转动方向控制位的值,如果是0则控制脉冲信号循环左移并输出,如果是1则控制脉冲信号循环右移并输出。最后恢复现场,返回,等待下次中断。
通过用当前转速控制中断时间,控制了脉冲的输出频率,也就到达了控制步进电机转动速度的目的;通过检测方向控制位的电平,选择脉冲信号的循环左移或循环右移,控制了步进电机各引出端的接通顺序,也就到实现了步进电机转动方向的控制。
5、 数码显示中断程序流程图
定时中断1服务程序流程图如图3-5所示:
图3-5定时中断1服务程序流程图
数码显示中断程序的定时时间为1ms。进入中断程序后,首先要保护现场,然后关闭个位数码管,根据当前转速求出十位与个位的值。查表得到十位的字段码送P1口,控制十位上的数码管显示。然后延时1ms,接着关闭十位数码管,查表得到个位的字段码送P1口,控制个位上的数码管显示。最后重新设置定时时间,恢复现场并返回。

评分

参与人数 2黑币 +55 收起 理由
PinIthS + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:113385 发表于 2016-11-16 19:21 | 显示全部楼层
顶!d=====( ̄▽ ̄*)b
回复

使用道具 举报

ID:162850 发表于 2017-1-24 09:52 | 显示全部楼层
学习啊!!!!!!!
回复

使用道具 举报

ID:165363 发表于 2017-2-19 11:57 | 显示全部楼层
好资料,感谢分享
回复

使用道具 举报

ID:163070 发表于 2017-2-19 23:34 来自手机 | 显示全部楼层
谢谢提供
回复

使用道具 举报

ID:60965 发表于 2017-2-20 21:07 | 显示全部楼层
你这贴太好了。
回复

使用道具 举报

ID:165456 发表于 2017-2-21 01:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:166382 发表于 2017-2-24 13:26 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:166382 发表于 2017-2-24 13:26 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:166447 发表于 2017-2-26 17:51 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:167215 发表于 2017-3-28 12:11 | 显示全部楼层
51单片机学习板能用这程序控制直流电机吗?
回复

使用道具 举报

ID:195441 发表于 2017-5-5 08:30 | 显示全部楼层
好资料,感谢分享
回复

使用道具 举报

ID:206764 发表于 2017-6-1 16:48 | 显示全部楼层
下载下来看看,不知道怎么用,先摸索起来
回复

使用道具 举报

ID:61390 发表于 2017-6-2 12:20 | 显示全部楼层
谢谢分享!!!!
回复

使用道具 举报

ID:165117 发表于 2017-6-2 15:33 | 显示全部楼层
感谢楼主分享!   下载下来看看
回复

使用道具 举报

ID:110866 发表于 2017-7-12 19:25 | 显示全部楼层
光给个代码,放着仿真图,尴尬
回复

使用道具 举报

ID:169394 发表于 2017-7-23 11:04 | 显示全部楼层
楼主,这个程序是L297驱动程序吧 ?请问L298的有吗 ?
回复

使用道具 举报

ID:187532 发表于 2017-8-7 19:10 | 显示全部楼层
楼主有mirostep driver驱动的嘛
回复

使用道具 举报

ID:193324 发表于 2017-8-14 10:30 | 显示全部楼层
目前正好需要这个。 谢谢楼主分享!
回复

使用道具 举报

ID:67692 发表于 2017-8-20 22:13 | 显示全部楼层

 谢谢分享!!!!!!!
回复

使用道具 举报

ID:232168 发表于 2017-9-20 12:07 | 显示全部楼层
正好在做个东西,谢谢分享
回复

使用道具 举报

ID:234458 发表于 2017-9-20 18:30 来自手机 | 显示全部楼层
学习了 谢谢
回复

使用道具 举报

ID:228228 发表于 2017-9-26 22:53 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:217754 发表于 2017-10-7 10:30 来自手机 | 显示全部楼层
厉害,这个全面,按图接线试一下
回复

使用道具 举报

ID:241215 发表于 2017-10-20 11:11 | 显示全部楼层
找了很久 应该有用 学习中
回复

使用道具 举报

ID:252235 发表于 2017-11-24 14:56 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:252165 发表于 2017-11-27 16:16 | 显示全部楼层
很好的学习材料
回复

使用道具 举报

ID:282486 发表于 2018-2-22 18:12 | 显示全部楼层
只有源码,没有仿真
回复

使用道具 举报

ID:189772 发表于 2018-3-3 11:32 | 显示全部楼层
楼主,你用的两相还是三相的步进电机?三相步进电机好象价格挺高哦
回复

使用道具 举报

ID:288930 发表于 2018-3-7 22:04 | 显示全部楼层
很好,感谢分享
回复

使用道具 举报

ID:290884 发表于 2018-3-12 17:02 | 显示全部楼层
非常感谢分享,很有帮助!
回复

使用道具 举报

ID:294575 发表于 2018-3-20 16:18 | 显示全部楼层
厉害厉害,受教了
回复

使用道具 举报

ID:302501 发表于 2018-4-5 19:51 | 显示全部楼层
谢谢老铁的分享
回复

使用道具 举报

ID:281632 发表于 2018-4-21 16:33 | 显示全部楼层
谢谢提供,很有启发
回复

使用道具 举报

ID:144054 发表于 2018-4-27 16:17 | 显示全部楼层
没有PROTEUS仿真图啊
回复

使用道具 举报

ID:313702 发表于 2018-4-28 11:57 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:318653 发表于 2018-4-28 21:42 | 显示全部楼层
厉害了,这个实用,不错
回复

使用道具 举报

ID:319643 发表于 2018-5-11 00:13 来自手机 | 显示全部楼层
楼主,能把数码管改成lcd1602显示吗,有重赏
回复

使用道具 举报

ID:319643 发表于 2018-5-11 00:15 来自手机 | 显示全部楼层
把数码管换乘lcd1602显示的程序有吗?有重谢
回复

使用道具 举报

ID:300063 发表于 2018-5-14 21:29 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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