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

📄 k-2.lst

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


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

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

 118   2      	   if(t1<abs(n2))
 119   2      		   s3=1;
 120   2      	   else s3=0;   /* 产生电机2的PWM信号 */
 121   2         }
 122   1       else
 123   1         {
 124   2      	 if(t1<abs(n2))
 125   2      		  s4=1;
 126   2             else s4=0;   /* 产生电机2的PWM信号 */
 127   2         } 
 128   1       t1++;
 129   1       if(t1>=60) t1=0;      /* 1个PWM信号由60次中断产生 */
 130   1       TR1=1;
 131   1      }
 132          void stop()
 133          {
 134   1        ET1=0;
 135   1        TR1=0; 
 136   1        en1=en2=1;
 137   1        s1=s3=0;
 138   1        s2=s4=0;                //实现快速停止
 139   1        delayz(5000);
 140   1        ET1=1;
 141   1        TR1=1;
 142   1        
 143   1      }
 144          static void xint0_isr(void) interrupt 0
 145          {
 146   1         static uchar j=0;
 147   1         j++;
 148   1         if(j==2||j==4||j==6)
 149   1           {
 150   2             stop();
 151   2             ET1=1;
 152   2             TR1=1;
 153   2              if(j==2)
 154   2               {
 155   3                      motorz(1,37);
 156   3                      motorz(2,-37);
 157   3                      delayz(520);
 158   3                      stop();
 159   3                      motorz(1,58);
 160   3                      motorz(2,60);
 161   3                      delayz(35);
 162   3                }
 163   2               if(j==4)
 164   2                 {
 165   3                  motorz(1,-37);
 166   3                  motorz(2,37);
 167   3                  delayz(300);
 168   3                  stop();
 169   3                  motorz(1,60);
 170   3                  motorz(2,59);
 171   3                  delayz(750);
 172   3                  stop();
 173   3                  motorz(1,36);
 174   3                  motorz(2,-32);
 175   3                  delayz(330);
 176   3                  stop();
 177   3                  motorz(1,58);
 178   3                  motorz(2,60);
 179   3                  delayz(35);
C51 COMPILER V6.12  K_2                                                                    06/08/2007 14:36:56 PAGE 4   

 180   3                 }
 181   2               if(j==6)
 182   2                {
 183   3                  motorz(1,-40);
 184   3                  motorz(2,-31);
 185   3                  delayz(1200);
 186   3                  while(1)
 187   3                  {
 188   4                   stop();
 189   4                   ET1=0;
 190   4                   TR1=0;
 191   4                  }
 192   3                }
 193   2             }
 194   1         else
 195   1         {
 196   2         ET1=1;
 197   2         TR1=1;
 198   2         motorz(1,m1);
 199   2         motorz(2,m2);
 200   2         delayz(550);
 201   2         }  
 202   1         ET1=0; 
 203   1         TR1=0; 
 204   1      }


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