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

📄 tes1.lst

📁 基于8051的电机调速程序 基于8051的电机调速程序
💻 LST
字号:
C51 COMPILER V7.06   TES1                                                                  09/17/2008 22:01:04 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TES1
OBJECT MODULE PLACED IN .\Tes1.obj
COMPILER INVOKED BY: D:\keil C51完全破解版\C51\BIN\C51.EXE ..\Tes1.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\Tes1.obj)

stmt level    source

   1          #include <AT89X52.H>
   2          #define uint unsigned int
   3          #define uchar unsigned char
   4          #define tim 65535-5000
   5          #define pwm 1100
   6          #define K 1
   7          #define Kp  1
   8          #define Ki  0
   9          #define Kd  1
  10          #define T  4
  11          sbit dis0 =P2^6;
  12          sbit dis1 =P2^5;
  13          sbit dis2 =P2^4;
  14          sbit dis3 =P2^3;
  15          sbit dis4 =P2^2;
  16          sbit key1 =P2^1;
  17          sbit key0 =P2^0;
  18          sbit PWMB=P1^0;
  19          
  20          bit  PWMX;
  21          
  22          uint pwmh,pwml;
  23          int sudu_set,sudu_now,sudu_old;
  24          int e0=0,e1=0,e2=0,sudu_d;
  25          int sb;
  26          uchar pid_b,tm;
  27          uchar count;
  28          
  29          uchar disp[5],dis;
  30          uchar key,keyx,ts;
  31          int para[8],ptr;
  32          uchar code numtab[5]={0x40,0x20,0x10,0x04,0x08};
  33          uchar code distab[16]={ 0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,
  34                                                          0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71};
  35          uchar code ledtab[8]={0x08,0x10,0x20,0x40,0x88,0x90,0xa0,0xc0};
  36          
  37          void time(uint tm)
  38          {
  39   1              for(tm;tm>0;tm--);
  40   1      }
  41          
  42          void distran()
  43          {
  44   1              disp[4]=distab[para[ptr]%10];      //编码转换
  45   1              disp[0]=distab[(para[ptr]/10)%10];
  46   1              disp[1]=distab[(para[ptr]/100)%10];
  47   1              disp[2]=distab[(para[ptr]/1000)%10];
  48   1              disp[3]=~ledtab[ptr];              //选中要点亮的LED
  49   1      }
  50          
  51          void display()
  52          {
  53   1              dis=(dis+1)%5;
  54   1              P2=0xff;
  55   1              P0=disp[dis];      //扫描数码管和LED
C51 COMPILER V7.06   TES1                                                                  09/17/2008 22:01:04 PAGE 2   

  56   1              P2=~numtab[dis];
  57   1      
  58   1              key0=1; key1=1;         //读取按键值
  59   1              if(!key0) keyx=dis+1;
  60   1              if(!key1) keyx=dis+5;
  61   1      }
  62          
  63          void keyproc()         //按键处理程序
  64          {
  65   1              if(key>0)
  66   1              {
  67   2                      switch(key)
  68   2                      {
  69   3                              case 1: para[ptr]--; break;             //设定速度值
  70   3                              case 5: para[ptr]++; break;
  71   3                              case 2: para[ptr]-=10; break;
  72   3                              case 6: para[ptr]+=10; break;
  73   3                              case 3: para[ptr]-=100; break;
  74   3                              case 7: para[ptr]+=100; break;
  75   3                              case 4: ptr--; break;
  76   3                              case 8: ptr++; break;
  77   3                      }
  78   2                      if(ptr>2) ptr=0;
  79   2                      if(ptr<0) ptr=2;
  80   2                      if(para[ptr]<0) para[ptr]=0;
  81   2                      if(para[ptr]>1000) para[ptr]=1000;
  82   2                      distran();           //刷新显示
  83   2              }
  84   1              key=0;
  85   1      }
  86          
  87          
  88          /***************PID算法********************/
  89          void PID_Control(void)
  90          {       
  91   1          sudu_old = sudu_now;
  92   1              sudu_now =TH1*256+ TL1;    //读取速度反馈值  
  93   1              para[1] = sudu_now*40;
  94   1              para[2]=TH1;
  95   1              TH1=0; TL1=0;
  96   1              e2=e1;e1=e0;
  97   1              e0 = sudu_set-(sudu_now*40);    // 偏差
  98   1                         //sudu_d = sudud_now-sudu_old;       // 微分
  99   1              sb += Kp*e0;    //+ Kd*sudu_d;
 100   1              if(sb<1) sb=0;
 101   1              else if(sb>6000) sb=6000;
 102   1              pwml=sudu_set;//sb*K;                     // pwmh=sb*k,k=30
 103   1              pwmh=pwm*3-pwml;       //计算输出占空比
 104   1              pwmh=65535-pwmh;  
 105   1              pwml=65535-pwml; 
 106   1      }
 107          
 108          void timer0() interrupt 1 using 0  //显示扫描
 109          {
 110   1               TH0=tim>>8;
 111   1           TL0=tim;
 112   1              tm++;
 113   1              if(tm>T) 
 114   1          {pid_b=1;tm=0; }
 115   1              display();
 116   1      }
 117          
