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

📄 k4+10.lst

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


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

  56   2        motor(2,60);
  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  K4_10                                                                  06/08/2007 14:17:18 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          static void xint0_isr(void) interrupt 0
 144          {
 145   1         static uchar j=0;
 146   1         j++;
 147   1         if(j==3||j==9)
 148   1           {
 149   2             stop();
 150   2              if(j==3)
 151   2               {
 152   3                      motorz(1,37);
 153   3                      motorz(2,-37);
 154   3                      delayz(570);
 155   3                      stop();
 156   3                      motorz(1,58);
 157   3                      motorz(2,60);
 158   3                      delayz(200);
 159   3                }
 160   2               if(j==9)
 161   2                 {
 162   3                  motorz(1,-45);
 163   3                  motorz(2,-31);
 164   3                  delayz(1200);
 165   3                  while(1)
 166   3                  {
 167   4                  stop();
 168   4                  ET1=0;
 169   4                  TR1=0;
 170   4                  }
 171   3                 }
 172   2           }
 173   1         else
 174   1         {
 175   2         ET1=1;
 176   2         TR1=1;
 177   2         motorz(1,m1);
 178   2         motorz(2,m2);
 179   2         delayz(550);
C51 COMPILER V6.12  K4_10                                                                  06/08/2007 14:17:18 PAGE 4   

 180   2         }  
 181   1         ET1=0; 
 182   1         TR1=0; 
 183   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    645    ----
   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 + -