⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2atmega48.c

📁 数码管显示交流稳压器,使用A48单片机编写,C言语
💻 C
📖 第 1 页 / 共 2 页
字号:
	else {on_Buzz;Buzz_time=3;}	
	   }	
       }
    }
 }
 //开关控制程序**************************
 void Power_control(void)
   { 
 if((PIND & BIT(5)))
     {if(Key_statu!=cl){     		
       if(Key_time>=180)
          {if(Power_Status==turn_on){shutdown_UPS();Key_statu=cl;}
	    else{PORTB|=BIT(0);Power_Status=turn_on;Key_statu=cl;}
                }
             }
         }
   } 
//**********************************

void AD_Sample(void)
{
	if(Power_Status==turn_on)
	{
 battery_AD();
 AC_input_AD();
 Output_AD();
}
 //Charge_voltage();
}
//---------------------------------
void battery_AD(void)
{
 unsigned int c=4,bat_adc=0;
 while(c!=0)
 {
 ADMUX = 0b01000010;  //select adc input 1
 ADCSRA = 0b11000010;
 
 while((ADCSRA&0x10)==0);
 
 {ADCSRA|=(1<<ADIF);
 bat_adc=ADCL;
 bat_adc|=ADCH<<8;}
 Battery_Value=(bat_adc*20)/135;c--;
 Bat_c=bat_adc;
 delay_100us(1);
 }
 
 //Battery_Value=ADC_Sample_ADD/=3;BAT=bat_ok;
 //ADC_Sample_ADD=0;
 }
 //----------------------------------------------
 //市电采样
 void AC_input_AD(void)
 {
 unsigned int c=0,Total=0,ZPC=0;unsigned char cn=0;
 int adc_c;
 //in_AC_cycle=200;//In_Frequency;      //测出的实际周期赋值
 //while(in_AC_cycle!=0)//在一个周期内连续采样
   while(ZPC!=2)
   {
 ADMUX = 0b01000100;  //select adc input 4
 ADCSRA = 0b11000010;
 
 while((ADCSRA&0x10)==0);
 ADCSRA|=(1<<ADIF);
 adc_c=ADCL;
 adc_c|=ADCH<<8;
 adc_c-=400;if(adc_c<0)adc_c=-adc_c;cn++;
 if(adc_c<10){
 	      if(ZPC==0){ZPC=1;c=0;}
              else{if(c>130)
                 {
              	 ZPC=2;Total/=c;Input_AcValue=Total*205/135;
                 if(Input_AcValue<30){Input_AcValue=0;}
                }else{if(cn>250)ZPC=2;}/*采样次数大于130采样结束*/
                          }/*采样次数小于130返回继续采样*/   
                              }
 else{if(ZPC!=0){Total+=adc_c;c++;delay_100us(1);}
                                     }
                                         }                                                           
                                            }
 //---------------------------------------------
 //*逆变输出采样**********************
  void Output_AD(void)
{
if(sys==bat_work)
 {
 unsigned int g=0,Out_adc;
 in_AC_cycle=100;      //测出的实际周期赋值
 while(in_AC_cycle!=0)//在一个周期内连续采样
 {
 ADMUX = 0b01000001;  //select adc input 1
 ADCSRA = 0b11000010; //分频因子
 while((ADCSRA&0x10)==0); 
 {ADCSRA|=(1<<ADIF);
 Out_adc=ADCL;
 Out_adc|=ADCH<<8;}
 if(Out_adc>g)//采样最大值
 {g=Out_adc; }
 Output_Value=g;
    }
         }
             }
 //PWM处理程序
 void Inverter_Deal(void)
 {
 	if(sys==bat_work||sys==Test){
 		if(InitPWM_T==0)
 		{
 if(Output_Value>300)
 {
 unsigned int di;Fault_waitTime=0;
 di=OUT230V/Output_Value;
 Load_PWM=di*di/100;
 PWM=Load_PWM;
 if(Load_PWM>99)
 {PWM=99;}
            }
 else{PWM=0;sys=over_load;sys_fault();}//sys=over_load;sys_fault();
 }
 else{InitPWM_T--;}
}
}
 //延时程序*******************************
 //us延时
