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

📄 text1.lst

📁 基于8051的电机调速程序 基于8051的电机调速程序
💻 LST
字号:
C51 COMPILER V7.06   TEXT1                                                                 09/17/2008 20:17:38 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: D:\keil C51完全破解版\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <REG52.H>
   2          
   3          #define uint  unsigned int
   4          #define uchar unsigned char
   5          
   6          #define tim 65535-5000
   7          #define pwm 2000
   8          
   9          #define T   5
  10          
  11          sbit key0 =P2^0;
  12          sbit key1 =P2^1;
  13          sbit PWMB =P3^3;                                        //PWM输出口
  14          
  15          bit  PWMX;
  16          
  17          uint pwmh,pwml,pwmm;
  18          uint sudu_set,sudu_now;
  19          int e0,sudu_d;
  20          
  21          uchar pid_b,tm=0;
  22          uchar count;
  23          
  24          uchar disp[5],dis =0;
  25          uchar key,keyx;
  26          int     para[4];
  27          char    ptr =0;
  28          uchar code numtab[5] ={ 0x40,0x20,0x10,0x04,0x08 };                                     //按键与显示扫描口
  29          uchar code distab[16]={ 0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,        //数码管显示值
  30                                                          0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71 };
  31          uchar code ledtab[8] ={ 0x08,0x10,0x20,0x40,0x80 };                                     //LED显示
  32          
  33          
  34          void delay(uint timer)
  35          {
  36   1              for(;timer >0;timer --);
  37   1      }
  38          
  39          void distran()
  40          {
  41   1              disp[4]=distab[para[ptr]%10];                   //编码转换
  42   1              disp[0]=distab[(para[ptr]/10)%10];
  43   1              disp[1]=distab[(para[ptr]/100)%10];
  44   1              disp[2]=distab[(para[ptr]/1000)%10];
  45   1              disp[3]=~ledtab[ptr];                           //选中要点亮的LED
  46   1      }
  47          
  48          void display()
  49          {
  50   1              dis=(dis+1)%5;
  51   1              P2 =0xff;
  52   1              P0 =disp[dis];                                                  //扫描数码管和LED
  53   1              P2 =~numtab[dis];
  54   1      
  55   1              key0=1;         key1=1;                                         //读取按键值
C51 COMPILER V7.06   TEXT1                                                                 09/17/2008 20:17:38 PAGE 2   

  56   1              if(!key0)       keyx=dis+1;
  57   1              if(!key1)       keyx=dis+5;
  58   1      }
  59          
  60          void keyproc()                                                          //按键处理程序
  61          {
  62   1              if(key>0)
  63   1              {
  64   2                      if(ptr!=1)
  65   2                      {
  66   3                              switch(key)
  67   3                              {
  68   4                                      case 1: para[ptr]--;    break;                  //设定速度值
  69   4                                      case 5: para[ptr]++;    break;
  70   4                                      case 2: para[ptr]-=10;  break;
  71   4                                      case 6: para[ptr]+=10;  break;
  72   4                                      case 3: para[ptr]-=100; break;
  73   4                                      case 7: para[ptr]+=100; break;
  74   4                                      case 4: ptr--; break;
  75   4                                      case 8: ptr++; break;
  76   4                              }
  77   3                      }
  78   2                      else
  79   2                      {
  80   3                              switch(key)
  81   3                              {
  82   4                                      case 4: ptr--; break;
  83   4                                      case 8: ptr++; break;
  84   4                              }
  85   3                      }
  86   2                      if(ptr>2) ptr=0;
  87   2                      if(ptr<0) ptr=2;
  88   2                      if(para[ptr]<0)   para[ptr]=0;
  89   2                      if(para[ptr]>1000) para[ptr]=1000;
  90   2                      distran();                                                              //刷新显示
  91   2              }
  92   1              key=0;
  93   1      }
  94          
  95          /***************PID算法********************/
  96          void PID_Control(void)
  97          {       
  98   1              sudu_now = TH1*256+TL1;                                         //读取速度反馈值
  99   1              
 100   1              TH1 =0; 
 101   1              TL1 =0;
 102   1              TR1 =1;
 103   1              para[1] = sudu_now*40;
 104   1              if(para[1] >(sudu_set+40))
 105   1              {
 106   2                      e0 =(para[1]-sudu_set)/4;
 107   2                      pwml =pwmm-e0;
 108   2                      if(pwml >2000)
 109   2                      {
 110   3                              pwml =2000;
 111   3                      }
 112   2                      pwmh =pwm-pwml;
 113   2                      pwmh =65535-pwmh;  
 114   2                      pwml =65535-pwml;
 115   2              }
 116   1              else
 117   1              if(para[1] <(sudu_set-40))
C51 COMPILER V7.06   TEXT1                                                                 09/17/2008 20:17:38 PAGE 3   

 118   1              {
 119   2                      e0 =(sudu_set-para[1])/4;
 120   2                      pwml =pwmm+e0;                          //计算输出占空比
 121   2                      if(pwml <1)
 122   2                      {
 123   3                              pwml =1;
 124   3                      }
 125   2                      pwmh =pwm-pwml;
 126   2                      pwmh =65535-pwmh;  
 127   2                      pwml =65535-pwml;
 128   2              }
 129   1      }
 130          
 131          void timer0() interrupt 1 using 0  //显示扫描
 132          {
 133   1              if(!PWMX)
 134   1              {
 135   2              TH0 =pwmh>>8;
 136   2                      TL0 =pwmh;
 137   2              }
 138   1              else
 139   1              {
 140   2              TH0 =pwml>>8;
 141   2                      TL0 =pwml;
 142   2              }
 143   1              PWMX =~PWMX;
 144   1              PWMB =PWMX;
 145   1              
 146   1      }
 147          
 148          void timer2() interrupt 5 using 2       //PWM输出
 149          {
 150   1              TF2 =0;
 151   1              TH2 =tim>>8; 
 152   1              TL2 =tim;
 153   1              tm ++;
 154   1              if(tm ==T) 
 155   1          {           
 156   2                      tm =0;
 157   2                      TR1 =0;
 158   2                      pid_b =1;
 159   2              }
 160   1              display();
 161   1      }
 162          
 163          void timer_int(void)
 164          {
 165   1              TMOD=0x51;                                      //设置定时器0的工作模式----定时模式,定时器1的工作模式----计数模式 //51
 166   1              T2CON=0x00;                                     //T2MOD=0x00;   //定时器2模式设置----定时模式(向上计数)
 167   1      
 168   1              TH0 =tim>>8; 
 169   1              TL0 =tim; 
 170   1              TH1 =0; 
 171   1              TL1 =0; 
 172   1              TH2 =tim>>8;
 173   1              TL2 =tim;
 174   1              
 175   1              ET0 =0;                 //定时器0开中断
 176   1              ET1 =0;                 //定时器1关中断
 177   1              ET2 =1;                 //定时器2关中断
 178   1      
 179   1              TR0 =1;                 //启动定时器0
C51 COMPILER V7.06   TEXT1                                                                 09/17/2008 20:17:38 PAGE 4   

 180   1              TR1 =1;                 //启动计数器1
 181   1              TR2 =1;                 //启动定时器2
 182   1      
 183   1              EA = 1;                 //开总中断
 184   1      }
 185          
 186          void main()
 187          {       
 188   1              char i;
 189   1      
 190   1              PWMB =1;
 191   1              timer_int();
 192   1              for(i=0;i<3;i++) 
 193   1                      para[i]=i;                                      //初始化速度存储数组
 194   1              distran();                                              //刷新显示缓存区
 195   1              sudu_set = para[0];
 196   1              while(1)
 197   1              {
 198   2                      if(keyx >0)
 199   2                      {
 200   3                              key =keyx;
 201   3                              while(keyx!=0) {keyx=0; delay(2500);}   
 202   3                              keyproc();                                                      //调用按键处理程序
 203   3                              sudu_set =para[0];
 204   3                              if(sudu_set <300)
 205   3                              {
 206   4                                      PWMB =1;
 207   4                                      ET0 =0;
 208   4                              }
 209   3                              else
 210   3                              {
 211   4                                      PWMB =0;
 212   4                                      pwmm = (sudu_set/1.28)-para[2]; 
 213   4                                      pwmh =pwm-pwmm;
 214   4                                      pwmh =65535-pwmh;  
 215   4                                      pwml =65535-pwmm;
 216   4                                      ET0 =1;
 217   4                              }
 218   3                      }
 219   2                  if(pid_b)
 220   2                      {       
 221   3                              pid_b =0;
 222   3                              PID_Control();                                                  //调用PID调速程序
 223   3                              count++;
 224   3                              if(count >10) {count=0; distran();}     //刷新显示
 225   3                      }
 226   2              }
 227   1      }


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