C51 COMPILER V7.06   TES1                                                                  09/17/2008 22:01:04 PAGE 3   

 118          void timer1() interrupt 3 using 1       //脉冲检测-----计数法
 119          {
 120   1      }
 121          
 122          void temer2() interrupt 5 using 2       //PWM输出
 123          {       TF2=0;
 124   1              if(!PWMX)
 125   1              {
 126   2              TH2=pwmh>>8;TL2=pwmh;
 127   2              }
 128   1              else
 129   1              {
 130   2              TH2=pwml>>8;TL2=pwml;
 131   2              }
 132   1              PWMX=~PWMX;
 133   1              PWMB=PWMX;
 134   1      }
 135          
 136          void main()
 137          {       char i;
 138   1              EA = 1;
 139   1              TMOD=0X01;      //设置定时器0的工作模式----定时模式
 140   1              ET0=1;          //定时器0开中断
 141   1              TH0=tim>>8; TL0=tim; TR0=1;     //启动定时器0定时5ms
 142   1              TMOD|=0X50; //设置定时器1的工作模式----计数模式
 143   1              ET1=0;          //定时器1关中断
 144   1              TH1=0; TL1=0; TR1=1;    //启动计数器1
 145   1              T2MOD=0x00;     //定时器2模式设置----定时模式(向上计数)
 146   1              T2CON=0x00;     
 147   1              ET2=1;     //定时器2开中断
 148   1              TH2=tim>>8; TL2=tim; TR2=1;     //启动定时器2
 149   1      
 150   1              dis=0;ptr=0;
 151   1              for(i=0;i<5;i++) para[i]=i;     //初始化速度存储数组
 152   1              distran();      //刷新显示缓存区
 153   1              sudu_set = para[0];
 154   1              /*pwmh=sudu_set*30;
 155   1              pwml=pwm-pwmh;
 156   1              pwmh=65535-pwmh;  
 157   1              pwml=65535-pwml; */ 
 158   1              for(;;)
 159   1              {
 160   2                      if(keyx>0)
 161   2                      {
 162   3                              key=keyx;
 163   3                              while(keyx!=0) {keyx=0; time(3000);}    //等待按键 
 164   3                              keyproc();         //调用按键处理程序
 165   3                              sudu_set = para[0];
 166   3                      }
 167   2      
 168   2                      if(!para[0]){PWMB=1;}           else  
 169   2      
 170   2                  if(pid_b)
 171   2                      {       pid_b = 0;
 172   3                              PID_Control();   //调用PID调速程序
 173   3                              count++;
 174   3                              if(count>10) {count=0; distran();}   //刷新显示
 175   3                      }
 176   2              }
 177   1      }


C51 COMPILER V7.06   TES1                                                                  09/17/2008 22:01:04 PAGE 4   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    893    ----
   CONSTANT SIZE    =     29    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     50    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -