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

📄 pwm2.lst

📁 单片机的电机控制
💻 LST
字号:
C51 COMPILER V6.12  PWM2                                                                   05/15/2007 18:26:49 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE PWM2
OBJECT MODULE PLACED IN .\PWM2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\PWM2.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           /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
  23          void motor(uchar index, char speed)
  24          {
  25   1       if(speed>=-100 && speed<=100)
  26   1         {
  27   2           if(index==1)       /* 电机1的处理    */
  28   2             {
  29   3              m1=abs(speed);  /* 取速度的绝对值 */
  30   3              if(speed<0)     /* 速度值为负则反转 */
  31   3                 {
  32   4                  s1=0;
  33   4                  s2=1;
  34   4                 }
  35   3                else          /* 不为负数则正转 */
  36   3                 {
  37   4                  s1=1;
  38   4                  s2=0;
  39   4                 }
  40   3             }
  41   2           if(index==2)       /* 电机2的处理    */
  42   2             {
  43   3              m2=abs(speed);  /* 电机2的速度控制 */
  44   3              if(speed<0)     /* 电机2的方向控制 */
  45   3                 {
  46   4                  s3=0;
  47   4                  s4=1;
  48   4                 }
  49   3                else
  50   3                 {
  51   4                  s3=1;
  52   4                  s4=0;
  53   4                 }
  54   3             }
  55   2         }
C51 COMPILER V6.12  PWM2                                                                   05/15/2007 18:26:49 PAGE 2   

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

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

 180   4      	   delay(5000);
 181   4       	  }
 182   3               }
 183   2          }
 184   1      }
 185          


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