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

📄 sf07p07v00.c

📁 基于单片机的多费率电能表源程序
💻 C
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :test.c                                                */
/*  DATE        :Thu, Apr 26, 2007                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/38024F                                             */
/*                                                                     */
/*  This file is generated by Renesas Project Generator (Ver.3.0).     */
/*                                                                     */
/***********************************************************************/
                  


#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif
#define MAINSYS_GLOBALS
#include "includes.h"

const INT8U AdjustmentCoefficientOfTemperature[]=
{
	    0,      0,      0,      0,      0,      0,      0,  128-1,  128-1,  128-1,
	128-1,  128-1,  128-2,  128-2,  128-2,  128-3,  128-3,  128-3,  128-4,  128-4,
    128-5,  128-5,  128-6,  128-6,  128-7,  128-7,  128-8,  128-8,  128-9, 128-10,
   128-10, 128-11, 128-12, 128-12, 128-13, 128-14, 128-15, 128-16, 128-17, 128-17,
   128-18, 128-19, 128-20, 128-21, 128-22, 128-23, 128-24, 128-25, 128-26, 128-28,
   128-29, 128-30, 128-31, 128-32, 128-33, 128-35, 128-36, 128-37, 128-39, 128-40,
   128-41, 128-43, 128-44, 128-46, 128-47, 128-48, 128-50, 128-52, 128-53, 128-55,
   128-56, 128-58, 128-59, 128-61
};

void main(void)
{
	set_imask_ccr(1);
	DelayXms(100);
	ClearWatchDog;
	DelayXms(100);
	ClearWatchDog;
	DelayXms(100);
	ClearWatchDog;
	DelayXms(100);
	ClearWatchDog;
	DelayXms(100);
	ClearWatchDog;
	DelayXms(100);
	ClearWatchDog;		
	CheckPower();		
	ClearWatchDog;
	//底层硬件初始化
	IOInit();		
	LcdInit();
	TimerInit();
	ADInit();
	//软件功能初始化		
 	Clock8025Init();		
	CommunicateInit();
	Tcn75Init();
	DataInit();	
	MultiRateInit();
	EnergyDataPowerOnInit();
	DisplayInit();	
	set_imask_ccr(0);
	for(;;)
	{
		ClearWatchDog;
		if(_PowerDown==0)
		{
			if(_Span10msTask)
				Span10msTask();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown==0)
		{
			if(_SpanSecondTask)
				SpanSecondTask();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown==0)
		{
			if(_SpanMinuteTask)
				SpanMinuteTask();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown==0)
		{
			if(_EnergyAccum)
				ActiveEnergyCalculate();
			if(_ReverseEnergyAccum)
				ReverseEnergyCalculate();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown)
			PowerDownTask();
		ClearWatchDog;
		if(_PowerDown==0)
		{
			if(_CommunicateReceiveEnableTask)
				CommunicateReceiveEnable();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown==0)
		{
			if(_DatagramDeal)
				DatagramDealTask();
			ClearWatchDog;
		}
//		else
//			CLOSE_PERIPHERY_PART;
		if(_PowerDown==0)
		{	
			if(_ProgramRecord)
				WriteProgramRecord();
		}
//		else
//			CLOSE_PERIPHERY_PART;	
	}
}

void abort(void)
{
	
}
void CloseWatchdog(void)
{
	HB_TCSRW=0x9c;HB_TCSRW=0x9c;/*对于38104,TCSRW初始值为0xae,经过设置后,值变成0x9c*/
	HB_TCSRW=0x0b2;/*由于寄存器值已经变成0x9c,经过设置后,值变成0xb2,tcw被停止*/
	HB_TCSRW=0x08f;/*在值已为0xb2的条件下,经过设置后,值变成0x8a,完成了停止看门狗的功能*/
	nop();
}

void EnableWatchdog(void)
{
	HB_TCSRW=0x9c;HB_TCSRW=0x9c;/*对于38104,TCSRW初始值为0xae,经过设置后,值变成0x9c*/
	HB_TCSRW=0x0b7;/*由于寄存器值已经变成0x9c,经过设置后,值变成0xb6,tcw被启动*/
	HB_TCSRW=0x08f;/*在值已为0xb6的条件下,经过设置后,值变成0x8E,完成了启动看门狗的功能*/	
}

void IOInit(void)
{
	PCR3Buf=Gcst_PCR3Ini;HB_PCR3=PCR3Buf;
	PCR4Buf=Gcst_PCR4Ini;HB_PCR4=PCR4Buf;
	PCR7Buf=Gcst_PCR7Ini;HB_PCR7=PCR7Buf;
	FENG_LED_OFF;
	HB_PCR5=0x01;	
}
void CheckPower(void)
{
	INT8U GuB_SysTmp;
	for(;;)
	{
		ClearWatchDog;
		ADInit();
		nop();
		GuB_SysTmp=0;
		HF_ADSR_ADSF=1;		
		while(HF_ADSR_ADSF)
		{
			GuB_SysTmp--;
			nop();
			if(GuB_SysTmp<1)
			{				
				break;
			}
		}
		AdResult=HW_ADRR;
		AdResult>>=8;
		if(AdResult>VoltageRstLve)
			VoltageLowCnt++;
		else 
			VoltageLowCnt=0;
		if(VoltageLowCnt>200)
		{
			VoltageLowCnt=0;			
			break;	//电源稳定,退出循环
		}			
	} 

}
void ADInit(void)
{
	HB_AMR=0x0b6;
}
void TimerInit(void)
{
	HB_CKSTPR1=Gcst_CKSTPR1Ini;//各种模块的工作时钟开关/
	HB_CKSTPR2=Gcst_CKSTPR2Ini;
	/*initialize timer A*/	
	HF_IENR1_IENTA=1;	/*enable timer A interrupt*/
	HB_TMA=0x16;		/*set the clock in timer A is interval 1/32*/
		
	/*initialize timer F*/
	HB_TCRF=0x46;/*Divide Timer F into two timers*/
	HB_TCSRF=0x11; /*enable match  TCFL  clearing*/
                   /*enable match  TCFH  clearing*/	
	HB_OCRF_L=16;/*The crystal is 10M TH is used on IR modulation*/

}
void DataInit(void)
{
	INT8U i,j,k;
	INT8U InitSign=0;
	TaskSign.BYTE=0;
	StateSign.BYTE=0X01;		
	for(i=0;i<3;i++)
	{
		for(k=EEPROM_INIT_SIGN_ID0;k<EEPROM_INIT_SIGN_ID2+1;k++)
		{
			if(ReadEepromData(k,TempBufOfMain))
			{
				InitSign=1;
				for(j=0;j<14;j++)
				{
					if(TempBufOfMain[j]!=0x55)
					{
						InitSign=0;
						break;
					}
				}
			}
			if(InitSign)
				break;			
		}
		if(InitSign)
			break;	
	}
	if(InitSign)
	{
		ClearWatchDog;
		for(i=EEPROM_INIT_SIGN_ID0;i<LAST_BROADCAST_TIME_ID+1;i++)
		{
			if(!ReadEepromData(i,TempBufOfMain))
			{
				if(!ReadEepromData(i,TempBufOfMain))
				{
					if(!ReadEepromData(i,TempBufOfMain))
						InitEepromData(i);
				}
			}
			InitRamData(i);
			ClearWatchDog;
		}
		if(!ReadEepromData(ENERGY_PULSE_ID,TempBufOfMain))
		{
			if(!ReadEepromData(ENERGY_PULSE_ID,TempBufOfMain))
			{
				PulseSample.PulseNum[0]=0;
				PulseSample.PulseNum[1]=0;
				PulseSample.PulseNum[2]=0;
				PulseSample.PulseNum[3]=0;
				WriteEepromData(ENERGY_PULSE_ID,TempBufOfMain);
				return;
			}
		}
		InitRamData(ENERGY_PULSE_ID);
	}
	else
	{
		InitNewEeprom();	
	}
}

