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

📄 gd485-08.c

📁 基于ADE7166/7169的单相表程序
💻 C
📖 第 1 页 / 共 4 页
字号:
             	
             	}
               else
                {    
                      recv[9]=0xc4;
                      trxPkg();	
                }
              }  
            else
                {    
                      recv[9]=0xc4;
                      trxPkg();	
                }
           }
        }
         else if(recv[12]==0xc0)
               {
                  
                     if(recv[11]==0x10)                                 /**日期及星期**/
                      {
   
          		 if(KRES_bz)
          		 { 
		            	 Time.day=BCD2HEX(recv[18]);		  
			             Time.month=BCD2HEX(recv[19]);			 
			             Time.year=BCD2HEX(recv[20]);
                   minute_bz=1;
                         
                	}
                        
           		 recv[9]=0x84;
            		 trxPkg();
                    }
                    else  if(recv[11]==0x11)                                   /**时间**/
                     { 
                     	 if(KRES_bz)
                       	{
                          IE_bit.ET1=0;
                          KYREG=0xEA;		  
			                    SEC=BCD2HEX(recv[17]);
			                    MIN=BCD2HEX(recv[18]);
			                    HOUR=BCD2HEX(recv[19]);
			                    IE_bit.ET1=1;
			                    minute_bz=1;
			                                      
                	}
                    
            	     recv[9]=0x84;
            	     trxPkg();
                   }
               else if(recv[11]==0x28)
                    { if((recv[13]==0))
                      readEE(MIMAADD0,4);
                      else
                      readEE(MIMAADD,4);
                      if((EEbuf[1]==recv[14])&&(EEbuf[2]==recv[15])&&(EEbuf[3]==recv[16]))
                      {  
                    	if((recv[17]==0x55)&&(recv[18]==0x33))		//off
                    	  {     Db_S_Jdq=0xf1;
                    	        EEbuf[0]=Db_S_Jdq;
                    	        writeEE(JDQADD,1);
                    	  	 if((PulTime[0]>PulT_ib)&&(PulTime[1]>PulT_ib))
                    	  	{poweroff();Db_S_Jdq|=0x04;MOTOR_FLAG=0x99;MOTOR_Timer=0;}
                    	  	else {MOTOR_FLAG=0x0f;}		//wait
                    	  	 recv[9]=0x84;
            	    		 trxPkg();
                    	  }
                    	else if((recv[17]==0x66)&&(recv[18]==0x99))		//on
                    	     {  EEbuf[0]=0;
                    	        writeEE(JDQADD,1);
                    	     	poweron();
                    	     	MOTOR_Timer=0;
                    	     	MOTOR_FLAG=0x99;
                    	     	Db_S_Jdq=0;
                    	     	
                    	     	recv[9]=0x84;
            	                trxPkg();
                    	     }  
                    	else 
                    	{
               
                          recv[9]=0xc4;
                          trxPkg();	
                         }  
                      }
                     else 
                    	{
               
                          recv[9]=0xc4;
                          trxPkg();	
                         }  
                    }
               
             
              else 
              {
               
               recv[9]=0xc4;
               trxPkg();	
              }        	           
     	} 
                   
       else if((recv[12]==0xc1)&&(recv[11]==0x17))                                      /**chao biao ri**/
         {                          	           	                  
                 EEbuf[0]=recv[18];
                 writeEE(AUTOREADDAYADD,1);
                          
                 recv[9]=0x84;
                 trxPkg();
        }	
                  
        else 
         {            
            recv[9]=0xc4;
            trxPkg();	
          }  
      }
      
      break;
     case 0x08:						/****广播校时***/
     if(recv[10]==6) 
        {  if((Time.year==BCD2HEX(recv[16]))&&(Time.month==BCD2HEX(recv[15]))&&(Time.day==BCD2HEX(recv[14])))
           { 
           ucA=BCD2HEX(recv[13]);		//hour  10-24
           ucB=BCD2HEX(recv[12]);		//minute

           if(SetTimeFlag==0)
             {  
       	//	 Time.second=BCD2HEX(recv[11]); // s & 0x7f
       		 IE_bit.ET1=0;
       	//	 Time.second=BCD2HEX(recv[11]); // s & 0x7f
       ucA=BCD2HEX(recv[11]);
	     Time.second=(ucA>>1);
 		   Time.minute=BCD2HEX(recv[12]);  // m & 0x7f
  		 Time.hour=BCD2HEX(recv[13]);  // h & 0x3f
  		 IE_bit.ET1=1;
  		 SetTimeFlag=1;
  		 
             }
          }
          else 
           {TimeErr_bz=1;
           
          }  
           
        }
     
     SCON_bit.REN=1;//LCDDATA10|=0x80;
     break;     
          
    case 0x0a:
     { if(KRES_bz)
       {
     	if((recv[10]==6))
        { ucB=0;
          for(ucA=0;ucA<6;ucA++)
          {EEbuf[ucA]=recv[ucA+11];
           
           MeterID[ucA]=recv[11+ucA];
           recv[2+ucA]=recv[11+ucA];
          }
          
          
          writeEE(YHIDADD,6);     //002005005728   fe
      //    EEbuf[3]=Month;EEbuf[2]=Day;EEbuf[1]=Hour;EEbuf[0]=Minute;
      // writeEE(XUL,PROGRAMTIMEADD,4);                  
          recv[9]=0x8a;         
          trxPkg();
        
        }
       }
       else {SCON_bit.REN=1;}// LCDDATA10|=0x80;}  
     }
     break;
      case 0x0f:							//写编程密码
     { if(KRES_bz)
       {
     
         {// readEE(CSHU,MIMAADD,4);
        //  if((EEbuf[0]==recv[11])&& (EEbuf[1]==recv[12])&&(EEbuf[2]==recv[13])&&(EEbuf[3]==recv[14]))
          for(ucA=0;ucA<4;ucA++)
          {EEbuf[ucA]=recv[ucA+15];
          }
          // memmove(EEbuf,&recv[15],4);
           if(recv[15]==0)
     	   writeEE(MIMAADD0,4);
     	   else  if(recv[15]==1)
     	   writeEE(MIMAADD,4);
     	   recv[9]=0x8f;
     	   recv[11]=recv[15];
     	   recv[12]=recv[16];
     	   EEbuf[0]=EEbuf[2];
     	   EEbuf[1]=EEbuf[3];
     	  
     	    trxLong=2;
            trxPkg();
  //      else {CREN=1;}				//错误码
	}
       }
      else
          {  if(recv[15]==0)
     	   readEE(MIMAADD0,4);
     	   else  if(recv[15]==1)
      	  readEE(MIMAADD,4);
          if((EEbuf[0]==recv[11])&& (EEbuf[1]==recv[12])&&(EEbuf[2]==recv[13])&&(EEbuf[3]==recv[14]))
         {if(recv[15]==0)
     	   writeEE(MIMAADD0,4);
     	   else  if(recv[15]==1)
     	   writeEE(MIMAADD,4);
     	   recv[9]=0x8f;
     	   recv[11]=recv[15];
     	   recv[12]=recv[16];
     	   EEbuf[0]=EEbuf[2];
     	   EEbuf[1]=EEbuf[3];
     	  
     	   trxLong=2;
           trxPkg();
          }
         else {SCON_bit.REN=1;}//LCDDATA10|=0x80;}
       }
    }
     break;
    
     default:
          
           // trxLong=0xfe;
           // recv[10]=recv[10]+0xc0;
           // trxPkg();	
           // RCIE=1;
     	    SCON_bit.REN=1;
     	  //  LCDDATA10|=0x80;
         
     break;
   }
 
}

