⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor.lst

📁 通过键盘能分别给步进电机单独运行的速度,同时也能进行差补运行,画直线段,并能返回原点
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.06   MOTOR                                                                 10/25/2007 22:48:42 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MOTOR
OBJECT MODULE PLACED IN motor.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE motor.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /////////////////////////////////////////////////////////////////////////////////////
   2          //             MCS51单片机作为主控制器组成一个双步进电机控制器                     // 
   3          //         通过小键盘,能给定两台步进电机单独运行的速度,要求可供选择的步          //
   4          //         进速度从60~600步/秒,可连续任意设置;通过直线差补算法能实时显           //
   5          //         示所绘直线段的坐标,并能通过键盘设定新的终点参数,且步进电机能          //
   6          //         正确运行到该点,回零后能快速回到始点。                                   // 
   7          /////////////////////////////////////////////////////////////////////////////////////
   8          /////////////////////////////////////////////////////////////////////////////////////
   9          #include<reg51.h>                                            //51芯片管脚定义头文件
  10          #include<stdio.h>
  11          
  12          typedef unsigned char unchar;
  13          sbit LED1=P2^0;            //LED位选 
  14          sbit LED2=P2^1;
  15          sbit LED3=P2^2;
  16          sbit LED4=P2^3;
  17          sbit LED5=P2^4;
  18          sbit LED6=P2^5;
  19          sbit LED7=P2^6;
  20          sbit LED8=P2^7;
  21          unchar start=0;            //启动键按下标志, 按下标志量变为一
  22          unchar back=0;             //回零键按下标志, 按下标志量变为一
  23          unchar setX_F=0;           //设置键X按下标志,按下标志量变为一
  24          unchar setY_F=0;           //设置键Y按下标志,按下标志量变为一
  25          unchar set_add_F=0;        //加一键按下标志, 按下标志量变为一
  26          unchar set_sure_F=0;       //确定键按下标志, 按下标志量变为一
  27          unchar setX_Z=0;           //设置X坐标键按下,按下标志量变为一
  28          unchar setY_Z=0;           //设置Y坐标键按下,按下标志量变为一
  29          
  30          ////////////////////////////////////////////////////////////////////////////////////////////////
  31          //定义全局变量
  32          ///////////////////////////////////////////////////////////////////////////////////////////
  33          unsigned int keytmp,tmp;
  34          unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,p=0,t=0,u=0,r=0;
  35          unsigned int speed=0,speed1=0,speed2=0;
  36          unsigned int Xi=0,Yi=0;
  37          unsigned int FX=0,FY=0;
  38          unsigned int XE=0,YE=0,Nxy=0;   //(X轴坐标,Y轴坐标,总部数)
  39          int FM=0;
  40          unsigned int flag=0,flagx=0,flagy=0;
  41          unsigned int setX_value=0;        // 当标志位为一时跳出设置X速度的循环
  42          unsigned int setY_value=0;        // 当标志位为一时跳出设置Y速度的循环
  43          unsigned int setX_Z_value=0;      // 当标志位为一时跳出设置X坐标的循环
  44          unsigned int setY_Z_value=0;      // 当标志位为一时跳出设置X坐标的循环
  45          unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //LED段选码
  46                                  //  0,   1,   2,   3,   4,   5,   6,   7,   8,   9
  47          int time=0;             //定时扫描键盘标志位           
  48          int time1=0;
  49          int time2=0;            //LED闪射时间
  50          int timeF2=0;           //LED闪射时间标志
  51          
  52          /////////////////////////////////////////////////////////////////////////////////////////////
  53          //声明函数
  54          ////////////////////////////////////////////////////////////////////////////////////////////
  55          void Time0_initial();
C51 COMPILER V7.06   MOTOR                                                                 10/25/2007 22:48:42 PAGE 2   

  56          void Time1_initial();                                             //定时器1初始化
  57          void chabu();                                                     //双步进电机差补运行 
  58          void runback();                                                   //步进电机回零
  59          void runX();                                                      //电机X正向运行
  60          void runY();                                                      //电机Y正向运行
  61          void control();                                                   //速度,坐标设置控制
  62          void displayxy(int,int);                                          //LED显示(int-位选,int-段选)
  63          void displayXY_data(int,int,int,int,int,int,int,int,int);         //8位LED显示数据,第一个int代表LED1显示的
  64                                                                            //数值,第二个int代表LED2显示的数值,*****
  65                                                                                                                                            //第九个int代表是否屏蔽其中的位选,是否闪动.
  66          //////////////////////////////////////////////////////////////////////////////
  67          void dingshi1ms(int i)                                 //延时10ms程序
  68          { 
  69   1        time1=0;
  70   1        while(1)
  71   1        {
  72   2          if(time1==i)
  73   2              break;
  74   2        }
  75   1      }
  76          /////////////////////////////////////////////
  77          main()                                                            //主程序
  78          {
  79   1         P0=0x00;
  80   1         P1=0;
  81   1         P2=0xff;
  82   1         P3=0x00; 
  83   1         TMOD=0x11;
  84   1         TF1=0;
  85   1         TF0=0;
  86   1         Time0_initial();
  87   1         Time1_initial();
  88   1         ET0=1;
  89   1         ET1=1;
  90   1         EA=1;  
  91   1         while(1)
  92   1         {
  93   2           control();
  94   2         }
  95   1      } 
  96          void time0_initial()
  97          {
  98   1         TR0=0;
  99   1         TF0=0;
 100   1         TH0=0xfc;
 101   1         TL0=0x17;
 102   1         TR0=1;    
 103   1      }
 104          ///////////////////////////////////////////////
 105          void time0_int(void) interrupt 1
 106          {
 107   1        time1+=1;
 108   1        time0_initial();
 109   1      }
 110          void Time1_initial()       //定时器1中断初始化定时50ms
 111          {
 112   1        TR1=0;
 113   1        TF1=0;
 114   1        TH1=0x3c;
 115   1        TL1=0xaf;
 116   1        TR1=1;
 117   1      }
