找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机控制步进电机转动设置的圈数

[复制链接]
ID:354129 发表于 2018-6-19 11:04 | 显示全部楼层 |阅读模式
单片机代码
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<stepmotrolcd1602.c>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define delayNOP();{_nop_();_nop_();_nop_();};
  7. unsigned char last_val[4]={1,1,1,1},cur_val[4]={1,1,1,1};
  8. unsigned char code FFW[8]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};    //正转
  9. unsigned char code REV[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};        //反转
  10. sbit K1=P3^0;        //运行与停止
  11. sbit K2=P3^1;        //设定圈数
  12. sbit K3=P3^2;        //方向转换
  13. sbit K4=P3^3;        //速率调整
  14. sbit L1=P3^5;        //正转指示
  15. sbit L2=P3^6;        //反转指示
  16. sbit L3=P3^7;        //停转指示
  17. sbit LCD_RS=P2^0;
  18. sbit LCD_RW=P2^1;
  19. sbit LCD_EN=P2^2;
  20. bit  on_off=0;          //运行与停止标志
  21. bit direction=1;  //方向标志
  22. bit rate_dr=1;          //速率标志
  23. bit snum_dr=1;          //圈数标志
  24. uchar number=0,number1=1;
  25. uchar snum=1,snum1=1;        //预设定标志
  26. uchar rate=1;                        //预设定速率
  27. uchar data_temp,data_temp0,rate1,rate1,rateh;
  28. uchar data_temp2[2]={'0','0'};
  29. void keyscan();
  30. void delay1();
  31. /************主程序************
  32. void main(void)
  33. {
  34.    TMOD=0X01;
  35.    rate1=0xb1;
  36.    rateh=0xe0;
  37.    EA=1;
  38.    ET0=1;
  39.    P1=0X03;
  40.    L1=1;
  41.    L2=1;
  42.    L3=1;
  43.    LcdRw=0;
  44.    welcome();
  45.    GotoXY(12,0);
  46.     Print(">>");
  47.         while(1)
  48.          {GotoXY(0,1);
  49.          Print("num:    ");
  50.          GotoXY(5,1);
  51.          Print(data_conv(snum));
  52.          GotoXY(8,1);
  53.          Print("rate:   ");
  54.           GotoXY(14,1);
  55.          Print(data_conv(rate));
  56.          keyscan();
  57.          if(number1==snum1)
  58.          { number1=0;
  59.            on_off=0;
  60.            TR0=0;
  61.            TL0=rate1;
  62.            TH0=rateh;
  63.            snum=snum1;
  64.            P1=0X00;
  65.            GotoXY(0,0);
  66.            Print("Stop!  ");
  67.            L1=1;
  68.            L2=1;
  69.            L3=1;
  70.            }
  71.          }
  72.         }
  73.         /**********延时10ms程序***************/
  74.         void delay1()
  75.         {
  76.         unsigned char i,j;
  77.         for(i=20;i>0;i--)
  78.         for(j=248;j>0;j--);
  79.         }
  80.         /**********键盘扫描程序**************/
  81.         void keyscan()  //独立按键扫描
  82.         {
  83.         last_val[0]=cur_val[0];
  84.         cur_val[0]=K1;
  85.         if((last_val[0]!=cur_val[0])&&cur_val[0]==0)
  86.         {delay1();
  87.         if((last_val[0]!=cur_val[0])&&cur_val[0]==0)
  88.         {on_off=~on_off;
  89.          {if(on_off)
  90.           { GotoXY(0,0)        ;
  91.                 Print("Running!   ");
  92.                 TR0=0;
  93.            TL0=rate1;
  94.            TH0=rateh;
  95.            if(direction)
  96.            {  L1=0;
  97.               L2=1;
  98.               L3=1;}
  99.                 }
  100.                 else
  101.                 {  GotoXY(0,0);
  102.              Print("Stop!   ");
  103.                  TR0=0;
  104.              TL0=rate1;
  105.              TH0=rateh;
  106.                   L1=1;
  107.               L2=1;
  108.               L3=0;
  109.                 }
  110.                 }
  111.                 }
  112.                 }
  113.         last_val[1]=cur_val[1];
  114.     cur_val[1]=K2;
  115.     if((last_val[1]!=cur_val[1])&&cur_val[1]==0)
  116.         {delay1();
  117.         if((last_val[1]!=cur_val[1])&&cur_val[1]==0)
  118.         {if(snum_dr==1)
  119.             {snum++;
  120.                   snum1=snum;
  121.                     if(snum==0x14)
  122.                           {snum_dr=~snum_dr;}
  123.                 }else{
  124.                     snum--;
  125.                            snum1=snum;
  126.                           if(snum==0x01)
  127.                           {snum_dr=~snum_dr;}
  128.                      }
  129.                          }
  130.         }
  131.         last_val[2]=cur_val[2];
  132.     cur_val[2]=K3;
  133.     if((last_val[2]!=cur_val[2])&&cur_val[2]==0)
  134.         {delay1();
  135.         if((last_val[2]!=cur_val[2])&&cur_val[2]==0)
  136.         {direction=~direction;
  137.                 if(direction)
  138.                         {GotoXY(12,0);
  139.                         Print(">>");
  140.                          L1=0;
  141.                  L2=1;
  142.                  L3=1;}
  143.                 else{GotoXY(12,0);
  144.              Print("<<");
  145.                           L1=1;
  146.                  L2=0;
  147.                  L3=1;}
  148.                          }
  149.                          }
  150.         last_val[3]=cur_val[3];
  151.     cur_val[3]=K4;
  152.     if((last_val[3]!=cur_val[3])&&cur_val[3]==0)
  153.         delay1();
  154.         {if((last_val[3]!=cur_val[3])&&cur_val[3]==0)
  155.         {if(rate_dr==1)
  156.             {rate++;
  157.                     if(snum==0x10)
  158.                           {rate_dr=~rate_dr;}
  159.                 }
  160.                 else
  161.                 {
  162.                     rate--;
  163.                           if(rate==0x01)
  164.                           {rate_dr=~rate_dr;}
  165.                      }
  166.                         switch(rate)
  167.                         {
  168.                         case 1: rate1=0xb1;rateh=0xe0;break;    //100hz
  169.                          case 2: rate1=0xec;rateh=0x78;break;    //200hz
  170.                         case 3: rate1=0xf2;rateh=0xb2;break;    //300hz
  171.                         case 4: rate1=0xf6;rateh=0x3c;break;    //400hz
  172.                         case 5: rate1=0xf7;rateh=0xb6;break;    //450hz
  173.                         case 6: rate1=0xf8;rateh=0x30;break;    //500hz
  174.                         case 7: rate1=0xf8;rateh=0xe6;break;    //550hz
  175.                         case 8: rate1=0xf9;rateh=0x7d;break;    //600hz
  176.                         case 9: rate1=0xf9;rateh=0xfe;break;    //650hz
  177.                         case 10: rate1=0xfa;rateh=0x6d;break;    //700hz
  178.                         case 11: rate1=0xfa;rateh=0xcd;break;    //750hz
  179.                         case 12: rate1=0xfb;rateh=0x1e;break;    //800hz
  180.                         case 13: rate1=0xfb;rateh=0x68;break;    //850hz
  181.                         case 14: rate1=0xfb;rateh=0xa9;break;    //900hz
  182.                         case 15: rate1=0xfc;rateh=0x18;break;    //1000hz
  183.                         case 16: rate1=0xfc;rateh=0x73;break;    //1100hz
  184.                         }
  185.                 }
  186.                 }
  187.         }
  188.         /************定时器中断**************/
  189.         void motor_onoff()   interrupt   1
  190.         {
  191.         number++;
  192.         TL0=rate1;
  193.         TH0=rateh;
  194.          if(number==64)
  195.          {snum--;
  196.          number=0;
  197.             number1++;
  198.         }
  199.         else {
  200.         if(direction==1)
  201.            {if(v<8)
  202.              {P1=FFW[v];
  203.                   v++;}
  204.                   if(v==8)
  205.                   v=0;
  206.                   }
  207.                   else
  208.                 {if(v<8)
  209.                  {P1=REV[v];v++;}
  210.                  if(v==8)
  211.                  v=0;
  212.                  }
  213.         }
  214. }
复制代码


单片机代码.docx

14.14 KB, 下载次数: 16, 下载积分: 黑币 -5

回复

使用道具 举报

ID:74382 发表于 2018-10-20 11:52 | 显示全部楼层
有接线图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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