找回密码
 立即注册

QQ登录

只需一步,快速开始

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

利用单片机+ULN2001A对步进电机进行调速控制并显示

[复制链接]
跳转到指定楼层
楼主
设计包含PROTEUS仿真电路图和程序代码。设计能实现步进电机的启停控制,加减档调速并显示当前档位和速度。
  1. /***步进电机调速实验***/
  2. /***实验内容:通过程序能够实现电机的启停,正反转,加减速。同时显示电机当前档位和速度。***/

  3. #include<reg52.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. void Delay_ms(uint x);//延时函数
  7. void Key_pros(); //声明按键函数
  8. void MotorControl_fwd();//声明电机控制函数
  9. void MotorControl_bwd();
  10. void Dig_display();//4位数码管显示函数
  11. void Data_pros(uint temp);//速度处理显示

  12. uchar code  Motor_fwd[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //正转动数组
  13. uchar code  Motor_bwd[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反转动数组
  14. uchar code  segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴显示段码,用于共阳数码管取反。
  15. uchar V_pros[4];
  16. uchar count=5; //初始挡位5档
  17. uint loop=50,j; //初始速度50ms一步,通过改变loop调整调整脉冲频率达到调速的目的
  18. uchar flag=1;  //正反转标志位 1正0反
  19. uchar state=1; //启停标志位 1启动0关闭

  20. sbit Motor_Dcl=P1^2; //电机减速
  21. sbit Motor_Acl=P1^1; //电机加速
  22. sbit Motor_Bwd=P1^4; //电机反转
  23. sbit Motor_Fwd=P1^3; //电机正转
  24. sbit Motor_Control=P1^0; //电机启停
  25. sbit LSA=P2^0;
  26. sbit LSB=P2^1;
  27. sbit LSC=P2^2;

  28. void main()
  29. {
  30. while(1)
  31.   {
  32.                 uint speed;
  33.           Key_pros();  
  34.           while(state==1)
  35.                 {
  36.                  if(flag==1)
  37.                  {
  38.                          MotorControl_fwd();
  39.                          P2=~segcode[count];
  40.                          Key_pros();
  41.                  }
  42.                  if(flag==0)
  43.                  {
  44.                   MotorControl_bwd();
  45.                   Key_pros();
  46.                         P2=~segcode[count];
  47.                  }
  48.          switch(loop)
  49.           {
  50.            case 10:speed=1900;break;
  51.            case 20:speed=1800;break;
  52.            case 30:speed=1700;break;
  53.            case 40:speed=1600;break;
  54.            case 50:speed=1500;break;
  55.            case 60:speed=1400;break;
  56.            case 70:speed=1300;break;
  57.            case 80:speed=1200;break;
  58.            case 90:speed=1100;break;
  59.            default:break;
  60.           }
  61.                 Data_pros(speed);
  62.                 Dig_display();
  63.    }
  64.   }
  65. }
  66. /***
  67.     函数名: Delay()
  68.     函数功能:延时函数
  69.     输入:j
  70.     输出:无
  71. ***/
  72. void Delay_ms(uint x)
  73. {
  74.        
  75.         uint i,j;
  76.         for(i=0;i<x;i++)
  77.                 for(j=0;j<112;j++);
  78. }
  79. /*******************************************************************************
  80. * 函 数 名         : delay
  81. * 函数功能                   : 延时函数,i=1时,大约延时10us
  82. *******************************************************************************/
  83. void delay(uint i)
  84. {
  85.         while(i--);       
  86. }

  87. /***
  88.     函数名: MotorControl_fwd()
  89.     函数功能: 电机正转函数
  90.     输入:无
  91.     输出:无
  92. ***/

  93. void MotorControl_fwd()
  94. {
  95. uchar z;
  96. for(z=0;z<8;z++)
  97.         {
  98.          P3=Motor_fwd[z];
  99.          Delay_ms(loop);       
  100.         }
  101. }       

  102. /***
  103.     函数名: MotorControl_bwd()
  104.     函数功能: 电机反转函数
  105.     输入:无
  106.     输出:无
  107. ***/

  108. void MotorControl_bwd()
  109. {
  110. uchar z;
  111. for(z=0;z<8;z++)
  112.         {
  113.          P3=Motor_bwd[z];
  114.          Delay_ms(loop);
  115.         }
  116. }

  117. /***
  118.     函数名:void Key_pros()
  119.     函数功能: 电机反转函数
  120.     输入:
  121.     输出:
  122. ***/
  123. void Key_pros()
  124. {
  125.   P1=0xff;           
  126.         if(P1!=0xff)
  127.         Delay_ms(10);
  128.         if(P1!=0xff)
  129.         {
  130.                 switch(P1)        
  131.                 {
  132.                         case 0xfe:state=~state;break;
  133.                         case 0xfd:loop-=10;count++;break;
  134.                         case 0xfb:loop+=10;count--;break;
  135.                         case 0xf7:flag=1;break;
  136.                         case 0xef:flag=0;break;
  137.                 }
  138.                 if(loop<10)  //超速保护,最快10ms一步
  139.                 {
  140.                         count=9;loop=10;
  141.                 }
  142.                 else if(loop>90) //最低转速限制90ms一步
  143.                 {
  144.                         count=1;loop=90;
  145.                 }
  146.         }
  147.         while(P1!=0xff);        //等待按键释放

  148. }       

  149. /***
  150.     函数名:  VDisplay_pros();
  151.     函数功能: 速度处理显示
  152.     输入:speed
  153.     输出:无
  154. ***/

  155. void Data_pros(uint temp)
  156. {
  157.         V_pros[0]=segcode[temp/1000];
  158.         V_pros[1]=segcode[temp%1000/100];
  159.   V_pros[2]=segcode[temp%100/10];
  160.         V_pros[3]=segcode[temp%10];
  161. }

  162. /***
  163.     函数名:void Dig_display()
  164.     函数功能: 4位数码管显示函数
  165.     输入:无
  166.     输出:无
  167. ***/
  168. void Dig_display()
  169. {
  170.         uint i;
  171.         for(i=0;i<4;i++)
  172.         {
  173.                 switch(i)         //位选,选择点亮的数码管,
  174.                 {
  175.                         case(0):
  176.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  177.                         case(1):
  178.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  179.                         case(2):
  180.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  181.                         case(3):
  182.                                 LSA=0;LSB=1;LSC=1; break;//显示第3位
  183.                 }
  184.                 P0=~V_pros[i];//发送段码
  185.                 delay(100); //间隔一段时间扫描       
  186.                 P0=0x00;//消隐
  187.         }
  188. }
复制代码


捕获2.PNG (98.38 KB, 下载次数: 35)

捕获2.PNG

捕获1.PNG (106.26 KB, 下载次数: 27)

捕获1.PNG

stepmotor.rar

33.92 KB, 下载次数: 32, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:808695 发表于 2020-8-7 12:35 | 只看该作者
程序在配合仿真电路调试时需要局部调整,因为51的点数不够用了。
回复

使用道具 举报

板凳
ID:336378 发表于 2020-8-14 10:30 | 只看该作者
    高手,学习下,看高手过招,如进入迷宫。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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