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

📄 gd485-08.c

📁 基于ADE7166/7169的单相表程序
💻 C
📖 第 1 页 / 共 4 页
字号:
  {
   	if(LCDbuf[ucA]==0)
   	{
   		LCDbuf[ucA]=11;
  	}
  	else break;
  }
}


/****************************************
** 函数原型: void checkpulseadd(void); **
** 功    能: .                         **
****************************************/
void checkpulseadd(void)
{ 
  if(IncZZFlag==1) { E2Add(); IncZZFlag=0; }
}



unsigned char JY(uchar ucJ)			//机偶位
{
	uchar ucA,ucB;
 ucB=0;
 for(ucA=0;ucA<8;ucA++)
 { if(ucJ&0x01) ucB++;
   ucJ>>=1;
 }
  if(ucB&0x01)  return(1);
 else return(0);	
}

/****************************************
** 函数原型: void trxPkg(void);        **
** 功    能: 串口发送数据成帧          **
****************************************/
void trxPkg(void)
{
 uchar i,ucA,ucB;
 SCON_bit.REN=0; 
 SR_STAT=0;
 SRTIME=0;					        //由子程序末移到首,避免因再接受数据改变
 
     for(ucA=0;ucA<6;ucA++)
     { 
       recv[ucA+2]=MeterID[ucA];
     }
   //  memmove(&recv[2],MeterID,6);				        //由子程序末移到首,避免因再接受数据改变
  if((recv[9]==0xc1)||(recv[9]==0xc4)) {recv[10]=1;recv[11]=0x1;  }
  else
  {
     recv[10]=trxLong;                                     // 数据域长度
  if(trxLong!=0) { recv[10]=trxLong+2;}                 // 写数据回应不包含DI1,DI0
  if(trxLong<21)
   {
   	for(i=0;i<trxLong;i++)   /** 数据域赋值并做余三码处理 **/
      {
         recv[13+i]=EEbuf[i];
      }
   }
  else {
        for(i=0;i<20;i++)   /** 数据域赋值并做余三码处理 **/
        {
         recv[13+i]=EEbuf[i];
        }
       }
  } 

   for(i=0;i<recv[10];i++)   /** 数据域赋值并做余三码处理 **/
      {
         recv[11+i]+=0x33;
      }
  for(ucB=0,ucA=1;ucA<(11+recv[10]);ucA++)              // 生成检验和
  {
    ucB+=recv[ucA];
  }
  recv[11+recv[10]]=ucB;
  recv[12+recv[10]]=ETX;

  recv[0]=12+recv[10];                                // 要发送数据长度
  trxLong=0;
  
  Delay(10);
  SCON_bit.REN=0;
 // TXIE=1;
  
// if(SR485_bz)			                        // 485通讯
     RS485Trx;
//  else				                        // 红外通讯
//  {  TMR2IE=0;
//    initT2();
// /  Timefull=1;
//    TMR2ON=1;
//  }
 // TXEN=1;
  Delay(48);
  SIOtrFlag=1;
  SR485_bz=0;
   SCON_bit.TB8=1;
   SBUF=0xfe;
//    _nop_();_nop_();
   //TXEN=1;
 //   if(P) TB8=1;
 //   else  TB8=0;
 //   SBUF=ACC;

}

/****************************************
** 函数原型: void trxPkg(void);        **
** 功    能: 串口发送数据成帧          **
****************************************/
void trxPkgL(void)
{
 uchar i,ucA,ucB;

 SCON_bit.REN=0; 
 SR_STAT=0;
 SRTIME=0;					        //由子程序末移到首,避免因再接受数据改变

     for(ucA=0;ucA<6;ucA++)
     { 
     	recv[ucA+2]=MeterID[ucA];
     }
   //  memmove(&recv[2],MeterID,6);				        //由子程序末移到首,避免因再接受数据改变
  
  
                                      // 数据域长度
  recv[10]=trxLong+2;                 // 
  
   for(i=0;i<18;i++)   /** 数据域赋值并做余三码处理 **/
      {
         recv[13+i]=EEbuf[i];
      }
   
 

   for(i=0;i<20;i++)   /** 数据域赋值并做余三码处理 **/
      {
         recv[11+i]+=0x33;
      }
  for(ucB=0,ucA=1;ucA<31;ucA++)              // 生成检验和
  {
    ucB+=recv[ucA];
  }
  recv[31]=ucB;
  recv[32]=ETX;

  recv[0]=12+recv[10];                                // 要发送数据长度
  trxLong=0;
  
  Delay(10);
  SCON_bit.REN=0;
 // TXIE=1;
  
// if(SR485_bz)			                        // 485通讯
     RS485Trx;
//  else				                        // 红外通讯
//  {  TMR2IE=0;
//    initT2();
// /  Timefull=1;
//    TMR2ON=1;
//  }
 // TXEN=1;
  Delay(48);
  SIOtrFlag=1;
  SR485_bz=0;
   SCON_bit.TB8=1;
   SBUF=0xfe;
//   asm("nop");asm("nop");
  // ES=1;
 //   if(P) TB8=1;
 //   else  TB8=0;
 //   SBUF=ACC;

}

uchar zerostar(uchar SS)       //上ss日0点电量地址
{
  uchar ucB;
  readEE24(0,NOWZEROADD,1);
  ucB=EEbuf[0];
  if(SS>ucB)
    ucB=ucB+8;
  return(ucB-SS);
}

void zerotake(uchar www,uchar weiz)        //上www日0点电量
{
 readEE24(1,ZEROADD+5*www,5);
 EEbuf[15-5*weiz]=EEbuf[0];
 EEbuf[16-5*weiz]=EEbuf[1];
 EEbuf[17-5*weiz]=EEbuf[2];
 EEbuf[18-5*weiz]=EEbuf[3];
 EEbuf[19-5*weiz]=EEbuf[4];
}

