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

📄 energy.c

📁 基于单片机的多费率电能表源程序
💻 C
字号:
#define ENERGY_GLOBALS
#include "includes.h"


void EnergyDataPowerOnInit(void)
{
	INT8U i;
	EnergyReverseTest.ReverseRecordCnt=0;
	CalculateTatolEnergy();
	if(ReadEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain))//以下是上电转存处理
	{
		if((TempBufOfMain[0]==0)&&(TempBufOfMain[1]==0)&&(TempBufOfMain[2]==0)&&(TempBufOfMain[3]==0))//没有停电记录
			return;
		if(TempBufOfMain[3]!=CurrentTime.Year)//停电跨年
		{
			if((TempBufOfMain[2]==0x12)&&(CurrentTime.Month==0x01))//停电时间不超过一个月
			{
				if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
				{
					EnergyMonthStore();
				}
				else	if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
						{
							EnergyMonthStore();
						}	
			}
			else//超过一个月
			{
				EnergyMonthStore();
			}
		}
		else//停电不跨年
		{			
			if(TempBufOfMain[2]==CurrentTime.Month)//停电不跨年不跨月
			{
				if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
				{
					if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
					{
						EnergyMonthStore();
					}
				}		
			}
			else//不跨年但跨月
			{
				TempBufOfMain[2]+=2;
				if((TempBufOfMain[2]&0x0f)>=0x0a)
					TempBufOfMain[2]+=0x06;//转化成BCD码
				if(CurrentTime.Month>=TempBufOfMain[2])//停电跨2个月
					EnergyMonthStore();
				else//跨月但没有跨2个月
				{
					if((TempBufOfMain[1]<MonthStoreDate[1])||((TempBufOfMain[1]==MonthStoreDate[1])&&(TempBufOfMain[0]<MonthStoreDate[0])))
					{
						EnergyMonthStore();
					}
					else	if((MonthStoreDate[1]<CurrentTime.Day)||((CurrentTime.Day==MonthStoreDate[1])&&(MonthStoreDate[0]<=CurrentTime.Hour)))
							{
								EnergyMonthStore();
							}
				}
			}
		}
	}
	for(i=0;i<4;i++)//清上次停电时间
		TempBufOfMain[i]=0;	
	WriteEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain);   
}
//有功电能计算
void ActiveEnergyCalculate(void)
{	
	INT8U CarryCnt;
	INT8U *Pnt;
	_EnergyAccum=0;	
	IncBcd(&EnergyData.ActiveTotalEnergy[0],4);	
	Pnt=&EnergyData.ActiveTotalEnergy[0];
	Pnt+=((TimeSliceInfo.CurrentRateID-1)<<2);	
	IncBcd(Pnt,4);
	WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
}
void ReverseEnergyCalculate(void)
{
	_ReverseEnergyAccum=0;
	IncBcd(&EnergyData.ActiveReverseEnergy[0],4);
	WriteEepromData(REVERSE_TOTAL_ENERGY_ID,&EnergyData.ActiveReverseEnergy[0]);			
}
void   PowerDownTask(void)
{
	TempBufOfMain[0]=PulseSample.PulseNum[0];
	TempBufOfMain[1]=PulseSample.PulseNum[1];
	TempBufOfMain[2]=PulseSample.PulseNum[2];
	TempBufOfMain[3]=PulseSample.PulseNum[3];
	WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
	TempBufOfMain[0]=CurrentTime.Hour;
	TempBufOfMain[1]=CurrentTime.Day;
	TempBufOfMain[2]=CurrentTime.Month;
	TempBufOfMain[3]=CurrentTime.Year;
	WriteEepromData(LAST_POWERDOWN_TIME_ID,TempBufOfMain);
	while(1);
}
void EnergyMonthStore(void)
{
	WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
	EnergyData.EnergyPointer++;
	if(EnergyData.EnergyPointer>12)
		EnergyData.EnergyPointer=0;	
	WriteEepromData(ACTIVE_ENERGY_ID0+EnergyData.EnergyPointer,&EnergyData.ActiveRate1Energy[0]);
	TempBufOfMain[0]=EnergyData.EnergyPointer;
	WriteEepromData(CURRENT_ENERGY_POINTER_ID,TempBufOfMain);
}
void CalculateTatolEnergy(void)	
{
	BcdAdd(&EnergyData.ActiveRate1Energy[0],&EnergyData.ActiveRate2Energy[0],TempBufOfMain,4);
	BcdAdd(TempBufOfMain,&EnergyData.ActiveRate3Energy[0],&EnergyData.ActiveTotalEnergy[0],4);
}
void InitEnergyData(INT8U *DataPnt)
{
	INT8U i;
	INT8U *Pnt;
	/*初始化当前正向电量*/
	Pnt=&EnergyData.ActiveRate1Energy[0];
	for(i=0;i<12;i++)
	{
		*Pnt=*DataPnt;
		Pnt++;
		DataPnt++;	
	}
	CalculateTatolEnergy();
	/*初始化当前反向电量*/
	Pnt=&EnergyData.ActiveReverseEnergy[0];
	for(i=0;i<4;i++)
	{
		*Pnt=0;
		Pnt++;
	}
	/*清0历史电量*/
	for(i=0;i<12;i++)
		TempBufOfMain[i]=0;
	for(i=ACTIVE_ENERGY_ID1;i<ACTIVE_ENERGY_ID12+1;i++)
		WriteEepromData(i,TempBufOfMain);
	PulseSample.PulseNum[0]=0;
	PulseSample.PulseNum[1]=0;
	PulseSample.PulseNum[2]=0;
	PulseSample.PulseNum[3]=0;
	//保存当前锋平谷电能
	WriteEepromData(ACTIVE_ENERGY_ID0,&EnergyData.ActiveRate1Energy[0]);
	//保存反向电能
	WriteEepromData(REVERSE_TOTAL_ENERGY_ID,&EnergyData.ActiveReverseEnergy[0]);
	//保存电能脉冲数	
	TempBufOfMain[0]=0;
	TempBufOfMain[1]=0;
	TempBufOfMain[2]=0;
	TempBufOfMain[3]=0;
	WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
	EnergyData.EnergyPointer=0;
	WriteEepromData(CURRENT_ENERGY_POINTER_ID,&EnergyData.EnergyPointer);
}

