📄 fantest.lst
字号:
290 2 Delay_us(CN_45us); /* 延时45us */
291 2 AD_TEMP2 = 0;
292 2 Delay_us(CN_525us); /* 精确延时大于480us,取525us */
293 2 AD_TEMP2 = 1; /* 拉高端口 */
294 2 Delay_us(CN_30us);
295 2 k=0; /* 滤波计数器. */
296 2 for(j=0;j<10;j++)
297 2 {
C51 COMPILER V7.50 FANTEST 07/21/2006 16:14:00 PAGE 6
298 3 if(!AD_TEMP2) /* 如果检测结果为0则初始化成功,为1则失败. */
299 3 {
300 4 k++; /* 检测到低电平加1. */
301 4 }
302 3 }
303 2 if(k>3)
304 2 gb_18b20init2_ok = TRUE; /* 复位成功. */
305 2 else
306 2 gb_18b20init2_ok = FALSE;/* 复位失败. 温感开路或温感损坏 */
307 2 Delay_us(CN_200us);
308 2 k=0;
309 2 AD_TEMP2=1; /* 输入允许 */
310 2 if(TRUE==gb_18b20init2_ok)
311 2 {
312 3 for(j=0;j<10;j++)
313 3 {
314 4 if(AD_TEMP2) /* 如果检测结果为1则初始化成功,为0则失败. */
315 4 {
316 5 k++; /* 检测到高电平加1 */
317 5 }
318 4 }
319 3 if(k>3)
320 3 gb_18b20init2_ok = TRUE; /* 复位成功 */
321 3 else
322 3 gb_18b20init2_ok = FALSE; /* 复位失败, 温感对地短路 */
323 3 }
324 2 }
325 1 }
326
327 /***************************************************************************
328 函数名称: DS18B20_Readchar
329 函数功能: 从DS18B20读一个字节
330 输入参数: 温度传感器号
331 输出参数: 返回读取的字节型值
332 ***************************************************************************/
333 uchar DS18B20_Readchar(uchar temp_number)
334 {
335 1 uchar i,d_data;
336 1
337 1 d_data=0;
338 1 if(temp_number==CN_TEMP1)
339 1 {
340 2 for (i=8;i>0;i--)
341 2 {
342 3 EA = 0;
343 3 AD_TEMP1 = 0; /* 给脉冲信号 */
344 3 d_data>>=1;
345 3 AD_TEMP1 = 1; /* 读允许 */
346 3 if(AD_TEMP1)
347 3 d_data|=0x80;
348 3 EA = 1;
349 3 Delay_us(CN_60us);
350 3 }
351 2 EA = 1;
352 2 }
353 1 if(temp_number==CN_TEMP2)
354 1 {
355 2 for (i=8;i>0;i--)
356 2 {
357 3 EA = 0;
358 3 AD_TEMP2 = 0; /* 给脉冲信号 */
359 3 d_data>>=1;
C51 COMPILER V7.50 FANTEST 07/21/2006 16:14:00 PAGE 7
360 3 AD_TEMP2 = 1; /* 读允许 */
361 3 if(AD_TEMP2)
362 3 d_data|=0x80;
363 3 EA = 1;
364 3 Delay_us(CN_60us);
365 3 }
366 2 EA = 1;
367 2 }
368 1 Delay_us(CN_60us);
369 1 return(d_data);
370 1 }
371
372 /***************************************************************************
373 函数名称: DS18B20_Writechar
374 函数功能: 向DS18B20写一个字节
375 输入参数: 要写入的字节型参数, 温度传感器号
376 输出参数: 无
377 ***************************************************************************/
378 void DS18B20_Writechar(uchar d_data,uchar temp_number)
379 {
380 1 uchar i;
381 1
382 1 if(temp_number==CN_TEMP1)
383 1 {
384 2 for (i=8;i>0;i--)
385 2 {
386 3 EA = 0;
387 3 AD_TEMP1 = 0;
388 3 AD_TEMP1 = d_data&0x01;
389 3 Delay_us(CN_45us);
390 3 EA = 1;
391 3 AD_TEMP1 = 1;
392 3 d_data>>=1;
393 3 }
394 2 EA = 1;
395 2 }
396 1 if(temp_number==CN_TEMP2)
397 1 {
398 2 for (i=8;i>0;i--)
399 2 {
400 3 EA = 0;
401 3 AD_TEMP2 = 0;
402 3 AD_TEMP2 = d_data&0x01;
403 3 Delay_us(CN_45us);
404 3 EA = 1;
405 3 AD_TEMP2 = 1;
406 3 d_data>>=1;
407 3 }
408 2 EA = 1;
409 2 }
410 1 Delay_us(CN_60us);
411 1 }
412
413 /***************************************************************************
414 函数名称: DS18B20_Gettemp
415 函数功能: 从DS18B20读取温度值
416 输入参数: 温度传感器号
417 输出参数: 字节型温度值(全局变量)
418 ***************************************************************************/
419 void DS18B20_Gettemp(uchar temp_number)
420 {
421 1 uchar temp_low;
C51 COMPILER V7.50 FANTEST 07/21/2006 16:14:00 PAGE 8
422 1 uchar temp_high;
423 1 uchar i,j;
424 1 uint k;
425 1 uchar temp_buff[5];
426 1
427 1 for(i=0;i<5;i++) /* 进行5次温度检测,以避免检测数据错误. */
428 1 {
429 2 DS18B20_Init(temp_number);
430 2 DS18B20_Writechar(0xCC,temp_number); /* 跳过读序列号操作 */
431 2 DS18B20_Writechar(0xBE,temp_number); /* 读取温度寄存器操作,共可读9个,前两个是温度 */
432 2 temp_low = DS18B20_Readchar(temp_number);
433 2 temp_high = DS18B20_Readchar(temp_number);
434 2 DS18B20_Init(temp_number);
435 2 k = temp_high;
436 2 k<<=8;
437 2 k = k|temp_low;
438 2 k>>=4; /* 将精度变为1度 */
439 2 k=k&0x00FF; /* 消去高8位 */
440 2 temp_buff[i]=k;
441 2 }
442 1 for(i=0;i<5;i++)
443 1 {
444 2 temp_low = temp_buff[i];
445 2 temp_high = 0;
446 2 for(j=0;j<5;j++)
447 2 {
448 3 if(temp_buff[i]==temp_buff[j])
449 3 temp_high++; /* 如果发现一次两个温度值相等,则计数器加1 */
450 3 }
451 2 if(temp_high>=4)
452 2 {
453 3 if(temp_buff[i]>=128) /* 符号位为负, 表示为负温度 */
454 3 {
455 4 temp_buff[i] = temp_buff[i]-255;
456 4 temp_buff[i] = temp_buff[i]-1;
457 4 }
458 3 else
459 3 {
460 4 temp_buff[i] = temp_buff[i];
461 4
462 4
463 4 }
464 3 if(temp_number==CN_TEMP1 && gb_18b20init1_ok==TRUE)
465 3 {
466 4 g_temp_value1 = temp_buff[i]; /* 将温度值写入温度寄存器1 */
467 4 }
468 3 if(temp_number==CN_TEMP2 && gb_18b20init2_ok==TRUE)
469 3 {
470 4 g_temp_value2 = temp_buff[i]; /* 将温度值写入温度寄存器2 */
471 4 }
472 3 break;
473 3 }
474 2
475 2 DS18B20_Writechar(0xCC,temp_number); /* 跳过读序列号操作 */
476 2 DS18B20_Writechar(0x44,temp_number); /* 启动温度转换 */
477 2 WDG_CONTR = 0x35; /* 喂狗,2秒看门狗定时 */
478 2 }
479 1
480 1 }
481
482
483 /***************************************************************************
C51 COMPILER V7.50 FANTEST 07/21/2006 16:14:00 PAGE 9
484 函数名称: TEMP_handle
485 函数功能: 根据获取的两路温度值进行处理,变为所需的温度值
486 输入参数: 无
487 输出参数: 无
488 ***************************************************************************/
489 void TEMP_handle()
490 {
491 1 Delay_Set(CN_10ms);
492 1 g_temp_getcnt++;
493 1 DS18B20_Gettemp(CN_TEMP1);
494 1 DS18B20_Gettemp(CN_TEMP2);
495 1 if(g_temp_getcnt>=70)
496 1 {
497 2 WDG_CONTR = 0x35; /*喂狗,2秒看门狗定时 */
498 2 if ((TRUE == gb_18b20init1_ok) || (TRUE == gb_18b20init1_ok) )
499 2 g_temp_value = (g_temp_value1 + g_temp_value2)/2; /* 两路温感均正常,取其平均值*/
500 2 if (FALSE == gb_18b20init1_ok) /* 如果温感1坏*/
501 2 g_temp_value = g_temp_value2; /* 温度取温感2的值*/
502 2 if (FALSE == gb_18b20init2_ok) /* 如果温感2坏*/
503 2 g_temp_value = g_temp_value1; /* 温度取温感1的值*/
504 2 else g_temp_value = 0; /* 两路温感均坏,取0*/
505 2 if (g_temp_value >=99)
506 2 g_temp_value = 99; /* 如果大于99度,取99*/
507 2 if (g_temp_value <=-9)
508 2 g_temp_value = -9; /* 如果小于-9度,取-9*/
509 2 else
510 2 g_temp_value = g_temp_value;
511 2 if (g_temp_value > SUP_temp || g_temp_value < LOW_temp)
512 2 AD_OVTEMP_ALM = 0;
513 2 AD_TEMP_LED=0; /* 高低温告警输出*/
514 2 }
515 1 }
516
517 /***************************************************************************
518 函数名称: Display_handle
519 函数功能: 根据温度值进行处理,并在数码管显示
520 输入参数: 无
521 输出参数: 无
522 ***************************************************************************/
523 void Display_handle()
524 {
525 1 uchar i,j;
526 1 uchar code data_arry [11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; /* 定义"0~9,-"
-*/
527 1 i=g_temp_value%10;
528 1 j=g_temp_value/10;
529 1 LE1 = 0; LE2=1; /* 开个位显示*/
530 1 P2 = data_arry[i]; /* 显示个位*/
531 1 Delay_Set(CN_5ms);
532 1 LE1 = 1; LE2 = 0; /* 开十位显示*/
533 1 P2 = data_arry[j]; /* 显示十位*/
534 1 Delay_Set(CN_5ms);
535 1 LE2 = 1;
536 1 }
537
538 /***************************************************************************
539 函数名称: System_Init
540 函数功能: 系统初始化
541 输入参数: 无
542 输出参数: 无
543 ***************************************************************************/
544 void System_Init()
C51 COMPILER V7.50 FANTEST 07/21/2006 16:14:00 PAGE 10
545 { uchar x;
546 1 P1M0 = 0x01; /* P1.0为开漏,其余I/O为传统口*/
547 1 P1M1 = 0x01;
548 1 g_ADC_fan=0;
549 1 Delay_Set(CN_1000ms);
550 1 AD_FAN_ALM = 1; /* 关闭风机告警输出 */
551 1 AD_TEMP_ALM = 1; /* 设温感正常;关闭告警输出 */
552 1 AD_TEMP_LED = 1; /* 设温感正常;告警灯灭 */
553 1 g_temp1_errcnt = 0; /* 温感1故障计数器清0 */
554 1 g_temp2_errcnt = 0; /* 温感2故障计数器清0 */
555 1 AD_FAN_CONT1 = CN_FAN_ON; /* 开启第一组风机*/
556 1 AD_FAN_CONT2 = CN_FAN_OFF; /* 开启第二组风机*/
557 1
558 1 for(x=0;x<10;x++) /* 做10次温度转换,稳定参数. */
559 1 {
560 2 DS18B20_Gettemp(CN_TEMP1);
561 2 DS18B20_Gettemp(CN_TEMP2);
562 2 Delay_Set(CN_200ms);
563 2 }
564 1 }
565
566
567 void main()
568 {
569 1 System_Init();
570 1 while(1)
571 1 {
572 2 TEMP_handle();
573 2 Display_handle();
574 2 }
575 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 882 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 10
IDATA SIZE = ---- ----
BIT SIZE = 6 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -