pl3106,pl3105载波发送接收程序_第1页
pl3106,pl3105载波发送接收程序_第2页
pl3106,pl3105载波发送接收程序_第3页
pl3106,pl3105载波发送接收程序_第4页
pl3106,pl3105载波发送接收程序_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/* * * * * All Rights Reserved * * * * 文件名称:PDEMO_DF.C * * 文件标识:存档 * * 摘 要:单、复费率载波DEMO收发板程序 * 1. 接收PC机串口下发的抄表命令并通过载波转发 * 2. 接收载波返回的抄表应答命令并通过串口转发给PC机 * 3. 不加跳线端子,适用于复费率 ; 4、5脚加跳线端子,适用于单费率 * 4. CPU :PL3105 * 5. 串口波特率: 2400BPS 无校验 * 6. 复费率接收最长有效字节数:247 ; 单费率接收最长字节数:14 * * * 当前版本:2.0(发布)* 修改记录:修改串口转发部分的

2、程序,另开一个com_buf,载波接收到数据以后, * 立即将接收到的数据转移到新开com_buf里,在串口转发时不关闭载波中断, * 直接使用com_buf。 * * * */#include PL3105.h#define uchar unsigned char#define uint unsigned int/I/O 口设置sbit RXD_TXD = P37; / 载波数据输入、输出口sbit txd = P31; / 向上发sbit rxd = P30; / 串口收sbit rlamp = P12; / 接收指示灯sbit tlamp = P13; / 发送指示灯sbit d_f =

3、 P11; / 单复费率转换/ 全局变量设置uchar bdata pl_data; / 发送字节缓冲sbit pl_h=pl_data7;uchar data pl_len,ti_len; / 发送字节计数uchar data d_f_x; / 单复费率标识uchar data pl_8; / 发送位计数uchar data x,n,plret_l;uchar xdata r250;uchar data ystxd;/, ysrxd;uint data x_09af;uchar data r_data,r_8;uchar data wdi;uchar data r_len;uchar dat

4、a r_len1;/ 位变量bit bdata r_x;bit bdata r_d;bit bdata plmrxd;bit bdata plmtxd;uchar xdata pl_buf250;uchar xdata com_buf250;/* * * FUNCTION: timeint0 * * DESCRIPTION: 定时器0中断程序; 50 ms 发生一次中断,对延时变量进行减1处理 * * PARAMETERS: none * * RETURNED: none */void timeint0(void) interrupt 1 if(ystxd!=0) ystxd-; TH0=0x

5、63; / 置定时器计数 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 载波接收成功 ; pl_buf 载波接收成功的数据 * * RETURNED: none */void pl_pro(void) interrupt 7 uchar data

6、 i; uchar data j; if(d_f_x=D) goto d_zb; / 复费率载波处理 if(PLM_RS) / 载波发送 if(pl_88) RXD_TXD=pl_h; pl_8+; pl_data=pl_data=20) PLM_RST=0xa2; plret_l=0; if(pl_len=ti_len)|(pl_len240) /发送完成 PLM_RS=0; / 置成收态 ti_len=0; pl_data=0; pl_8=0; for(pl_len=0;pl_len20;pl_len+) rpl_len=0; pl_len=0; RXD_TXD=1; tlamp=1; /

7、 发送指示灯灭 plmtxd=0; / 清正在发送标志 else / 载波接收 RXD_TXD=1; if (r_x=0) if (RXD_TXD=1) x_09af=x_09af|1; if (x_09af=0x09af) r_x=1; r_8=0; r_d=0; x_09af=0; r_data=0; rlamp=0; / 接收指示灯亮 else x_09af=x_09af1; else if (r_d=0) if (RXD_TXD=1) r_data=r_data|1; r_8+; if (r_8!=8) r_data=r_data1; else pl_buf0=r_data; r_8=

8、0; r_d=1; r_len=1; r_data=0; r_len1=240; else if (RXD_TXD=1) r_data=r_data|1; r_8+; r_d=1; if (r_8!=8) r_data=r_data=r_len1) r_x=0; r_d=0; plmrxd=1; rlamp=1; / 接收指示灯灭 for (j=0;j(r_len1+1);j+) com_bufj=pl_bufj; goto zb_end; d_zb: / 单费率载波处理 if(PLM_RS) / 载波发送 if(pl_88) RXD_TXD=pl_h; pl_8+; pl_data=pl_d

9、ata=20) PLM_RST=0xa2; plret_l=0; /if(pl_len=20) /PLM_RST=0xa2; / 复位发送计数器 if(pl_len=ti_len)|(pl_len40) /发送完成 PLM_RS=0; / 置成收态 ti_len=0; pl_data=0; pl_8=0; for(pl_len=0;pl_len20;pl_len+) rpl_len=0; pl_len=0; RXD_TXD=1; tlamp=1; / 发送指示灯灭 plmtxd=0; / 清正在发送标志 else / 载波接收 RXD_TXD=1; if (r_x=0) if (RXD_TXD

10、=1) x_09af=x_09af|1; if (x_09af=0x09af) r_x=1; r_8=0; r_d=0; x_09af=0; r_data=0; rlamp=0; / 接收指示灯亮 else x_09af=x_09af1; else if (r_d=0) if(RXD_TXD=1) r_data=r_data|1; r_8+; if(r_8!=8) r_data=r_data1; else i=r_data; i=i&0x20; if(i=0x20) r_len1=14; / 上行 else / 下行 i=r_data; i=i&0x18; if(i=0x18)|(i=0x10

11、) i=r_data; i=i&0x07; r_len1=8+(2*i); else if(i=0x08) r_len1=8; else r_len1=14; pl_buf0=r_data; r_8=0; r_d=1; r_len=1; r_data=0; else if(RXD_TXD=1) r_data=r_data|1; r_8+; if(r_8!=8) r_data=r_data=r_len1) r_x=0; r_d=0; plmrxd=1; rlamp=1; / 接收指示灯灭 for (j=0;j(r_len1+1);j+) com_bufj=pl_bufj; zb_end:;/*

12、* * FUNCTION: initsys * * DESCRIPTION: 初始化设置函数;进行系统初始化设置 * * PARAMETERS: none * * RETURNED: none */void initsys(void) CKCON=0X3F; / 控制看门狗喂狗时间长度 ALU_MOD=0; / 8位/16位运算模式选择位设置,设置成8位运算模式 /载波通讯配置 PLM_SSC=1; / (D8H)使能载波通讯PLM_SSC(EXT_CFG.0)=1 EIE=0X01; / (A9H 使能INT2中断(EX2=1) IT2=1; / (C8H) 为边沿触发方式(IT2=1)。

13、PLM_RS=0; / PLM_RS(EXT_CTRL.0)=1 为0时,载波处于接收状态 /串口通讯配置 TMOD = 0x21 ; / 设 T/C1 为定时方式2 设置为8位自装载计数器 T/C0 为定时方式 14 SCON=0x50; / 工作方式1 PCON=0X80; / 波特率加倍 TH1=0xf6; TL1=0xf6; / 加倍设定波特率 9.6MHz(PL3105按4800计算) 下数 F6H TR1=1; / 启动定时器1 LED_LCD=0; / 不显示使能 / 定时器0中断配置 TH0=0x63; TL0=0xcc; / 定时 50 ms 一个定时中断 TR0 = 1;

14、/ 启动 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)使能载

15、波通讯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

16、!=1) TR1=1; / 启动定时器1 / 中断设置重置 if (IE!=0x82) IE=0x82; if (IP!=2) IP=2; if (EIP!=1) EIP=1; / 外部中断2 为高级中断 / 定时器0重置 if (TR0!=1) TR0 = 1; / 启动 T0 定时器 / 关显示使能重置 if (LED_LCD!=0) LED_LCD=0;/* * * FUNCTION: txdbyte * * DESCRIPTION: 一字节串口发送函数 * * PARAMETERS: * in : dachar (要发送的一字节数据) * out: none * * RETURNED:

17、 none */void txdbyte(uchar dachar) SBUF=dachar; ystxd=10; / 500毫秒钟发送不成功退出 while(!TI) if(ystxd=0) break; TI=0;/ 载波接收数据包后的处理函数/ 入口: plmrxd=1; pl_buf数据存入接收和数据/ 功能: 1。进行数据包的校验和合法性判断/ 2。点亮上传指示灯/ 3。进行数据包的向上转发/ 4。清pl_buf/ 返回: 无/void zb_pro(void) uchar data i; EIE=0X01; / (A9H 使能INT2中断(EX2=1) tlamp=0; / 发送指

18、示灯亮 plmrxd=0; x=0; n=0; / 停止串口接收 txdbyte(D); txdbyte(A); txdbyte(T); r_len1=r_len1+2; txdbyte(r_len1); txdbyte(0x09); txdbyte(0xaf); r_len1=r_len1-2; for(i=0;i60) break; wdi=0x9a; /for(i=0;i20;i+) pl_bufi=0; /2004.10.22删 tlamp=1; / 发送指示灯灭 EIE=0X01; / (A9H 使能INT2中断(EX2=1)void zb_pro_d(void) uchar dat

19、a i; EIE=0X01; / (A9H 使能INT2中断(EX2=1) tlamp=0; / 发送指示灯亮 plmrxd=0; x=0; n=0; / 停止串口接收 txdbyte(0XFF); txdbyte(A); txdbyte(N); txdbyte(S); txdbyte(r_len1); for(i=0;i60) break; /for(i=0;i240) x=0; rlamp=1; goto qqq; n=0; rlamp=0; / 接收指示灯亮 goto qqq; if(x=4) rn=SBUF; n+; x=5; goto qqq; if(x=5) rn=SBUF; n+

20、; if (n=ti_len) x=6; rlamp=1; / 接收指示灯灭 goto qqq; if (n60) x=0; rlamp=1; / 接收指示灯灭 goto qqq; goto qqq; qqq:;void jzqrxd_pro_d(void) if(RI) / 有集中器下发命令处理 RI=0; if(x=0)&(SBUF=S) x=1; n=1; goto qqq; if(x=1)&(SBUF=N)|(x=1)&(SBUF=E) x=2; n=1; goto qqq; if(x=1) x=0; n=0; goto qqq; if(x=2)&(SBUF=D)|(x=2)&(SBUF=T) x=3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论