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

📄 fangana.lst

📁 单片机的电机控制
💻 LST
字号:
C51 COMPILER V6.12  FANGANA                                                                06/09/2007 18:00:55 PAGE 1   


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

stmt level    source

   1          #include<reg51.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 sensor3=P1^0;
  14          sbit sensor4=P1^1;
  15          sbit sensors=P3^2;
  16          uchar k=0;
  17          uchar t=0,t1=0;          /* 中断计数器     */
  18          char m1=0,n1=0;         /* 电机1速度值    */
  19          char m2=0,n2=0;         /* 电机2速度值    */
  20          char tmp1,tmp2;    /* 电机当前速度值 */
  21          
  22          
  23           /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
  24          void motor(uchar index, char speed)
  25          {
  26   1        if(index==1)       /* 电机1的处理    */
  27   1          {
  28   2           en1=1;
  29   2           s2=0; 
  30   2           m1=speed;
  31   2          }
  32   1        if(index==2)       /* 电机2的处理    */
  33   1          {
  34   2           en2=1;
  35   2           s4=0;
  36   2           m2=speed;  /* 电机2的速度控制 */
  37   2          }
  38   1      }
  39          
  40          void delay(uint j)      /* 简易延时函数 */
  41          {
  42   1       for(j;j>0;j--);
  43   1      }
  44          
  45          void main()
  46          {
  47   1       EA=0;                    //设置系统不接受任何中断
  48   1       TMOD=0x22;	        /* 设定T0的工作模式为2 */
  49   1       TH0=0xC8;		/* 装入定时器的初值    */
  50   1       TL0=0xC8; 
  51   1       IT0=0;                    //设置下降延触发
  52   1       EX0=1;                    //设置接受INT0的中断 
  53   1       ET0=1;			/* 定时器0允许中断     */
  54   1       TR0=1;			/* 启动定时器0         */;	        /* 设定T1的工作模式为2 */
  55   1       TH1=0xC8;		/* 装入定时器的初值    */
C51 COMPILER V6.12  FANGANA                                                                06/09/2007 18:00:55 PAGE 2   

  56   1       TL1=0xC8;
  57   1       PT1=1;                    //中断优先级为高
  58   1       ET1=1; 
  59   1       EA=1;	        	     /* 开中断              */
  60   1       while(1)               /* 电机实际控制演示    */
  61   1       {                          
  62   2         if(~(sensor1==0&&sensor2==0))
  63   2         {
  64   3         if(sensor1==1)          //判断传感器信号高低
  65   3             motor(1,40);
  66   3         else
  67   3            {        
  68   4             motor(1,38);
  69   4             delay(90);
  70   4             motor(1,40);
  71   4             
  72   4            }
  73   3         if(sensor2==1)          //判断传感器信号高低
  74   3             motor(2,40);			
  75   3         else
  76   3            {     
  77   4             motor(2,38);          //减速
  78   4             delay(130);
  79   4             motor(2,40);
  80   4            }
  81   3          }
  82   2            
  83   2        }
  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; 
  97   1       TR0=1;         /* 1个PWM信号由20次中断产生 */
  98   1      }
  99          void delayz(uint j)      /* 简易延时函数 */
 100          {
 101   1       for(j;j>0;j--);
 102   1      }
 103          
 104          void motorz(uchar index, char speed)
 105          {
 106   1           if(index==1)       /* 电机1的处理    */
 107   1             {
 108   2              en1=1; 
 109   2              n1=speed;
 110   2      		if(speed<0)
 111   2      			s1=0;
 112   2      		else
 113   2      			s2=0;
 114   2      	   }
 115   1           if(index==2)       /* 电机2的处理    */
 116   1             {
 117   2              en2=1;
C51 COMPILER V6.12  FANGANA                                                                06/09/2007 18:00:55 PAGE 3   

 118   2              n2=speed;  /* 电机2的速度控制 */
 119   2      		if(speed<0)
 120   2      			s3=0;
 121   2      		else
 122   2      			s4=0;
 123   2             }
 124   1      
 125   1      }
 126          
 127          static void timer1() interrupt 3          /* T0中断服务程序 */
 128          {
 129   1         TR1=0;
 130   1       if(n1>0) 
 131   1         { 
 132   2      	   if(t1<abs(n1))
 133   2      		  s1=1;
 134   2             else s1=0;   /* 产生电机1的PWM信号 */
 135   2         }
 136   1       else
 137   1         {
 138   2      	 if(t1<abs(n1))
 139   2      		  s2=1;
 140   2             else s2=0;   /* 产生电机1的PWM信号 */
 141   2         }
 142   1       if(n2>0) 
 143   1         {
 144   2      	   if(t1<abs(n2))
 145   2      		   s3=1;
 146   2      	   else s3=0;   /* 产生电机2的PWM信号 */
 147   2         }
 148   1       else
 149   1         {
 150   2      	 if(t1<abs(n2))
 151   2      		  s4=1;
 152   2             else s4=0;   /* 产生电机2的PWM信号 */
 153   2         } 
 154   1       t1++;
 155   1       if(t1>=60) t1=0;      /* 1个PWM信号由60次中断产生 */
 156   1       TR1=1;
 157   1      }
 158          void stop()
 159          {
 160   1        ET1=0;
 161   1        TR1=0; 
 162   1        en1=en2=1;
 163   1        s1=s3=0;
 164   1        s2=s4=0;                //实现快速停止
 165   1        delayz(1000);
 166   1        ET1=1;
 167   1        TR1=1;
 168   1        
 169   1      }
 170          static void xint0_isr(void) interrupt 0
 171          {
 172   1         static uchar j=0;
 173   1         j++;
 174   1         if(j==3||j==9||j==11||j==14||j==16||j==20||j==32||j==35||j==36)
 175   1           {
 176   2             stop();
 177   2              if(j==3)
 178   2               {
 179   3                      motorz(1,36);
C51 COMPILER V6.12  FANGANA                                                                06/09/2007 18:00:55 PAGE 4   

 180   3                      motorz(2,-32);
 181   3                      delay(550);
 182   3                      motorz(1,40);
 183   3                      motorz(2,40);
 184   3                      delayz(250);
 185   3                }
 186   2               if(j==9)
 187   2                 {
 188   3                   stop();
 189   3                   motorz(1,-45);
 190   3                   motorz(2,-31);
 191   3                   delayz(1200);
 192   3                   stop();
 193   3                   motorz(1,36);
 194   3                   motorz(2,-32);
 195   3                   delayz(580);
 196   3                   stop();
 197   3                   motorz(1,40);
 198   3                   motorz(2,40);
 199   3                   delayz(150);
 200   3                   j=10; 
 201   3                 }
 202   2                if(j==11||j==14||j==16)
 203   2                 {
 204   3                   stop();
 205   3                   motorz(1,36);
 206   3                   motorz(2,-32);
 207   3                   delayz(575);//右转
 208   3                   stop();
 209   3                   motorz(1,40);
 210   3                   motorz(2,40);
 211   3                   delayz(150); 
 212   3                  }
 213   2                if(j==20)
 214   2                 {
 215   3                   stop();
 216   3                   motorz(1,-45);
 217   3                   motorz(2,-31);
 218   3                   delayz(1200);
 219   3                   stop();
 220   3                   motorz(1,-34);
 221   3                   motorz(2,36);
 222   3                   delayz(550);//左转
 223   3                   j=30;
 224   3                   stop();
 225   3                   motorz(1,40);
 226   3                   motorz(2,40);
 227   3                   delayz(150); 
 228   3                 }
 229   2               if(j==32||j==35||j==36)
 230   2                {
 231   3                   motorz(1,-34);
 232   3                   motorz(2,36);
 233   3                   delayz(670);
 234   3                   stop();
 235   3                   motorz(1,40);
 236   3                   motorz(2,40);
 237   3                   delayz(180);
 238   3                }
 239   2               stop();
 240   2           }
 241   1         else
C51 COMPILER V6.12  FANGANA                                                                06/09/2007 18:00:55 PAGE 5   

 242   1         {
 243   2         ET1=1;
 244   2         TR1=1;
 245   2         motorz(1,m1);
 246   2         motorz(2,m2);
 247   2         delayz(800);
 248   2         }  
 249   1         ET1=0; 
 250   1         TR1=0; 
 251   1      }


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


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

⌨️ 快捷键说明

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