📄 current2.lst
字号:
520 2 }
521 1 if(S1STA==0x38)
522 1 S1CON=0xE5; //STA=1 STO=0 SI=0 AA=1
523 1 if(S1STA==0x40)
524 1 S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
525 1 if(S1STA==0x48)
526 1 {
527 2 FF=1;
528 2 S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
529 2 }
530 1 if(S1STA==0x50)
531 1 {
532 2 GET=S1DAT;
533 2 S1CON=0xC1; //STA=0 STO=0 SI=0 AA=0
534 2 }
535 1 if(S1STA==0x58)
536 1 {
537 2 FF=1;
538 2 S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
539 2 }
540 1 ES1=1;
541 1 }
542
543 void CT0_int (void) interrupt 6 //横摆使能输入
544 {
545 1 CTI0=0;
546 1 CTCON=CTCON&0XFC; //禁止上升、下降
547 1 if(edge==0)
548 1 {
549 2 current_out=1; //峰值
550 2 IEN1=IEN1&0XDF; //禁止CM1,停峰、基时间
551 2 if(ahf_ok==1)
C51 COMPILER V7.06 CURRENT2 10/19/2005 14:43:02 PAGE 10
552 2 {
553 3 IM8=IML_ahf;
554 3 IM4=IMH_ahf;
555 3 IB8=IMML_ahf;
556 3 IB4=IMMH_ahf;
557 3 UPD=0X00;
558 3 }
559 2 else
560 2 {
561 3 IM8=IML;
562 3 IM4=IMH;
563 3 IB8=IML;
564 3 IB4=IMH;
565 3 UPD=0X00;
566 3 }
567 2 edge=1;
568 2 CTCON=CTCON|0X01; //CT0上升沿
569 2 }
570 1 else
571 1 {
572 2 edge=0;
573 2 current_out=0;
574 2 CTCON=CTCON|0X02; //CT0下降沿
575 2 CML1=TML2+0XE2; //峰值时间
576 2 if(CML1<TML2)
577 2 CMH1=(TMH2+1)+0X04;
578 2 else
579 2 CMH1=TMH2+0X04;
580 2 c_cm1=0;
581 2 IEN1=IEN1|0X20; //允许CM1,峰、基时间
582 2 }
583 1 }
584
585 void CT2_int (void) interrupt 8 //采样保持脉冲
586 {
587 1 CTI2=0;
588 1 if(current_out==1&&ad_finish==1)
589 1 {
590 2 ad_finish=0; //采样进行标志
591 2 if(i_v==0)
592 2 ADCON=0x09; //启动电流采样
593 2 else
594 2 ADCON=0X08; //启动电压采样
595 2 }
596 1 }
597
598 void ADC_int (void) interrupt 10 //AD采样中断
599 {
600 1 ADCON=ADCON&0xEF; //清ADC中断标志
601 1 CTCON=CTCON&0XCF;
602 1 IEN1=IEN1&0XFB; //禁止CT2
603 1 c_adc++;
604 1 adh=ADCH;
605 1 adl=ADCON&0xC0;
606 1 adh=adh<<2;
607 1 adl=adl>>6;
608 1 ad=adh+adl;
609 1 da=ad;
610 1 AD5=(da*5000)/0x3FF;
611 1
612 1 if(i_v==0) //电流采样
613 1 {
C51 COMPILER V7.06 CURRENT2 10/19/2005 14:43:02 PAGE 11
614 2 ad_i=10000*AD5/4920;
615 2 if(ad_i<50) //电流小于5.0A
616 2 tab2++;
617 2 if(c_adc==1)
618 2 {
619 3 AD1=ad_i;
620 3 AD2=ad_i;
621 3 AD3=ad_i;
622 3 AD4=ad_i;
623 3 }
624 2 else
625 2 {
626 3 ad_i=(ad_i+AD1+AD2+AD3+AD4)/5;
627 3 AD1=AD2;
628 3 AD2=AD3;
629 3 AD3=AD4;
630 3 AD4=ad_i;
631 3 }
632 2 }
633 1 else //电压采样
634 1 {
635 2
636 2 ad_v=1000*AD5/4920;
637 2 if(ad_v<25)
638 2 tab3++;
639 2 if(c_adc==6)
640 2 {
641 3 AD1=ad_v;
642 3 AD2=ad_v;
643 3 AD3=ad_v;
644 3 AD4=ad_v;
645 3 }
646 2 else
647 2 {
648 3 ad_v=(ad_v+AD1+AD2+AD3+AD4)/5;
649 3 AD1=AD2;
650 3 AD2=AD3;
651 3 AD3=AD4;
652 3 AD4=ad_v;
653 3 } //电压小于2.5V
654 2 }
655 1 if(c_adc<=5) //电流采样
656 1 {
657 2 if(c_adc==5) //电流——电压
658 2 {
659 3 i_v=1; //电压采样标志
660 3 AD1=0;
661 3 AD2=0;
662 3 AD3=0;
663 3 AD4=0;
664 3 tab2=0;
665 3 }
666 2 ad_finish=1;
667 2 CTCON=CTCON|0X20;
668 2 IEN1=IEN1|0X04; //允许CT2
669 2 }
670 1 if(c_adc>5&&c_adc<=10)
671 1 {
672 2 if(c_adc==10) //电压——电流
673 2 {
674 3 i_v=0; //电流采样标志
675 3 c_adc=0;
C51 COMPILER V7.06 CURRENT2 10/19/2005 14:43:02 PAGE 12
676 3 AD1=0;
677 3 AD2=0;
678 3 AD3=0;
679 3 AD4=0;
680 3 tab3=0;
681 3 }
682 2 ad_finish=1;
683 2 CTCON=CTCON|0X20;
684 2 IEN1=IEN1|0X04; //允许CT2
685 2 }
686 1 }
687
688 void CM1_int (void) interrupt 12 //电流脉冲输出(峰、基值时间)
689 {
690 1 CMI1=0;
691 1 c_cm1++;
692 1 if(current_out==1&&c_cm1==n_pulse||current_out==0&&c_cm1==n_base)
693 1 {
694 2 if(decrease==1||ahf_ok==0)
695 2 {
696 3 if(current_out==1)
697 3 {
698 4 IM8=IBL;
699 4 IM4=IBH;
700 4 IB8=IBL;
701 4 IB4=IBH;
702 4 UPD=0X00;
703 4 }
704 3 else
705 3 {
706 4 IM8=IML;
707 4 IM4=IMH;
708 4 IB8=IML;
709 4 IB4=IMH;
710 4 UPD=0X00;
711 4 }
712 3 }
713 2 else
714 2 {
715 3 if(current_out==1)
716 3 {
717 4 IM8=IBL_ahf;
718 4 IM4=IBH_ahf;
719 4 IB8=IBBL_ahf;
720 4 IB4=IBBH_ahf;
721 4 UPD=0X00;
722 4 }
723 3 else
724 3 {
725 4 IM8=IML_ahf;
726 4 IM4=IMH_ahf;
727 4 IB8=IMML_ahf;
728 4 IB4=IMMH_ahf;
729 4 UPD=0X00;
730 4 }
731 3 }
732 2 current_out=~current_out;
733 2 c_cm1=0;
734 2 }
735 1 CML1=TML2+0XE2; //峰值时间
736 1 if(CML1<TML2)
737 1 CMH1=(TMH2+1)+0X04;
C51 COMPILER V7.06 CURRENT2 10/19/2005 14:43:02 PAGE 13
738 1 else
739 1 CMH1=TMH2+0X04;
740 1 }
741
742 void CM2_int (void) interrupt 13 //关水计时
743 {
744 1 CMI2=0;
745 1 c_cm2++;
746 1 if(c_cm2==240)
747 1 {
748 2 con_water=1; //关水
749 2 IEN1=IEN1&0xDF; //禁止CM1
750 2 c_cm2=0;
751 2 }
752 1 CML2=TML2+0x24;
753 1 if(CML2<TML2)
754 1 CMH2=TMH2+1+0xF4;
755 1 else
756 1 CMH2=TMH2+0xF4;
757 1 }
758
759 main()
760 {
761 1 unsigned char k,k1,k2;
762 1 unsigned int temp_delt_p,temp_delt_b;
763 1
764 1 current_enable=0;
765 1 TMOD=0x22; //定时器1,方式2;
766 1 TL1=0XFD; //波特率9600
767 1 TH1=0XFD;
768 1 TR1=1; //启动定时器
769 1 PCON=0X00; //SMOD=1
770 1 TMOD=0x23; //定时器0,方式3,两个8位定时器;
771 1 TR1=0;
772 1 TF1=0;
773 1 S0CON=0XF8; //串口方式3,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
774 1 IP0=0X98; //S0=1
775 1 IP1=IP1|0X20;
776 1 ES0=1; //开串口中断
777 1 ET0=1;
778 1 ET1=1;
779 1 ES1=1; //I2C
780 1 EAD=1; //AD中断允许
781 1 EA=1; //中断总允许
782 1 start_t2();
783 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -