标题: STC89C52RC单片机控制步进电机仿真与程序源码及实物图 [打印本页]

作者: chenzibao    时间: 2018-5-9 13:59
标题: STC89C52RC单片机控制步进电机仿真与程序源码及实物图
本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,
  供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,
控制步进电机启动/停止,正反转,加减速,并有运行,及转换状态显示。
是初学者的好例程。


实物图:


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


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




单片机源程序如下:

  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, 下载次数: 301)
此附件由于多人回帖说代码有错误,已经被管理员删除,无法下载,请论坛搜索"步进电机" 或移步http://www.51hei.com/bbs/dpj-146064-1.html



作者: zzzzy    时间: 2018-5-30 18:57
不好使
作者: SHERLOCK永恒    时间: 2019-3-3 10:24
代码有错误
作者: cjn1411714511    时间: 2019-3-11 21:09
不错,运行成功了,就是发热量太大了,运行2分钟就烫手
作者: 一扥的家    时间: 2019-3-13 15:24
谢谢大神的指导!!!
作者: dayiu    时间: 2019-3-25 19:30
感谢楼主啊的
作者: 敌对的    时间: 2019-4-27 20:36
谢谢楼主分享,很有用。
作者: kljie1000    时间: 2019-5-7 19:03
感谢分享,正好能用到。

作者: juncai8131    时间: 2019-5-10 09:48
感谢分享
作者: 1151302223    时间: 2019-5-13 10:44
cjn1411714511 发表于 2019-3-11 21:09
不错,运行成功了,就是发热量太大了,运行2分钟就烫手

为什么我不能运行

作者: 单片机小白树    时间: 2019-5-14 13:32
感谢楼主、
作者: ZZK1019625222    时间: 2019-5-29 13:26
这个电路图怎么还没连上啊
作者: ZZK1019625222    时间: 2019-5-29 13:35
敌对的 发表于 2019-4-27 20:36
谢谢楼主分享,很有用。

在吗,你是怎么运行成功的,还需要连线吗
作者: thomas3218    时间: 2019-12-4 22:47
谢谢楼主分享,需要提醒各位朋友。楼主的仿真那块,把按键引脚和(A+ A- B+ B-)画反了,看代码就知道怎么调换了。
作者: 哇哈哈哈    时间: 2019-12-5 10:48
感谢分享
作者: Derickzxc    时间: 2019-12-17 14:55
大佬厉害了。
作者: 清风慕雨    时间: 2019-12-17 16:20
程序  写的很烂  直接对引脚操作  变量声明很不规范
作者: 王试试33    时间: 2019-12-23 16:02
不错,运行成功了,就是发热量太大了,运行2分钟就烫手
作者: 476752885    时间: 2020-1-2 12:14
王试试33 发表于 2019-12-23 16:02
不错,运行成功了,就是发热量太大了,运行2分钟就烫手

你好,请问是怎么成功的啊
作者: 15773896335    时间: 2020-3-15 22:12
楼主厉害嘛,分享出来的东西既改电路还改程序。
作者: zy寻找    时间: 2020-5-12 16:40
乱七八糟的,跟程序对应的电路图也不说下,IO口就对不上哪个是哪个,都不知道运行出来的人是怎么运行的?




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