📄 energadd.c
字号:
/*************************************************************************************
文件类型:
文件作用:能量计量
修改权限:
文件相关:
创 建 人:chenbo
创建日期:2007.06.04
当前版本:Ver0.1
版本信息:Ver0.1
**************************************************************************************/
#include "tiger.h"
#include "defvar.h"
#include "typemeter.h"
#include "chipmac.h"
extern unsigned char R_Byte(unsigned int Addr);
extern unsigned long R_Buff(void);
extern void W_Byte(unsigned int Addr,unsigned char Wdata);
extern void wrnum_flash(unsigned char num,unsigned int addr);
extern unsigned long long_to_4bcd(unsigned long value);
extern void ready_wrflash(void);
extern void Init_Interrupt(void);
//===================================================
//函数功能:获取CF脉冲个数
//备注:
//===================================================
unsigned long read_encount(void)
{ unsigned long buffer_d;
//W_Byte(0x28a1,0x01);
R_Byte(0x1074); //active
buffer_d=R_Buff();
R_Byte(0x1071); //reactive
buffer_d+=R_Buff();
//W_Byte(0x28a1,0x00);
return buffer_d;
}
//=====================================================
//函数功能:根据CF个数来累加能量
//备注
//======================================================
void energ_add(void)
{unsigned long temp_CF;
unsigned char bufeng,bufdoteng;
if(buffer_energ[0]>buffer_energ[1]) //如果脉冲数有增加
{ temp_CF=(buffer_energ[0]-buffer_energ[1]); //计算增加的脉冲数
sumCF=sumCF+temp_CF;
buffer_energ[1]=buffer_energ[0]; //新数据保存
counttime_qiandong=0;
}
if(sumCF>=level_add) //判断是否到0.01度
{ bufdoteng=Enegedata.byte[3];
bufeng=sumCF/level_add;
sumCF=sumCF%level_add;
energehex=energehex+bufeng; //电量累加
Enegedata.lword=long_to_4bcd(energehex); //BCD码转换
//Enegedata.lword=Enegedata.lword+bufeng;
F_stordot=true; //小数存贮标志
F_display=true; //显示刷新标志
if(Enegedata.byte[3]<bufdoteng)
F_storint=true; //整数存贮标志
}
}
//========================================================
//函数功能:保存电量
//
//=======================================================
void store_energ(void)
{ unsigned char i;
if(F_stordot==1) //存贮小数部分
{ F_stordot=0;
wr_buffer[0]=Enegedata.byte[3];
if(couren_addrdot==twoadd_blkeng_dot+511) //计算存贮地址
couren_addrdot=oneadd_blkeng_dot;
else
couren_addrdot=couren_addrdot+1;
//Fet_Dog();
ready_wrflash();
wrnum_flash(1,couren_addrdot); //存贮电量小数部分
Init_Interrupt();
if(couren_addrdot==twoadd_blkeng_dot) //页擦除标志位
F_askeras3=1;
else if(couren_addrdot==oneadd_blkeng_dot)
F_askeras4=1;
}
if(F_storint==1) // 存贮整数部分
{F_storint=0;
for(i=0;i<3;i++)
wr_buffer[i]=Enegedata.byte[i];
if(couren_addrint==oneaddr_blkeng_A)
{ couren_addrint=twoaddr_blkeng_A;
F_askeras1=1;
}
else
{ couren_addrint=oneaddr_blkeng_A;
F_askeras2=1;
}
ready_wrflash();
for(i=0;i<3;i++)
wrnum_flash(3,couren_addrint+100*i); //存电量整数部分
Init_Interrupt();
}
}
//=====================================================
//函数功能:对能量进行计量
//备注:1秒中刷新一次
//======================================================
void energcountmode(void)
{
if((F_askeras1==false)&&(F_askeras2==false)&&(F_askeras3==false)&&(F_askeras4==false))
{if((F_energeadd==true)&&(F_clreng==0)) //开始能量刷新标志
{ F_energeadd=false;
buffer_energ[0]=read_encount(); //读取脉冲数
energ_add(); //电量累加
store_energ(); //保存电量
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -