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

📄 gd485-08.c

📁 基于ADE7166/7169的单相表程序
💻 C
📖 第 1 页 / 共 4 页
字号:
}    
    

void Read_ADE_SFR(uchar *Pointer, char Register) 
{    
  char ByteH, ByteM, ByteL;      
  MADDPT = Register;    
  ByteH = MDATH;    
  ByteM = MDATM;    
  ByteL = MDATL;    
    
  *Pointer = ByteL;    
  *(Pointer+1) = ByteM;    
  *(Pointer+2) = ByteH;    
  return;    
}    


void INIT7166()
{	
	   //**** initializes the  power management    
	    
  KYREG = 0xA7;      
  POWCON=0x00;                       //POWCON &amt; 0xF8; //CD2 CD1 CD0=000 4.096MHz    

   IPSMF = 0x00;                
 // if (VSWSOURCE)                     //set BATPR only when the part is supplied from VDD      
    BATPR = 0x00;                   //00=battery switchover enabled on Low VDD only        
  //BATVTH = Battery_Low;
    STRBPER=STRBPER | 0x0c;    
 // PERIPH =PERIPH&0xf8;    
  //  EPSR = 1;   EVDCIN=1;
     IPSME |=0x89;                     //psm中断允许
//	 PERIPH=PERIPH|0x03; 
	  //**** initializes the RTC  
   IEIP2_bit.ETI=1;
   IEIP2_bit.EADE=1;
   IEIP2_bit.PTI=0;
   TIMECON = 0x43;   
   INTVAL = 128; 
   RTCCOMP = 0;                     //every 1sec=128* 1/128 sec, the interval timer generates an interrupt        
   //IEIP2 &=0xBF;                          //RTC interrupt with Low Priority (Bit6=PTI=0)                       
  // IEIP2 |=0x04;                          //Enable RTC interrupt (Bit2=ETI=1)  
  
    //**** initializes watchdog  
    WDCON_bit.WDWR = 1;                        // WDCON |=BIT0;    
    WDCON = 0x73;//0x01;             // Disable WDT; 0x73 enable WDT 2s    
    WDCON_bit.WDE = 1; 
    
    CFG|=0x01;
     //**** initializes lcd
    LCDCON=0xa7;                        // LCDEN+MUX4_BIAS3; enable LCD with 1/3 bias and 4x multiplecing. LCDEN|MUX4_BIAS3|BLINKEN Blink mod by srt    
    LCDCLK=0x82;                                     // FD1; FD1|BLKMOD1 Blink mod by srt    
    LCDCONX=0x18;                      // use charge pump. set the bias level for 3V;Va = Vref X (BLVL[4:0]/31)    
  //  LCDSEGE2=SEG19EN|SEG18EN|SEG17EN;               // enable FP17-19    
  //  LCDSEGE=FP23EN|FP22EN|FP21EN|FP20EN;        // enable FP20-23    
    LCDCONY=0x40;  
  
  
    //**** initializes ade
    Write_ADE_SFR(0x00, 0x80, MODE1);    
    Delay(200);    
    Write_ADE_SFR(0x00, 0x04, MODE1);    
    Write_ADE_SFR(0x00, 0x45, MODE2);    
    Write_ADE_SFR(0x00, 0x07, WAVMODE);    
    Write_ADE_SFR(0x00, 0x55, NLMODE);    
    Write_ADE_SFR(0x00, 0x00, ACCMODE);  
    Write_ADE_SFR(0x00, 0x10, CALMODE);    
    Write_ADE_SFR(0x00, 0x14, LINCYC);    
    Write_ADE_SFR(0x00, 0x00, WDIV);    
    Write_ADE_SFR(0x00, 0x00, CF1NUM); 
    
    //ee_read_bytes(ADDR_OF_GAIN_VAL,tmp_buf,1);    
   // Write_ADE_SFR(0x00, tmp_buf[0], GAIN);    
   
    //ee_read_bytes(ADDR_OF_CF1DEN_VAL,tmp_buf,2);    
    //Write_ADE_SFR(tmp_buf[1], tmp_buf[0], CF1DEN);    
   // ee_read_bytes(ADDR_OF_WGAIN_VAL,tmp_buf,2);    
   // Write_ADE_SFR(tmp_buf[1], tmp_buf[0], WGAIN);    
   // ee_read_bytes(ADDR_OF_PHCAL_VAL,tmp_buf,1);    
   // Write_ADE_SFR(0x00, tmp_buf[0], PHCAL);    
   // ee_read_bytes(ADDR_OF_WATTOS_VAL,tmp_buf,2);    
   // Write_ADE_SFR(tmp_buf[1], tmp_buf[0], WATTOS);    
    
  
    MIRQENH=0;    
    MIRQENM=0x40;    
    MIRQENL=0;    
    //enable Energy Metering Interrupt    
    IPSME  = 0;    
   // IEIP2 |=0x08;   //EADE=1; 

 //   INITtime();
     

}


