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

📄 3200demo.c

📁 这是北京福星晓程公司的PL3105电力载波通信程序
💻 C
字号:
/*******************************************************************************************
 *
 *  Copyright (c) 2004,北京福星晓程电子科技股份有限公司
 *
 *  All Rights Reserved
 *
 *
 *
 *  文件名称:3200DEMO.C
 *
 *  文件标识:存档
 *
 *  摘    要:单、复费率载波DEMO收发板程序
 *            1. 接收PC机串口下发的抄表命令并通过载波转发
 *            2. 接收载波返回的抄表应答命令并通过串口转发给PC机
 *            3. 不加跳线端子,适用于复费率 ; 4、5脚加跳线端子,适用于单费率
 *            4. CPU :PL3200
 *            5. 串口波特率:  2400BPS  无校验
 *            6. 复费率接收最长有效字节数:247 ; 单费率接收最长字节数:14
 *
 *
 *  当前版本:2.0(发布)
 *  作    者:魏  茂
 *  完成日期:2004年11月17日
 *  修改记录:修改串口转发部分的程序,另开一个com_buf,载波接收到数据以后,
 *            立即将接收到的数据转移到新开com_buf里,在串口转发时不关闭载波中断,
 *            直接使用com_buf。
 *
 *
 *
 *  取代版本:
 *  原作者  :
 *  完成日期:
 *
 *
*******************************************************************************************/

#include "PL3200.h"

#define uchar unsigned char
#define uint  unsigned int

//I/O 口设置

sbit   DFL_FFL = P1^1;                // 单—复费率转换判断标志脚
sbit   rlamp   = P1^2;                // 接收指示灯
sbit   tlamp   = P1^3;                // 发送指示灯

// 全局变量设置
uchar data     DFL_FFL_Sign;          // 单——复费率标识

uchar  bdata   pl_data;               // 发送字节缓冲

uchar  data    pl_len;                // 发送字节计数
uchar  data    ti_len;                // 发送字节计数
uchar  data    zbr_delay;             // 发送字节计数
uchar  data    zbt_delay;             // 发送字节计数
uchar  data    uart_delay;            // 发送字节计数
uchar  data    max_rx ;               // 发送字节计数

uchar  data    x,n;                   // x、n表示串口接收控制变量
uchar  xdata   r[250];                // 串口接收缓冲区
uchar  data    ystxd;                 // 延时时间变量
uchar  data    Carrier_Rxd_Delay;     // 延时时间变量
uchar  data    r_data;
uchar  data    wdi;                   // 软狗变量
uchar  data    r_len;                 // 接收字节个数变量
uchar  data    r_len1;                // 接收字节个数变量
uchar  data    dat;                   // 接收字节个数变量

// 位变量
bit    bdata   r_x;                   // 载波接收控制变量
bit    bdata   plmrxd;                // 载波接收标志
bit    bdata   plmtxd;                // 载波发送标志
uchar  xdata   pl_buf[250];           // 载波接收/红外接收缓冲区
uchar  xdata   com_buf[250];          // 载波接收/红外接收缓冲区


/**************************************************************************************
 *
 * FUNCTION:    timeint0
 *
 * DESCRIPTION: 定时器0中断程序; 50 ms 发生一次中断,对延时变量进行减1处理
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *************************************************************************************/
void  timeint0(void) interrupt 1
{
   if  (ystxd!=0)
   {
      ystxd--;                       // 串口发送延时
   }

   if(Carrier_Rxd_Delay>0)
   {
      Carrier_Rxd_Delay--;
   }
   else
   {
      Carrier_Rxd_Delay=0;
      rlamp=1;
      r_x=0;
   }

   TH0=0x63;                         // 置定时器计数  50ms 中断一次( 12MHz )
   TL0=0xcc;

   if(wdi==0x9a)
   {
      WDT_RST=0xa1;                  // 清看门狗
      wdi=0;
   }
}


/**************************************************************************************
 *
 * FUNCTION:    pl_pro
 *
 * DESCRIPTION: 载波中断收、发程序
 *
 * PARAMETERS:
 *              in :  PLM_RS(PLM_RS=0  载波接收 ;  PLM_RS=1 载波发送)
 *
 *              out:  plmrxd=1 载波接收成功  ; com_buf[]  载波接收成功的数据
 *
 * RETURNED:    none
 *************************************************************************************/
void  pl_pro(void) interrupt 7
{                                             // 复费率载波处理
   uchar data i;

  SSC_ADR=0x00;                               //选择载波状态寄存器
  dat= SSC_DAT;
  if((dat&0x80)==0x0)
      return;

  if((dat&0x01)==1)                           //载波发送状态
  { // 载波发送
    if((pl_len<ti_len)&&(pl_len<240))
    {
       SSC_BUF=r[pl_len++];                  //发送下一个字节
    }
    else//((pl_len>=ti_len)||(pl_len>240))//发送字节字数限制,芯片自己会回到载波接收状态
    {  //发送完成
      plmtxd=0;                              // 清正在发送标志

      ti_len=0;
      pl_data=0;

      for(pl_len=0;pl_len<20;pl_len++)
      {
         r[pl_len]=0;
      }
      pl_len=0;
      tlamp=1;                                // 发送指示灯灭
    }
  }
  else
  { // 载波接收
    //if(plmrxd==1){return;}
    if((dat&0x04)==0x04)                //如果接收的是祯头标志
    {

      if(r_x==0)                        //如果处于等待接收状态
      {
         r_data=SSC_BUF;                //接收第一个字节,并准备接收后面的字节
         pl_buf[0]=r_data;
         r_len=1;
         r_len1 =60;
         r_x=1;
         rlamp=0;

         Carrier_Rxd_Delay=20;          // 最大接收延时时间为1S
      }
    }
    else
    {
      if(r_x==1)                          // 如果已经接收了祯头,继续接收后续字节
      {
        r_data=SSC_BUF;
        pl_buf[r_len]=r_data;

        if(r_len==0x04)                   // 接收到了载波字节个数
        {
           r_len1=r_data+7;               // 加7的意思是3个地址码+1个控制码+1个长度码+2个校验码

           if(r_len1>60)
              r_len1=60;                  // 接收字节长度限制
        }

        r_len+=1;

        if(r_len>=r_len1)
        {
           plmrxd=1;
           rlamp=1;
           r_x=0;

           for( i=0 ; i<(r_len1+1) ; i++ )
           {
              com_buf[i]=pl_buf[i];
           }

        }
      }
    }
  }
}

/**************************************************************************************
 *
 * FUNCTION:    initsys
 *
 * DESCRIPTION: 初始化设置函数,
 *              进行系统初始化设置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys(void)
{  // 控制看门狗喂狗时间长度
  CKCON=0X3F;
  // 8位/16位运算模式选择位设置
  ALU_MOD=0;      // 设置成8位运算模式
  //载波通讯配置
  //************   3200的载波寄存器设置  **********//
  SSC_ADR=0x03;
  SSC_DAT=0xC0;
  
  SSC_ADR=0xFF;
  SSC_DAT=0xFF;
  SSC_ADR=0x02;
  SSC_DAT=0x1F;
  SSC_ADR=0xFF;
  SSC_DAT=0x00;
  
  //************   3200的载波寄存器设置  **********//
  EIE=0X01;       // (A9H 使能INT2中断(EX2=1)
  IT2=1;          // (C8H) 为边沿触发方式(IT2=1)

⌨️ 快捷键说明

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