找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15574|回复: 20
收起左侧

STC89C52RC单片机控制步进电机仿真与程序源码及实物图

  [复制链接]
ID:319122 发表于 2018-5-9 13:59 | 显示全部楼层 |阅读模式
本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,
  供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,
控制步进电机启动/停止,正反转,加减速,并有运行,及转换状态显示。
是初学者的好例程。
0.png

实物图:
webwxgetmsgimg(13).jpg webwxgetmsgimg(14).jpg

大家好,我是智成电子DIY,我会不定时写一下简单实用的源码分享给大家,
当然是分享给初学单片机的,大神请自觉飘过。原创首发的当然会在我们的《51黑电子论坛》网址:http://www.51hei.com/bbs/ 偶尔也会发到我的新浪博客(附件里面有地址)


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

0.png 0.png


单片机源程序如下:

  1. /*本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,
  2.    供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,*/


  3. #include <STC89C5xRC.H>
  4. #define uchar unsigned char//数据宏定义
  5. #define uint unsigned int
  6. #define A P10 //
  7. #define _A P11 //步进电机脉冲接口
  8. #define B P12 //
  9. #define _B P13 //步进电机脉冲接口
  10. uchar su_du=0;       //转速
  11. bit fang_xiang=0;    //方向
  12. bit qi_dong=0;       //启动标志
  13. /********************************************************************/

  14. #include <intrins.h>//包含移位标准库函数头文件


  15. sbit DU = P2^6;//数码管段选
  16. sbit WE = P2^7;//数码管段选


  17. //共阴数码管段选表0-9
  18. uchar  code shu_ma[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
  19. /*********************************************************************/
  20. /*====================================
  21. 函数    : delay(uint z)
  22. 参数    :z 延时毫秒设定,取值范围0-65535
  23. 返回值    :无
  24. 描述    :12T/Fosc11.0592M毫秒级延时
  25. ====================================*/
  26. void delay(uint z)
  27. {
  28.     uint x,y;
  29.     for(x = z; x > 0; x--)
  30.         for(y = 114; y > 0 ; y--);         
  31. }

  32. /*====================================
  33. 函数    :display(uchar i)
  34. 参数    :i 显示数值,取值范围0-255
  35. 返回值    :无
  36. 描述    :三位共阴数码管动态显示
  37. ====================================*/
  38. void display(uchar i)                         //数据处理
  39. {
  40.     uchar bai, shi, ge;
  41. //    bai = i / 100; //236 / 100  = 2
  42. //    shi = i % 100 / 10;    //236 % 100 / 10 = 3
  43.     ge  = i;// % 10;//236 % 10 =6
  44.    
  45. /*  第一位数码管         
  46.     P0 = 0XFF;//清除断码
  47.     WE = 1;//打开位选锁存器
  48.     P0 = 0XFE; //1111 1110
  49.     WE = 0;//锁存位选数据
  50.    
  51.     DU = 1;//打开段选锁存器
  52.     P0 = shu_ma[bai];//
  53.     DU = 0;//锁存段选数据
  54.     delay(5);

  55.     //第二位数码管
  56.     P0 = 0XFF;//清除断码
  57.     WE = 1;//打开位选锁存器
  58.     P0 = 0XFD; //1111 1101
  59.     WE = 0;//锁存位选数据
  60.    
  61.     DU = 1;//打开段选锁存器
  62.     P0 = shu_ma[shi];//
  63.     DU = 0;//锁存段选数据
  64.     delay(5);*/

  65. /*********    第三位数码管 */
  66.     P0 = 0XFF;//清除断码
  67.     WE = 1;//打开位选锁存器
  68.     P0 = 0XFB; //1111 1011
  69.     WE = 0;//锁存位选数据
  70.    
  71.     DU = 1;//打开段选锁存器
  72.     P0 = shu_ma[ge];//
  73.     DU = 0;//锁存段选数据
  74.     delay(5);
  75. }
  76. void yanshi2(uint a)      //延时程序
  77. {
  78.     while(a--);
  79. }
  80. uchar an_jian()     //按键检测,P3.0,P3.1,P3.2,P3.3分别接4个按键
  81. {
  82.     if((P3&0x0f)!=0x0f)//判断 P3只要有一个按键按下,就延时返回按键值。
  83.     {
  84.         yanshi2(20000);
  85.         if((P3&0x0f)!=0x0f)
  86.         {
  87.             return P3&0x0f;
  88.         }
  89.     }
  90.     return P3&0x0f;
  91. }

  92. void yanshi()            //步进电机延时时间
  93. {
  94.     uint sd1=0;
  95.     sd1=8000+5753*(10-su_du);//    su_du值越大,周期越短,频率越高
  96.     while(sd1--)
  97.     {
  98.         if((P3&0x0f)!=0x0f)return;  //在延时里面判断有没有按键按下,有就直接返回主函数
  99.     }
  100. }
  101. void bu_jin()             //每调用一次步进电机向指定方向走一步
  102. {
  103.     static char j=1;     //把起始速度设置为1。
  104.     if(fang_xiang)         //判断方向位,为1则按正相序循环,
  105.     {
  106.         j++;
  107.         if(j==5)j=1;
  108.     }
  109.     else
  110.     {
  111.         j--;
  112.         if(j==0)j=4;     //否则,按反相序循环
  113.     }
  114.     switch(j)             //根据拍数选择不同的电压组合
  115.     {
  116.         case 1:
  117.             A=1;B=1;_A=0;_B=0;yanshi(); //ab  1100
  118.         break;
  119.         case 2:
  120.             A=0;B=1;_A=1;_B=0;yanshi(); //a~b 0110
  121.         break;
  122.         case 3:
  123.             A=0;B=0;_A=1;_B=1;yanshi(); //a~b~0011
  124.         break;
  125.         case 4:
  126.             A=1;B=0;_A=0;_B=1;yanshi(); //ab~ 1001
  127.         break;
  128.     }
  129. }



  130.    

  131. void main()
  132. {
  133.     P14=0;//方向标志
  134.     P15=0;//启动 标志
  135.     while(1)
  136.     {
  137.         switch(an_jian())             //按键处理
  138.         {
  139.             case 0x0e:                   //第一个按键按下按键状态取反,启动/停止
  140.                 qi_dong=!qi_dong;
  141.                 P15=qi_dong;            //状态指示
  142.             break;
  143.             case 0x0d:                    //第二个按键按下,速度加
  144.                 if(su_du<9)
  145.                     su_du++;         //速度加
  146.             break;
  147.             case 0x0b:                   //第三个按键按下,速度减
  148.                 if(su_du>0)
  149.                     su_du--;         //速度减
  150.             break;
  151.             case 0x07:                     //第四个按键按下按键状态取反,方向转换
  152.                 fang_xiang=!fang_xiang;      
  153.                 P34=fang_xiang;            //方向指示灯
  154.             break;
  155.         }
  156.    
  157.         if(qi_dong)                         //启动按钮为1
  158.         {
  159.             bu_jin();                    //步进电机
  160.         }
  161.         else P1=0X0F;                    //停止状态,脉冲输出端口全部停止输出

  162.            display(su_du); //数码管显示函数
  163.     }
  164.    
  165. }
复制代码
下面插个小广告:
在这里会有精彩有趣的单片机DIY套件产品和优质原创的源码。
包括淘宝最低价的微型激光雕刻机支持脱机打印的,用51单片机打造(原创哦)。
6足4足蜘蛛仿生机器人,同样是用51单片机打造,控制18路舵机完成各个动作
还可以手机wifi控制,提供所有资料(单片机源码,APP源码,电路,PCB等)
还会有其他强大有趣的设计,如解魔法机器人,智能小车等。
您有好的想法也可以联系我,我们一起开发更多有用的产品!

此附件由于多人回帖说代码有错误,已经被管理员删除,无法下载
单片机控制步进电机.rar (361.69 KB, 下载次数: 299)

评分

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

查看全部评分

回复

使用道具 举报

ID:328476 发表于 2018-5-30 18:57 | 显示全部楼层
不好使
回复

使用道具 举报

ID:482513 发表于 2019-3-3 10:24 | 显示全部楼层
代码有错误
回复

使用道具 举报

ID:234344 发表于 2019-3-11 21:09 | 显示全部楼层
不错,运行成功了,就是发热量太大了,运行2分钟就烫手
回复

使用道具 举报

ID:490006 发表于 2019-3-13 15:24 | 显示全部楼层
谢谢大神的指导!!!
回复

使用道具 举报

ID:497548 发表于 2019-3-25 19:30 | 显示全部楼层
感谢楼主啊的
回复

使用道具 举报

ID:424386 发表于 2019-4-27 20:36 | 显示全部楼层
谢谢楼主分享,很有用。
回复

使用道具 举报

ID:16806 发表于 2019-5-7 19:03 | 显示全部楼层
感谢分享,正好能用到。
回复

使用道具 举报

ID:530732 发表于 2019-5-10 09:48 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:261318 发表于 2019-5-13 10:44 | 显示全部楼层
cjn1411714511 发表于 2019-3-11 21:09
不错,运行成功了,就是发热量太大了,运行2分钟就烫手

为什么我不能运行
回复

使用道具 举报

ID:525685 发表于 2019-5-14 13:32 | 显示全部楼层
感谢楼主、
回复

使用道具 举报

ID:549774 发表于 2019-5-29 13:26 | 显示全部楼层
这个电路图怎么还没连上啊
回复

使用道具 举报

ID:549774 发表于 2019-5-29 13:35 | 显示全部楼层
敌对的 发表于 2019-4-27 20:36
谢谢楼主分享,很有用。

在吗,你是怎么运行成功的,还需要连线吗
回复

使用道具 举报

ID:399229 发表于 2019-12-4 22:47 | 显示全部楼层
谢谢楼主分享,需要提醒各位朋友。楼主的仿真那块,把按键引脚和(A+ A- B+ B-)画反了,看代码就知道怎么调换了。
回复

使用道具 举报

ID:219115 发表于 2019-12-5 10:48 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:666279 发表于 2019-12-17 14:55 | 显示全部楼层
大佬厉害了。
回复

使用道具 举报

ID:396513 发表于 2019-12-17 16:20 | 显示全部楼层
程序  写的很烂  直接对引脚操作  变量声明很不规范
回复

使用道具 举报

ID:671439 发表于 2019-12-23 16:02 | 显示全部楼层
不错,运行成功了,就是发热量太大了,运行2分钟就烫手
回复

使用道具 举报

ID:679523 发表于 2020-1-2 12:14 来自手机 | 显示全部楼层
王试试33 发表于 2019-12-23 16:02
不错,运行成功了,就是发热量太大了,运行2分钟就烫手

你好,请问是怎么成功的啊
回复

使用道具 举报

ID:272776 发表于 2020-3-15 22:12 | 显示全部楼层
楼主厉害嘛,分享出来的东西既改电路还改程序。
回复

使用道具 举报

ID:750010 发表于 2020-5-12 16:40 | 显示全部楼层
乱七八糟的,跟程序对应的电路图也不说下,IO口就对不上哪个是哪个,都不知道运行出来的人是怎么运行的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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