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

📄 dataverify.c

📁 一个电表的程序
💻 C
字号:
/*********************************************************************************/
/*===========================================================================
* Copyright (c) 2004,三星科技有限公司 
* All rights reserved.
* 
* 文件名称:dataverify.c
* 文件标识:
* 摘    要:DDS188
*          
* 
* 当前版本:V 1.0
* 作    者:叶孟军
* 修改内容:
* 开始日期:2005年7月25日
* 完成日期:2005年7月

/******************************************************************************/
#include	"iodefine.h"
#include	"extern.h"

#define		Power_Io_Data		(IO.PDR5.BIT.B0)

//==============================================================================*/
const unsigned  char  SysData_const[69]={0x00,0x08,0x00,			//电表常数
										 0x34,0x12,0x00,0x00,0x00,0x00,	//表号
										 0x01,0x00,0x00,0x00,0x00,0x00,	//用户号
										 0x34,0x12,0x00,0x00,0x00,0x00,	//设备码
										 0x06,							//循显时间
										 0x01,							//停显时间
										 0x00,0x01,						//自动抄表日
										 0x00,0x00,0x00,0x00,			//有功电能起始读数
										 0x00,0x11,0x11,0x11,			//密码
										 0x00,0x04,0x05,0xff,0xff,0xff,0xff,0xff,	//自动轮显序号
										 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
										 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,	//键显序号
										 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
										 0x00,0x00,0x00,0x00};						//LCD开关显示时间

const unsigned 	char  ClrData_const[20] = {0x00,0x00,0x00,0x00,0x00,
                                           0x00,0x00,0x00,0x00,0x00,
                                           0x00,0x00,0x00,0x00,0x00,
                                           0x00,0x00,0x00,0x00,0x00};				//

const unsigned 	char  Time_const[7] 	= {0x00,0x00,0x00,0x06,0x01,0x01,0x00};

/****************************************************************************/
void 	EngerData_Clr(void)
{
	F_BlckWrt_Eeprm(EPPwrTtl_Dtr,ClrData_const,20);				//E2P当前电量清除
	F_BlckWrt_Eeprm(EM4_PPwrTtl_Dtr,ClrData_const,20);				//E2P反向电量清除
	F_BlckWrt_Eeprm(EM9_PPwrTtl_Dtr,ClrData_const,16);			//E2P上月电量清除
	WatchDog_Set();												//喂狗
	F_BlckWrt_Eeprm(ELDay_PPwrTtl_Dtr,ClrData_const,20);			//E2P上2月电量清除
	F_BlckWrt_Eeprm(ELDay_PPwrTtl_Dtr+20,ClrData_const,20);			//E2P上2月电量清除

	F_BlckWrt_Eeprm(EPrgrm_Cnt_Dtr,ClrData_const,20);			//E2P广播编程事件清除
	F_BlckWrt_Eeprm(EPrgrm_Cnt_Dtr+20,ClrData_const,20);			//E2P广播编程事件清除
	F_BlckWrt_Eeprm(ELPrgrm_MdCnt_Dtr,ClrData_const,20);			//E2P广播编程事件清除
	WatchDog_Set();												//喂狗
	F_BlckWrt_Eeprm(EPdCnt_Dtr,ClrData_const,20);				//E2P停电事件清除
	F_BlckWrt_Eeprm(EPdCnt_Dtr+20,ClrData_const,20);			//E2P停电事件清除
	F_BlckWrt_Eeprm(EPdCnt_Dtr+40,ClrData_const,20);				//E2P停电事件清除
	F_BlckWrt_Eeprm(EPdCnt_Dtr+60,ClrData_const,20);				//E2P停电事件清除
	F_BlckWrt_Eeprm(EPdCnt_Dtr+80,ClrData_const,20);				//E2P停电事件清除
	F_BlckWrt_Eeprm(EPdCnt_Dtr+100,ClrData_const,02);				//E2P停电事件清除

	WatchDog_Set();	
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr,ClrData_const,20);				//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+20,ClrData_const,20);			//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+40,ClrData_const,20);				//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+60,ClrData_const,20);				//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+80,ClrData_const,20);				//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+100,ClrData_const,20);			//E2P反向事件清除
	F_BlckWrt_Eeprm(ECrntRvrs_Cnt_Dtr+100,ClrData_const,02);			//E2P反向事件清除

	WatchDog_Set();	
	F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr,ClrData_const,20);				//E2P清零事件清除
	F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr+20,ClrData_const,20);			//E2P清零事件清除
	F_BlckWrt_Eeprm(EClrPw_Cnt_Dtr+40,ClrData_const,07);			//E2P清零事件清除

	F_BlckWrt_Eeprm(PowDwn_Tm,ClrData_const,20);				//E2P其它参数清除
	F_BlckWrt_Eeprm(PowDwn_Tm+20,ClrData_const,20);				//E2P其它参数清除
	F_BlckWrt_Eeprm2(EPPwrTtl_BKUP1,ClrData_const,20);	//清E2P中当前电量备份

 }


