找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的步进电机正反转调速系统控制 仿真+源程序+详细教程

  [复制链接]
跳转到指定楼层
楼主
超级规范,详细的注释代码,可以参考学习一下

步进电机正反转调速系统控制设计课题实际开发采用的软件名称和版本如下
(如果出现程序打开异常或文件打开不太对,请先检查软件版本)
Keil uVision5keilc51-v9.54),Proteus 8.3 SP1Altium Designer 14LabVIEW2014office2013VSPDstc-isp-15xx-v6.85I.exe
1、单片机是通用的无论51还是52、无论STC还是AT都一样,引脚功能都一样。程序也是一样的。
2、原理图,请用Altium Designer 14软件打开,我已帮您转换成word格式和pdf格式的了。
3、本店提供的USB转串口线芯片是PL2303HX(部分带上位机宝贝提供),请在电脑上安装驱动PL2303_Prolific_DriverInstaller_v1_12_0,方可正常使用
下载链接:http://www.51hei.com/bbs/dpj-56767-1.html   或者百度也可以有很多地址下载
4、可以按照正面布局,尽量不要按照实物的背面焊接,很容易看错,建议参考本店提供的实物图片布局参考,都是优化之后的布局,省时省力。要按照原理图焊接,不要按照仿真图焊接,因为仿真只是模拟一个现象。
5、焊接之前一定要提前阅读 制作实物详解(含焊接) 文件夹里的焊接技巧和器件说明,可大大提高焊接的成功率。

8、关于本套设计使用说明请看视频:

步进电机正反转调速系统的仿真原理图:



