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

📄 main.c

📁 电能表源码
💻 C
📖 第 1 页 / 共 2 页
字号:
//==============================================================
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 + -