找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4338|回复: 0
收起左侧

求大神看程序写一个单片机控制步进电机转动的流程图

[复制链接]
ID:303067 发表于 2018-5-10 17:20 | 显示全部楼层 |阅读模式
本程序是一个51单片机控制步进电机转动的程序,通过键盘设置转的圈数,电机能自动转设置的圈数,并且转的圈数和已经转过的圈数都能在液晶上显示出来。求大神帮忙写个程序流程图,先谢谢大佬们。以下是程序:

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"  //添加液晶头文件
  4. #include "key.h"  //添加1602头文件

  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
  8. uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

  9. unsigned char speed=2;   //档位
  10. unsigned char speed_1=30;//速度延迟
  11. unsigned char key_X=0;          //0 运行,1 设置

  12. unsigned char set=0;          //0 运行,1 设置

  13. /********************************************************/
  14. /*                                                  
  15. /* 延时t毫秒
  16. /* 11.0592MHz时钟,延时约1ms                                    
  17. /*                                                      
  18. /********************************************************/
  19. void delay(uint t)
  20. {                           
  21.    uint k;
  22.    while(t--)
  23.    {
  24.      for(k=0; k<125; k++)
  25.      { }
  26.    }
  27. }
  28. /********************************************************/
  29. /*
  30. /*步进电机正转
  31. /*
  32. /********************************************************/
  33. void  motor_ffw(uint n)
  34. {
  35.     uchar i;
  36.     uint  j;
  37.     for (j=0; j<n; j++)     //转1×n圈
  38.     {
  39.       for (i=0; i<8; i++)     //一个周期转30度
  40.         {
  41.           P1 = FFW[i];        //取数据
  42.           delay(30);          //调节转速
  43.         }
  44.     }
  45. }
  46. /********************************************************/
  47. /*
  48. /*步进电机反转
  49. /*
  50. /********************************************************/
  51. void  motor_rev(uint n)
  52. {
  53.     uchar i;
  54.         uint  j;
  55.         for (j=0; j<n; j++)      //转1×n圈
  56.       {
  57.         for (i=0; i<8; i++)    //一个周期转30度
  58.         {
  59.           P1 = REV[i];         //取数据
  60.           delay(30);           //调节转速
  61.         }
  62.       }
  63. }

  64. void disp()
  65. {
  66.         if(set==0)
  67.         {
  68.                 write_1602_c(0x87);
  69.                 write_1602_d(key_X/100+0x30);
  70.                 write_1602_d(key_X%100/10+0x30);
  71.                 write_1602_d('.');
  72.                 write_1602_d(key_X%10+0x30);

  73.                 write_1602_c(0xc8);
  74.                 write_1602_d(speed%10+0x30);
  75.         }

  76.         if(set==1)
  77.         {
  78.         }

  79. }

  80. unsigned char k=16;     //矩阵键盘值
  81. unsigned char k1=17;    //矩阵键盘值

  82. void main(){
  83.         unsigned char x1=0;         //光标位置
  84.         unsigned char quan=0;       //圈数
  85.         unsigned char xiaoshudian=0;//小数点

  86.         unsigned char x2=0;         //整数
  87.         unsigned char x3=0;         //小数

  88.         LCD_init();

  89.         write_1602_c(0x80);
  90.         write_1602_d('M');
  91.         write_1602_d('O');
  92.         write_1602_d('T');
  93.         write_1602_d('O');
  94.         write_1602_d('R');
  95.         write_1602_d(' ');
  96.         write_1602_d(' ');
  97.         write_1602_c(0x8C);
  98.         write_1602_d(' ');
  99.         write_1602_d('0');
  100.         write_1602_d('.');
  101.         write_1602_d('0');

  102.         write_1602_c(0xC0);
  103.         write_1602_d('S');
  104.         write_1602_d('P');
  105.         write_1602_d('E');
  106.         write_1602_d('E');
  107.         write_1602_d('D');

  108.         while(1)
  109.         {

  110.                 k=scan();                                        //矩阵键盘

  111.                 if(k!=k1)                                       
  112.                 {
  113.                         if(set==1)
  114.                         if(k<10)                                    //数字
  115.                         {
  116.                                 if(x1==0)
  117.                                         x2=k;
  118.                                 if(x1==2)
  119.                                         x3=k;

  120.                                 write_1602_c(0x8D+x1);
  121.                                 write_1602_d(k+'0');
  122.                                 x1=x1+2;
  123.                                 write_1602_c(0x8D+x1);
  124.                                 write_1602_c(0x0f);//让光标闪烁
  125.                         }

  126.                         if(k==14)                                    //开阀
  127.                         {
  128.                                 set=0;
  129.                                 write_1602_c(0x0C);     //让光标停
  130.                                 key_X=key_X+(x2*10+x3);
  131.                                 disp();
  132.                                motor_rev(x2*10+x3);    //电机转
  133.                         }

  134.                         if(k==15)                                    //关阀
  135.                         {
  136.                                 set=0;
  137.                                 write_1602_c(0x0C);     //让光标停
  138.                                 if(key_X>=(x2*10+x3))                                
  139.                                 {
  140.                                         key_X=key_X-(x2*10+x3);
  141.                                         disp();
  142.                                        motor_ffw(x2*10+x3);    //电机转
  143.                                 }
  144.                         }

  145.                         if(k==10)                                    //设置键
  146.                         {
  147.                                 if(set==0)
  148.                                 {
  149.                                         set=1;
  150.                                         x1=0;
  151.                                         write_1602_c(0x8C);
  152.                                         write_1602_d(' ');
  153.                                         write_1602_d('0');
  154.                                         write_1602_d('.');
  155.                                         write_1602_d('0');
  156.                                         write_1602_c(0x8D);
  157.                                         write_1602_c(0x0f);//让光标闪烁
  158.                                 }
  159.                                 else
  160.                                 {
  161.                                         write_1602_c(0x0c);//让光标消失
  162.                                         set=0;
  163.                                 }
  164.                         }
  165.                         
  166.                         k1=k;
  167.                         if(k==12)                                    //按加速
  168.                         {
  169.                                 if(speed<4)
  170.                                 {
  171.                                         speed++;
  172.                                 }
  173.                                 if(speed==4)
  174.                                         speed_1=30;
  175.                                 if(speed==3)
  176.                                         speed_1=50;
  177.                                 if(speed==2)
  178.                                         speed_1=70;
  179.                                 if(speed==1)
  180.                                         speed_1=90;
  181.                         }
  182.                         if(k==13)                                    //按减速
  183.                         {
  184.                                 if(speed>1)
  185.                                 {
  186.                                         speed--;
  187.                                 }
  188.                                 if(speed==4)
  189.                                         speed_1=30;
  190.                                 if(speed==3)
  191.                                         speed_1=50;
  192.                                 if(speed==2)
  193.                                         speed_1=70;
  194.                                 if(speed==1)
  195.                                         speed_1=90;
  196.                         }

  197.                 }

  198.                 disp();

  199.         }
  200. }
复制代码

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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