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

📄 new0.lst

📁 磁流变阻尼器控制器的源程序
💻 LST
字号:
C51 COMPILER V7.50   NEW0                                                                  04/01/2008 17:24:27 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE NEW0
OBJECT MODULE PLACED IN new0.OBJ
COMPILER INVOKED BY: I:\Keil\C51\BIN\C51.EXE new0.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //加定时器已完成 现在的采样频率为32Hz
   2          //主体部分已经完成,Ka已经计算正确,给P2端口赋值能正确显示,但通过Ka给P2传递
   3          //增益时,P2输出亦正确,调整PI算法已调整,振级表是使用自己编写的一个,P0输出
   4          //正确了(实施办法是将P0赋值位置提前就解决了)
   5          #include<stdio.h>
   6          #include<aduc842.h>
   7          #include<math.h>
   8          
   9          #define KP 0.5//暂定Kp=5
  10          #define KI 0.5//暂定Ki=5
  11          
  12          sfr templ=0x86;
  13          sfr temph=0x85;
  14          
  15          void DELAY(int length);
  16          void adc_chan(int chan);// 选择通道
  17          void adc_ini();
  18          void adc_start();
  19          void config();
  20          void uart_ini();
  21          void dac_ini();
  22          void port_ini();
  23          //void TIC_ini();
  24          //void TIC_start();
  25          void readval();//读取AD转换值并转为10进制数子函数
  26          void pi();//PI算法子程序
  27          //float Lookuptab(unsigned char voltab);//查表子程序
  28          
  29          int       K;
  30          int   Kout1=0;//将Ka1值进行翻转准备输出到P0口
  31          int   Kout2=0;//将Ka2值进行翻转准备输出到P2口
  32          
  33          int   xdata num1[8];//用作暂时存储Ka1值以便今后进行翻转方便
  34          //int   xdata num2[8];//用作暂时存储Ka2值以便今后进行翻转方便
  35          int   xdata i;
  36          int   Ka1,Ka2;
  37          int   tempval;
  38          float code Table[6]={1.0,2.0,3.0,4.0,5.0,6.0};//自己暂定的振级表,可以根据实际值修改
  39          float UDA;//UDA为DAC0输出
  40          float UIK=0;//UI的初值设为0 
  41          float xdata MK;//该值为采样的电压值
  42          float RK;
  43          float EK;
  44          float UPK;
  45          float UK;
  46          //int xdata level1;
  47          //int xdata level2;
  48          
  49          
  50          void adc_int() interrupt 6  //ADC转换完,进入中断
  51          {
  52   1              I2CCON=0x0C8;//灯灭
  53   1              DELAY(2000);
  54   1              I2CCON=0x048;//灯亮  
  55   1              temph=ADCDATAH;
C51 COMPILER V7.50   NEW0                                                                  04/01/2008 17:24:27 PAGE 2   

  56   1              templ=ADCDATAL;//转换值暂存到temp中
  57   1              ADCI = 0;//可要可不要,如果不进入ADC中断,则须用户手动清零
  58   1              return;
  59   1      }
  60          
  61          
  62          
  63          void adc_chan(int chan)
  64          {
  65   1      ADCCON2 = chan;
  66   1      }
  67          
  68          
  69          
  70          void adc_ini()
  71          {
  72   1      ADCCON1 = 0x02C;            // 暂停AD
  73   1      EA          = 0;                                // 中断不使能
  74   1      EADC    = 0;                            // ADC中断不使能
  75   1      
  76   1      }
  77          
  78          void adc_start()
  79          {
  80   1      ADCCON1 = 0x0AC;            // 启动AD,使用内部参考电压
  81   1      EA          = 1;                                // 中断使能
  82   1      EADC    = 1;                            // ADC中断使能
  83   1      }
  84          
  85          void config()
  86          {
  87   1      CFG842 = 0x41;      //暂定
  88   1      PLLCON = 0x03;          //工作频率=2.097152 MHz
  89   1      
  90   1      
  91   1      }
  92          
  93          void uart_ini()         //串口初始化
  94          {
  95   1      T3CON = 0x083;
  96   1      T3FD  = 0x02D;
  97   1      SCON  = 0x052;
  98   1      }
  99          
 100          void dac_ini()
 101          {
 102   1      DACCON = 0x0D;//DAC0 12位异步 0-Cref=5v
 103   1      //DACCON = 0x2D;//DAC0 12位异步 0-Vdd
 104   1      }
 105          
 106          void port_ini()//根据需要设置AD7520增益值
 107          {
 108   1      P0&=0x00;
 109   1      P2&=0x00;
 110   1      //P2|=0x64;//0110,0100
 111   1      //P2|=0xC4;//1110,0101
 112   1      }
 113          
 114          
 115          
 116          void readval()
 117          {
C51 COMPILER V7.50   NEW0                                                                  04/01/2008 17:24:27 PAGE 3   

 118   1      
 119   1      tempval=(int)temph*256;//强制转换为整形数
 120   1      tempval+=(int)templ;//此时计算的是十进制的AD结果,比如若temph:templ=03ff,则对应于1023
 121   1      
 122   1      }
 123          
 124          /*float Lookuptab(unsigned char voltab)
 125           {
 126           return Table[voltab];
 127           }
 128          */
 129          /*void pi()
 130          {
 131                  
 132                  
 133                  //UDA=5;//UDA为方便计算设置的一个变量
 134                  //UK=UDA;//调试时先可直接把Uk=5v来计算,等到完成后在应用下面的PI算法
 135                  DELAY(500);
 136                       if(level2 == 0)  {RK=Lookuptab(0);}
 137                  else if(level2 == 1)  {RK=Lookuptab(1);}
 138                  else if(level2 == 2)  {RK=Lookuptab(2);}
 139                  else if(level2 == 3)  {RK=Lookuptab(3);}
 140                  else if(level2 == 4)  {RK=Lookuptab(4);}
 141                  else                  {RK=Lookuptab(5);}//这段程序目的是查表确定振动的给定参考值以便与采集来的数据比
             -较
 142                  
 143                  EK=RK-MK2;
 144                  UPK=KP*EK;
 145                  UIK=KI*EK+UIK;
 146                  UK=UPK+UIK;
 147                  K=(UK/UDA*1024);//现将()内表达式的值取整,此值处理后即为送往AD7520的增益值,
 148                  
 149                  Ka2=K>>2;//因为电路板上低两位已拉高,所以只需要高8位
 150                  Ka2=0x00;
 151                  //Ka&=0x00FF;//只用了低八位
 152                  //Ka = 0x0064;//为测试方便
 153                  MK1 = MK2;
 154                  level1 = level2;
 155          }
 156          */
 157          
 158          
 159          void main(void)//主程序开始
 160          {       
 161   1              DELAY(100);
 162   1              config();
 163   1              adc_ini();
 164   1              adc_chan(0);
 165   1              uart_ini();
 166   1              dac_ini();
 167   1              
 168   1              port_ini();//p0和p2的初始化
 169   1              printf("P0=%02BX\n",P0);
 170   1              
 171   1              //DELAY(2000);
 172   1              //TIC_ini();
 173   1              //DELAY(2000);
 174   1              //P0&=0x00;//如果要调整P0口增益值,则打开此句
 175   1              //DELAY(2000);
 176   1              //P0|=0xFF;//第一级AD7520增益先设为不放大,即放大倍数为(1023/1024)
 177   1              //DELAY(2000);
 178   1              //printf("P0=%02BX\n",P0);
C51 COMPILER V7.50   NEW0                                                                  04/01/2008 17:24:27 PAGE 4   

 179   1              //printf("UIK=%f\n",UIK);
 180   1              DAC0H=0x07;
 181   1          DAC0L=0xFF;//AC0输出恒值2.5v
 182   1              //i=0;
 183   1              //adc_start();
 184   1              //SCONV = 1;                                    //启动AD转换
 185   1              /////////////////初始化
 186   1              for (i=0;i<8;i++)
 187   1              {
 188   2                      num1[i] = 1;
 189   2              }
 190   1              MK=1.1;//初始设定值为1.1v
 191   1              Ka1=0xFF;//初始化p0口的值
 192   1              Ka2=0xFF;//初始化p2口的值
 193   1              //Ka = 0x0064;//0110,0100 用于测试用,并不是实际值
 194   1      
 195   1              //////////////////////////////初始化完成
 196   1      
 197   1              while(1){       //连续进行AD转换
 198   2              
 199   2              adc_start();
 200   2              SCONV = 1;                              //开始一次转换
 201   2              DELAY(1000);                    //调延迟,等待转换完毕
 202   2              if (ADCI == 0)                  //中断处理完毕标志,进行输出
 203   2              {
 204   3              printf("temph=%02BX,templ=%02BX\n",temph,templ);//串口输出转换值
 205   3              //printf("UIK=%f\n",UIK);
 206   3              
 207   3              readval();
 208   3              DELAY(500);
 209   3              MK=(float)tempval*5/4096;//必须强制转换为浮点数,否则结果不对
 210   3              //MK=2.5;
 211   3      
 212   3                   if(0<=MK&MK<=1)  { Ka1=0x2A;}//Ka1的值未确定,暂时以0x00代替
 213   3              else if(1<MK&MK<=2)  {  Ka1=0x55;}
 214   3              else if(2<MK&MK<=3)  {  Ka1=0x80;}
 215   3              else if(3<MK&MK<=4)  {  Ka1=0xAB;}
 216   3              else if(4<MK&MK<=5)  {  Ka1=0xD5;}
 217   3          else                     {  Ka1=0xFF;}//这段程序目的是查表确定振动的给定参考值以便与采集来的数据比较
 218   3              
 219   3      
 220   3              printf("MK=%f\n",MK);
 221   3              //printf("RK=%f\n",RK);
 222   3              //printf("EK=%f\n",EK);
 223   3              //printf("UPK=%f\n",UPK);
 224   3              //printf("UIK=%f\n",UIK);
 225   3              //printf("UK=%f\n",UK);
 226   3          //printf("K=%04X\n",K);
 227   3              printf("Ka1=%04X\n",Ka1);
 228   3      
 229   3              /////将Ka值进行翻转并输出到P0口
 230   3              //方法一
 231   3      
 232   3              num1[0]=Ka1&0x01;
 233   3              num1[1]=Ka1&0x02;
 234   3              num1[2]=Ka1&0x04;
 235   3              num1[3]=Ka1&0x08;
 236   3              num1[4]=Ka1&0x10;
 237   3              num1[5]=Ka1&0x20;
 238   3              num1[6]=Ka1&0x40;
 239   3              num1[7]=Ka1&0x80;
 240   3      
C51 COMPILER V7.50   NEW0                                                                  04/01/2008 17:24:27 PAGE 5   

 241   3              for (i=0;i<8;i++)
 242   3              {
 243   4                      if (num1[i]==pow(2,i))
 244   4                         num1[i]=1;
 245   4                      else num1[i]=0;
 246   4              }
 247   3              Kout1 = 0;
 248   3              for (i=0;i<8;i++)
 249   3              {       
 250   4                      
 251   4                      Kout1 +=pow(2,(7-i))*num1[i];
 252   4              }
 253   3              P0 = Kout1; //本应该为此句,再次利用下句做以简单替代用于测试
 254   3              Kout2 = Ka2;
 255   3              P2 = Kout2;
 256   3      
 257   3              
 258   3              //P2|=Ka;//正式给端口赋值,产生AD7520增益
 259   3              //P2^=Ka;//正式给端口赋值,产生AD7520增益
 260   3              DELAY(500);
 261   3              printf("P2=%02BX\n",P2);//显示P2口置位是否正确
 262   3              printf("P0=%02BX\n",P0);
 263   3              printf("num1[0]=%d\n",num1[0]);
 264   3              printf("num1[1]=%d\n",num1[1]);
 265   3              printf("num1[2]=%d\n",num1[2]);
 266   3              printf("num1[3]=%d\n",num1[3]);
 267   3              printf("num1[4]=%d\n",num1[4]);
 268   3              printf("num1[5]=%d\n",num1[5]);
 269   3              printf("num1[6]=%d\n",num1[6]);
 270   3              printf("num1[7]=%d\n\n",num1[7]);
 271   3              DELAY(1000);
 272   3      
 273   3      
 274   3              }
 275   2                              }
 276   1      }
 277          
 278          void DELAY(int length)//延迟函数
 279          {
 280   1      while (length >=0)
 281   1          length--;
 282   1      }
 283                          
 284          
 285          
 286          
 287          
 288          
 289          


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