/********************************************
** 函数原型: void SIOservice(void);        **
** 功    能: 串口接受程序                  **
**           接受完整一帧并完成校验码和    **
**           余三码处理,置位接收有效      **
**           SIOrecvFlag                   **
********************************************/
void SIORECV( void ) 
{ 
   
    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;
       
          return;
        }   
        else{                                     /* 否则,继续监听 */
         goto sioend;
         
        }
     }
   
   }
 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;
	            
}
/********************************************
** 函数原型: void SIOservice(void);        **
** 功    能: 串口发送程序                  **
**           发送完整一帧并完成校验码和    **
**           余三码处理,置位接收有效      **
**           SIOTXFlag                   **
********************************************/

void SIOTX()
{  
    uchar ucA,ucB;  
    SCON_bit.TI=0;
    // Delay(2);
   if(recv[0]<64)
    {
     if(trxLong<recv[0])
     {              
       trxLong++;
       SCON_bit.TB8=JY(recv[trxLong]);
       SBUF=recv[trxLong];
  
       goto sioend1;
     }
     else             //关红外载波和发送中断 
     {  
     	Delay3ms();
     
       SCON_bit.REN=1;
       RS485Rcv;
       SIOtrFlag=0;
      // LCDDATA10|=0x80;
     //  SR_STAT=1;
      // SRTIME=0;
      // INTF=0;
      // INTE=1;
  	
         goto  sioend1;
     }   
    }
   else
    {
     if(trxLong<recv[0])
     {              
       trxLong++;
       
      
      if(trxLong<31)
      {
      	 SCON_bit.TB8=JY(recv[trxLong]);
        SBUF=recv[trxLong];
      }
      else
      {
       if(ZH_n==18)
       { ZH_n=0;
         ZH_x++;
         ucA=ZH_x&0x0f;
        if(ucA<0x08)
        {
          if(ZH_x<0xa4)
          {
           for(ucB=0;ucB<18;ucB++)
                { 
                //  EEbuf[ucB]=zhval[ucA*18+ucB];
                } 
          }
         else
        { zhtake(ZH_x);     }
        
         for(ucB=0;ucB<18;ucB++)
          {
           recv[13+ucB]=EEbuf[ucB]+0x33;
       //    recv[13+ucA]+=0x33;
           recv[31]+=recv[13+ucB];
          }
       }
        else 
        {
         ZH_n=18;
	       }
       }
        SCON_bit.TB8=JY(recv[ZH_n+13]);
        SBUF=recv[ZH_n+13];
        ZH_n++;
      }
       goto sioend1;
     }
    else
      {
      	Delay3ms();
    // 	TXIE=0;
     	//IRCLK=0;
     //	CCP2CON=0;
        
       // PR2=0X9c;				// 20ms
       
       // TMR2IF=0;
      //  TMR2IE=1;
       // T2CON=0X3E;				//128分频,TMR2ON=1; 
     	 SCON_bit.REN=1;
       RS485Rcv;
       SIOtrFlag=0;
      // LCDDATA10|=0x80;
     //  SR_STAT=1;
      // SRTIME=0;
      // INTF=0;
      // INTE=1;
  	
         goto  sioend1;
     }	
    	
    } 
  
   sioend1:
         SCON_bit.REN=1;

}

