薄浩楠:
附部分源程序#include#include/*use_nop_()function*/#defineucharunsignedchar#defineuintunsignedint#defineADC_FLAG0X10#defineS1_S00x40//P_SW1.6#defineS1_S10x80//P_SW1.7sbitSD1=P3^3;sbitLED3=P1^7;sbitLED4=P3^4;sbitkey1=P0^0;//oksbitkey2=P2^0;//+sfrP_SW1=0xA2;//外设功能切换寄存器1uintVout=0;uintIout=0;//输出电压uintV1=0;uintI1=0;uintsum=0;uintVref=0;ucharblock=175;ucharlog=0;ucharlag=0;ucharsnm=0;uintget=0;uintgot=0;floatR=9.998;floatVin=5.08;floatVget;floatRfu;bitbusy;voiddelay();voidKey_1_();voidKey_2_();voidinit_pca();voidinit_timer();voidSendData(uchardat);voidSendString(char*s);/**********************************************************函数说明:延时程序**********************************************************/voiddelay(uchart){uintj;uchari;for(i=0;i0;k--);}/**********************************************************函数说明:过流保护开启按键**********************************************************/voidKey_1_(){if(key1==0){delay(100);if(key1==0){SD1=1;LED4=1;delay(200);LED4=0;}delay(100);}}/**********************************************************函数说明:模式选择按键**********************************************************/voidKey_2_(){if(key2==0){delay(100);if(key2==0){if(log=100){sum=0;switch(lag){case0:Iout=Iout/50;a=48+Iout/1000;b=48+Iout%1000/100;c=48+Iout%100/10;d=48+Iout%10;//SendData(e);SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');Vref=119+Iout/29;break;case1:break;case2:Vout=Vout/100;a=48+Vout/1000;b=48+Vout%1000/100;c=48+Vout%100/10;d=48+Vout%10;//SendData(e);SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');if(Vout>Vref)//输出电压小于36V{if(block==255)block=255;elseblock++;}else//输出电压大于36V{if(block==50)block=50;elseblock--;}break;case3:break;}lag+=1;if(lag>3)lag=0;Vout=0;Iout=0;}}/**********************************************************函数说明:过流保护**********************************************************/voidIAdjust(){uchara,b,c,d;switch(lag){case0:I1=GetADC(1);sum+=1;Iout+=I1;break;case1:ADC_CONTR=0X00;_nop_();_nop_();_nop_();_nop_();sum+=1;break;case2:V1=GetADC(0);sum+=1;Vout+=V1;break;case3:ADC_CONTR=0X80;_nop_();_nop_();_nop_();_nop_();sum+=1;break;}if(sum>=100){sum=0;switch(lag){case0:Iout=Iout/50;a=48+Iout/1000;b=48+Iout%1000/100;c=48+Iout%100/10;d=48+Iout%10;//SendData(e);SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');if(Iout>=218){snm+=1;if(snm>=20)SD1=0;}Vref=119+Iout/29;break;case1:break;case2:Vout=Vout/100;a=48+Vout/1000;b=48+Vout%1000/100;c=48+Vout%100/10;d=48+Vout%10;//SendData(e);SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');if(Vout>Vref)//输出电压小于36V{if(block==255)block=255;elseblock++;}else//输出电压大于36V{if(block==50)block=50;elseblock--;}break;case3:break;}lag+=1;if(lag>3)lag=0;Vout=0;Iout=0;}}/**********************************************************函数说明:负载识别**********************************************************/voidKnowLoad(void){uchara,b,c,d;switch(lag){case0:get=GetADC(2);sum+=1;got+=get;break;case1:ADC_CONTR=0X00;_nop_();_nop_();_nop_();_nop_();sum+=1;break;case2:V1=GetADC(0);sum+=1;Vout+=V1;break;case3:ADC_CONTR=0X80;_nop_();_nop_();_nop_();_nop_();sum+=1;break;}if(sum>=100){sum=0;switch(lag){case0:got=got/100;a=48+got/1000;b=48+got%1000/100;c=48+got%100/10;d=48+got%10;//SendData(e);SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');if(got>=240)Vref=0;else{if(got60&&got=100){Vget=(got-6)*0.02;Rfu=Vget*R/Vin/(1-Vget/Vin)/2.0;Vref=Rfu/0.02;}}break;case1:break;case2:Vout=Vout/100;a=48+Vout/1000;b=48+Vout%1000/100;c=48+Vout%100/10;d=48+Vout%10;//SendData(e);/*SendData(a);SendData(b);SendData(c);SendData(d);SendData('\n');*/if(Vout>Vref)//输出电压小于36V{if(block==255)block=255;elseblock++;}else//输出电压大于36V{if(block==50)block=50;elseblock--;}break;case3:break;}lag+=1;if(lag>3)lag=0;Vout=0;Iout=0;}}/**********************************************************函数说明:主函数**********************************************************/voidmain(void){LED1=LED2=LED3=LED4=0;delay(255);delay(255);delay(255);InitADC();init_pca();init_timer();EA=1;//开总中断while(1)//主循环{Key_2_();//VAdjust();switch(log){case1:break;case0:VAdjust();LED1=1;LED2=LED3=0;break;case3:IAdjust();LED2=1;LED1=LED3=0;Key_1_();break;case2:KnowLoad();LED3=1;LED1=LED2=0;break;}}}