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

📄 czx167-145-v2.2.c

📁 代码实现了载波抄读电能表
💻 C
📖 第 1 页 / 共 5 页
字号:
            HW_State=7;
            HW_Pointer++;
         }
         else
         {
            HW_State=0;
            HW_Pointer=0;
            HW_Data_CRC=0;
         }
      }
      else if(HW_State==7)                                 // 数据校验和正确,开始接收结束字符
      {
         Infrared_buf[HW_Pointer]=SBUF;

         if(Infrared_buf[HW_Pointer]==0x16)
         {
            for(i=0; i<(HW_Pointer+1); i++)
                Infrared_buf_bak[i]=Infrared_buf[i];      //备份接收到的数据

            HW_Re_OK='O';                                 //置红外接收正确标志
            HW_ZB='H';                                    //置红外/载波状态为===红外标志
         }

         HW_State=0;           //清0红外使用的积存器
         HW_Pointer=0;
         HW_Data_CRC=0;

      }

   }

   ES=1;    //允许串行口0中断
   ET0=1;
   REN=1;   //允许接收
   RI=0;    //清标志位

   return;
}

/**************************************************************************************
 *
 * FUNCTION:    Com1_int
 *
 * DESCRIPTION: COM1中断程序:    COM1(RS485)中断产生时,按照顺序接收规约数据
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  Com1_int(void) interrupt 6
{
   ES1=0;                                               // 串口1中断禁止
   ET0=1;
   EREN=1;
   if(ERI!=0)
   {
       Timer_RS=20;                     // 100mS未接收到下一字节则退出接收状态(恢复原始态)
       RS485_buf[RS485_Pointer]=SBUF1; 
       RS485_Pointer++;
   }           
   ES1=1;
   ERI=0;
   EREN=1;
}
/**************************************************************************************
 *
 * FUNCTION:    pl_pro
 *
 * DESCRIPTION: 载波中断收、发程序
 *
 * PARAMETERS:
 *              in :  PLM_RS(PLM_RS=0  载波接收 ;  PLM_RS=1 载波发送)
 *
 *              out:  plmrxd=1 载波接收成功  ; pl_buf[]  载波接收成功的数据
 *
 * RETURNED:    none
 *************************************************************************************/
void  pl_pro(void) interrupt 7
{
	uchar data   j;
    if(PLM_RS)
    {                                                        // 载波发送
        if(pl_8<8)            //
        {
               RXD_TXD=pl_h;
               pl_8++;        //发送一个字节的比特位的计数器
               pl_data=pl_data<<1;

               if(pl_8==8)
			   {
                    pl_8=0;                                         // 位计数清0
                    ZB_Txd_Len++;                                   // 发送长度加1
                    plret_l++;                                      //复位计数器+1
                    pl_data=Send_Carrier_buf[ZB_Txd_Len];           // 下一个字节

                    if(plret_l>=20)
                    {
                           PLM_RST=0xa2;
                           plret_l=0;
                    }
                    if(ZB_Txd_Len>=ZB_Glob_Len)
                    {                                                //发送完成
                          PLM_RS=0;                                  // 置成收态
                          ZB_Glob_Len=0;                             //总长度置成0
                          pl_data=0;
                          pl_8=0;
                          for(ZB_Txd_Len=0;ZB_Txd_Len<20;ZB_Txd_Len++)   //接收缓冲区清0
                             Send_Carrier_buf[ZB_Txd_Len]=0;
                          ZB_Txd_Len=0;
                          RXD_TXD=1;
                    }
			   	}
		 }
    }
    else
    {                                                        // 载波接收
         RXD_TXD=1;
         if (r_x==0)                                         //接收检测同步头
         {
              if (RXD_TXD==1)
              {
                 x_09af=x_09af|1;
              }
              if (x_09af==0x09af)//判断同步头
              { //myled=0; 
                 r_x=1;          //同步头已经接收标志
                 r_8=0;          //比特计数器
                 x_09af=0;       //清0
                 r_data=0;
				 r_len=0;  //接收有效字节的长度为1
                 r_len1=30;//接收总长度给初值
              }
              else
              {
                 x_09af=x_09af<<1;
              }
         }
         else               //接收有效字节
         {
               if (RXD_TXD==1)
                  r_data=r_data|1;
               r_8++;
               if (r_8<8)
               r_data=r_data<<1;
               else
               {
                    Carrier_buf[r_len]=r_data;
                    r_8=0;
                    if(r_len==4)
                    {
					   r_len1=r_data+7;   //得到实际要接收的长度
                       if(r_len1>60)
					       r_x=0;
                    }
                    r_len++;
                    r_data=0;
                    if (r_len>=r_len1)
                    {
                       r_x=0;
                       for (j=0;j<r_len1;j++)
                       {
                          Carrier_buf_bak[j]=Carrier_buf[j]; //备份接收到的数据
                       }
                       ZB_Re_OK='O';
                       HW_ZB='Z';

                     }
               }
          }
    }
}
///////////////////////////////////////
//zb_send_c();
/////////////////////////////////////////////
void zb_send_c(void)
{
    uchar   i;
    uint    crc;
    i=ZB_Glob_Len;
    crc=cal_crc(Send_Carrier_buf,i);

    Send_Carrier_buf[ZB_Glob_Len]=(uchar)crc;   
	crc=crc>>8;
    Send_Carrier_buf[ZB_Glob_Len+1]=(uchar)crc;    

    ZB_Glob_Len+=2;          //发送长度增加2个字节校验码
    for(i=0;i<ZB_Glob_Len;i++)
      Send_Carrier_buf[ZB_Glob_Len-i+7]=Send_Carrier_buf[ZB_Glob_Len-i-1];
	for(i=0;i<6;i++)
    Send_Carrier_buf[i]=0XFF;  //补充数据头

    Send_Carrier_buf[6]=0X09;
    Send_Carrier_buf[7]=0XAF;
    ZB_Glob_Len=ZB_Glob_Len+9;//发射长度增加8个字节的帧头,为可靠多发一个字节
    ZB_Txd_Len=0;
    pl_8=0;
    PLM_RST=0xa2;          // 复位发送计数器
    plret_l=0;             // 清载波复位计数器
    pl_data=Send_Carrier_buf[0];
    PLM_RS=1;
}
/**************************************************************************************
 *
 * FUNCTION:    Check_HW_Son_ADD
 *
 * DESCRIPTION: 检查红外通讯地址是否正确
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    返回地址类型  'E'=错误地址;0=子表地址;0x99=广播地址;0x55=终端地址
 *
 *************************************************************************************/
uchar Check_HW_Son_ADD(void)
{
    uchar  i;
    if(Infrared_buf_bak[1]==0)
        if(Infrared_buf_bak[2]==0)
             if(Infrared_buf_bak[3]==0) 
                return('E');  
    if(Infrared_buf_bak[1]==0x99)
        if(Infrared_buf_bak[2]==0x99)
            if(Infrared_buf_bak[3]==0x99) 
                return(0x99); 
	for(i=0;i<16;i++)
	{
	    if(Infrared_buf_bak[1]==Son_Add_buf[i][0])
            if(Infrared_buf_bak[2]==Son_Add_buf[i][1])
                if(Infrared_buf_bak[3]==Son_Add_buf[i][2]) 
                    return(0);
	}
    if(Infrared_buf_bak[1]==terminal_add[0])
        if(Infrared_buf_bak[2]==terminal_add[1])
            if(Infrared_buf_bak[3]==terminal_add[2])
			      return(0x55);
	return('E');
}
/**************************************************************************************
 *
 * FUNCTION:    check_HW_password
 *
 * DESCRIPTION: 检查红外通讯密码是否正确
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    'O'=密码正确;'E'=密码错误
 *
 *************************************************************************************/
void  xiaodou(void)
{
      uchar  j;
	  key=1;
	  if(key==0)
	  {
           for(j=0;j<250;j++);for(j=0;j<250;j++); for(j=0;j<250;j++);
		   if(key==0)
		   {
			    for(j=0;j<250;j++);for(j=0;j<250;j++);for(j=0;j<250;j++);
                if(key==0)    
	               wp24=0;
           }
	  }
}

/**************************************************************************************
 *
 * FUNCTION:    WR_ADDR
 *
 * DESCRIPTION: 向EE中写7个字节并校验写入的7个字节是否正确
 *              
 *
 * PARAMETERS:  none
 *
 * RETURNED:    返回0写出错,返回O写正确
 *
 *************************************************************************************/
uchar WR_ADDR(uchar WR_24,uchar Add_FM24)
{ 
      uchar  i,j;
	  if(wp24==1)
	     return(0);
	  Write_FM24_nByte(WR_24,7, Add_FM24 );

      for(j=0;j<3;j++)
      for(i=0;i<250;i++);

      WDT_RST=0xA1;
      i=Read_FM24_7Byte(WR_24,Add_FM24);
      if(i!='O')
         return(0);
      if(Write_buf[0]==Read_buf[0])
      {
           if(Write_buf[1]==Read_buf[1])
           {
                if(Write_buf[2]==Read_buf[2])
                {
                       if(Write_buf[3]==Read_buf[3])
                       {
                             if(Write_buf[4]==Read_buf[4])
                             {
                                   if(Write_buf[5]==Read_buf[5])
                                   {
                                         if(Write_buf[6]==Read_buf[6])
                                             return('O');                                                          
                                   }
                             }
                       }
                 }
			}
	   }
	   return(0);
}
/**************************************************************************************
 *
 * FUNCTION:    write_add_terminal
 *
 * DESCRIPTION: 写终端表号
 *
 *
 * PARAMETERS:  红外接收的终端表号位置
 *
 * RETURNED:    none
 *
 *************************************************************************************/
  void  write_add_terminal(uchar k)
  {
        uchar i;
        uchar j='X';
        for(i=0;i<6;i++)
		{
		     Write_buf[i]=Infrared_buf_bak[k+i]-0x33;
			 j+=Write_buf[i];
		}
		Write_buf[6]=j;
        xiaodou();
		i=WR_ADDR(WR_2402,add_terminal);
        xiaodou();		
		j=WR_ADDR(WR_2402,add_terminal_bak);
		if((i=='O')&&(j=='O'))
		{
	     	for(i=0;i<7;i++)
              terminal_add[i]=Write_buf[i];
			HW_Answer_Success();	 
		}
  }
/**************************************************************************************
 *
 * FUNCTION:    HW_Design_Prog
 *
 * DESCRIPTION: 红外规约数据处理
 *
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void HW_Design_Prog()
{
   uchar   Data_Control_sign;                       // 控制码( "0x01" or "0x04" )
   uchar   Command_Sign_H;                          // 0x90
   uchar   Command_Sign_L;                          // 0x1F
   uchar   Add_FM24;                                // FM24C04中的数据保存地址
   uchar   CS;
   uchar   i,j,k;
   uchar   Addcheck;   

   Addcheck=Check_HW_Son_ADD();
   Data_Control_sign=Infrared_buf_bak[8];     //读取功能码
   Command_Sign_H=Infrared_buf_bak[11]-0x33;  //接收方-0x33处理数据
   Command_Sign_L=Infrared_buf_bak[10]-0x33;  //

⌨️ 快捷键说明

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