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

📄 czx167-145-v2.2.c

📁 代码实现了载波抄读电能表
💻 C
📖 第 1 页 / 共 5 页
字号:
            Send_Infrared_buf[i]=RS485_buf_bak[i];
          
       Infrared_Data_Send(j);   //红外发送
	   HW_ZB=0;
   }
   else if(HW_ZB=='Z')   //载波读表数据
   {
      if(ZB_Read_Time=='Y')    //判断载波是否读时间
	  {
	       if(RS485_buf_bak[11]==0xF3)
           {
               if(RS485_buf_bak[10]==0x43)               //=C010   日期及周次的回答
               {
                   Send_Carrier_buf[0]=ZJ_Add_buf[0];
                   Send_Carrier_buf[1]=ZJ_Add_buf[1];
                   Send_Carrier_buf[2]=ZJ_Add_buf[2];
                   Send_Carrier_buf[3]=0x81;

                   Send_Carrier_buf[4]=13;
                   Send_Carrier_buf[5]=0x12;
                   Send_Carrier_buf[6]=0xC0;

                   Send_Carrier_buf[7]=RS485_buf_bak[1];
                   Send_Carrier_buf[8]=RS485_buf_bak[2];
                   Send_Carrier_buf[9]=RS485_buf_bak[3];               // 载波地址
                   Send_Carrier_buf[10]=0x0F;                          // 继电器状态

                   Send_Carrier_buf[14]=RS485_buf_bak[12]-0x33;
                   Send_Carrier_buf[15]=RS485_buf_bak[13]-0x33;
                   Send_Carrier_buf[16]=RS485_buf_bak[14]-0x33;
                   Send_Carrier_buf[17]=RS485_buf_bak[15]-0x33;
		      	   for(i=0; i<100; i++)         //延时15.08ms
                   {
			             WDT_RST=0xa1;  
                         for(j=0; j<250; j++);                       
                   }
                   read_hms_frame();   //下发读时分秒485数据帧
               }
               else if(RS485_buf_bak[10]==0x44)                   //= C011 时间
               {
                   Send_Carrier_buf[11]=RS485_buf_bak[12]-0x33;
                   Send_Carrier_buf[12]=RS485_buf_bak[13]-0x33;
                   Send_Carrier_buf[13]=RS485_buf_bak[14]-0x33;
                   ZB_Glob_Len=18;
                   zb_send_c();
                   ZB_Read_Time=0x0;
                   HW_ZB=0;  
    		   }
    		   else
    		   {
                   ZB_Read_Time=0x0;
                   HW_ZB=0;     		   		
    		   }
		  }
		  else 
		  {
               ZB_Read_Time=0x0;
               HW_ZB=0;  		  		
		  }
	  }
	  else
	  {
	      Send_Carrier_buf[0]=ZJ_Add_buf[0];
          Send_Carrier_buf[1]=ZJ_Add_buf[1];
          Send_Carrier_buf[2]=ZJ_Add_buf[2];
		  Send_Carrier_buf[3]=RS485_buf_bak[8];
	      Send_Carrier_buf[4]=RS485_buf_bak[9]+4;
		  if(RS485_buf_bak[9]==0)
		  {
		      Send_Carrier_buf[5]=RS485_buf_bak[1];
	          Send_Carrier_buf[6]=RS485_buf_bak[2];
              Send_Carrier_buf[7]=RS485_buf_bak[3];          // 载波地址                 
              Send_Carrier_buf[8]=0x0F;
			  ZB_Glob_Len=9;
			  zb_send_c();
		  }
	      else
		  {
		      Send_Carrier_buf[5]=RS485_buf_bak[10]-0x33;
              Send_Carrier_buf[6]=RS485_buf_bak[11]-0x33;
		      j=RS485_buf_bak[9]+9;
              ZB_Glob_Len=j;
		      for(i=11;i<j;i++)
                  Send_Carrier_buf[i]=RS485_buf_bak[i+1]-0x33;
              Send_Carrier_buf[7]=RS485_buf_bak[1];
	          Send_Carrier_buf[8]=RS485_buf_bak[2];
              Send_Carrier_buf[9]=RS485_buf_bak[3];          // 载波地址                 
              Send_Carrier_buf[10]=0x0F;
              zb_send_c();
		  }
          HW_ZB=0;
	  }	  
   }
   else HW_ZB=0;
}


/**************************************************************************************
 *
 * FUNCTION:    Infrared_Data_Send
 *
 * DESCRIPTION: 红外数据发送
 *
 *
 * PARAMETERS:  Buf[]: 等待发送的数据,  Send_Len待发送数据的长度
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void Infrared_Data_Send(uchar  Send_Len )
{
   uchar    i,j,k;

   ES=0;
   REN=0;
   EXT_ADR=0X19;
   EXT_DAT=0X20;

   for( i=0; i<Send_Len; i++ )
   {
       ACC=Send_Infrared_buf[i];
       TB8=PSW^0;

       SBUF=Send_Infrared_buf[i];

       Timer_HW=100;
                                             // 500毫秒钟发送不成功退出
       while(TI==0)
       {
           if(Timer_HW==0)
           {
             ES=1;
             REN=1;
             TI=0;
             return;
           }
       }
       TI=0;
	   for(k=0;k<3;k++)
       for(j=0;j<200;j++);
       
   }

   REN=1;
   ES=1;
   TI=0;
   EXT_ADR=0X19;
   EXT_DAT=0X00;
}



/**************************************************************************************
 *
 * FUNCTION:    RS485_Data_Send
 *
 * DESCRIPTION: RS485数据发送(都是读命令,因此固定发送14个字节)
 *              68 A0 A1 A2 A3 A4 A5 68 01 02 Data_L Data_H CS 16
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void RS485_Data_Send()
{
   uchar     i;
   uchar     j,k;
   uchar     Len;
   EXT_ADR=0X19;
   EXT_DAT=0X20;
   ES1=0;
   EREN=0;

   Len=Send_RS485_buf[9]+12;

   for( i=0; i<Len; i++ )
   {
       ACC=Send_RS485_buf[i];
       ETB8=PSW^0;

       SBUF1=Send_RS485_buf[i];

       Timer_RS=20;                                        // 100毫秒钟发送不成功退出

       while(ETI==0)
       {
           if(Timer_RS==0)
           {
             ES1=1;
             EREN=1;
             ETI=0;
             return;
           }
       }
       ETI=0;
       for(k=0;k<3;k++)
       for(j=0;j<200;j++);
   }

   ES1=1;
   EREN=1;
   ETI=0;
   EXT_ADR=0X19;
   EXT_DAT=0X00; 

   RS485_Send_Sign='O';
   Timer_RS_Answer=120;   //600mS未收到第一个字节,认为该帧数据无应答
}

/**************************************************************************************
 *
 * FUNCTION:    HW_Answer_Success
 *
 * DESCRIPTION: 红外应答设置成功
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void HW_Answer_Success()
{
   uchar     i;
   uchar     Data_CRC;

   for(i=0; i<4; i++)
       Send_Infrared_buf[i]=0xFE;

   for(i=4; i<12; i++)
       Send_Infrared_buf[i]=Infrared_buf_bak[(i-4)];
   
   Send_Infrared_buf[12]=0x84;
   Send_Infrared_buf[13]=0x00;

   Data_CRC=0;
   for(i=4; i<14; i++)
   {
       Data_CRC+=Send_Infrared_buf[i];
   }

   Send_Infrared_buf[14]=Data_CRC;
   Send_Infrared_buf[15]=0x16;

   Infrared_Data_Send(16);
}


/**************************************************************************************
 *
 * FUNCTION:    HW_Answer_MeterNO
 *
 * DESCRIPTION: 红外应答电表表号
 *
 *
 * PARAMETERS:  MeterNO: 电表序号
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void HW_Answer_MeterNO(uchar  MeterNO)
{
   uchar     i;
   uchar     Data_CRC;

   Send_Infrared_buf[0]=0x68;

   for(i=1; i<7; i++)   //变表号为终端所管理的表号
   {
       Send_Infrared_buf[i]=Son_Add_buf[MeterNO][(i-1)];
       Send_Infrared_buf[(i+11)]=Son_Add_buf[MeterNO][(i-1)]+0x33;
   }
   Send_Infrared_buf[7]=0x68;
   Send_Infrared_buf[8]=0x81;
   Send_Infrared_buf[9]=0x08;
   Send_Infrared_buf[10]=0x40+MeterNO+0x33;
   Send_Infrared_buf[11]=0xC0+0x33;

   Data_CRC=0;
   for(i=0; i<18; i++)
       Data_CRC+=Send_Infrared_buf[i];
   
   Send_Infrared_buf[18]=Data_CRC;
   Send_Infrared_buf[19]=0x16;

   Infrared_Data_Send(20);
}


/**************************************************************************************
 *
 * FUNCTION:    initsys
 *
 * DESCRIPTION: 初始化设置函数,
 *              进行系统初始化设置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys(void)
{
  CKCON=0X3F;                       // 控制看门狗喂狗时间长度为832ms (0x8EH)
  ALU_MOD=0;                        // 8位/16位运算模式选择位 ; 设置成8位运算模式 (D0H^1)

//载波通讯配置
  PLM_SSC=1;                           // (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1
  EIE=0X01;                            // (A9H 使能INT2中断(EX2=1)
  IT2=1;                               // (C8H) 为边沿触发方式(IT2=1)。
  PLM_RS=0;                            // PLM_RS(EXT_CTRL.0)=1  为0时,载波处于接收状态

  // T0设置为定时方式
  TMOD=0x21;                        // 设 T/C1 为模式2,8 位自装载计数器 ;T/C0 为模式1, 定时方式,16 位计数器
  TH0=0xF8;                         // 定时器0中断配置
  TL0=0x30;                         // 定时 5ms 一个定时中断
  TR0 =1;                           // 启动 T0 定时器
  ET0 =1;                           // 允许定时器 T0 中断

  //COM0通讯配置
  PCON=0xC0;                        // COM0 和 COM1的波特率加倍
  SCON=0xD0;                        // 串口0 的控制寄存器,方式3 11 位异步收发,波特率由定时器控制,允许接收。
  TH1=0xEB;
  TL1=0xEB;                         // 设定波特率为1200;  9.6(PL3105按9.6/2计算) 下数 EBH
  TR1=1;                            // 启动定时器1
  ES=1;                             // 允许串口0中断

  IR_CNT1=0x1F;                      // 红外通讯使用38K频率
  EXT_ADR=0xFE;
  LED_LCD =0;                       // 打开液晶显示
  IR38K   =1;                       // 打开红外通讯
  RS485   =0;                       // 关闭RS485通讯


  //COM1通讯配置
  SCON1=0xD0;                       // 串口1 的控制寄存器,方式3 11 位异步收发,波特率由定时器控制,允许接收。
  TMOD1=0x02;                       // T2设置为模式2(8位自装载计数器 )
  TH2=0xEB;
  TL2=0xEB;                         // 设定波特率为1200;  9.6(PL3105按9.6/2计算) 下数 EBH
  TR2=1;                            // 启动定时器2
  ES1=1;                            // 允许串口1中断

  // 中断级别设置
  PT0=1;                            // 定时器 T0 中断为高级中断
  EIP=1;                            // 外部中断2 为高级中断,载波中断优先
  EA=1;                             // 开总中断
}


/**************************************************************************************
 *
 * FUNCTION:    initsys_ref
 *
 * DESCRIPTION: 初始化重置函数,
 *              进行系统初始化重置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys_ref(void)
{
   if(ALU_MOD!=0)
      ALU_MOD=0;
   //载波通讯重置

   if(PLM_SSC!=1)
      PLM_SSC=1;
   if (EIE!=0x01)
       EIE=0x01;                          // (A9H 使能INT2中断(EX2=0)
   if(IT2!=1)
      IT2=1;                              // (C8H) 为边沿触发方式(

⌨️ 快捷键说明

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