void poweron(void)
{
  OUTA=0;
  OUTB=1;
  LEDBJ=0;
}
void poweroff(void)
{
   OUTA=1;
   OUTB=0;
}
/********************************************
** 函数原型: void TakeCommunication(void); **         
** 功    能: 串口处理程序                  **
**           根据数据帧完成数据读写并      **
**           调用trxpag完成应答数据处理    **
********************************************/
void TakeCommunication(void)
{
  uchar ucA,ucB;
  trxLong=0;
 
  switch(recv[9])
   {
     case 0x01:       /** 读数据 **/
     {
        recv[9]=0x81;       
        if(recv[12]==0x90)   /**当前电能**/
       { 
       	 if(recv[11]==0x1f)
        {
          
            for(ucA=0;ucA<12;ucA++)
            {EEbuf[4+ucA]=0;} 
           
             readEE24(0,NOWVALADD,4);
             EEbuf[0]=PulseAdd[1];
             EEbuf[8]=EEbuf[0];
             EEbuf[9]=EEbuf[1];
             EEbuf[10]=EEbuf[2];
             EEbuf[11]=EEbuf[3];
             trxLong=16;
             
     //        trxPkg();
          
       }
       else if(recv[11]==0x10)   /**当前电能**/           
          {  for(ucA=0;ucA<4;ucA++)
             {
             	EEbuf[ucA]=DL[ucA];
             }
          
             EEbuf[0]=PulseAdd[1];
      
             trxLong=4;
            
     //       trxPkg();	
          }
           else if(recv[11]==0x20)  /**当前电能**/            
          {   for(ucA=0;ucA<4;ucA++)
             {
             	EEbuf[ucA]=0;
             }
           
             trxLong=4;
            
      //       trxPkg();	
          }
         else  if((recv[11]&0xf0)==0x90)
         {
         	if(recv[11]<=0x97)
          { 
          	 ucA=zerostar(recv[11]&0x0f);            
             readEE24(1,ZEROADD+5*ucA,5);
             trxLong=5;
          }
          else if(recv[11]==0x9f)
            {
             for(ucB=0;ucB<4;ucB++)
             { 
             	 ucA=zerostar(4+ucB);
               readEE24(1,ZEROADD+5*ucA,5);
               recv[33+5*ucB]=EEbuf[0];
               recv[34+5*ucB]=EEbuf[1];
               recv[35+5*ucB]=EEbuf[2];
               recv[36+5*ucB]=EEbuf[3];
               recv[37+5*ucB]=EEbuf[4];
               ucA=zerostar(3-ucB);
             
               zerotake(ucA,ucB);
              
             }
              recv[53]=0xaa;
              trxLong=41;
            }
         else if(recv[11]==0x9d)
            {
             for(ucB=0;ucB<4;ucB++)
             { 
               ucA=zerostar(3-ucB);
               zerotake(ucA,ucB);
             }
              trxLong=20;
            }
         else if(recv[11]==0x9e)
            {
             for(ucB=0;ucB<4;ucB++)
             { ucA=zerostar(7-ucB);

               zerotake(ucA,ucB);
        
              
             }
              trxLong=20;
            }
         else {recv[9]=0xc1;}
         }
          
       else  if((recv[11]&0xf0)==0xa0)
                 {  
                       	ucA=recv[11]&0x0f;
                       	if(ucA<4)
                       	{
                       	  for(ucB=0;ucB<18;ucB++)
                       	  { 
                       	   // EEbuf[ucB]=zhval[ucA*18+ucB];
                          } 
                          trxLong=18;
                       	}
                       	else if(ucA<8)
                       	{
                       	 zhtake(recv[11]);
                       	 trxLong=18;
                       	}
                       	else
                       	{ZH_x=0xa0;ZH_n=18;
                       	 for(ucB=0;ucB<18;ucB++)
                       	  { 
                       	   // EEbuf[ucB]=zhval[ucB];
                          } 
                       	 trxLong=144;
                     //  	 trxPkgL();
                       	
                       	}
                    }     
          else if((recv[11]&0xf0)==0xb0)
                       {  if(recv[11]!=0xbf)
                          {
                        	zhtake(recv[11]);
                       		trxLong=18;
                       	  }
                       	  else
                       	  { ZH_x=0xb0;ZH_n=18;
                       	    zhtake(0xb0);
                       	    trxLong=144;
                   //    	    trxPkgL();
                       	   
                       	  }
                       }  
                 
         else {recv[1]=0xc1;}
        
       }
       else if((recv[12]==0x94)&&(recv[11]==0x10))   /**当前电能**/
          {   readEE(BYVALADD,4);
             //readEE(NOWVALADD,5);
            
             trxLong=4;
            
   //         trxPkg();	
          }
        else if((recv[12]==0x98)&&(recv[11]==0x10))   /**当前电能**/
          {   readEE(BYVALADD+4,4);
             //readEE(NOWVALADD,5);
            
              trxLong=4;
            
       //       trxPkg();	
          }
        else if((recv[12]==0x9a)&&(recv[11]==0x10))   /**当前电能**/
          {   readEE(BYVALADD+8,4);
             //readEE(NOWVALADD,5);
            
              trxLong=4;
            
       //       trxPkg();	
          }
       else if(recv[12]==0xc0)
       {if(recv[11]==0x30)
        {
       	
                               /**电表常数(有功)**/
                             //   readEE(LOW,CONSTANTADD,2);
                        EEbuf[0]=0;
                        EEbuf[1]=0x16;		//
                        EEbuf[2]=0;
                        trxLong=3;
         //               trxPkg();
                                
        }
        else if(recv[11]==0x32)                                      /**表号**/
         {           readEE(YHIDADD,6);
                                
                     trxLong=6;
         //            trxPkg();
        }
        else if(recv[11]==0x29)                                      /**状态**/
         {            EEbuf[0]=Db_S_Jdq&0x0f;  
                       if(SetTimeFlag)   EEbuf[0]|=0X10;		//10-23
                       else	         EEbuf[0]&=0xef;
                       if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
                                       EEbuf[0]&=0xdf;
                       else            EEbuf[0]|=0X20;
                            	     
                       if(TimeErr_bz)    EEbuf[0]|=0x08;
                       else              EEbuf[0]&=0xf7;       
                       trxLong=1;
        }
         else if(recv[11]==0x10) 
               {  EEbuf[0]=0;
                  EEbuf[1]=HEX2BCD(Time.day);
                  EEbuf[2]=HEX2BCD(Time.month);
                  EEbuf[3]=HEX2BCD(Time.year);
                  trxLong=4;
                  
       //           trxPkg();
               }
             else if(recv[11]==0x11) 
                { EEbuf[0]=HEX2BCD(Time.second*2);
			  
		  EEbuf[1]=HEX2BCD(Time.minute);
			  
		  EEbuf[2]=HEX2BCD(Time.hour);
		  trxLong=3;
        //          trxPkg();
                }
            else {
                  recv[9]=0xc1;
              //    trxPkg();
                }   
      }
        
       else if((recv[12]==0xc1)&&(recv[11]==0x19))                                      /**初值**/
         {                      readEE(INIVALADD,4);
                                
                                trxLong=4;
            //                    trxPkg();
        }	
         else if((recv[12]==0xc1)&&(recv[11]==0x17))                                      /**chao biao ri**/
         {                 readEE(AUTOREADDAYADD,1);
 	                   if(EEbuf[0]>=0x31) EEbuf[0]=0x01;
                           EEbuf[1]=EEbuf[0];
                           EEbuf[0]=0;
                           trxLong=2;
          //                 trxPkg();
        }
         else if((recv[12]==0x8e)&&(recv[11]==0xa2))                                      /**chao biao ri**/
         {                 
 	                  
                           EEbuf[0]=0x06;		//带控制和485(06)
                           EEbuf[1]=0x18;
                           EEbuf[2]=0x17;
                           EEbuf[3]=0x10;
                           EEbuf[4]=0x01;
                           EEbuf[5]=0x00;
                           trxLong=6;
          //                 trxPkg();
        }
        else 
          {
            
            recv[9]=0xc1;
       //     trxPkg();	
        }  
      if(trxLong==144)
       trxPkgL();
      else trxPkg();
     }
    	        
     break;
     
     case 0x04:                     /** 写数据 **/
     {  
     	
     	 if((recv[12]==0xc1)&&(recv[11]==0x19))
     	{  if(KRES_bz==1)  
     	  { SetDL();
     	    EEbuf[0]=0;
     	    writeEE(CleanAdd,1);
            S_timeFlag=1;
	    
            recv[9]=0x84;
            trxPkg();	
          }
         else
           { 
             readEE(MIMAADD0,4);
            if((recv[13]==0)&&(EEbuf[1]==recv[14])&&(EEbuf[2]==recv[15])&&(EEbuf[3]==recv[16]))
              {
             	if((DL[1]<0x10)&&(DL[2]==0)&&(DL[3]==0))
             	{readEE(CleanAdd,1);
             	 EEbuf[0]++;
             	 if(EEbuf[0]<=5)
             	   {    writeEE(CleanAdd,1);
             	        recv[17]=0;
     	    		recv[18]=0;
     	    		recv[19]=0;
     	    		recv[20]=0;
             	   	SetDL();
             	   	S_timeFlag=1;
	                
                        recv[9]=0x84;
                        trxPkg();
                        
             	   }
             	  else
             	    { 
             	      
                      recv[9]=0xc4;
                      trxPkg();	
             	    }

⌨️ 快捷键说明

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