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

📄 fangan2.lst

📁 单片机的电机控制
💻 LST
字号:
C51 COMPILER V6.12  FANGAN2                                                                06/07/2007 08:31:15 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE FANGAN2
OBJECT MODULE PLACED IN .\fangan2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\fangan2.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=40,n1=0;         /* 电机1速度值    */
  18          char m2=40,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  FANGAN2                                                                06/07/2007 08:31:15 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   3         if(sensor1==1)          //判断传感器信号高低
  64   3             motor(1,40);
  65   3         else
  66   3            {        
  67   4             motor(1,37);
  68   4             delay(130);
  69   4             motor(1,40);
  70   4             
  71   4            }
  72   3         if(sensor2==1)          //判断传感器信号高低
  73   3             motor(2,40);			
  74   3         else
  75   3            {     
  76   4             motor(2,37);          //减速
  77   4             delay(130);
  78   4             motor(2,40);
  79   4            }
  80   3          }
  81   2        }
  82   1      }
  83          
  84          static void timer0() interrupt 1          /* T0中断服务程序 */
  85          {
  86   1       TR0=0;
  87   1       if(t==0)           /* 1个PWM周期完成后才会接受新数值 */
  88   1         {
  89   2           tmp1=m1;
  90   2           tmp2=m2;
  91   2         }
  92   1       if(t<abs(tmp1))
  93   1            s1=1;
  94   1       else s1=0;   /* 产生电机1的PWM信号 */
  95   1       if(t<abs(tmp2))
  96   1            s3=1;
  97   1       else s3=0;   /* 产生电机2的PWM信号 */
  98   1       t++;
  99   1       if(t>=60) t=0; 
 100   1       TR0=1;         /* 1个PWM信号由20次中断产生 */
 101   1      }
 102          void delayz(uint j)      /* 简易延时函数 */
 103          {
 104   1       for(j;j>0;j--);
 105   1      }
 106          
 107          void motorz(uchar index, char speed)
 108          {
 109   1           if(index==1)       /* 电机1的处理    */
 110   1             {
 111   2              en1=1; 
 112   2              n1=speed;
 113   2      		if(speed<0)
 114   2      			s1=0;
 115   2      		else
 116   2      			s2=0;
 117   2      	   }
C51 COMPILER V6.12  FANGAN2                                                                06/07/2007 08:31:15 PAGE 3   

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

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


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