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

📄 new0_uart.lst

📁 磁流变阻尼器控制器的源程序
💻 LST
字号:
C51 COMPILER V7.50   NEW0_UART                                                             04/02/2008 13:06:26 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE NEW0_UART
OBJECT MODULE PLACED IN new0_uart.OBJ
COMPILER INVOKED BY: D:\KEIL\C51\BIN\C51.EXE new0_uart.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 collectdata();
  17          void adc_chan(int chan);// 选择通道
  18          void adc_ini();
  19          void adc_start();
  20          void config();
  21          void uart_ini();
  22          void dac_ini();
  23          void port_ini();
  24          //void TIC_ini();
  25          //void TIC_start();
  26          void readval();//读取AD转换值并转为10进制数子函数
  27          void pi();//PI算法子程序
  28          //float Lookuptab(unsigned char voltab);//查表子程序
  29          
  30          int       K;
  31          int   Kout1=0;//将Ka1值进行翻转准备输出到P0口
  32          int   Kout2=0;//将Ka2值进行翻转准备输出到P2口
  33          
  34          int   xdata num1[8];//用作暂时存储Ka1值以便今后进行翻转方便
  35          //int   xdata num2[8];//用作暂时存储Ka2值以便今后进行翻转方便
  36          int   xdata i;
  37          int   Ka1,Ka2;
  38          int   tempval;
  39          //float code Table[6]={1.0,2.0,3.0,4.0,5.0,6.0};//自己暂定的振级表,可以根据实际值修改
  40          float UDA;//UDA为DAC0输出
  41          float UIK=0;//UI的初值设为0 
  42          float xdata MK;//该值为采样的电压值
  43          float RK;
  44          float EK;
  45          float UPK;
  46          float UK;
  47          //int xdata level1;
  48          //int xdata level;
  49          
  50          
  51          void adc_int() interrupt 6  //ADC转换完,进入中断
  52          {
  53   1              I2CCON=0x0C8;//灯灭
  54   1              DELAY(2000);
  55   1              I2CCON=0x048;//灯亮  
C51 COMPILER V7.50   NEW0_UART                                                             04/02/2008 13:06:26 PAGE 2   

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

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

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

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


C51 COMPILER V7.50   NEW0_UART                                                             04/02/2008 13:06:26 PAGE 6   

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