void Span10msTask(void)//跨10MS任务
{
	_Span10msTask=0;	
	if(RecTmr)
	{
		RecTmr--;
		if(RecTmr==0)
			_CommunicateReceiveEnableTask=1;
	}
	if(Com485Cnt>0)
		Com485Cnt--;	
	/*****************软时钟处理**********************/
	
	/*****************报文发送处理*********************/
	if(_DataSend_)
	{
		SendDelayCnt++;
		if(SendDelayCnt>1)		
		{
			SendDelayCnt=0;
			if(PreCharactorCnt)
			{
				HB_TDR=0xfe;
				PreCharactorCnt--;	
			}
			else
			{
			
				if(SendLen>0)
				{
					HB_TDR=SendBuf[SendPnt];
					SendLen--;
					SendPnt++;	
				}
				else
				{
					_DataSend_=0;
					UartTransmitDisable;
					_CommunicateReceiveEnableTask=1;	
				}
			}	
		}
		
	}		
}
void SpanSecondTask(void)//跨秒任务
{
	INT8U i;
	_SpanSecondTask=0;	
	CurrentTime.Second++;
	if((CurrentTime.Second&0x0f)>0x09)
		CurrentTime.Second+=0X06;
	if(CurrentTime.Second>=0X60)
	{
		_SpanMinuteTask=1;
		CurrentTime.Second=0X00;
		OldCurrentTime.Year=CurrentTime.Year;
		OldCurrentTime.Month=CurrentTime.Month;
		OldCurrentTime.Day=CurrentTime.Day;	
		OldCurrentTime.Hour=CurrentTime.Hour;
		OldCurrentTime.Minute=CurrentTime.Minute;		
		for(i=0;i<3;i++)
		{
			GetCurrentDateAndTime();
			if(CheckTime(&CurrentTime.Second)&&CheckDate(&CurrentTime.Day)&&(CurrentTime.Weekday<0x07))
				break;
		}
		if(OldCurrentTime.Hour!=CurrentTime.Hour)//跨时
		{
			//转存处理
			if((MonthStoreDate[1]==CurrentTime.Day)&&(CurrentTime.Hour==MonthStoreDate[0]))
				EnergyMonthStore();
			//广播校时允许处理
			if(_BroadCalibrateTimeAllow_==0)
			{
				if(IsBroadCalibrateTimePermit())
					_BroadCalibrateTimeAllow_=1;
			}
		}
		if(OldCurrentTime.Day!=CurrentTime.Day)//跨日
		{
			MultiRateInit();
		
		}
		else 	if(OldCurrentTime.Minute!=CurrentTime.Minute)
				{
					RateNormalRunningTask();				
				}	
	}
	/////////////////////////
	RATESHOW();		
	/////////////////////////
	if(_BroadCalibrateTimeAllow_)
	{
		MeterRunningState|=0x20;
	}
	else
	{
		MeterRunningState&=0xdf;
	}
	//通讯正在进行指示
	if(CommunicateCnt)
	{
		CommunicateCnt--;
		if(CommunicateCnt==0)
			_Communicate_=0;
	}	
	Display();	
	EnergyReverseDeal();						
}
void SpanMinuteTask(void)//跨分任务
{
	_SpanMinuteTask=0;
	_PowerTest_=0;//启动电池检测
	
	if(_TCN75Err_==0)	
		TemperatureCompensate();
	if(HardwareErrState.BYTE)
		MeterRunningState|=0x02;
	else
		MeterRunningState&=0xfd;		
						
}

void TemperatureCompensate(void)
{
	INT8U i;
	INT8S TempVar;
	for(i=0;i<3;i++)
	{
		ReadTCN75(TEMPERTURE_REG_ADR,TempBufOfMain,1);
		ReadTCN75(TEMPERTURE_REG_ADR,&TempBufOfMain[1],1);
		if(TempBufOfMain[0]==TempBufOfMain[1])
			break;
	}
	TempVar=(INT8S)(TempBufOfMain[0]);
	TempVar-=25;
	if(TempVar<0)
	{
		TempVar=~TempVar+1;
	}	
	if(TempVar>73)
		TempVar=73;
	TempVar=AdjustmentCoefficientOfTemperature[TempVar];
	if(TempVar!=OldCompensateValue)
	{
		OldCompensateValue=TempVar;
		AdjustClockPrecision(TempVar);
	}
	
}

⌨️ 快捷键说明

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