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

📄 zibianpwm2.lst

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


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

  56   1       PT1=1;                    //中断优先级为高
  57   1       ET1=1; 
  58   1       EA=1;	        	     /* 开中断              */
  59   1       while(1)               /* 电机实际控制演示    */
  60   1       {
  61   2         if(sensor1==0&&sensor2==0);
  62   2                                  
  63   2         else
  64   2         {
  65   3         if(sensor1==1)          //判断传感器信号高低
  66   3             motor(1,39);
  67   3         else
  68   3            {        
  69   4             motor(1,34);
  70   4             delay(110);
  71   4             
  72   4            }
  73   3         if(sensor2==1)          //判断传感器信号高低
  74   3             motor(2,40);			
  75   3         else
  76   3            {     
  77   4             motor(2,36);          //减速
  78   4             delay(60);
  79   4            }
  80   3           EX0=1;
  81   3          }
  82   2        }
  83   1      }
  84          
  85          static void timer0() interrupt 1          /* T0中断服务程序 */
  86          {
  87   1       TR0=0;
  88   1       if(t==0)           /* 1个PWM周期完成后才会接受新数值 */
  89   1         {
  90   2           tmp1=m1;
  91   2           tmp2=m2;
  92   2         }
  93   1       if(t<abs(tmp1))
  94   1            s1=1;
  95   1       else s1=0;   /* 产生电机1的PWM信号 */
  96   1       if(t<abs(tmp2))
  97   1            s3=1;
  98   1       else s3=0;   /* 产生电机2的PWM信号 */
  99   1       t++;
 100   1       if(t>=60) t=0; 
 101   1       TR0=1;         /* 1个PWM信号由20次中断产生 */
 102   1      }
 103          void delayz(uint j)      /* 简易延时函数 */
 104          {
 105   1       for(j;j>0;j--);
 106   1      }
 107          
 108          void motorz(uchar index, char speed)
 109          {
 110   1           if(index==1)       /* 电机1的处理    */
 111   1             {
 112   2              en1=1; 
 113   2              n1=speed;
 114   2      		if(speed<0)
 115   2      			s1=0;
 116   2      		else
 117   2      			s2=0;
C51 COMPILER V6.12  ZIBIANPWM2                                                             06/06/2007 08:42:14 PAGE 3   

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

 180   1         if(j==3)
 181   1           {
 182   2             /*stop();
 183   2             ET1=1;
 184   2             TR1=1;
 185   2              if(j==3)
 186   2               {
 187   2                      motorz(1,36);
 188   2                      motorz(2,-32);
 189   2                      delayz(650);
 190   2                }*/
 191   2              // if(j==9)
 192   2                 //{
 193   2                   // motorz(1,-10);
 194   2                   // motorz(2,10);
 195   2                   //delayz(740);
 196   2                  //}
 197   2               stop();
 198   2               
 199   2              while(1);               // 电机实际控制演示    
 200   2      	//{
 201   2      	    //motorz(1,15);     //电机正转
 202   2      	    //motorz(2,-14);    //电机反转
 203   2                   //delayz(1000);
 204   2               //}
 205   2           }
 206   1         else
 207   1         {
 208   2         EX0=0;
 209   2         }  
 210   1         ET1=0; 
 211   1         TR1=0; 
 212   1      }


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