📄 ds18b20-lcd1602-c51.lst
字号:
464 1 if(crc==0) //CRC效验正确
465 1 {
466 2 Disp_RomCode(2); //显示64位序列码
467 2 }
468 1 }
469
470 /*******************************************************************/
471 /* */
472 /* DS18B20 ERROR 显示菜单 */
473 /* */
474 /*******************************************************************/
475 void Error_Menu ()
476 {
477 1 uchar m;
478 1 lcd_init(); //初始化LCD
479 1
480 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
481 1 for(m=0;m<16;m++)
482 1 lcd_wdat(cdis3[m]); //显示字符
483 1
484 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
485 1 for(m=0;m<16;m++)
486 1 lcd_wdat(cdis4[m]); //显示字符
487 1 }
488
489 /*******************************************************************/
C51 COMPILER V8.08 DS18B20_LCD1602_C51 03/21/2009 19:07:17 PAGE 9
490 /* */
491 /* DS18B20 正常显示菜单 */
492 /* */
493 /*******************************************************************/
494 void Natural_Menu ()
495 {
496 1 uchar m;
497 1 lcd_init(); //初始化LCD
498 1
499 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
500 1 for(m=0;m<16;m++)
501 1 lcd_wdat(cdis5[m]); //显示字符
502 1
503 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
504 1 for(m=0;m<16;m++)
505 1 lcd_wdat(cdis6[m]); //显示字符
506 1
507 1 Read_Temperature();
508 1 Disp_Temp_alarm(0x43,0); //显示TH值
509 1 Disp_Temp_alarm(0x4b,1); //显示TL值
510 1 Disp_Temperature(); //显示实时温度值
511 1 }
512
513
514 /*********************************************************/
515 // 显示报警温度
516 /*********************************************************/
517 void Disp_Temp_alarm(uchar addr,uchar num)
518 { //0=TH,1=TL
519 1 display1[2]=temp_alarm[num]/100+0x30;
520 1 display1[0]=temp_alarm[num]%100;
521 1 display1[1]=display1[0]/10+0x30;
522 1 display1[0]=display1[0]%10+0x30;
523 1
524 1 if(display1[2]==0x30) //高位为0,不显示
525 1 {
526 2 display1[2]=0x20;
527 2 if(display1[1]==0x30) //次高位为0,不显示
528 2 display1[1]=0x20;
529 2 }
530 1
531 1 lcd_pos(addr);
532 1 lcd_wdat(display1[2]); //百位数显示
533 1 lcd_wdat(display1[1]); //十位数显示
534 1 lcd_wdat(display1[0]); //个位数显示
535 1 }
536
537 /**********************************************************/
538 // Time0中断函数
539 /**********************************************************/
540 void Time0(void) interrupt 1 using 0
541 {
542 1 TH0=0x4c; //50ms定时
543 1 TL0=0x00;
544 1 timecount++;
545 1 if(timecount>9)
546 1 {
547 2 timecount=0;
548 2 flag=~flag;
549 2 }
550 1 }
551
C51 COMPILER V8.08 DS18B20_LCD1602_C51 03/21/2009 19:07:17 PAGE 10
552 /*********************************************************/
553 /* */
554 /*小喇叭闪动 */
555 /* */
556 /*********************************************************/
557 void spk(uchar addr)
558 {
559 1 if(flag)
560 1 {
561 2 lcd_pos(addr);
562 2 lcd_wdat(0x01); //小喇叭显示
563 2 }
564 1 else
565 1 {
566 2 lcd_pos(addr);
567 2 lcd_wdat(0x20); //清屏
568 2 }
569 1 }
570
571 /*********************************************************/
572 // 温度比较函数
573 /*********************************************************/
574 void temp_compare()
575 {
576 1 if(temp_comp >= temp_alarm[0]) //比较 TH 值
577 1 {
578 2 compare_th=1;
579 2 }
580 1 else compare_th=0;
581 1
582 1 if(temp_comp < temp_alarm[1]) //比较 TL 值
583 1 {
584 2 compare_tl=1;
585 2 }
586 1 else compare_tl=0;
587 1
588 1 if(compare_th)
589 1 {
590 2 spk(0x46); //小喇叭闪动
591 2 if(!alarm_on_off) //静音选择
592 2 beep();
593 2 count=temp_alarm[0];
594 2 }
595 1 else
596 1 {
597 2 lcd_pos(0x46);
598 2 lcd_wdat(0x20);
599 2 }
600 1 if(compare_tl)
601 1 {
602 2 spk(0x4e); //小喇叭闪动
603 2 if(!alarm_on_off) //静音选择
604 2 beep();
605 2 count=temp_alarm[1];
606 2 }
607 1 else
608 1 {
609 2 lcd_pos(0x4e);
610 2 lcd_wdat(0x20);
611 2 }
612 1 }
613
C51 COMPILER V8.08 DS18B20_LCD1602_C51 03/21/2009 19:07:17 PAGE 11
614 /*********************************************************/
615 // 温度报警值闪动
616 /*********************************************************/
617 void Set_tempalarm_Flash(uchar addr,uchar num)
618 {
619 1 if(flag)
620 1 {
621 2 temp_alarm[num]=count;
622 2 Disp_Temp_alarm(addr,num); //显示温度报警值
623 2 }
624 1 else
625 1 {
626 2 lcd_pos(addr);
627 2 lcd_wdat(0x20);
628 2 lcd_wdat(0x20);
629 2 lcd_wdat(0x20);
630 2 }
631 1 }
632
633
634 /*******************************************************************/
635 /* */
636 /* 主函数 */
637 /* */
638 /*******************************************************************/
639 void main()
640 {
641 1 uchar m;
642 1 TMOD=0x01; TH0=0x4c; TL0=0x00; //50ms定时
643 1 EA=1; ET0=1; TR0=1;
644 1 P0=0;
645 1 P2&=0x1F;
646 1 Init_DS18B20();
647 1 Write_Temperature_alarm(); //设定报警上下限温度值
648 1 if(presence)
649 1 {
650 2 Error_Menu ();
651 2 do
652 2 {
653 3 Init_DS18B20();
654 3 beep();
655 3 }
656 2 while(presence);
657 2 }
658 1
659 1 RomCode_Menu (); //显示RomCode
660 1 for(m=0;m<10;m++)
661 1 Delay(50000);
662 1 Natural_Menu (); //正常显示界面
663 1 Delay(50000);
664 1 while(1)
665 1 {
666 2 Read_Temperature(); //读取当前温度
667 2 Delay(50000);
668 2 Disp_Temperature(); //更新当前温度
669 2 temp_compare(); //温度上下限比较
670 2 if(compare_th)
671 2 {
672 3 Set_tempalarm_Flash(0x43,0); //上限报警
673 3 }
674 2 if(compare_tl)
675 2 {
C51 COMPILER V8.08 DS18B20_LCD1602_C51 03/21/2009 19:07:17 PAGE 12
676 3 Set_tempalarm_Flash(0x4b,1); //下限报警
677 3 }
678 2 }//end of while(1)
679 1 } //end of main()
680
681
682 /**********************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1288 ----
CONSTANT SIZE = 118 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 ----
IDATA SIZE = ---- ----
BIT SIZE = 7 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -