📄 main.c
字号:
//==============================================================
void Recover_tindiandata(void)
{ unsigned char value;
data_addr.word[1]=EEP_Save_engdot; //恢复电量小数部分
Read_data(EEPROM,2);
value=0;
if(wr_buff[0]==(wr_buff[1]-0x33)) //校验和相等
{ if(checkone_bcd(wr_buff[0])==1) //BCD校验
{ value=1;
}
}
if(value==0) //恢复失败
{ wr_buff[0]=0;
}
addr_baseonIDandtype(RAM,ID_POSENGSUM);
ram[(*ID_coretalbpoint[0]).dataaddr+3]=wr_buff[0]; // 存放进RAM中
xiaoshu=wr_buff[0];
data_addr.word[1]=EEP_Save_cf; //CF 恢复
Read_data(EEPROM,2);
if(wr_buff[1]==(wr_buff[0]+0x33))
{ if(wr_buff[0]<128)
sumCF_Z=wr_buff[0];
}
sumCF_Z=0; // 恢复失败,置0。
}
//==================================================
//函数功能:恢复数据
//备注:
//===================================================
void Recover_data(void)
{ Recover_eng(); // 恢复电量整数
Recover_tindiandata(); // 恢复停电时保存的数据:电量小数,CF脉冲数,等
Recover_prim(); // 恢复表参数
}
//=============================================
//函数功能:检测当前系统供电模式
//返回参数:1:市电供电。0:电池供电
//=============================================
unsigned char check_powertype(void)
{ unsigned char value;
if((Systate&0x01)==0x01)
value=1; //正常供电
else
{value=0;
}
return value;
}
//===============================================
//函数功能: 电池电压检测
//返回参数: battest=1,电池电量不足;battest=0;正常
//=================================================
void bat_test(void)
{ uint32 M;
// battest=0; //
SetMChannel(2,1); // 开M通道,电池电压检测功能,1倍增益
delay_10ms(); // 10MS延时
M=ReadMeterPara(2); // 读寄存器值
if(M>0x7fffffff)
{
M=(~M)+1; //取补码
}
M=(M*3)/1000000000; // 计算有效值
if (M<3) // 小于多少表示电池电压不足,报警
battest=1; // 报警标志,LCD中显示
else
battest=0; //
SetMChannel(0,1); // 开M通道,电池电压检测功能,1倍增益
}
//==============================================
//函数功能:初始化各功能模块
//
//==============================================
void Init_modul(void)
{
Init_disp(); // 初始化显示模块
// init_keyevent(); // 初始化按键模块
init_RTCmode(); // 初始化RTC模块
init_realdate(); // 初始化瞬时值
int_energeadd(); // 初始化能量计量模块
// init_485comm(); // 初始化485模块
init_infrcomm(); //初始化红外模块
// int_lostqiandong(); //初始化潜动和防窃电模块
// int_zhuancun(); //初始化历史转存模块
// Ini_switchmode();
//Ini_checkmode(); //初始化检测模块
// Int_ereasflashmode(); //初始化擦除标志位
}
//============================================================
//函数功能:初始化停电模块,
//
//============================================================
void ini_sleepmode(void)
{ CfgInterrupt(0); //关所有中断
EA=0; //关总中断
time_jihuo=0;
time_lostiv=0;
port_init(); //禁止IO口输入输出
}
//=============================================================
//函数功能:停电激活初始化
//
//============================================================
void Init_jihuo(void)
{
Init_disp(); //初始化显示模块
sta_meterrun=5; //激活模式
time_jihuo=0;
}
//===============================================================
//函数功能:停电保存各类数据
//备注:包括:电量小数,CF脉冲位数,当月平均功率因数、停电时间
//===============================================================
void savedata_tingdian(void)
{unsigned int temp_addr;
//====================================================================电量小数部分
addr_baseonIDandtype(RAM,ID_POSENGSUM);
temp_addr=(*ID_coretalbpoint[0]).dataaddr;
wr_buff[0]=ram[temp_addr+3];
wr_buff[1]=wr_buff[0]+0x33;
data_addr.word[1]=EEP_Save_engdot;
Write_data(EEPROM,2);
//======================================================================CF
wr_buff[0]=sumCF_Z;
wr_buff[1]=wr_buff[0]+0x33;
data_addr.word[1]=EEP_Save_cf;
Write_data(EEPROM,2);
/*
//=======================================================================停电时间年,月 日 时 分 次数
wr_buff[0]=RTCTIME.rYear;
wr_buff[1]=RTCTIME.rMonth;
wr_buff[2]=RTCTIME.rDate;
wr_buff[3]=RTCTIME.rHour;
wr_buff[4]=RTCTIME.rMinute;
addr_baseonIDandtype(EEPROM,ID_CUTPOWTIME);
data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
Write_data(EEPROM,5);
addr_baseonIDandtype(EEPROM,ID_CUTPOWTIME);
data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
Read_data(EEPROM,2);
byte_x_bcd_addone(wr_buff,2); //停电总次数加1
Write_data(EEPROM,2);
*/
}
//=========================================================================
//函数功能:开启CF脉冲输出
//
//=========================================================================
void Open_CF(void)
{unsigned char i;
if(count_opencftime==0)
{ i=ReadMeterFunc();
if((i&0x10)!=0x10) //如果cf没有开
{ i=ReadMeterFunc();
if((i&0x10)!=0x10)
{ i&=0x7f; //关潜动
i|=0x10; //开CF
timocount_cf=0; //清CF间隔计时器
SetMeterFunc(i);
SetInterrupt(14); //开CF中断
}
}
}
}
//==============================================================
// 主函数
//
//==============================================================
void main(void)
{// uint8 xdata *p,i;
SetPLL(1); // 3M 工作频率
SetMeterFunc(0); // 关CF输出
if(Systate & BIT2) // rtc reset
{
}
// #ifdef DEBUG
// #else
else if(Systate & BIT4) // wdt reset
{
Init_System();
Recover_data(); // 恢复数据 re
Init_modul(); // 各功能模块初始化
// complet_zhuncun(); // N停电事件超过一个月,转存数据
EA = 1; // 开总中断
// i=ReadMeterFunc();
// SetMeterFunc(i|0x10); // 开CF中断
}
// #endif
else if(Systate & BIT3) // io reset
{
}
else // 正常上电复位
{
Init_System();
Recover_data(); // 恢复数据
Init_modul(); // 各功能模块初始化
// complet_zhuncun(); // N停电事件超过一个月,转存数据
EA = 1; // 开总中断
}
//========================================================================================正常运行部分
run_zhengchang:
while(check_powertype()==1) //市电供电
{
//test_enout=0;
//test_out=(~test_out);
//ClearWDT(); //喂狗
if(check_powertype()==0)
break;
Rtc_refreshmode(); //时钟刷新
if(check_powertype()==0)
break;
Open_CF();
//if(check_powertype()==0)
// break;
//keymode(); //按键事件
if(check_powertype()==0)
break;
display_mode(); //显示模块
if(check_powertype()==0)
break;
read_encount(); //读CF脉冲
if(check_powertype()==0)
break;
energ_addmode(); //能量计量模块
if(check_powertype()==0)
break;
realdata_mode(); //计算有效值
if(check_powertype()==0)
break;
commu_mode(); //通讯模块
if(check_powertype()==0)
break;
xuliangmode(); //需量模块
//if(check_powertype()==0)
// break;
//Switch_mode(); //拉合闸控制
// if(check_powertype()==0)
// break;
// zhuncun_mode(); //历书数据转存模块
}
//==============================================================================================停电处理部分
if(check_powertype()==0) //电池供电
{ savedata_tingdian(); //停电保存数据
// Ene_lostenvent(); //结束窃电事件
// CfgRTC(0,0); //32768,1秒唤醒
ini_sleepmode(); //初始化停电模式
SetMeterFunc(0x00);
// CfgLCD(0x08);
CloseLCD(); //关lcd
sta_meterrun=4; //程序进入休眠模式
Sleep(); //进入睡眠模式
}
else
goto run_zhengchang;
//=========================================================================================停电激活
jihuo:
Init_jihuo(); //激活初始化
while(time_jihuo<=80) //电池供电,激活运行3分钟
{ ClearWDT(); //喂狗
if(check_powertype()==1)
break;
Rtc_refreshmode(); //时钟刷新
//if(check_powertype()==1)
// break;
//keymode(); //按键事件
if(check_powertype()==1)
break;
display_mode(); //显示模块
if(check_powertype()==1)
break;
commu_mode(); //通讯模块
if(check_powertype()==1)
break;
}
if(check_powertype()==1) //来电处理
{ Init_System();
Init_modul(); //各功能模块初始化
EA = 1; //开总中断
goto run_zhengchang;
}
if(time_jihuo>80) //激活时间到
{ CloseLCD(); //关lcd
ini_sleepmode(); //初始化停电模式
Sleep(); //进入睡眠模式
}
}
#undef MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -