📄 ds18b20-lcd1602-c51.lst
字号:
518 1 Disp_Temp_alarm(0x43,0); //显示TH值
519 1 Disp_Temp_alarm(0x4b,1); //显示TL值
520 1 Disp_Temperature(); //显示实时温度值
521 1 }
522 /*******************************************************************/
523 /* */
524 /* 主函数 */
525 /* */
526 /*******************************************************************/
527 void main()
528 {
529 1 uchar m;
530 1 TMOD=0x01; TH0=0x4c; TL0=0x00; //50ms定时
531 1 EA=1; ET0=1; TR0=1;
532 1
533 1 while(1)
534 1 {
535 2 Init_DS18B20();
536 2 if(presence)
537 2 {
538 3 Error_Menu ();
539 3 do
540 3 {
541 4 Init_DS18B20();
542 4 beep();
543 4 }
544 3 while(presence);
545 3 }
546 2
547 2 RomCode_Menu (); //显示RomCode
548 2 for(m=0;m<10;m++)
549 2 Delay(50000);
550 2
551 2 Natural_Menu ();
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 10
552 2 do
553 2 {
554 3 Read_Temperature();
555 3 Disp_Temperature();
556 3 temp_compare();
557 3 set_temp_alarm();
558 3 if(!K4)
559 3 {
560 4 beep();
561 4 while(!K4); //等待键释放
562 4 alarm_on_off=~alarm_on_off;
563 4 }
564 3
565 3 if(!K1)
566 3 {
567 4 beep();
568 4 while(!K1); //等待键释放
569 4 RomCode_Menu (); //显示RomCode
570 4
571 4 while(K2); //等待K2键按下
572 4 beep();
573 4 Natural_Menu ();
574 4 }
575 3 }
576 2 while(!presence);
577 2
578 2 }//end of while(1)
579 1 } //end of main()
580
581 /*********************************************************/
582 // 显示报警温度
583 /*********************************************************/
584 void Disp_Temp_alarm(uchar addr,uchar num)
585 { //0=TH,1=TL
586 1 display1[2]=temp_alarm[num]/100+0x30;
587 1 display1[0]=temp_alarm[num]%100;
588 1 display1[1]=display1[0]/10+0x30;
589 1 display1[0]=display1[0]%10+0x30;
590 1
591 1 if(display1[2]==0x30) //高位为0,不显示
592 1 {
593 2 display1[2]=0x20;
594 2 if(display1[1]==0x30) //次高位为0,不显示
595 2 display1[1]=0x20;
596 2 }
597 1
598 1 lcd_pos(addr);
599 1 lcd_wdat(display1[2]); //百位数显示
600 1 lcd_wdat(display1[1]); //十位数显示
601 1 lcd_wdat(display1[0]); //个位数显示
602 1 }
603
604 /**********************************************************/
605 // Time0中断函数
606 /**********************************************************/
607 void Time0(void) interrupt 1 using 0
608 {
609 1 TH0=0x4c; //50ms定时
610 1 TL0=0x00;
611 1 timecount++;
612 1 if(timecount>9)
613 1 {
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 11
614 2 timecount=0;
615 2 flag=~flag;
616 2 }
617 1 }
618
619 /*********************************************************/
620 /* */
621 /*小喇叭闪动 */
622 /* */
623 /*********************************************************/
624 void spk(uchar addr)
625 {
626 1 if(flag)
627 1 {
628 2 lcd_pos(addr);
629 2 lcd_wdat(0x01); //小喇叭显示
630 2 }
631 1 else
632 1 {
633 2 lcd_pos(addr);
634 2 lcd_wdat(0x20); //清屏
635 2 }
636 1 }
637
638 /*********************************************************/
639 // 温度比较函数
640 /*********************************************************/
641 void temp_compare()
642 {
643 1 if(temp_comp >= temp_alarm[0]) //比较 TH 值
644 1 {
645 2 compare_th=1;
646 2 }
647 1 else compare_th=0;
648 1
649 1 if(temp_comp < temp_alarm[1]) //比较 TL 值
650 1 {
651 2 compare_tl=1;
652 2 }
653 1 else compare_tl=0;
654 1
655 1 if(compare_th)
656 1 {
657 2 spk(0x46); //小喇叭闪动
658 2 if(!alarm_on_off) //静音选择
659 2 beep();
660 2 }
661 1 else
662 1 {
663 2 lcd_pos(0x46);
664 2 lcd_wdat(0x20);
665 2 }
666 1 if(compare_tl)
667 1 {
668 2 spk(0x4e); //小喇叭闪动
669 2 if(!alarm_on_off) //静音选择
670 2 beep();
671 2 }
672 1 else
673 1 {
674 2 lcd_pos(0x4e);
675 2 lcd_wdat(0x20);
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 12
676 2 }
677 1 }
678
679 /*********************************************************/
680 // 温度报警值闪动
681 /*********************************************************/
682 void Set_tempalarm_Flash(uchar addr,uchar num)
683 {
684 1 if(flag)
685 1 {
686 2 temp_alarm[num]=count;
687 2 Disp_Temp_alarm(addr,num); //显示温度报警值
688 2 }
689 1 else
690 1 {
691 2 lcd_pos(addr);
692 2 lcd_wdat(0x20);
693 2 lcd_wdat(0x20);
694 2 lcd_wdat(0x20);
695 2 }
696 1 }
697
698 /*********************************************************/
699 // 设定报警值键函数
700 /*********************************************************/
701 void key_set(uchar num)
702 {
703 1 if(!K2) //加键
704 1 {
705 2 beep();
706 2 if(count!=num)
707 2 count++;
708 2 else
709 2 count=0;
710 2 }
711 1 if(!K1) //减键
712 1 {
713 2 beep();
714 2 if(count!=0)
715 2 count--;
716 2 else count=num;
717 2 }
718 1 }
719
720 /**********************************************************
721 温度报警值设定
722 ***********************************************************/
723 void set_temp_alarm()
724 {
725 1 if(!K3)
726 1 {
727 2 beep();
728 2 temp_th=1;
729 2 count=temp_alarm[0]; //取实时TH报警值
730 2 }
731 1
732 1 while(temp_th)
733 1 {
734 2 key_set(120);
735 2 Set_tempalarm_Flash(0x43,0);
736 2
737 2 if(!K3)
C51 COMPILER V8.05a DS18B20_LCD1602_C51 11/20/2006 21:44:00 PAGE 13
738 2 {
739 3 beep();
740 3 temp_th=0;
741 3 temp_tl=1;
742 3 flag=1;
743 3 Set_tempalarm_Flash(0x43,0); //显示温度报警TH值
744 3 count=temp_alarm[1]; //取实时TL报警值
745 3 }
746 2 }
747 1 while(temp_tl)
748 1 {
749 2 key_set(120);
750 2 Set_tempalarm_Flash(0x4b,1);
751 2
752 2 if(!K3)
753 2 {
754 3 beep();
755 3 temp_tl=0;
756 3 flag=1;
757 3 Set_tempalarm_Flash(0x4b,1); //显示温度报警TL值
758 3 Write_Temperature_alarm(); //报警值写入DS18B20
759 3 count=0;
760 3 }
761 2 }
762 1 }
763
764 /**********************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1396 ----
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 + -