📄 zjq_bc.c
字号:
/********************************************************************************************/
/*
/* 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 + -