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

📄 switch.lst

📁 单片机的电机控制
💻 LST
字号:
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE SWITCH
OBJECT MODULE PLACED IN .\switch.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\switch.c DEBUG OBJECTEXTEND

stmt level    source

   1          #include <at89x51.h>    /* 电机当前速度值 */
   2          #include <math.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          sbit en1=P2^4;      /* L298的Enable A */
   6          sbit en2=P2^5;      /* L298的Enable B */
   7          sbit s1=P2^0;       /* L298的Input 1  */
   8          sbit s2=P2^1;       /* L298的Input 2  */
   9          sbit s3=P2^2;       /* L298的Input 3  */
  10          sbit s4=P2^3;       /* L298的Input 4  */
  11          sbit sensor1=P2^6;  //传感器一的输入
  12          sbit sensor2=P2^7;  //传感器二的输入
  13          sbit sensors=P3^2;
  14          sbit ch1=P0^0;
  15          sbit ch2=P0^1;
  16          sbit ch3=P0^2;
  17          
  18          
  19          
  20          char m1=0,m2=0;
  21          char n1=0,n2=0;
  22          uchar t=0,t1=0;
  23          char choose=0;
  24          char a=0,b=0,c=0;
  25          
  26          void method1();
  27          void method2();
  28          void method3();
  29          void motor(uchar index, char speed)
  30          {
  31   1        if(index==1)       /* 电机1的处理    */
  32   1          {
  33   2           en1=1;
  34   2           s2=0; 
  35   2           m1=speed;
  36   2          }
  37   1        if(index==2)       /* 电机2的处理    */
  38   1          {
  39   2           en2=1;
  40   2           s4=0;
  41   2           m2=speed;  /* 电机2的速度控制 */
  42   2          }
  43   1      }
  44          
  45          
  46          void delayz(uint j)      /* 简易延时函数 */
  47          {
  48   1       for(j;j>0;j--);
  49   1      }
  50          
  51          void stop(void)
  52          {
  53   1             ET1=0;
  54   1             TR1=0;
  55   1             en1=en2=1;
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 2   

  56   1             s1=s3=0;
  57   1             s2=s4=0;                //实现快速停止
  58   1             delayz(5000);
  59   1             ET1=1;
  60   1             TR1=1;
  61   1      }
  62          
  63          void motorz(uchar index, char speed)
  64          {
  65   1           if(index==1)       /* 电机1的处理    */
  66   1             {
  67   2              en1=1; 
  68   2              n1=speed;
  69   2      		if(speed<0)
  70   2      			s1=0;
  71   2      		else
  72   2      			s2=0;
  73   2      	   }
  74   1           if(index==2)       /* 电机2的处理    */
  75   1             {
  76   2              en2=1;
  77   2              n2=speed;  /* 电机2的速度控制 */
  78   2      		if(speed<0)
  79   2      			s3=0;
  80   2      		else
  81   2      			s4=0;
  82   2             }
  83   1      
  84   1      }
  85          
  86          static void timer0() interrupt 1          /* T0中断服务程序 */
  87          {
  88   1       TR0=0;
  89   1       if(t<abs(m1))
  90   1            s1=1;
  91   1       else s1=0;   /* 产生电机1的PWM信号 */
  92   1       if(t<abs(m2))
  93   1            s3=1;
  94   1       else s3=0;   /* 产生电机2的PWM信号 */
  95   1       t++;
  96   1       if(t>=60) t=0;          /* 1个PWM信号由20次中断产生 */
  97   1       TR0=1;
  98   1      }
  99          static void timer1() interrupt 3          /* T1中断服务程序 */
 100          {
 101   1         TR1=0;
 102   1       if(n1>0) 
 103   1         { 
 104   2      	   if(t1<abs(n1))
 105   2      		  s1=1;
 106   2             else s1=0;   /* 产生电机1的PWM信号 */
 107   2         }
 108   1       else
 109   1         {
 110   2      	 if(t1<abs(n1))
 111   2      		  s2=1;
 112   2             else s2=0;   /* 产生电机1的PWM信号 */
 113   2         }
 114   1       if(n2>0) 
 115   1         {
 116   2      	   if(t1<abs(n2))
 117   2      		   s3=1;
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 3   

 118   2      	   else s3=0;   /* 产生电机2的PWM信号 */
 119   2         }
 120   1       else
 121   1         {
 122   2      	 if(t1<abs(n2))
 123   2      		  s4=1;
 124   2             else s4=0;   /* 产生电机2的PWM信号 */
 125   2         } 
 126   1       t1++;
 127   1       if(t1>=60) t1=0;      /* 1个PWM信号由20次中断产生 */
 128   1       TR1=1;
 129   1      }
 130          
 131          void xunxian()
 132          {
 133   1       TR0=1;			/* 启动定时器0         */
 134   1       while(1)               /* 电机实际控制演示    */
 135   1       {
 136   2         motor(1,60);
 137   2         motor(2,60);
 138   2       }
 139   1      }
 140          static void xint0_isr(void) interrupt 0
 141          {
 142   1        if(choose==0) 
 143   1           method1(); 
 144   1        if(choose==1)
 145   1           method2();
 146   1        if(choose==2)
 147   1           method3();
 148   1         s1=1;
 149   1         s3=1;
 150   1      }
 151          void main(void)
 152          {
 153   1         ch1=0;
 154   1         ch2=0;
 155   1         ch3=0;
 156   1       EA=0;                    //设置系统不接受任何中断
 157   1       TMOD=0x22;	        /* 设定T0的工作模式为2 */
 158   1       TH0=0xC8;		/* 装入定时器的初值    */
 159   1       TL0=0xC8; 
 160   1       IT0=0;                    //设置下降延触发
 161   1       EX0=1;                    //设置接受INT0的中断 
 162   1       ET0=1;			/* 定时器0允许中断     */
 163   1       TH1=0xC8;		/* 装入定时器的初值    */
 164   1       TL1=0xC8;
 165   1       PT1=1;
 166   1       ET1=1;
 167   1       EA=1;
 168   1        if(ch1==1)
 169   1          a=1;
 170   1        if(ch2==1)
 171   1          b=1;
 172   1        if(ch3==1)
 173   1          c=1;
 174   1        choose=c*4+b*2+a;
 175   1       xunxian();
 176   1      }
 177          
 178          
 179          void method1()
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 4   

 180          {
 181   1         static uchar j=0;
 182   1         j++;
 183   1         if(j==2||j==5||j==11||j==14||j==15)
 184   1           {
 185   2              stop();
 186   2              if(j==2)
 187   2               {
 188   3               motorz(1,36);
 189   3               motorz(2,-32);
 190   3               delayz(300);
 191   3               stop();//右转45
 192   3               motorz(1,60);
 193   3               motorz(2,59);
 194   3               delayz(1600);
 195   3               stop();
 196   3               motorz(1,36);
 197   3               motorz(2,-32);
 198   3               delayz(560);
 199   3               stop();
 200   3               motorz(1,60);
 201   3               motorz(2,59);
 202   3               delayz(700);
 203   3               stop();
 204   3               motorz(1,-34);
 205   3               motorz(2,36);
 206   3               delayz(350);
 207   3               stop();
 208   3               motorz(1,60);
 209   3               motorz(2,59);
 210   3               delayz(50);
 211   3               }
 212   2               if(j==5)
 213   2               {
 214   3                   motorz(1,-45);
 215   3                   motorz(2,-31);
 216   3                   delayz(1200);
 217   3                   stop();
 218   3                   motorz(1,36);
 219   3                   motorz(2,-32);
 220   3                   delayz(580);
 221   3                   stop();
 222   3                   motorz(1,40);
 223   3                   motorz(2,40);
 224   3                   delayz(150);
 225   3                   j=10; 
 226   3               }
 227   2              if(j==11||j==14||j==15)
 228   2                 {
 229   3                   stop();
 230   3                   motorz(1,36);
 231   3                   motorz(2,-32);
 232   3                   delayz(550);//右转
 233   3                   stop();
 234   3                   motorz(1,40);
 235   3                   motorz(2,40);
 236   3                   delayz(150); 
 237   3                 }
 238   2           }
 239   1         else
 240   1         {
 241   2         ET1=1;
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 5   

 242   2         TR1=1;
 243   2         motorz(1,60);
 244   2         motorz(2,59);
 245   2         delayz(600);
 246   2         }  
 247   1         ET1=0; 
 248   1         TR1=0; 
 249   1         s2=0;
 250   1         s4=0;
 251   1      }
 252          
 253          void method2()
 254          {
 255   1      static uchar j=0;
 256   1         j++;
 257   1         if(j==2||j==4||j==6)
 258   1           {
 259   2             stop();
 260   2             ET1=1;
 261   2             TR1=1;
 262   2              if(j==2)
 263   2               {
 264   3                      motorz(1,36);
 265   3                      motorz(2,-34);
 266   3                      delayz(550);
 267   3                      stop();
 268   3                      motorz(1,60);
 269   3                      motorz(2,59);
 270   3                      delayz(35);
 271   3                }
 272   2               if(j==4)
 273   2                 {
 274   3                  motorz(1,-34);
 275   3                  motorz(2,36);
 276   3                  delayz(360);
 277   3                  stop();
 278   3                  motorz(1,60);
 279   3                  motorz(2,59);
 280   3                  delayz(750);
 281   3                  stop();
 282   3                  motorz(1,36);
 283   3                  motorz(2,-32);
 284   3                  delayz(310);
 285   3                  stop();
 286   3                  motorz(1,60);
 287   3                  motorz(2,59);
 288   3                  delayz(35);
 289   3                 }
 290   2               if(j==6)
 291   2                {
 292   3                  motorz(1,60);
 293   3                  motorz(2,59);
 294   3                  delayz(600);
 295   3                 while(1)
 296   3                 {
 297   4                  stop();
 298   4                  ET1=0;
 299   4                  TR1=0;
 300   4                 }
 301   3                }
 302   2               stop();
 303   2           }
C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 6   

 304   1         else
 305   1         {
 306   2         ET1=1;
 307   2         TR1=1;
 308   2         motorz(1,m1);
 309   2         motorz(2,m2);
 310   2         delayz(700);
 311   2         }  
 312   1         ET1=0; 
 313   1         TR1=0; 
 314   1      }
 315          
 316          void method3()
 317          {
 318   1       static uchar j=0;
 319   1         j++;
 320   1         if(j==4||j==6)
 321   1           {
 322   2             stop();
 323   2              if(j==4)
 324   2               {
 325   3                      motorz(1,36);
 326   3                      motorz(2,-32);
 327   3                      delayz(525);
 328   3                      stop();
 329   3                      motorz(1,60);
 330   3                      motorz(2,59);
 331   3                      delayz(200);
 332   3                }
 333   2               if(j==6)
 334   2                 {
 335   3                  while(1)
 336   3                  {
 337   4                   stop();
 338   4                   ET1=0;
 339   4                   TR1=0;
 340   4                  }
 341   3                 }
 342   2               stop();
 343   2           }
 344   1         else
 345   1         {
 346   2         ET1=1;
 347   2         TR1=1;
 348   2         motorz(1,m1);
 349   2         motorz(2,m2);
 350   2         delayz(600);
 351   2         }  
 352   1         ET1=0; 
 353   1         TR1=0; 
 354   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1167    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.

C51 COMPILER V6.12  SWITCH                                                                 06/08/2007 12:52:27 PAGE 7   


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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