void delay_100us(unsigned char n)
{delay_us_timer=n;
while(delay_us_timer!=0);

}
//----------------------
///ms延时
void delay_ms(unsigned char m)
{
	delay_ms_timer=m;
while(delay_ms_timer!=0);
}
//s计时在计时delay_s_timer中加入时间数再读是否为0。
//***********************************************
//---系统处理------------------------------------
//***********************************************
void System_Deal(void)
{
   if(sys==AC_Normal){AC_working_mode();}
   if(sys==bat_work||sys==bat_Protect||sys==Test){Bat_working_mode();}
   if(sys==over_load)sys_fault();
   if(com_off==off){if(Shutdown_T==0)shutdown_UPS();}
}
//-----------------------------------------
void AC_working_mode(void)
{
if(sys==AC_Normal)
    {  
if((Input_AcValue>265)||(Input_AcValue<165))
    {
	  if(Cycle_dat<254)
	  {
	  	if(CycleDat_A>CycleDat_B)
	      { 
	      	while((Cycle_dat<160)||(Cycle_dat>185||Cycle_dat==0))
	      	{if(sys==bat_work)break;}
	      	         } //上半周等待
	   else{while((Cycle_dat<70)||(Cycle_dat>90)||Cycle_dat==0)
	   {if(sys==bat_work)break;}
	           } //下半周等待
	             } 
	if(sys_delay==0)
	{OnInvDelay=100;To_Bat();}//切换点正确转为电池工作
		              }
         else{To_AC();out_v=Input_AcValue;Buzz_status=stop;UPS_STDis&=~0b00100001;BAT_Work_maxtime=0;
        AC_frequency=(50500/In_Frequency)*2;}
    }
       }
//-------------------------------------------
void To_Bat(void)
{
PwmOFFtime=60;
PwmONtime=40;
PWM10ms_data=PWM10ms;
off_relay;
off_charge;
off_GreLED;
sys=bat_work;
Buzz_status=0;
PWMflag=0;
InitPWM_T=1;
}
void To_AC(void)
{
	sys=AC_Normal;
	off_300v;
cut_M3;
cut_M4;
cut_M5;
cut_M6;
on_relay;
PWM=40;
on_GreLED;
off_YLED;
on_charge;
Shutdown_T=0;
}
//电池工作模式下处理程序
void Bat_working_mode(void)
{
	unsigned char h=2;
	if(Test_time==0){		
      if((Input_AcValue>170)&&(Input_AcValue<260))
                    {if(delay_s_timer==0){if(sys==bat_Protect){To_AC();}
                                         else{while(PwmONtime!=0);
                                            sys=AC_Normal;off_300v;delay_ms(4);To_AC();
                                             }
                                          }
                    }     
     else{if(sys!=bat_Protect){if(BAT_Work_maxtime<1800)
                                           {sys=bat_work;   
                                             on_YLED;
                                             out_v=230-(Output_Load/7);
                                             delay_s_timer=2;	//市电恢复延时时间。
                                             UPS_STDis|=0b00010001;
                                             AC_frequency=500;}             
                              else{shutdown_UPS();}//如果正常逆变大于20分钟UPS关机                    
        }else{sys_fault();}//电池欠压保护待机
                                    }
                               }//UPS_STDis|=0b00100000;//测试时间未到返回
                               
                                        }

//******************************************
void Communication(void)
{
//if(CommStatus==RSTART){RS232_command_on();}
if(CommStatus==REND)
{
     if(ReC[0]=='Q'){UPS_send_data();}
     if(ReC[0]=='T'){sys=Test;on_YLED;UPS_STDis|=0b00110000;Test_time=6;To_Bat();CommStatus=RSTART;}     
     if(ReC[0]=='S')
                  {unsigned char v=ReC[2]-48;
                        if(ReC[1]=='.'){Shutdown_T=v*6;}                
                        else{Shutdown_T=((ReC[1]-48)*10+v)*60;}
                                              com_off=off;}
     if(ReC[0]=='F'){send_data(FFF,21);}
     if(ReC[0]=='I'){send_data(III,38);}//CommStatus=WSTART;
     
 else{RS232_command_on();}
        
        }
          }

