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

📄 motor1.lst

📁 单片机的电机控制
💻 LST
字号:
C51 COMPILER V6.12  MOTOR1                                                                 05/19/2007 19:14:06 PAGE 1   


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

stmt level    source

   1          /* =======直流电机的PWM速度控制程序======== */
   2          /* 纬东工作室  robots51.51.net    2006年6月 */
   3          /* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
   4          
   5          #include<reg51.h>
   6          #include<math.h>
   7          #define uchar unsigned char
   8          #define uint unsigned int
   9          sbit en1=P2^4;      /* L298的Enable A */
  10          sbit en2=P2^5;      /* L298的Enable B */
  11          sbit s1=P2^0;       /* L298的Input 1  */
  12          sbit s2=P2^1;       /* L298的Input 2  */
  13          sbit s3=P2^2;       /* L298的Input 3  */
  14          sbit s4=P2^3;       /* L298的Input 4  */
  15          sbit sensor1=P2^6;  //传感器一的输入
  16          sbit sensor2=P2^7;  //传感器二的输入
  17          uchar t=0;          /* 中断计数器     */
  18          uchar m1=0;         /* 电机1速度值    */
  19          uchar m2=0;         /* 电机2速度值    */
  20          uchar tmp1,tmp2;    /* 电机当前速度值 */
  21          
  22          
  23           /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
  24          void motor(uchar index, char speed)
  25          {
  26   1       if(speed>=-50 && speed<=50)
  27   1         {
  28   2           if(index==1)       /* 电机1的处理    */
  29   2             {
  30   3              en1=1; 
  31   3              m1=speed;
  32   3      		if(speed<0)
  33   3      			s1=0;
  34   3      		else
  35   3      			s2=0;
  36   3      	   }
  37   2           if(index==2)       /* 电机2的处理    */
  38   2             {
  39   3              en2=1;
  40   3              m2=speed;  /* 电机2的速度控制 */
  41   3      		if(speed<0)
  42   3      			s3=0;
  43   3      		else
  44   3      			s4=0;
  45   3             }
  46   2         }
  47   1      }
  48          
  49          void delay(uint j)      /* 简易延时函数 */
  50          {
  51   1       for(j;j>0;j--);
  52   1      }
  53          
  54          void main()
  55          {
C51 COMPILER V6.12  MOTOR1                                                                 05/19/2007 19:14:06 PAGE 2   

  56   1       uchar i;
  57   1       EA=0;                    //设置系统不接受任何中断
  58   1       TMOD=0x02;	        /* 设定T0的工作模式为2 */
  59   1       TH0=0xC8;		/* 装入定时器的初值    */
  60   1       TL0=0xC8; 
  61   1       PX0=1;                     //设置优先级为高 
  62   1       IT0=1;                    //设置下降延触发
  63   1       EX0=1;                    //设置接受INT0的中断 
  64   1       ET0=1;			/* 定时器0允许中断     */
  65   1       TR0=1;			/* 启动定时器0         */
  66   1       EA=1;	        	     /* 开中断              */
  67   1       while(1)               /* 电机实际控制演示    */
  68   1       {
  69   2        for(i=20;i<=50;i=i+1)   /* 正转加速 */
  70   2           {
  71   3            //if(sensor1==1)
  72   3            motor(1,i);
  73   3            //if(sensor2==1)
  74   3            motor(2,i);
  75   3            delay(5000);
  76   3           }
  77   2        for(i=50;i>20;i=i-1)    /* 正转减速 */
  78   2           {
  79   3            //if(sensor2==1)
  80   3            motor(1,i);
  81   3            //if(sensor1==1)
  82   3            motor(2,i);
  83   3            delay(5000);
  84   3           }
  85   2       /* for(i=0;i<=100;i++)   //反转加速 
  86   2           {
  87   2            motor(1,-i);
  88   2            motor(2,-i);
  89   2            delay(5000);
  90   2           }
  91   2        for(i=100;i>0;i--)    // 反转减速 
  92   2           {
  93   2            motor(1,-i);
  94   2            motor(2,-i);
  95   2            delay(5000);
  96   2           }*/
  97   2       }
  98   1      }
  99          
 100          static void timer0() interrupt 1          /* T0中断服务程序 */
 101          {
 102   1       if(t==0)           /* 1个PWM周期完成后才会接受新数值 */
 103   1         {
 104   2           tmp1=m1;
 105   2           tmp2=m2;
 106   2         }
 107   1       if(tmp1>0) 
 108   1         { 
 109   2      	   if(t<abs(tmp1))
 110   2      		  s1=1;
 111   2             else s1=0;   /* 产生电机1的PWM信号 */
 112   2         }
 113   1       else
 114   1         {
 115   2      	 if(t<abs(tmp1))
 116   2      		  s2=1;
 117   2             else s2=0;   /* 产生电机1的PWM信号 */
C51 COMPILER V6.12  MOTOR1                                                                 05/19/2007 19:14:06 PAGE 3   

 118   2         }
 119   1       if(tmp2>0) 
 120   1         {
 121   2      	   if(t<abs(tmp2))
 122   2      		   s3=1;
 123   2      	   else s3=0;   /* 产生电机2的PWM信号 */
 124   2         }
 125   1       else
 126   1         {
 127   2      	 if(t<abs(tmp2))
 128   2      		  s4=1;
 129   2             else s4=0;   /* 产生电机2的PWM信号 */
 130   2         } 
 131   1       t++;
 132   1       if(t>=50) t=0;          /* 1个PWM信号由50次中断产生 */
 133   1      }
 134          
 135          
 136          void motorz(uchar index, char speed)
 137          {
 138   1       if(speed>=-100 && speed<=100)
 139   1         {
 140   2           if(index==1)       /* 电机1的处理    */
 141   2             {
 142   3              en1=1; 
 143   3              m1=speed;
 144   3      		if(speed<0)
 145   3      			s1=0;
 146   3      		else
 147   3      			s2=0;
 148   3      	   }
 149   2           if(index==2)       /* 电机2的处理    */
 150   2             {
 151   3              en2=1;
 152   3              m2=speed;  /* 电机2的速度控制 */
 153   3      		if(speed<0)
 154   3      			s3=0;
 155   3      		else
 156   3      			s4=0;
 157   3             }
 158   2         }
 159   1      }
 160          static void xint0_isr(void) interrupt 0
 161          {
 162   1         static uchar j=0;
 163   1         uchar i; 
 164   1         j++;
 165   1         if(j==2)
 166   1           {
 167   2             en1=en2=1;
 168   2             s1=s3=1;
 169   2             s2=s4=1;                //实现快速停止
 170   2             while(1)               /* 电机实际控制演示    */
 171   2      	{
 172   3      	 for(i=20;i<=100;i++)   /* 正反转加速 */
 173   3      	  {
 174   4      	    motorz(1,i);
 175   4      	    motorz(2,-i);
 176   4      	    delay(5000);
 177   4      	  }
 178   3      	 for(i=100;i>20;i--)    /* 正反转减速 */
 179   3      	  {
C51 COMPILER V6.12  MOTOR1                                                                 05/19/2007 19:14:06 PAGE 4   

 180   4      	   motorz(1,i);
 181   4      	   motorz(2,-i);
 182   4      	   delay(5000);
 183   4       	  }
 184   3               }
 185   2          }
 186   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    483    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6    ----
   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 + -