C51 COMPILER V7.06   MOTOR                                                                 10/25/2007 22:48:42 PAGE 3   

 118          ///////////////////////////////////////////////
 119          //定时扫描键盘
 120          ////////////////////////////////////////////////
 121          void time1_int(void) interrupt 3
 122          {  
 123   1         time+=1;
 124   1         time1+=1;
 125   1         time2+=1;
 126   1         if(time2<=4)
 127   1            {timeF2=0;}
 128   1          if(time2>4&&time2<8)
 129   1            {timeF2=1;}
 130   1          if(time2==8)
 131   1            { timeF2=0;
 132   2              time2=0;
 133   2            }
 134   1              if(time==2)
 135   1              {
 136   2                P3=0x00;
 137   2            P3=0x01;                                                     //第一行置零
 138   2            tmp=P3;
 139   2                keytmp=tmp&0xff;              
 140   2            if(keytmp!=0x01)
 141   2           {   
 142   3              switch(keytmp)
 143   3              {
 144   4                case 0x11:
 145   4                   start=1;    break;
 146   4                case 0x21:
 147   4                   setX_F=1;    break;
 148   4                case 0x41:
 149   4                   setY_F=1;    break;
 150   4                case 0x81:
 151   4                   setX_Z=1;    break; 
 152   4                default :       break;
 153   4                  }
 154   3            }   
 155   2              }
 156   1          if(time==4)
 157   1           { 
 158   2           P3=0x00;
 159   2           P3=0x02;                                                           //第二行置零
 160   2           tmp=P3;
 161   2               keytmp=tmp&0xff;            
 162   2           if(keytmp!=0x02)
 163   2           {
 164   3             switch(keytmp)
 165   3             {
 166   4                case 0x12:
 167   4                     back=1;  break;
 168   4                case 0x22:
 169   4                     set_sure_F=1;  break;
 170   4                case 0x42:
 171   4                     set_add_F=1;   break;
 172   4                case 0x82:  
 173   4                     setY_Z=1;     break;
 174   4                default :           break;
 175   4                  }              
 176   3            }
 177   2                  time=0;
 178   2          }
 179   1          Time1_initial();
C51 COMPILER V7.06   MOTOR                                                                 10/25/2007 22:48:42 PAGE 4   

 180   1      }
 181          //////////////////////////////////////////////
 182          //电机X轴正运行函数
 183          //////////////////////////////////////////////
 184          void runX(void)
 185          {  int tt;
 186   1         speed=(int)(3750/(a*100+b*10+c));
 187   1        while(1)
 188   1        {  
 189   2            P1=0x01;
 190   2                tt=speed;
 191   2           while(tt--)
 192   2            displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 193   2            P1=0x03;
 194   2            tt=speed;
 195   2           while(tt--)
 196   2                displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 197   2                P1=0x02;
 198   2                tt=speed;
 199   2           while(tt--)
 200   2            displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 201   2            P1=0x06;
 202   2            tt=speed;
 203   2           while(tt--)
 204   2                displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 205   2                P1=0x04;
 206   2            tt=speed;
 207   2           while(tt--)
 208   2                displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 209   2                P1=0x0c;
 210   2                tt=speed;
 211   2           while(tt--)
 212   2            displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 213   2                P1=0x08;
 214   2                tt=speed;
 215   2           while(tt--)
 216   2                displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 217   2            P1=0x09;
 218   2                tt=speed;
 219   2           while(tt--)
 220   2                displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
 221   2              Xi+=1;Yi+=1;
 222   2         if(set_sure_F==1) break;
 223   2         }
 224   1      }
 225          /////////////////////////////////////////////
 226          //电机Y正运行函数
 227          /////////////////////////////////////////////
 228          void runY(void)
 229          {  
 230   1         int tt;
 231   1         speed=(int)(3750/(d*100+e*10+f));
 232   1         while(1)
 233   1         {
 234   2          P1=0x10;
 235   2              tt=speed;
 236   2         while(tt--)
 237   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 238   2          P1=0x30;
 239   2              tt=speed;
 240   2         while(tt--)
 241   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
C51 COMPILER V7.06   MOTOR                                                                 10/25/2007 22:48:42 PAGE 5   

 242   2          P1=0x20;
 243   2              tt=speed;
 244   2         while(tt--)
 245   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 246   2              P1=0x60;
 247   2              tt=speed;
 248   2         while(tt--)
 249   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 250   2              P1=0x40;
 251   2              tt=speed;
 252   2         while(tt--)
 253   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 254   2              P1=0xc0;
 255   2              tt=speed;
 256   2         while(tt--)
 257   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 258   2              P1=0x80;
 259   2              tt=speed;
 260   2         while(tt--)
 261   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 262   2              P1=0x90;
 263   2              tt=speed;
 264   2         while(tt--)
 265   2          displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
 266   2              Xi+=1;Yi+=1;
 267   2         if(set_sure_F==1) break;
 268   2         }
 269   1      }
 270          /////////////////////////////////////////////
 271          ///双步进电机差补运行
 272          //////////////////////////////////////////////
 273          void chabu(void)
 274          {   int tt;
 275   1          speed1=(int)(3750/(a*100+b*10+c));
 276   1          speed2=(int)(3750/(d*100+e*10+f));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -