单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11|回复: 1
收起左侧

单片机+UDN2916 5相4线步进电机的单片机驱动程序 发送速度到串口

[复制链接]
辉辉辉辉 发表于 2019-11-10 15:35 | 显示全部楼层 |阅读模式
5相4线步进电机驱动程序,可以调速,正反转,发送速度到串口,用1602显示

单片机源程序如下:
  1. /*************************************************************************************
  2. *  标题:  步进电机试验一(双极性步进电机)                                                                                         *
  3. *                                                                                                                                                                          *
  4. *    通过本例程了解步进马达使用及驱动程序编写                                                                                 *
  5. *;   单相四拍通电驱动时序:                                                          *
  6. *;   正转: A/  B  A  B/
  7. *    反转: B/  A  B  A/                                                                                              *
  8. *   
  9. *    UDN2916电流控制真值表:
  10. *          I0    I1        输出电流
  11. *          L            L                  最大
  12. *          H                L                  最大*2/3
  13. *          L                H                  最大*1/3
  14. *     H     H         0                                                                     *
  15. *  请学员一定要消化掉本例程                     0x30,0x0e,0x39,0x07                              *
  16.    注意:J14短路冒需断开                                                                                    *
  17. **************************************************************************************/  
  18. #include "reg52.h"
  19. //Motor
  20. sbit key  = P0^0;          //定义管脚
  21. sbit key1 = P0^1;
  22. sbit key2 = P0^2;          //定义管脚
  23. sbit key3 = P0^3;
  24. sbit key4 = P0^4;          //定义管脚
  25. sbit key5 = P0^5;
  26. sbit key6 = P0^6;          //定义管脚
  27. sbit I01  = P1^0;
  28. sbit I02  = P1^1;
  29. sbit I03  = P1^2;
  30. sbit I04  = P1^3;

  31. int speed=20,zhuangtaiflag=0,gaodu=0,jiaodu=0,gd=0,jd=0;

  32. void delay(int time);
  33. void bujinzhengzhuan(int b)
  34. {
  35.         int i;
  36.         for(i=0;i<b;i++)
  37.         {
  38.                 I01=1;
  39.                 I02=0;
  40.                 I03=0;
  41.                 I04=0;
  42.                 delay(speed);
  43.                 I01=0;
  44.                 I02=1;
  45.                 I03=0;
  46.                 I04=0;
  47.                 delay(speed);
  48.                 I01=0;
  49.                 I02=0;
  50.                 I03=1;
  51.                 I04=0;
  52.                 delay(speed);
  53.                 I01=0;
  54.                 I02=0;
  55.                 I03=0;
  56.                 I04=1;
  57.                 delay(speed);
  58.         }
  59. }

  60. void bujinfanzhuan(int a)
  61. {
  62.         int i;
  63.         for(i=0;i<a;i++)
  64.         {
  65.                 I01=0;
  66.                 I02=0;
  67.                 I03=0;
  68.                 I04=1;
  69.                 delay(speed);
  70.                 I01=0;
  71.                 I02=0;
  72.                 I03=1;
  73.                 I04=0;
  74.                 delay(speed);
  75.                 I01=0;
  76.                 I02=1;
  77.                 I03=0;
  78.                 I04=0;
  79.                 delay(speed);
  80.                 I01=1;
  81.                 I02=0;
  82.                 I03=0;
  83.                 I04=0;
  84.                 delay(speed);
  85.         }
  86. }
  87. void bujinstop(void)
  88. {
  89.         I01=0;
  90.         I02=0;
  91.         I03=0;
  92.         I04=0;
  93. }
  94. /*------------------------------------------------
  95.                     串口初始化
  96. ------------------------------------------------*/
  97. void UsartConfiguration()
  98. {
  99.         SCON=0X50;                        //设置为工作方式1
  100.         TMOD=0X20;                        //设置计数器工作方式2
  101.         PCON=0X80;                        //波特率加倍
  102.         TH1=0XF3;                    //计数器初始值设置,注意波特率是4800的
  103.         TL1=0XF3;
  104. //        ES=1;                                                //打开接收中断
  105. //        EA=1;                                                //打开总中断
  106.         TR1=1;                                            //打开计数器
  107. }
  108. /*******************延时函数****************************/
  109. void delay(int time)
  110. {
  111.   int i,j;
  112.   
  113.   for(j=0; j <= time; j++)
  114.    for(i =0 ; i <= 120; i++);
  115. }

  116. void main()
  117. {
  118.   int flag;
  119.   UsartConfiguration();
  120.   while(1)
  121.   {
  122.     if(key==0)
  123.                 {
  124.                         delay(10);
  125.                         if(key==0)
  126.                         {
  127.                                 while(key==0);
  128.                                 flag++;
  129.                                 if(flag==3)flag=0;               
  130.                         }
  131.                 }
  132.                
  133.          if(key1==0)
  134.                 {
  135.                         delay(10);
  136.                         if(key1==0)
  137.                         {
  138.                                 while(key1==0);
  139.                                 speed++;
  140.                                 if(speed==50)speed=2;               
  141.                         }
  142.                 }
  143.                
  144.                 if(key2==0)
  145.                 {
  146.                         delay(10);
  147.                         if(key2==0)
  148.                         {
  149.                                 while(key2==0);
  150.                                 speed--;
  151.                                 if(speed<=2)speed=2;               
  152.                         }
  153.                 }
  154.                 if(key3==0)
  155.                 {
  156.                         delay(10);
  157.                         if(key3==0)
  158.                         {
  159.                                 while(key3==0);
  160.                                 zhuangtaiflag++;
  161.                                 if(zhuangtaiflag==0)jd=0;
  162.                                 if(zhuangtaiflag==1)gd=0;
  163.                                 if(zhuangtaiflag==2)zhuangtaiflag=0;
  164.                         }
  165.                 }
  166.                
  167.                 if(key4==0)
  168.                 {
  169.                         delay(10);
  170.                         if(key4==0)
  171.                         {
  172.                                 while(key4==0);
  173.                                 if(zhuangtaiflag==0)jiaodu++;
  174.                                 if(zhuangtaiflag==1)gaodu++;
  175.                         }
  176.                 }
  177.                
  178.                         if(key5==0)
  179.                 {
  180.                         delay(10);
  181.                         if(key5==0)
  182.                         {
  183.                                 while(key5==0);
  184.                                 if(zhuangtaiflag==0)jiaodu--;
  185.                                 if(zhuangtaiflag==1)gaodu--;
  186.                         }
  187.                 }
  188.                
  189.                 if(flag==0)bujinstop();
  190.                 if(flag==1)bujinzhengzhuan(1);
  191.           if(flag==2)bujinfanzhuan(1);
  192.                 if(gaodu-gd>0)
  193.                 {
  194.                         bujinzhengzhuan(100*(gaodu-gd));
  195.                         gd=gaodu;
  196.                 }
  197.                 if(gaodu-gd<0)
  198.                 {
  199.                         bujinfanzhuan(100*(gd-gaodu));
  200.                         gd=gaodu;
  201.                 }
  202.                 if(jiaodu-jd>0)
  203.                 {
  204.                         bujinzhengzhuan(jiaodu-jd);
  205.                         jd=jiaodu;
  206.                 }
  207.                 if(jiaodu-jd<0)
  208.                 {
  209.                         bujinfanzhuan(jd-jiaodu);
  210.                         jd=jiaodu;
  211.                 }
  212.     SBUF=speed;
  213.   }

  214. }
复制代码

所有资料51hei提供下载:
bujindianji.zip (32.26 KB, 下载次数: 0)
回复

使用道具 举报

admin 发表于 2019-11-10 16:52 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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