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

📄 powermanage.c

📁 一个很好的 电源管理程序 很不错哦 能定时管理你的电池
💻 C
字号:
#include "main.h"


void Read_adc(void)       //A/D转化
{
   ADMUX=_BV(REFS0)|0x07; //第7通道
   ACSR=_BV(ACD);
   ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS0);//32分频
   loop_until_bit_is_set(ADCSRA,ADIF);                     
   SetBit(ADCSRA,ADIF);     //清标志位  

   ADMUX=_BV(REFS0)|0x07; //第7通道
   ACSR=_BV(ACD);
   ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS0);//32分频
   loop_until_bit_is_set(ADCSRA,ADIF);                     
   SetBit(ADCSRA,ADIF);     //清标志位  
   ADValue=ADC;   
}


struct stBC_TimeCn
{
	unsigned int  B;
	unsigned char H;
	unsigned char D;
} sBC;

unsigned char fnBCCountDown(void)
{
	if (sBC.B--) return 0;
	sBC.B= 36000-1 ;
	if (sBC.H--) return 0;
	sBC.H = 23;
	if ( sBC.D--) return 0;
	return 1;
}


void fn0(void)
{
 Read_adc();
 if(ADValue<=Batteryempty)
 { 
    mBC_Value=0; 
	ClrBit(PORTA,BatteryCharger); //停止充电
	ClrBit(SystemLedState,BatterDis); //电池电压指示灯灭
	ClrBit(SystemLedSpring,BatterDis); 
   return;
  }

  if(bit_is_set(SystemLedState,PowerDis))// 市电标志位
  { 
	mBC_State=1;    //有电充电 没电进入备电	
	sBC.B = 0;
	sBC.H = 0;
	sBC.D = 2;      //充电时间为2天
  }
  else
  {
    mBC_State=3;   //3= 备电
    ClrBit(PORTA,BatteryCharger); //停止充电 放电
  }
}


void fn1(void)         //充电处理
{
  if(fnBCCountDown())  //充电时间
  {
	mBC_State=2;      //充电时间到  什么都不做
	ClrBit(PORTA,BatteryCharger); //停止充电      充电满了就等半年再充   没满就进下面程序 进行检测
	sBC.B = 0;
	sBC.H = 0;
	sBC.D = 30*6;
	return;
   }

  if(bit_is_clear(SystemLedState,PowerDis))// 市电标志位
  {
 	mBC_State=3;                  //3= 备电
	ClrBit(PORTA,BatteryCharger); //停止充电 放电
	return;
   }

  if(mTmBC_1s)                   //充电0.9秒,停止充电检测电压0.1秒
  {
	if(++mTmBC_1s>=10)
	{
	  ClrBit(PORTA,BatteryCharger); //停止充电 放电
	  mTmBC_1s=0;
	 }
	return;	
   }
   mTmBC_1s=1;

   ClrBit(PORTA,BatteryCharger);
   Read_adc();
   SetBit(PORTA,BatteryCharger); //充电
    
  if(ADValue<=Batteryempty)
  { 
     mBC_State=0;
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志		
	return;
   }
  else if(ADValue<BatteryLowkeep)//5~11v   
   {
     mBC_Value=1;
     SetBit(SystemLedState,BatterDis); 
	 SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志	 	
    }
  else if(ADValue<BatteryLow)//11.1~12.1v   
   {    
     mBC_Value=2;
  	 SetBit(SystemLedState,BatterDis); 
	 SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
     }
  else if(ADValue<BatteryHigh)//12.1~13.8V   
   {   
     mBC_Value=3;	 
     SetBit(SystemLedState,BatterDis); 
	 ClrBit(SystemLedSpring,BatterDis); 
	 ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
     }
  else  //大于13.8V
   {   
      if(mBC_Value!=4)
	  {
		mBC_Value=4;
		if(sBC.D || sBC.H >12)
		 {
		   sBC.D=0; sBC.H =12 ;  //再充电12个小时			
		  }
	   }
     SetBit(SystemLedState,BatterDis); 
	 ClrBit(SystemLedSpring,BatterDis); 
	 ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
     }
}


