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

📄 adc.lst

📁 STC12C5410AD模拟串口再现多串口通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
 194   3                  A10 = 1;                              //选中第7路电池
 195   3                  A9  = 1;                              //A9
 196   3                          A8  = 0;                              //A8
 197   3              }break;
 198   2              case 15 :
 199   2              {
 200   3                  A12 = 0;                  //选通U10-138译码器
 201   3                  A11 = 1;                              //E3
 202   3                  A10 = 1;                              //选中第8路电池
 203   3                  A9  = 1;                              //A9
 204   3                          A8  = 1;                              //A8
 205   3              }break;
 206   2              default: break;
 207   2          }//end switch
 208   1      }
 209          /*********************************************************************************************************
 210          ** 函数名称: uint16 TemperatureLine(uint16 ADResult_T)
 211          ** 功能描述: 负温度系数传感器线性化处理(线性化电压采集最好使用12位ADC这样采样精度高,同样温度精度高)
 212          ** 输   入: 无
 213          ** 输   出: 无
 214          ** 全局变量: 
 215          ** 调用模块: 
 216          **
 217          ** 作   者: 李伟
 218          ** 日   期: 2008年12月09日
 219          **-------------------------------------------------------------------------------------------------------
 220          ** 修 改 人:
 221          ** 日   期:
 222          **-------------------------------------------------------------------------------------------------------
 223          ********************************************************************************************************/
 224          signed char TemperatureLine(uint16 ADT)
 225          {
 226   1          uint16 Current;
 227   1          signed   char TEMPT;
 228   1          unsigned long R,Yout,Temperature,ADResult_T;
 229   1          signed   long T;
 230   1          Temperature  = ADT;
 231   1          ADResult_T   = 5000 - Temperature;
 232   1          Current      = (unsigned int)(ADResult_T*10/100);//扩大10倍计算出电流值 100表示100K电阻
 233   1          R            = Temperature*10000;
 234   1          R            = R/Current;                          //R/Current/1000;;
 235   1          if(R > 181385) //小于-30度    
 236   1          {
 237   2                      T = -30;    
 238   2          }
 239   1              else if(R > 32851)   //小于零度 0 ~ -30
 240   1                       {
 241   2                           Yout         = 1000000000/(1000+0.0169*R);  //将结果扩大到小数点后六位
C51 COMPILER V7.06   ADC                                                                   10/30/2008 13:20:05 PAGE 5   

 242   2                           T            = Yout - 647275;                       
 243   2                           //T            = T/1344;                    //温度取三位整数
 244   2                               T            = T/13440;                     //温度取2位整数            
 245   2                       }
 246   1                       else if(R > 8052)           //小于30度 0 ~ +30
 247   1                            {
 248   2                                        Yout = 1000000000/(1000+0.082*R);      //将结果扩大到小数点后六位
 249   2                                        T    = Yout - 268487;                  
 250   2                                        //T    = T/1120;                       //温度取三位整数 
 251   2                        T    = T/11200;                        //温度取2位整数          
 252   2                            }
 253   1                            else if(R > 2488)      //小于60度  +30 ~ +60
 254   1                                 {
 255   2                                                 Yout = 1000000000/(1000+0.305*R); //将结果扩大到小数点后六位
 256   2                                                 T    = Yout - 9671;                
 257   2                                                 //T    = T/940;                   //温度取三位整数 
 258   2                                             T    = T/9400;                    //温度取2位整数   
 259   2                                 }
 260   1                                 else if(R > 920)  //小于90度    +60 ~ +90
 261   1                                      {
 262   2                                                          Yout = 1000000000/(1000+0.928*R); 
 263   2                                                          T    = Yout + 176081;                
 264   2                                                          //T    = T/796;             //温度取三位整数 
 265   2                                              T    = T/7960;              //温度取2位整数 
 266   2                                      }
 267   1                                      else T = 90;                    //高于90度
 268   1              TEMPT  = (signed char)(T);
 269   1          return TEMPT;
 270   1      } 
 271          /*********************************************************************************************************
 272          ** 函数名称: uint16 Adc_Collect(uint8 adchannel)
 273          ** 功能描述: 模数转换函数
 274          ** 输   入: 无
 275          ** 输   出: 无
 276          ** 全局变量: 
 277          ** 调用模块: 
 278          **
 279          ** 作   者: 李伟
 280          ** 日   期: 2008年12月09日
 281          **-------------------------------------------------------------------------------------------------------
 282          ** 修 改 人:
 283          ** 日   期:
 284          **-------------------------------------------------------------------------------------------------------
 285          ********************************************************************************************************/
 286          uint16 Adc_Collect(uint8 adchannel)
 287          {
 288   1          uint32 Result,ad_data,t;
 289   1          uint16 LDATA;
 290   1          uint8  i,j;
 291   1          //WDT_CONTR = 0x3c;       /************************喂狗************************/
 292   1          ADC_CONTR|= 0x80;         /*AD_Power_On*/
 293   1          delaynms(2);
 294   1              if(adchannel == NEG_CURRENT)    //P1.2 used for negative current collect
 295   1              {
 296   2                  ADC_CONTR = 0xE2;     /*ADC_Power_On_Speed_Channel_2 0xe2;11100010B P1.2做为A/D输入*/
 297   2                      delaynms(2);    
 298   2              }
 299   1              else if(adchannel == ACT_CURRENT)         //P1.3 used for active current collect
 300   1                       {
 301   2                               ADC_CONTR = 0xE3;
 302   2                               delaynms(2);
 303   2                       }
C51 COMPILER V7.06   ADC                                                                   10/30/2008 13:20:05 PAGE 6   

 304   1                       else if(adchannel == OUTS_TEMPERATURE)    //P1.4 used for outside temperature collect
 305   1                                {
 306   2                                        ADC_CONTR = 0xE4;
 307   2                                        delaynms(2);
 308   2                                }
 309   1                                else if(adchannel == CELL_TEMPERATURE)     //P1.5 used for cell temperature collect
 310   1                                         {
 311   2                                                 ADC_CONTR = 0xE5;
 312   2                                                 delaynms(2);
 313   2                                         }
 314   1                                         else if(adchannel == CELL_VOLTAGE)      //P1.6 used for cell voltage collect
 315   1                                              {
 316   2                                                              ADC_CONTR = 0xE6;
 317   2                                                              delaynms(2);
 318   2                                                      }
 319   1          for(i = 0;i < 10;i++)
 320   1          {
 321   2              Result = Get_AD_Result();
 322   2              sum[i] = Result;
 323   2          }
 324   1              //A11 = 1;    //close the channel
 325   1              //A12 = 1;      //close the channel
 326   1          for(j = 0;j < 10;j++)
 327   1          {
 328   2              for(i = 0;i < 9-j;i++)
 329   2              {
 330   3                  if(sum[i] > sum[i+1])
 331   3                  {
 332   4                      t = sum[i];sum[i] = sum[i+1];sum[i+1] = t;
 333   4                  }
 334   3              }
 335   2          }
 336   1              ad_data = 0;
 337   1          for(i = 3;i <= 6;i++)
 338   1          {
 339   2              ad_data += sum[i];
 340   2          }
 341   1          Result = ad_data/4;
 342   1              if(adchannel == NEG_CURRENT)
 343   1              {
 344   2                      ;
 345   2              }
 346   1              else if(adchannel == ACT_CURRENT)
 347   1                   {
 348   2                              ;
 349   2                       }
 350   1                       else if(adchannel == OUTS_TEMPERATURE)
 351   1                            {
 352   2                                    Result*= 5000;   //5000
 353   2                                        Result/= 1024;
 354   2                                        Result*= OTK;
 355   2                                        Result/= 10000;
 356   2                                } 
 357   1                                else if(adchannel == CELL_TEMPERATURE)
 358   1                                 {
 359   2                                         Result*= 5000;   //5000
 360   2                                             Result/= 1024;
 361   2                                             Result*= CTK;
 362   2                                             Result/= 10000;
 363   2      //                                         Suart_Send_Byte(0xAA);
 364   2      //                                         Suart_Send_Byte(Result>>8);
 365   2      //                                         Suart_Send_Byte(Result);
C51 COMPILER V7.06   ADC                                                                   10/30/2008 13:20:05 PAGE 7   

 366   2      //                                         Suart_Send_Byte(0xBB);
 367   2                                     }
 368   1                                         else if(adchannel == CELL_VOLTAGE)
 369   1                                                      {
 370   2                                                              Result*= 10000;   //5000*2
 371   2                                                              Result/= 1024;
 372   2                                                          Result*= CUK;
 373   2                                                              Result/= 10000;
 374   2                                                      }
 375   1          LDATA  = (uint16)(Result);
 376   1          return(LDATA);
 377   1      }
 378          /********************************************************************************************************
 379                                                         End of file
 380          ********************************************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1751    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     40    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      37
   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 + -