//*****************************************************           
//----------------------------------

void UPS_send_data(void)
{
if(ReC[1]=='1')
  {
unsigned char *mmm=MMM,i;j0=1;
*mmm='(';

Str_S(Input_AcValue,6);//Input_AcValue
Str_S(165,6);
Str_S(out_v,6);//out_v 输出电压Output_Load
Str_S(Output_Load,4);
Str_S(AC_frequency,5);
Str_S(Battery_Value,5);
Str_S(Temp_Value,5);
mmm=MMM+37;
  for(i=0;i<8;i++) 
   {if(UPS_STDis&(1<<i)){*(++mmm)='1';}                           
    else{*(++mmm)='0';} 
   } 
*(++mmm)=13; 
send_data(MMM,46);
}
else{Buzz_status=~Buzz_status;CommStatus=RSTART;}//通讯控制蜂鸣器
}
//Q1指令字符串赋值----2006-11-27改编
void Str_S(unsigned int y,unsigned char z)
 {  
   unsigned char a,b,d,*u=MMM+j0;
       
	   *(u++)=(y/100)+48;                                      
      d=(y%100);                                           
      a=(d/10)+48;*(u++)=a; if(z==5)*(u++)='.';         
      b=(d%10)+48;*(u++)=b; if(z==5)*(u++)=' ';
            if(z==4){*(u++)=' '; }
			else{*(u++)='.';*(u++)='0';*(u++)=' ';}								
	   j0+=z;
	   }
//-字符转换程序------2006-11-20编写

//******************************************************/

	
send_data(unsigned char *ss,unsigned char u)
{
  unsigned char w=1,p=0,ur=*ss;
  
  while(w!=0){
      while (!( UCSR0A & (1<<UDRE0)));
	      { ur=*(ss++);
	       UDR0 = ur;
	     if((p++)==u){w=0;}
                     }  					   
                           }                                  
 RS232_command_on();// CommStatus=RSTART;

                                   }
								   
//-----------------------------------------
void Batter_status(void)
{
	if(sys==bat_work||sys==AC_Normal)
	{
	if(sys_delay==0)//系统延时到开始电池采样。
	{
	if(Battery_Value<=138)
	{
		if(Battery_Value>110)
		{BAT=bat_ok;UPS_STDis&=~0b00000010;off_RedLED;Fault_waitTime=0;}//Buzz_status=normal;
		else{
		if(Battery_Value>100)
		{BAT=bat_lower;UPS_STDis|=0b00010010;off_RedLED;Fault_waitTime=0;Buzz_status=normal;}
			else{BAT=bat_Protect;sys=bat_Protect;Buzz_status=stop;sys_fault();}//sys=bat_Protect;Buzz_status=stop;
			}
			}
		else{off_charge;}
	}
    }
}
//---------------------------------------------
void Overload_status(void)
{
  unsigned int P,U,Y,W;Output_Load=0;
if(sys==bat_work)
{
 P=Output_Value*Load_PWM/100;
 Y=Battery_Value*P/100;//out_v=Y;//---------
 if(Y>=500)
 {
 U=(138-Battery_Value)/8;//补偿值
 W=(Y-500)+U;
 Output_Load=W*100/76;
 if(Output_Load>130){OverLoad_Count++;}
 else{OverLoad_Count=0;Fault_waitTime=0;}
 if(OverLoad_Count>30){sys=over_load;out_v=0;sys_fault();}//out_v=0;
 }
    }
       }
void sys_fault(void)
{
	off_300v;on_RedLED;out_v=0;off_YLED;
	if(Fault_waitTime>240){shutdown_UPS();}//如果过载或电池欠压保护待机4分钟关机。
}
void shutdown_UPS(void)
{
	PORTB&=~BIT(0);
	Power_Status=0;
//	off_relay;
//	sys=fault;
	  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -