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

📄 zb_to_dlt645.c

📁 低压电力线载波通信PL3200驱动程序
💻 C
字号:
/********************************************************************
包含头文件
********************************************************************/
#include "PL3200.H"
#include "CONST.H"
#include "RAM.H"
#include "IO.H"

/********************************************************************
函数名称: void com0_send(uint8 dat)
功    能: 串口1发送子程序,偶校验
入    口: 无
出    口: 无 
********************************************************************/
void com0_send(uint8 dat)
{
    uint8 i ;
    uint8 temp ;
    bit crc_bit=0 ;
    
    soft_bit = 1 ;
      
    ETB8 = 0 ;
    temp = dat ;
    for(i=0;i<8;i++)
    {
        if(temp&0x01) 
            crc_bit = !crc_bit ;
        temp = temp>>1 ;  
    }

    if(crc_bit) ETB8 = 1 ;
    
    ETI = 0 ;
    SBUF1 = dat ;
    while(!ETI) ;
    ETI = 0 ;
}

/********************************************************************
函数名称: void ZB_To_DLT645(void)
功    能: 把载波数据转化为DLT645数据格式,并发送给上位机
入    口: 无
出    口: 无
********************************************************************/
void ZB_To_DLT645(void)
{
    uint8 i ;
    uint8 temp_crc=0 ;
    
    for(i=0;i<3;i++)                                //载波接收的目的地址为BB,BB,BB时才上传
    {
        if(zb_rece_buf_bak[i]==0xbb)
            continue ;
        else
            return ;
    }
    
    led_time = BASE_LED_TIME ;
    UP_OK_IO = 0 ;                                  //置向上一级芯片传送指示
    for(i=0;i<255;i++)                              //使上一级芯片有充分时间能检测到此管脚为低,进入串口转发
    {
        UP_OK_IO = 0 ; 
    }

    ES1   = 0 ;                                     //关闭串口中断,禁止串口接收                                          
    SCON1 = 0xc0 ;                   
    
    com0_send(0xff) ;
    
    com0_send_buf[0] = 'D' ;
    com0_send_buf[1] = 'A' ;
    com0_send_buf[2] = 'T' ;
    com0_send_buf[3] = zb_rece_buf_bak[4]+2+5 ;//+2 ;
    //com0_send_buf[4] = 0x09 ;
    //com0_send_buf[5] = 0xaf ;
    
    for(i=0;i<(zb_rece_buf_bak[4]+7);i++)
    {
        com0_send_buf[4+i] = zb_rece_buf_bak[i] ;
    }

    for(i=0;i<(com0_send_buf[3]+4);i++)
    {
        com0_tmr = 60 ;
        com0_send(com0_send_buf[i]) ;
    }
    
    com0_send('A') ;
    
    
    UP_OK_IO = 1 ;                                  //清向上一级芯片传送指示
    
    SCON1 = 0xd0 ;
    ES = 1 ;
}

/********************************************************************
函数名称: void Series_Data_Upload(void)
功    能: 把DLT645数据以数据流的方式向上转发
入    口: 无
出    口: 无
********************************************************************/
void Series_Data_Upload(void)
{
    ES1 = 0 ;                                       //关串口中断,串口停止接收
    EIE = 0 ;
    EA  = 0 ;                               
    
    WDT_RST = 0xa1 ;                                
    
    if(!BELOW_OK_IO)
    {
        UP_OK_IO = 0 ;                              //置向上一级芯片传送指示
        
        while(!BELOW_OK_IO)
        {
            if(UP_DATA_IO)
                TXD_IO = 1 ;
            else
                TXD_IO = 0 ;
        }
    
        UP_OK_IO = 1 ;                              //清向上一级芯片传送指示
    }

    
    ES1 = 1 ;                                       //开串口中断,串口允许接收
    EIE = 1 ;
    EA = 1 ;
}

/********************************************************************
函数名称: void VersionAnswer(void)
功    能: 特殊应答,回复厂商代码 'I' 'D' 0x30 0x31 0x0d 0x0a
入    口: 无
出    口: 无
********************************************************************/
void VersionAnswer(void)
{
    uint8 i ;
    uint8 temp_crc=0 ;

    ES1   = 0 ;                                            
    SCON1 = 0xC0 ; //禁止接收
    
    com0_send(0xff) ;
    
    com0_send_buf[0] = 'I' ;
    com0_send_buf[1] = 'D' ;
    com0_send_buf[2] = 0x30 ;
    com0_send_buf[3] = 0x31 ;
    com0_send_buf[4] = 0x0d ;
    com0_send_buf[5] = 0x0a ;
        
    for(i=0;i<6;i++)
    {
        com0_tmr = 20 ;
        com0_send(com0_send_buf[i]) ;
    }
    
    
    SCON1 = 0xd0 ;
    ES1 = 1 ;
}

⌨️ 快捷键说明

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