void	Reset_Data(void)										//E2P中全部数据初始化
{
	unsigned char	i;
	EngerData_Clr();											//电量数据清零
	F_BlckWrt_Eeprm(EMtCt_Dtr,SysData_const,69);				//E2P中各项参数初始化
	WatchDog_Set();												//喂狗
	F_BlckWrt_Eeprm(Rtc_Time,Time_const,7);						//
    F_BlckRead_Eeprm(Rtc_Time,RTm_Dtr,7);						//时间
    F_BlckRead_Eeprm(Rtc_Time+3,RDtWk_Dtr,4);					//日期

	F_BlckWrt_Eeprm(PowDwn_Tm,ClrData_const,20);				//E2P中各项事件参数清零
	WatchDog_Set();	
	for(i=0;i<16;i++)
	 {
	    SysData_Verify[i] = 0x68;
      }
    F_BlckWrt_Eeprm(ESysData_Group,SysData_Verify,0x10);
	RBatt_WorkTm_Dtr[0] = 0x00;
	RBatt_WorkTm_Dtr[1] = 0x00;
	RBatt_WorkTm_Dtr[2] = 0x00;
	BrochkSec_Cnt = 0;				//广播校时后秒计数器清零
	

 }

void	Dl_VerAdd_0(unsigned char *addr1,unsigned int addr2,unsigned int addr3)
{
   unsigned char i;
   unsigned char j = 0x00;
   unsigned char p = 0x00;
   for(i=0;i<4;i++)
    {
      j = j + *(addr1 + i);
     }
  F_BlckRead_Eeprm(addr2,Databuf,4);						//读取E2P电量数据到RAM区1
   for(i=0;i<4;i++)
    {
	   p = p + Databuf[i];
     }
   if(j != p)
    {
	   F_BlckRead_Eeprm(addr3,Databuf+30,4);						//读取E2P2电量数据到RAM区2
	   j = 0x00;
	   for(i=0;i<4;i++)
	    {
		   j = j + Databuf[30+i];
         }
       if(j != p)
	    {
		   F_BlckWrt_Eeprm(addr2,&Databuf[30],4);
		   F_BlckRead_Eeprm(addr2,addr1,4);
         }
       else
	    {
		   F_BlckRead_Eeprm(addr2,addr1,4);
        }
	 }
 }


void	Sys_DataVer(void)
{
   unsigned char i;
   unsigned char j = 0x00;
   for(i=0;i<16;i++)
    {
	    if(SysData_Verify[i] == 0x68)
		 {
		    ++j;
		  }
	 }
   if(j < 10)			//RAM区系统数据校验区数据 == 0x68的个数小于10
    {
	   Sys_Reg.BYTE=0x02;			//系统认为该电表系统已初始化过,但电池未在掉电后提供电压
       F_BlckRead_Eeprm(ESysData_Group,SysData_Verify,0x10);
	   j = 0x00;
       for(i=0;i<16;i++)
        {
	      if(SysData_Verify[i] == 0x68)
	       {
		      ++j;
            }
         }
       if(j < 10)							//系统为第一次上电
        {
	       Sys_Reg.BYTE=0x01;			//系统认为第一次上电
	     }
     }
   else
    {
	    Sys_Reg.BYTE=0x04;			//系统认为该电表系统已初始化过,且电池在掉电后一直提供电压
	   }	 
 }  