步进电机正反转调速系统源程序:
  1. //-----------------------------------------------------------------
  2. //  名称:步进电机(28BYJ-48)程序
  3. //-----------------------------------------------------------------

  4. //---1~9档的转速------------------------------------------------
  5. //DEE4        定时时间        8.476ms        ,                转速        1.73r/min
  6. //E1EC        定时时间        7.7ms        ,                        转速        1.90r/min
  7. //E5D4        定时时间        6.7ms,                        转速        2.19r/min
  8. //E9BC        定时时间        5.7ms,                        转速        2.57r/min
  9. //EDA4        定时时间        4.7ms,                        转速        3.12r/min
  10. //F18C        定时时间        3.7ms,                        转速        3.96r/min
  11. //F574        定时时间        2.7ms,                        转速        5.43r/min
  12. //F95C        定时时间        1.7ms,                        转速        8.62r/min
  13. //FC18        定时时间        1ms         ,                        转速        14.65r/min
  14. //-----------------------------------------------------------------
  15. //转一圈需要节拍数:360/(5.625/64) = 4096 个节拍
  16. //转速r/min = (60*1000) / (4096 * 定时时间)
  17. //-----------------------------------------------------------------

  18. #include "Key.h"

  19. //0~9 的共阳数码管段码,最后一个是黑屏
  20. const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

  21. //输出励磁序列的频率参数{TH1,TL1}
  22. const uchar Timer[9][2]={{0xDE,0xE4},{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC},  //8.476 ~ 1ms
  23.                                                             {0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};

  24. //步进电机正转的励磁序列
  25. const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX

  26. //步进电机反转的励磁序列
  27. const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX

  28. //枚举变量--正反转标志
  29. typedef enum
  30.         {FwdRun, RevRun} RunFlag;                                                               
  31. RunFlag flag1 = FwdRun;

  32. uchar speed = 0;

  33. //函数声明
  34. void T0_Init();                                        //定时器0初始化函数声明
  35. void T1_Init();                                        //定时器1初始化函数声明
  36. void KeyService();                        //按键服务函数声明
  37. void delay_ms(uint t);        //毫秒延时函数声明
  38.         
  39. //-----------------------------------------------------------------
  40. // 主程序
  41. //-----------------------------------------------------------------
  42. void main()
  43. {        
  44.         T0_Init();                                        //定时器0初始化
  45.         T1_Init();                                        //定时器1初始化
  46.         FWD_LED = 0;                                //正转指示灯亮,默认初始化是正转
  47.         
  48.         delay_ms(500);                        //延时500ms,待各个模块上电稳定
  49.         EA = 1;                                                        //开启中断
  50.         while(1)
  51.         {        
  52.                 KeyService();                //按键服务程序
  53.         }
  54. }        

  55. //-----------------------------------------------------------------
  56. // Timer0 初始化,模式1,允许中断,1ms定时
  57. // Timer0 用于按键扫描
  58. //-----------------------------------------------------------------
  59. void T0_Init()
  60. {
  61.         TMOD &= 0xF0;
  62.         TMOD |= 0x01;                                                                                //T0工作于模式1,16位定时器
  63.         TH0 = (65536 - 1000) >> 8;                        //1ms定时
  64.         TL0 = (65536 - 1000) & 0xFF;
  65.         ET0 = 1;                                                                                                //允许T0中断
  66.         TR0 = 1;                                                                                                //启动T0
  67. }

  68. //-----------------------------------------------------------------
  69. // Timer1 初始化,模式1,允许中断
  70. // Timer1 用于改变步进电机转速
  71. //-----------------------------------------------------------------
  72. void T1_Init()
  73. {
  74.         TMOD &= 0x0F;
  75.         TMOD |= 0x10;                                                        //定时器1工作于模式1,16位定时器
  76.         TH1 = Timer[speed][0];
  77.         TL1 = Timer[speed][1];                //定时器1,定时用于步进电机转速控制
  78.         ET1 = 1;                                                                        //允许T1中断
  79.         PT1 = 1;                                                                        //定时器1优先级高
  80.         TR1 = 0;                                                                        //关闭定时器1
  81. }

  82. //-----------------------------------------------------------------
  83. // Timer0 中断服务程序
  84. //-----------------------------------------------------------------
  85. void InterruptTime0() interrupt 1
  86. {
  87.         TH0 = (65536 - 1000) >> 8;                //1ms
  88.         TL0 = (65536 - 1000) & 0xFF;
  89.         KeyScan();                                                                                //按键扫描
  90. }


  91. //-----------------------------------------------------------------
  92. // Timer1 中断服务程序
  93. //-----------------------------------------------------------------
  94. void InterruptTime1() interrupt 3
  95. {
  96.         static step1 = 0;                                                        
  97.         static step2 = 0;
  98.         TH1 = Timer[speed - 1][0];                        //根据不同的转速档位,给定时器1赋定时器值
  99.         TL1 = Timer[speed - 1][1];                        
  100.         
  101.         //按照定时器1的频率循环发送正转励磁序列的脉冲给步进电机,使其不停地转动
  102.         if(flag1 == FwdRun)//正转
  103.         {
  104.                 MotorDriver = FFW[step1++];               
  105.                 if(step1 == 8) step1 = 0;
  106.         }
  107.         
  108.          //按照定时器1的频率循环发送反转励磁序列的脉冲给步进电机,使其不停地转动
  109.         else if(flag1 == RevRun)      
  110.         {
  111.                 MotorDriver = REV[step2++];
  112.                 if(step2 == 8) step2 = 0;
  113.         }
  114. }

  115. //-----------------------------------------------------------------
  116. // 按键服务程序
  117. //-----------------------------------------------------------------
  118. void KeyService()
  119. {
  120.         switch (KeyCode)
  121.         {
  122.                 case 1:        flag1 = FwdRun;                                                                                //正转
  123.                                                 FWD_LED = 0;        REV_LED = 1;                                //正转指示灯亮
  124.                                                 KeyCode = 0;
  125.                                                 break;                                                        
  126.                 case 2:        flag1 = RevRun;                                                                                //反转
  127.                                                 FWD_LED = 1;        REV_LED = 0;                                //反转指示灯亮
  128.                                                 KeyCode = 0;
  129.                                                 break;
  130.                 case 3:        speed++;                                                                                                        //速度加
  131.                                                 if(speed == 10) speed = 1;                                
  132.                                                 SpeedShow = SEG_CODE[speed];
  133.                                                 if(TR1 == 0) TR1 = 1;
  134.                                                 KeyCode = 0;
  135.                                                 break;
  136.                 case 4:        speed--;                                                                                                        //速度减
  137.                                                 if(speed == 0 || speed == -1 ) speed = 9;
  138.                                                 SpeedShow = SEG_CODE[speed];        
  139.                                                 if(TR1 == 0) TR1 = 1;        
  140.                                                 KeyCode = 0;
  141.                                                 break;
  142.                 case 5:        TR1 = 0;                                                                                                        //停止
  143.                                                 SpeedShow = 0xFF;
  144.                                                 MotorDriver = 0x00;
  145.                                                 KeyCode = 0;
  146.                                                 break;        
  147.                 default: ;
  148.         }
  149. }

  150. //-----------------------------------------------------------------
  151. //函数名称:        void delay_ms(uint t)
  152. //函数功能:                延时ms程序(粗略)
  153. //调用子函数: 无
  154. //输入参数:         t
  155. //返回值:                        无
  156. //-----------------------------------------------------------------
  157. void delay_ms(uint t)
  158. {
  159.         uchar i; while(t--) for(i = 0; i < 125; i++);
  160. }
复制代码

  1. //-----------------------------------------------------------------
  2. //  名称:按键处理程序(独立键盘)
  3. //-----------------------------------------------------------------
  4. #include "Key.h"

  5. uchar KeyCode = 0;                                                //按键编码值

  6. //共5个独立机械按键,通过短按实现5种按键编码值
  7. uint KeyTimeCnt[5] = {0,0,0,0,0};                //按键去抖动延时计数器,分别对应KEY1/2/3/4/5
  8. uchar KeyLock[5] = {0,0,0,0,0};                        //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5

  9. //-----------------------------------------------------------------
  10. //函数名称:        void KeyScan()
  11. //函数功能:                按键扫描程序,放在定时中断里,可较快实现按键响应
  12. //调用子函数:        无
  13. //输入参数:         无
  14. //返回值:                        无,说明:返回的按键编码值保存在KeyCode变量里
  15. //-----------------------------------------------------------------
  16. void KeyScan()
  17. {
  18. //------KEY1实现-------------------------------------------------
  19.         if(KEY1 == 1)                                                        //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  20.         {        KeyLock[0] = 0;                                        //按键自锁变量标志清零
  21.                 KeyTimeCnt[0] = 0;                  //按键去抖动延时计数器清零
  22.         }
  23.         else if(KeyLock[0] == 0)
  24.         {
  25.                  KeyTimeCnt[0]++;
  26.                  if(KeyTimeCnt[0] > KEY_TIME_SHORT)  
  27.                  {
  28.                                 KeyTimeCnt[0] = 0;
  29.                                 KeyLock[0] = 1;                  //自锁按键置位,避免一直触发
  30.                                 KeyCode = 1;
  31.                  }
  32.         }
  33.         
  34. //------KEY2实现-----------------------------------
  35.         if(KEY2 == 1)
  36.         {        KeyLock[1] = 0;
  37.                 KeyTimeCnt[1] = 0;
  38.         }
  39.         else if(KeyLock[1] == 0)
  40.         {
  41.                  KeyTimeCnt[1]++;
  42.                  if(KeyTimeCnt[1] > KEY_TIME_SHORT)         //消抖
  43.                  {        
  44.                                 KeyTimeCnt[1] = 0;                                                                 //按键去抖动延时计数器清零
  45.                                 KeyLock[1] = 1;                                                                          //自锁按键置位,避免一直触发
  46.                                 KeyCode = 2;                                                                    
  47.                  }
  48.         }

  49. //------KEY3实现-----------------------------------
  50.         if(KEY3 == 1)
  51.         {        KeyLock[2] = 0;
  52.                 KeyTimeCnt[2] = 0;               
  53.         }
  54.         else if(KeyLock[2] == 0)
  55.         {
  56.                  KeyTimeCnt[2]++;
  57.                  if(KeyTimeCnt[2] > KEY_TIME_SHORT)
  58.                  {        
  59.                                 KeyTimeCnt[2] = 0;
  60.                                 KeyLock[2] = 1;  
  61.                                 KeyCode = 3;                                                                    
  62.                  }
  63.         }

  64. //------KEY4实现-----------------------------------
  65.         if(KEY4 == 1)
  66.         {        KeyLock[3] = 0;
  67.                 KeyTimeCnt[3] = 0;               
  68.         }
  69.         else if(KeyLock[3] == 0)
  70.         {
  71.                  KeyTimeCnt[3]++;
  72.                  if(KeyTimeCnt[3] > KEY_TIME_SHORT)
  73.                  {        
  74.                                 KeyTimeCnt[3] = 0;
  75.                                 KeyLock[3] = 1;  
  76.                                 KeyCode = 4;                                                                    
  77.                  }
  78.         }
  79.         
  80. //------KEY5实现-----------------------------------
  81.         if(KEY5 == 1)
  82.         {        KeyLock[4] = 0;
  83.                 KeyTimeCnt[4] = 0;               
  84.         }
  85.         else if(KeyLock[4] == 0)
  86.         {
  87.                  KeyTimeCnt[4]++;
  88.                  if(KeyTimeCnt[4] > KEY_TIME_SHORT)
  89.                  {        
  90.                                 KeyTimeCnt[4] = 0;
  91.                                 KeyLock[4] = 1;  
  92.                                 KeyCode = 5;                                                                    
  93.                  }
  94.         }
  95. }
