📄 3200demo.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 + -