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

📄 zjq_bc.c

📁 利用福星晓程芯片3105开发多功能表时B、C相CPU的软件程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************/
/*
/*  Copyright (c) 2004,北京福星晓程电子科技股份有限公司
/*
/*  All Rights Reserved
/*
/*
/*
/*  文件名称:ZJQ_BC.c
/*
/*  文件标识:存档
/*
/*  摘    要:1、单、复费率通用三相中继器B、C两相程序
/*            2、该文件包括主函数;载波中断接收函数;看门狗处理函数;定时器中断处理函数
/*            3、CPU :PL3105
/*            4、中继器串口集联收发程序(中继器载波接收、串口发送部分)
/*            5、适用费率规约:  ①、P1.6接VCC为:复费率
/*                               ②、P1.6接GND为:单费率
/*
/*  功    能:1. 接收载波数据并通过串口集联上传返回集中器
/*            2. 接收下位集联上传串口数据, 并通过串口集联上传
/*
/*
/*  指示灯  : 1. 接收到载波数据并转发时, 指示灯点亮
/*            2. 本级接收到载波返回的合法抄表应答命令时, 指示灯点亮
/*
/*  串口速率:2400BPS  无校验
/*
/*  当前版本:1.0(发布)
/*  作    者:魏茂
/*  完成日期:2004年11月17日
/*
/*
/********************************************************************************************/

#include "PL3105.h"

#define uchar unsigned char
#define uint  unsigned int

//I/O 口设置
sbit Carrier_Rxd= P3^7;                                   // 载波数据输入、输出口
sbit led        = P0^5;                                   // 指示灯
sbit up_ok_txd  = P3^5;                                   // 向上OK发
sbit txd_up     = P3^4;                                   // 下级数据接收口
sbit up_ok_rxd  = P3^2;                                   // 向上OK收
sbit up_txd_10  = P3^1;                                   // 向上发
sbit rxd_10     = P3^0;                                   // 串口收

sbit D_F_Sign   = P1^6;                                   // 单、复费率区分标志,
                                                          // 接VCC为:复费率 ;
                                                          // 接GND为:单费率

uchar data   YS_SET_DF;
// 全局变量设置
uchar bdata  pl_data;                                     // 发送字节缓冲
uchar data   pl_len;                                      // 发送字节计数
uchar data   r_len1;                                      // 发送字节计数
uchar data   r_len;
uchar data   r_data;
uchar data   r_8;
uchar data   pl_8;                                        // 发送位计数
uchar data   x;
uchar data   n;
uchar data   ti_len;
uchar data   ystxd;
uchar data   ysrxd;
uint  data   x_09af;
uchar xdata  pl_buf[60];
uchar xdata  COM_Buf[60];

// 位变量
bit   bdata  r_x,r_d;
bit   bdata  plmrxd;
uchar data   wdi;



void  D_LED_DISPLAY();
void  F_LED_DISPLAY();