void	Sys_UpVer(void)				//系统自校验
{
	Sys_DataVer();
  	if(Sys_Reg.BYTE == 0x01)			//系统第一次上电
     { 
        Reset_Data();
		BrochkSec_Cnt = 0;				//广播校时后秒计数器清零
      }
    if(Sys_Reg.BYTE == 0x02)			//系统认为该电表系统已初始化过,但电池未在掉电后提供电压
	 {
	    RBatt_WorkTm_Dtr[0] = 0x00;
		RBatt_WorkTm_Dtr[1] = 0x00;
		RBatt_WorkTm_Dtr[2] = 0x00;
		BrochkSec_Cnt = 0;				//广播校时后秒计数器清零
      }
	WatchDog_Set();						//喂狗
	IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
    if(Power_Io_Data)					//系统如为正常上电模式
     {
	    Dl_VerAdd_0(RPPwrTtl_Dtr,EPPwrTtl_Dtr,EPPwrTtl_BKUP);		//当前电量校验
       }
	IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
    if(Power_Io_Data)					//系统如为正常上电模式
	 {
	    Dl_VerAdd_0(RNPwrTtl_Dtr,ENPwrTtl_Dtr,ENPwrTtl_BKUP);		//反向电量校验
      }
	IO.PCR5 = 0xFE;			//POWER作为输入、WP1、SCL1、SDA1作为输出
    if(Power_Io_Data)					//系统如为正常上电模式   
	 {
	    F_BlckRead_Eeprm(ENPwrTtl_Dtr,RNPwrTtl_Dtr,0x04);
	    F_BlckRead_Eeprm(EMtCt_Dtr,RMtCt_Dtr,0x03);			//电表常数读取
	    F_BlckRead_Eeprm(EMtNo_Dtr,RMtNo_Dtr,0x06);			//表地址读取   
	    F_BlckRead_Eeprm(EUsrNo_Dtr,RUsrNo_Dtr,0x06);		//用户号读取  
	    F_BlckRead_Eeprm(EDvcNo_Dtr,RDvcNo_Dtr,0x06);		//设备码读取 
	    F_BlckRead_Eeprm(EShftDspTm_Dtr,RShftDspTm_Dtr,0x01);		//循显时间读取 		
	    F_BlckRead_Eeprm(EStpDspTm_Dtr,RStpDspTm_Dtr,0x01);		//停显时间读取  
	    F_BlckRead_Eeprm(EAUtRdTm_Dtr,RAUtRdTm_Dtr,0x02);		//自动抄表日
	    F_BlckRead_Eeprm(EIntPwr_Dtr,RIntPwr_Dtr,0x04);			//有功电能起始读数
	    F_BlckRead_Eeprm(EPassWd_Dtr,RPassWd_Dtr,0x04);			//密码读取
	    F_BlckRead_Eeprm(ERttDspNo_Dtr,RRttDspNo_Dtr,0x10);		//正常轮显序号
	    F_BlckRead_Eeprm(EKeyDspNo_Dtr,RKeyDspNo_Dtr,0x10);		//键显序号
	    F_BlckRead_Eeprm(EOpnClsLcd_Dtr,ROpnClsLcd_Dtr,0x04);	//LCD开关显示时间
	    F_BlckRead_Eeprm(E_Cf_Cnt,&CF_CUNT,1);					//脉冲数

		WatchDog_Set();						//喂狗
	  }						
 }

⌨️ 快捷键说明

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