#pragma vector=0x0B
__interrupt void timer0(void)
{	
  if((TCON_bit.TF0==1)&&(IE_bit.ET0))	
   {
    TCON_bit.TR0=0;                                // 定时器重新赋值h:217  l:30-----10ms
    // TH0=243;
     TH0=120;
     TL0=0;
     TCON_bit.TF0=0;
     TCON_bit.TR0=1;
     WDT_bz=0; 
     t2flg=1;
             
     if(SR_STAT)
     { 
       SRTIME++;
       if(SRTIME>=12)
       { 
         SR_STAT=0;
         StartFlag=0;CheIDFlag=0;SR_P=0;SRTIME=0;
   	     SCON_bit.REN=1;

       }
     }
    T0Timer++;
    if(++Xulon>160) 
    	{Xulon=160; PulTime[0]=160;PulTime[1]=160;}
   if(T0Timer>=50)                      // 是否到3秒
  {   
     if(++DisTime>=123) {DisTime=0;S_timeFlag=1;}   
     T0Timer=0;     
  } 
  
  
  if(MOTOR_FLAG==0x99)					//OFF执行中
    { 
    	 MOTOR_Timer++;      
       if(MOTOR_Timer>=8)
       {
       	MOTOR_Timer=0;OUTA=0;OUTB=0;
        if((Db_S_Jdq&0xf1)==0xf1)
        	 {Db_S_Jdq|=0x03;MOTOR_FLAG=0x66;OFFRXD=0;}
        else
        	 {MOTOR_FLAG=0;Db_S_Jdq=0;}
       }
    }
 }

        
}


void Write_ADE_SFR(char ByteM, char ByteL, char Register)
 {    
  MDATM = ByteM;    
  MDATL = ByteL;    
  MADDPT = 0x80 | Register;    
    
  return;    

⌨️ 快捷键说明

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