/**************************************************************************************
 *
 * FUNCTION:    timeint0
 *
 * DESCRIPTION: 定时器0中断程序,50 ms 发生一次中断,
 *              对延时变量进行减1处理
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  timeint0(void) interrupt 1       // 定时中断程序 50 ms 发生一次中断
{

   if(ystxd>0)
      ystxd--;
   else
      ystxd=0;

   if(YS_SET_DF>0)
      YS_SET_DF--;
   else
   {
      YS_SET_DF=20;
      D_F_Sign=1;
   }

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

   TH0=0xB1;                           // 置定时器计数  50ms 中断一次( 4.8MHz )
   TL0=0xE0;

   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  载波接收成功 ;pl_buf[]  载波接收成功的数据
 *
 *
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void  pl_pro(void) interrupt 7
{
    uchar data i;
    uchar data j;
    uchar data k;
    uchar data h;

    if(D_F_Sign==0)
       goto D_FL_DESIGN;
    else
       goto F_FL_DESIGN;

    return;

    F_FL_DESIGN:

    if(PLM_RS)
    {
       return;                                            // 载波发送
    }
    else
    {                                                     // 载波接收
         Carrier_Rxd=1;

         if (r_x==0)
         {
             if (Carrier_Rxd==1)
             {
             	x_09af=x_09af|1;
             }

             if (x_09af==0x09af)
             {
             	r_x=1;
             	r_8=0;
             	r_d=0;
             	x_09af=0;
             	r_len=0;
             	r_data=0;
             	r_len1=20;
             }
             else
             {
             	x_09af=x_09af<<1;
             }
         }
         else
         {
             if (Carrier_Rxd==1)
                r_data=r_data|1;

             r_8++;

             if (r_8<8)
                 r_data=r_data<<1;
             else
             {
             	pl_buf[r_len]=r_data;
             	r_8=0;

                if(r_len<3)
                {
                   if(r_data>0xBB)
                   {
                   	r_x=0;
                   	return;                 // goto zb_end;
                   }
                }
                else if(r_len==4)
                {
                    if(r_data==0)
                    {
                    	r_x=0;
                    	return;                 // goto zb_end;
                    }
                    if(r_data>50)
                    {
                      r_x=0;
                      return;                   // goto zb_end;
                    }

                    r_len1=r_data+7;
                }

                r_len++;
                r_data=0;

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

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

                   //led=0;

                }

                zb_end:;
            }
         }
    }

    return;

    D_FL_DESIGN:

    if(PLM_RS)
    {
       return;                                            // 载波发送
    }
    else
    {                                                     // 载波接收
         Carrier_Rxd=1;

         if (r_x==0)
         {
             if (Carrier_Rxd==1)
             {
             	x_09af=x_09af|1;
             }

             if (x_09af==0x09af)
             {
             	r_x=1;
             	r_8=0;
             	r_d=0;
             	x_09af=0;
             	r_len=0;
             	r_data=0;
             	r_len1=20;
             }
             else
             {
             	x_09af=x_09af<<1;
             }
         }
         else
         {
             if (Carrier_Rxd==1)
                r_data=r_data|1;

             r_8++;

             if (r_8<8)
                 r_data=r_data<<1;
             else
             {
             	pl_buf[r_len]=r_data;
             	r_8=0;

                if(r_len==0)                            // 接收Func_A
                {
                   i=r_data;
                   j=i&0x20;

                   if(j==0)                             // 下行命令
                   {
                      k=i&0x18;
                      h=i&0x07;

                      if(k==0x00)                       // 设置表底
                         r_len1=14;
                      else if(k==0x08)                  // 设置表号
                         r_len1=8;
                      else if(k==0x10)                  // 实时抄表
                         r_len1=8+(2*h);
                      else if(k==0x18)                  // 冻结抄表
                         r_len1=8+(2*h);
                      else
                      {
                         r_len1=0;
                         r_x=0;
                      }
                   }
                   else                                 // 上行命令
                   {
                      r_len1=14;
                   }

                }


                r_len++;
                r_data=0;

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

                   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=0X1F;                       // 控制看门狗喂狗时间长度为832ms (0x8EH)
  ALU_MOD=0;                        // 8位/16位运算模式选择位 ; 设置成8位运算模式 (D0H^1)

  //载波通讯配置
  PLM_SSC=1;                        // (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1
  EIE=0X01;                         // 外部中断2 中断允许位:EX2=0,禁止中断;EX2=1,允许中断。  (A9H)
  IT2=1;                            // 外部中断2触发方式控制位,IT2=0低电平触发,IT2=1下降沿触发 (C8H^0)
  PLM_RS=0;                         // PLM_RS(EXT_CTRL.0)=1  为0时,载波处于接收状态

  //串口通讯配置
  TMOD = 0x21 ;                     // 设 T/C1 为模式2,8 位自装载计数器 ;T/C0 为模式1, 定时方式,16 位计数器
  SCON=0x50;                        // 串口0 的控制寄存器,方式1 10 位异步收发由定时器控制,允许接收。
  PCON=0X80;                        // 波特率加倍
  TH1=0xf6;
  TL1=0xf6;                         // 加倍设定波特率 9.6MHz(PL3105按4800计算) 下数 F6H

  TR1=1;                            // 启动定时器1
  LED_LCD=0;                        // 不显示使能


  //TH0=0x63;                         // 定时器0中断配置
  //TL0=0xcc;                         // 定时 50 ms 一个定时中断
  TH0=0xB1;                         // 定时器0中断配置
  TL0=0xE0;                         // 定时 50 ms 一个定时中断
  TR0 =1;                           // 启动 T0 定时器

  IP=0x02;                          // 定时器 T0 中断为高级中断
  EIP=1;                            // 外部中断2 为高级中断
  IE=0x82;                          // 允许ET0=1定时器 T0 中断;  开放中断
}


/**************************************************************************************
 *
 * FUNCTION:    initsys_ref
 *
 * DESCRIPTION: 初始化重置函数,
 *              进行系统初始化重置
 *
 * PARAMETERS:  none
 *
 * RETURNED:    none
 *
 *************************************************************************************/
void initsys_ref(void)
{
   uchar  data i;

   if (PLM_SSC!=1)
       PLM_SSC=1;                         // (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1

   if (EIE!=1)
       EIE=0X01;                          // (A9H 使能INT2中断(EX2=1)

   if (IT2!=1)
       IT2=1;                             // (C8H) 为边沿触发方式(IT2=1)

   // 串口设置重置
   if (TMOD!=0x21)
       TMOD = 0x21 ;                      // 设 T/C1 为定时方式2 设置为8位自装载计数器  T/C0 为定时方式 14

   if (PCON!=0x80)
       PCON=0X80;                         // 波特率加倍

   i=SCON;
   i=i&0xf0;
   if(i!=0x50)
      initsys();

   if (TH1!=0xf6)
       TH1=0xf6;

   if (TR1!=1)
       TR1=1;                             // 启动定时器1


   if (IE!=0x82)                          // 中断设置重置

⌨️ 快捷键说明

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