void INITtime()
{
 
  // INT1
  TCON_bit.IT1=1;					// 边沿触发
  IE_bit.ET1=0;          // 不准许中断
  IP_bit.PT1=0;					// 中断优先级:低

  // Serial Port
  PCON=0x00;				// SMOD=0
  SCON=0xd8;				// SCON=(多机)方式3:xf0?单机)方式1:x50
  					        // 方式3: 1个起始位(0)、8个数据位、
                            //        1个(标志位)、1个停止位(1)
  					        // 波特率=2^SMOD*定时器1的溢出率/32
 SCON_bit.SM2=0;                    // 单机方式SM2=0,多机方式SM2=1
 IE_bit. ES=1;					    // 准许中断
 IP_bit.PS=0;					    // 中断优先级: 高

  // Baud Rate
  TMOD=0x21;				// 0010 0001:T1=方式2、 T0=方式1
				    // 波特率=2^SMOD*fosc/((2^8-0xfdh)*12*32)=9600
  TH1=0xf7;
  TL1=0xf7;				    // fosc=11.0592MHz
  TCON_bit. TR1=1;                    // 波特率=1200 TH1=TL1=0xE8h                         //       =2400 TH1=TL1=0xF4h
                            //       =4800 TH1=TL1=0xFAh
  					        //       =9600 TH1=TL1=0xFDh
 
  // Timer0
  TCON_bit.IT0=1;
  TL0=0xE6;					// Tman=(2^16-X)*12/fosc =(65536-0)*12/(4.092*10^6)=71ms
  TH0=0xE6; 				    // 定时20ms
  TCON_bit.TR0=1;
 // TCON_bit.TF0=0;
  IE_bit. ET0=1;					// 准许定时器0中断
  IP_bit. PT0=1;
 

}


//////////////////////////////////////////////////////////////////////////
////////////////////////串口中断函数 //////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#pragma vector=0x23
__interrupt void SIOservice(void)
{
  if(SCON_bit.RI) 
     {
     	 uchar ucA,ucB;
    ucA=SBUF;
    SCON_bit.RI=0;
  if(!StartFlag){
    if(ucA!=STX){
  
      return;
               }
    else {
    
       CheIDFlag=0;SR_P=1;IP_bit.PX1=1;IE_bit.EX1=1;
       SRTIME=0;StartFlag=1;SR_STAT=1;
        recv[1]=0x68;
        return; 
 
       }
  
 
    }

  if(!CheIDFlag){
    SR_P++;
    if(SR_P<8)
    {		              
        SRTIME=0;
        recv[SR_P]=SBUF;
       
       return;
       
     }
     if(SR_P==8)
      { if((recv[2]==0x99)&&(recv[3]==0x99)&&(recv[4]==0x99)&&(recv[5]==0x99)&&(recv[6]==0x99)&&(recv[7]==0x99)) 
      	    goto MeterIDOK;
    
    for(ucB=0;ucB<6;ucB++)
    {
    	   
     if((recv[2+ucB]!=MeterID[0+ucB])&&(recv[2+ucB]!=0xaa))
     { goto sioend;}
    }

      MeterIDOK: if(ucA==STX)   
         {recv[8]=0x68;
          StartFlag=1;CheIDFlag=1;SRTIME=0;IP_bit.PX1=0; IE_bit.EX1=0;
         //  if(INT1SUM>12) { SR485_bz=1;}   
         //  else SR485_bz=0;
         //  IR_star=0;
        //   INT1SUM=0;		
          return;
        }   
        else{                                    
      
         
        }
     }
   
   }
 recv[++SR_P]=ucA;
 SRTIME=0;
 if(SR_P==10)
  {  if(recv[10]>MaxL) goto sioend;} 
 if(SR_P>10)
  {  
  if(SR_P>=recv[10]+12)
   {     
   	if(recv[recv[10]+12]==0x16)
      {  ucB=0;
         for(ucA=1;ucA<=(10+recv[10]);ucA++) { ucB+=recv[ucA]; }      /**计算检验和CS**/
     if(ucB!=recv[ucA]) { goto sioend;}                        /** 校验和正确与否 **/
       for(ucA=11;ucA<recv[10]+11;ucA++) { recv[ucA]-=0x33; }    /**余三码处理**/
      
        
      	 StartFlag=0;CheIDFlag=0; SCON_bit.REN=0;
         SIOrecvFlag=1;SR_STAT=0;SRTIME=0;
         goto siorecvend;
      }
      else { goto sioend;
      	   }
  }
 else {
  
       return;
      }
 }
    return;
   
 sioend:
    SCON_bit.REN=1;
    IE_bit.EX1=0;
    IP_bit. PX1=0;

    StartFlag=0;CheIDFlag=0;SR_P=0;SR_STAT=0;
  
   	  return;
siorecvend:   RS485Rcv;
    }
    
}



////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
///////////////////////////////ADE中断函数///////////////////////////
////////////////////////////////////////////////////////////////////////////
#pragma vector=0x4B
__interrupt void ade_ISR(void)
{

}

///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
///////////////////////////////////RTC中断
//////////////////////////////////////////////////////////////////////
#pragma vector=0x53
__interrupt void RTC(void)   
{    
 
  if (TIMECON_bit.ALARM )              //(ALARM)
    {    
       TIMECON_bit.ALARM=0;
       ADDTIME=1;
    }    
    
}

 
void DisLcd(void)
{  
 
   LCDbuf[0]=DL[3]>>4;
   LCDbuf[1]=DL[3]&0x0f;		//显示最高位
   LCDbuf[2]=DL[2]>>4;
   LCDbuf[3]=DL[2]&0x0f;
   LCDbuf[4]=DL[1]>>4;
   nodiszero();
 
   LCDbuf[5]=DL[1]&0x0f;
   
   LCDbuf[6]=PulseAdd[1]>>4;

   writeLCD();
}
 
void MonthChange(void)
 {
  uchar ucA;
  readEE(BYVALADD+4,4);
  writeEE(BYVALADD+8,4);
  readEE(BYVALADD,4);
  writeEE(BYVALADD+4,4);
  for(ucA=0;ucA<4;ucA++)
  {
  	EEbuf[ucA]=DL[ucA];
  }
  EEbuf[0]=PulseAdd[1];
 	
     
   writeEE(BYVALADD,4);
                                                          // 当前需量时间不用清零
   EEbuf[0]=Time.month;
   writeEE(MONTHMARKADD,1);                                            // 改变月标志,为当月
   MonthMark=Time.month;
 }
 
 
void DayChange(void)
{ 
  uchar ucA,ucB;
  readEE(NOWZEROADD,1);
  ucB=EEbuf[0];
  ucB++;
  if(ucB>=8) ucB=0;
  for(ucA=0;ucA<4;ucA++)
  {
  	EEbuf[ucA]=DL[ucA];
  }
  EEbuf[0]=PulseAdd[1];
  EEbuf[4]=HEX2BCD(Time.day);
  writeEE(ZEROADD+5*ucB,5);
  EEbuf[0]=ucB;
  writeEE(NOWZEROADD,1);
}