复制代码
程序有些问题 无法转动
步进电机正反转调速系统设计.7z (3.73 MB, 下载次数: 242)

评分

参与人数 1黑币 +5 收起 理由
GUOXUAN + 5 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:159872 发表于 2017-1-4 14:53 | 只看该作者
大神!
回复

使用道具 举报

板凳
ID:159872 发表于 2017-1-4 14:54 | 只看该作者
收下了
回复

使用道具 举报

地板
ID:204503 发表于 2017-6-7 21:01 | 只看该作者
在找这方面的东西   很有帮助
回复

使用道具 举报

5#
ID:238776 发表于 2017-10-12 09:54 | 只看该作者
想问 接电路板的时候有什么注意的地方
回复

使用道具 举报

6#
ID:249545 发表于 2018-4-19 09:38 | 只看该作者
感谢老师贡献资料
回复

使用道具 举报

7#
ID:434106 发表于 2018-11-29 12:35 | 只看该作者
正好近期做类似的设计 借鉴一下
回复

使用道具 举报

8#
ID:560055 发表于 2019-6-11 16:24 | 只看该作者
收下了
回复

使用道具 举报

9#
ID:570601 发表于 2019-6-24 11:04 | 只看该作者
谢谢,很有用
回复

使用道具 举报

10#
ID:768329 发表于 2020-6-3 12:39 | 只看该作者
你的Key.h没放上
回复

使用道具 举报

11#
ID:1003452 发表于 2022-12-30 10:28 | 只看该作者
仿真用不了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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