void EnergyReverseDeal(void)
{
	if(IS_ENERGY_REVERSE_HIGH)
	{
		EnergyReverseTest.ReverseHighCnt=0;
		EnergyReverseTest.ReverseLowCnt++;
		if(EnergyReverseTest.ReverseLowCnt>=3)
		{
			MeterRunningState&=0xef;//正向电能			
			EnergyReverseTest.ReverseLowCnt=0;
			EnergyReverseTest.ReverseState=0;
		}
	}
	else
	{
		EnergyReverseTest.ReverseLowCnt=0;
		EnergyReverseTest.ReverseHighCnt++;
		if(EnergyReverseTest.ReverseHighCnt>=3)
		{
			MeterRunningState|=0x10;//反向电能
			EnergyReverseTest.ReverseHighCnt=0;
			if(EnergyReverseTest.ReverseState==0)
			{
				TempBufOfMain[0]=CurrentTime.Minute;
				TempBufOfMain[1]=CurrentTime.Hour;
				TempBufOfMain[2]=CurrentTime.Day;
				TempBufOfMain[3]=CurrentTime.Month;
				WriteEepromData(LAST_POWER_REVERSE_TIME_ID,TempBufOfMain);				
				EnergyReverseTest.ReverseState=1;
			}
		}	
	}
	if(EnergyReverseTest.ReverseState)
	{
		EnergyReverseTest.ReverseRecordCnt++;
		if(EnergyReverseTest.ReverseRecordCnt>=60)
		{
			EnergyReverseTest.ReverseRecordCnt=0;
			IncBcd(ReverseTotalTime,3);
			WriteEepromData(POWER_REVERSE_TOTALTIME_ID,ReverseTotalTime);
		}
	}
	
}

⌨️ 快捷键说明

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