📄 adc.lst
字号:
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 + -