void fn2(void)              //2=Idle 什么都不做
{
 if(fnBCCountDown())
  {
	mBC_State=1;           //	0=开机 1= 充电 2=Idle 3= 备电
	SetBit(PORTA,BatteryCharger); //充电
	sBC.B = 0;
	sBC.H = 0;
	sBC.D = 2;
	return;
  }	 
	 
 if(bit_is_clear(SystemLedState,PowerDis))// 市电标志位	 
 {
   mBC_State=3;
   ClrBit(PORTA,BatteryCharger); //停止充电 放电
   return;
  }	
  		
  if(mTmBC_1s)                   //充电0.9秒,停止充电检测电压0.1秒
  {
	if(++mTmBC_1s>=10)
	{
	  ClrBit(PORTA,BatteryCharger); //停止充电 放电
	  mTmBC_1s=0;
	 }
	return;	
   }
   mTmBC_1s=1;

   ClrBit(PORTA,BatteryCharger);
   Read_adc();
   SetBit(PORTA,BatteryCharger); //充电
    
  if(ADValue<=Batteryempty)
  { 
     mBC_State=0;
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志		
	return;
   }
  else if(ADValue<=BatteryLow)  
  {
 	if(mBC_Value!=2)
	 {  
	   mBC_Value=2;      
  	   SetBit(SystemLedState,BatterDis); 
	   SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
	   SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	   SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
	   if( sBC.D >=7 )
		 { 
		   sBC.B = 0;
		   sBC.H = 0;
		   sBC.D = 7;
		  } 	 
	   }
    }
   else if(ADValue<= BatteryHigh) // 大于12.1V小于13.8V
    {      
  	   mBC_Value=3;
       SetBit(SystemLedState,BatterDis); 
	   ClrBit(SystemLedSpring,BatterDis);  
	   ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	   ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志	     
     }
   else
    {     
  	   mBC_Value=4;
       SetBit(SystemLedState,BatterDis); 
	   ClrBit(SystemLedSpring,BatterDis); 
	   ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	   ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志	    
     }
}


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

//*******************************************************
 void fn3(void)   //3= 备电
{  
  Read_adc();
  if(ADValue<BatteryLowkeep) //5~11v  
   {    
  	 mBC_Value=1; 
  	 SetBit(SystemLedState,BatterDis); 
	 SetBit(SystemLedSpring,BatterDis); //电池电压指示灯闪烁
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
	 ClrBit(PORTA,BatterySupply);//断供给
	 while(1); // Restart system
    }
  else if(ADValue<BatteryLow) //11.1~12.1v  
   {    
  	 mBC_Value=2;
  	 SetBit(SystemLedState,BatterDis); 
	 SetBit(SystemLedSpring,BatterDis);       //电池电压指示灯闪烁
	 SetBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志	
    }
  else if(ADValue<BatteryHigh)// 大于12.1V小于13.8V  
   {   
  	 mBC_Value=3; //12.1~13.8V
     SetBit(SystemLedState,BatterDis); 
	 ClrBit(SystemLedSpring,BatterDis); 
	 ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志	  
    }
  else  //大于13.8V
   {  
	 mBC_Value=4;
     SetBit(SystemLedState,BatterDis); 
	 ClrBit(SystemLedSpring,BatterDis);  
	 ClrBit(mDvStatus,cDvSS_BtLw);	          //上行,低电压标志
	 ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtVl);//下行,低电压标志
    }

   if(bit_is_set(SystemLedState,PowerDis))// 市电标志位
	{ 
	  mBC_State=1;    //有电充电 没电进入备电	
	  sBC.B = 0;
	  sBC.H = 0;
	  sBC.D = 2;
	}	    
}

unsigned char Power_Rd=0x02,Power_Pre=0x02,Power_Save=0x02;
void fnPowerCheck(void)//市电检测 
{    
   Power_Rd=PIND & 0x02;
   if(Power_Rd != Power_Pre )  //除抖动
	{
		Power_Pre=Power_Rd;
		return;
     }	
	
   if( Power_Pre != Power_Save )
	{	
	    Power_Save = Power_Pre;	
		if(!Power_Pre )           //jump to space          
		{ 
          SetBit(SystemLedState,PowerDis);  //有市电电源指示灯亮
	      ClrBit(mDvStatus,cDvSS_BtPower);         //上行,备电标志
	      ClrBit(mSPI_DwLinkStatus,cDv9101Ss_BtM); //下行,备电标志
		 return; 
		}
		else                           //Release_Space
		{
	      ClrBit(SystemLedState,PowerDis); //无市电电源指示灯灭
	      SetBit(mDvStatus,cDvSS_BtPower);         //上行,备电标志
	      SetBit(mSPI_DwLinkStatus,cDv9101Ss_BtM); //下行,备电标志												    	 		  
		  return;
		}    	 
     }
	else
	{	
		if (!Power_Save )      //保持  ,Space
		{
		 }
	    return;
	 }
}


void BatteryCharge(void)
{
 switch  (mBC_State)
  {
	case 0: fn0(); 	break; //0=开机
	case 1:	fn1(); 	break; //1= 充电
	case 2: fn2();  break; //2=Idle 什么都不做	
	case 3: fn3();  break; //3= 备电
	default: while(1);          
   }
}


void fnPowerManage(void)
{
 fnPowerCheck();
 BatteryCharge();
}

⌨️ 快捷键说明

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