/************************************/
/************************************/
void main(void)
{ 
  INIT7166(); 
  INITtime();
  IE_bit.EA=1;
 //do
 //{
   LCDbuf[0]=0x00;
   LCDbuf[1]=0x01;
   LCDbuf[2]=0x02;		//显示最高位
   LCDbuf[3]=0x03;
   LCDbuf[4]=0x04;
   LCDbuf[5]=0x05;
   LCDbuf[6]=0x06; 
   writeLCD();
   Delay(120);
   Delay(120);
   Delay(120);
   Delay(120);
 //}
 //  while(1);
   PCON=0x00;				// SMOD=0

           TCON_bit.TR1=1;                    // 波特率=1200 TH1=TL1=0xE8h    
     	     
     	   SCON_bit.REN=1;
     	   RS485Rcv;  
     	   Xulon=0;MOTOR_Timer=0;S_timeFlag=1;
     	   PulTime[0]=160;
   	     PulTime[1]=160;
  do
  {  	
  	ei(); 
  	if(PERIPH_bit.VSWSOURCE==0)              
       { 
         IE_bit.EA = 0;
      KYREG  = 0xa7;
      POWCON = 0x40;             //energy off
      PERIPH_bit.REF_BATT_EN=1;           //LCD active in psm2 IPSMF  = 1;  //clear inter flag
    //  IEIP2 |=0x80;        //IEIP2_bit.EPSR = 1;
      IE_bit.EA = 1; 
      
      
      IEIP2_bit.ETI =0;               //进入sleep之前修改rtc参数 eti=0;
      TIMECON = 0x7b;                
   //   INTVAL = 128; 
      RTCCOMP = 0;                    
      IEIP2_bit.PTI =0;                  //RTC interrupt with Low Priority (Bit6=PTI=0)   pti=0;                    
      IEIP2_bit.ETI=1;               	//0000 0100 enable the rtc 中断 eti=1;
      KYREG  = 0xa7;
      POWCON = 0x50;            
       LEDBJ=0;
       }
       else
       {
     	   
     	   if(MOTOR_FLAG==0x99) 
     	      {   if(Db_S_Jdq==0)
                  {
                     poweron();                    	     	
                  }	
                 else if((Db_S_Jdq&0xf1)==0xf1)
                  {
                   MOTOR_FLAG=0x0f;
                  }
     	       }
  	  
       
   	
  		if(PulseFlag)
     {   
    		 if(testbyte==0xaa)
   	    {
   	    	testbyte=0;   	    	      
   	      checkpulseadd();
   	    }
   	   else 
   	   	{
   	 	      Delay(250);      
        } 
     }
 
     if((Dis_bz==1)) 
     {
     	if(IncZZFlag==0)   
      {       
       DisLcd();
       Dis_bz=0; 
      }        
     }
    if((S_timeFlag)&&(IncZZFlag==0))
    { 
      DisLcd();
      DisTime=0;
      S_timeFlag=0;		//04 15
    }
  
   
    if(minute_bz)
    {
    	minute_bz=0;
      if(HourMark!=Time.hour)
      {      	  
          CLRWDT();
          Hour_Change();             
      }
     if(MonthMark!=Time.month)
      {  	 
          CLRWDT();
          MonthChange();        
      }
      if(DayMark!=Time.day)
      {
       DayMark=Time.day;
       SetTimeFlag=0;
       DayChange();
       readEE(JDQADD,1);
       if(EEbuf[0]!=0xf1)
        {
          if(PERIPH_bit.VSWSOURCE)
           {
            poweron();
            Delay(120);
            OUTA=0;OUTB=0;
           }
        }
      
      }
     
    }
   if (WDT_bz)
     { CLRWDT(); WDT_bz=0; }
     if(SIOrecvFlag==1) 
     	{  
        //LCDDATA10&=0x7f;		//通讯显示
    	TakeCommunication(); SIOrecvFlag=0; 
    	
    	}
    if(SIOtrFlag)
    {  if(SCON_bit.TI) SIOTX();}
   
  //  if(WDT_bz)
    
  if((t2flg==1)&&(SleepFlag==0))
  {
  	t2flg=0;
    if(RXD1) {
               if(OFFRXD>100) LEDBJ=1;
               else      
                 OFFRXD++;
             }
       else 
    	{
          OFFRXD=0;LEDBJ=0;                  
        }          
  if(KRES==0)
      CleanCnt++;
  else
  	 CleanCnt=0;
  if(CleanCnt>15)
  {
  	KRES_bz=1;CleanCnt=16;
  }
  else
  {
  	 KRES_bz=0;
  }
   if((MOTOR_FLAG==0x0f)&&(SleepFlag==0))				//等待执行OFF
         {
          if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
              { 
              	poweroff();MOTOR_FLAG=0x99;MOTOR_Timer=0;Db_S_Jdq|=0xf4;
              }
         }
   else if(MOTOR_FLAG==0x66)
          { 
          }
   else if(MOTOR_FLAG==0x00)
         {}
   
   }
 }
}while(1);
 
}

⌨️ 快捷键说明

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