PTR的c程序开发代码无线数传模块Word文档下载推荐.docx
《PTR的c程序开发代码无线数传模块Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PTR的c程序开发代码无线数传模块Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
CS=0时,选择工作频道
1,即433.92MHz;
CS=1时选择工作频道2,即434.33MHz
DO(3脚):
数据输出端;
DI(4脚):
数据输入端
GND(5脚):
电源地
PWR(6脚):
节能控制端。
当PWR=1时,模块处于正常工作状态,PWR=0
时,模块处于待机微功耗状态;
TXTN(7脚):
发射/接收控制端。
当TXTN=1时,模块为发射状态;
当TXTN=0
时,模块被设置为接受状态。
PTR2000可与所有单片机(如80C31、2051、68HC08、PIC、Z8等)配合使
用,可直接接单片机的串口或I/O口,也可与计算机串口进行通讯,此时需要
在中间简单地接在一个RS232电平转换芯片,如MAX232等。
无线收发数传MODEM模块PTR2000的原理
4软件编程注意事项在软件编程过程中,对PTR2000的工作模式和工作频道的选择尤为重要,表1给出了该模块的工作模式控制及工作频道的选择方式。
表1模块工作模式控制及工作频道选择表
模块接脚输入电平
模块状态
TXEN
CS
PWR
工作频道号
器件状态
1
接收
2
发射
x
待机
4.1发送
PTR2000的通信速率最高为20Kbit/s,也可工作在其它速率如4800bps、9600bps下,无需设置PTR2000的工作速率。
在发送数据之前,应将模块先置于发射模式,即TXEN=1。
然后在等待至少5ms后(接收到发射的转换时间)才可以发送任意长度的数据。
发送结束后应将模块置于接收状态,即TXEN=0。
发射到接收的转换时间为5ms。
4.2接收
接收时应将PTR2000置于接收状态,即TXEN=0。
然后将将接收到的数据直接送到单片机串口或经电平转换后送到计算机。
4.3待机模式
当PWR=0时,PTR2000进入节电待机模式,此时的功耗大约为8μA,但在待机模式下不能接收和发射数据。
PTR2000除了应注意在发送、接收和待机模式下的编程外,还需注意在无信号时,PTR2000的串口输出的是随机数据,此时,可定义一个简单的通信协议,如在发送时,在有效数据这前加两用人才个(或多个)字节的固定标志,以便在接收一方的软件中检测该固定标志并将其作出了为下式数据的开始。
为了使系统能够可靠地通信,在编程时应设计通信协议,并应考虑数据的纠检错,检错可采用较验方式或更好的CRC校验方式。
5硬件连接
图2所示是PTR2000与计算机串口进行接口的典型应用电路。
连接时,PTR2000无线MODEM的DI端应接单片串口的发送端,DO接单片机串口的接收端。
利用单片机的I/O可以控制模块的发射控制、频道转换和低功耗模式。
如果直接将PTR2000与计算机串口连接,则可用RTS来控制PTR2000无线MODEM模块的收/发状态转换(RTS需经电平转换)。
6应用
单片无线收、发一体无线数传模块PTR2000可广泛用于遥控、遥测、小型无线网络、无线抄表、门禁
系统、小区传呼、工业数据采集系统、无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火系统、无线遥控系统、生物信号采集、水文气象控制、机器人控制、无线/230/422/485数据通信、数字音频、数字图像传输等系统。
图3是PTR2000的一种具体应用框图。
图中,MCU单片机可以是8031、2051、68HC08、PIC16C、Z8等,可将PTR2000直接到单片机的串口或I/0口上。
图4的接收和发射系统图可完成数据采集的点对点传输。
适用于工业控制、数据采集、无线键盘、无线标签、身份识别等系统中。
利用图5所示电路可以构成3点对多点的双向数据传输通道,该系统可用于无线抄表、无线数传等。
单片机实现短距离无线通信实例V:
本文为《51基础与应用实例》的部分内容,浅显易懂,《51基础与应用实例》为三恒星科技公司公司编写,新华书店公开发行,未经许可不得转载
随着通信和信息技术的不断发展,短距离无线通信技术的应用步伐不断加快,正日益走向成熟。
短距离无线通信泛指在较小的区域内(数百米)提供无线通信的技术,目前常见的技术大致有802.11系列无线局域网、蓝牙、HomeRF和红外传输技术。
硬件设计
本例的硬件设计分别包括单片机和PTR2000接口电路设计和PC机和PTR2000接口电路设计。
单片机和PTR2000接口电路设计
本例中单片机的电平通过串口以及I/O控制口与PTE2000直接相连,接口电路如图8-16所示。
图8-16
单片机和PTR2000接口电路原理图
S1是复位键,与C3,R1构成了复位电路;
Y1是12MHz的晶振,决定了单片机串口的传输速率;
单片机的P3.0引脚和PTR2000的DO相连,单片机的P3.1引脚和PTR2000的DI相连,实现串行数据传输;
PTR2000的TXEN,CS,PWR三个引脚分别和单片机I/O控制中的P2.0,P2.1,P2.2相连。
C机和PTR2000接口电路设计
PC机和PTR2000接口电路的原理图如图8-17所示。
图8-17
PC机和PTR2000接口电路原理图
因为PC机的串口支持RS-232标准,而PTR2000模块支持的是TTL电平,所以需要MAX202来完成PC机和PTR2000之间的电平转换。
PC机的串口通过MAX202与PTR2000模块的串行输入,输出引脚DI,DO相连;
PTR2000的低功耗控制引脚PWR接VCC高电平,让其处在工作状态;
频道选择引脚CS接GND高电平,即采用通信频道1(433.92MHz);
TXEN引脚由PC机串口的RTS信号来控制,决定了PTR2000模块的发送/接收状态。
C7,C8,C9,C10的电容值都是0.1μF。
PC机端的串口传输速率也需设定为96kb/s,和单片机保持一致。
软件设计
本例中由两个通信终端,分别是单片机和PC机,两部分的软件相互对应,设置各自的PTR2000模块的功能工作状态。
这里着重介绍单片机端的软件设计。
出于方便的考虑,本例中已固定了通信频道,并且让PTR2000模块一直处于工作状态,不能使用待机状态(这两点已经在硬件的设计上有所体现)。
这样,单片机和PC机端软件就这要在于PTR2000发射还是接受状态的设置。
发射:
收到接受命令后,应先将PTR2000模块至于发射模式,即将TXEN置一。
然后等待一段时间才可以发送数据(PTR2000从接收模式转换成发送模式需要一个切换时间,大概5ms左右)。
发送结束后,将模块至于接受状态,即将TXEN置零。
接收:
接收时应将PTR2000至于接受模式,即将TXEN置零。
单片机在不发送时的时候应尽量处于接受状态。
程序流程图
本例的程序流程图如图8-18所示。
图8-18
单片机端程序流程图
单片机端默认将PTR2000设为接收状态,通过串口中断来识别由PC即通过无线信道传输过来的指令,再根据具体指令完成对应的工作。
需要注意的是,将PTR2000模块设置为发射状态的时候至少要等待5ms的时间才可以发送;
发送完毕后,向PC即端发送“发送结束指令”,然后将PTR2000重新设置位接收状态。
程序代码
下面是程序的完整代码
#include<
reg52.h>
//引用标准库的头文件
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineREQ_SEND0x33
#defineREQ_RESEND0x66
#defineSEND_OVER0x99
//为简化起见,假设了7位固定的采集数据
#defineDATA00x10
#defineDATA10x20
#defineDATA20x30
#defineDATA30x40
#defineDATA40x50
#defineDATA50x60
#defineDATA60x70
sbitTXEN=P2^0;
sbitCS=P2^1;
sbitPWR=P2^2;
voidClearT_buf();
//清除t_buf函数
voidClearR_buf();
//清除r_buf函数
voidDelay();
//延时5ms
voidGetData();
//采集数据
voidSend();
//采集并发送函数
voidSendOver();
//通知PC机发送结束函数
xdataucharFlag_Start=0;
//开始接受数据标志位
xdataucharFlag_RSend=0;
//请求发送标志位
xdataucharFlag_ReSend=0;
//请求重发标志位
xdataucharFlag_Delay=1;
//延时5ms标志
xdataucharData[7];
//采集的7个字节数据
xdatauchartCount=0;
xdatauchart_buf[11];
//1开始字节"
$"
,1长度字节LEN,
//7字节数据,1校验和字节,
//1结束字节"
*"
xdataucharrCount=0;
xdataucharr_buf[5];
//1字节指令,1校验和字节,
/*定时器0中断服务子程序*/
voidtimer()interrupt1using2
{
Flag_Delay=0;
TH0=-5000/256;
TL0=-5000%256;
}
//串口中断服务子程序
voidserial()interrupt4using1
RI=0;
//判断是否收到字符'
$'
,其数值为0x24,置开始接收标志位
if((!
Flag_Start)&
&
(SBUF==0x24))
Flag_Start=1;
if(Flag_Start)
if(rCount<
5)
r_buf[rCount]=SBUF;
rCount++;
*'
,其数值为0x2A,根据接收的指令设置相应标志位
if((r_buf[rCount-1]==0x2A)||(rCount==5))
rCount=0;
Flag_Start=0;
if(r_buf[2]==REQ_SEND)//收到“请求发送”指令
Flag_RSend=1;
if(r_buf[2]==REQ_RESEND)//收到“请求重发”指令
Flag_ReSend=1;
else
ClearR_buf();
//清除t_buf函数
voidClearT_buf(void)
ucharxdatai;
for(i=0;
i++;
i<
11)
t_buf[i]=0;
//清除r_buf函数
voidClearR_buf(void)
r_buf[i]=0;
//延时函数
voidDelay(void)
TR0=1;
ET0=1;
while(Flag_Delay);
ET0=0;
TR0=0;
Flag_Delay=1;
//采集数据函数经过简化处理,取固定的7个字节数据
voidGetData(void)
Data[0]=DATA0;
Data[1]=DATA1;
Data[2]=DATA2;
Data[3]=DATA3;
Data[4]=DATA4;
Data[5]=DATA5;
Data[6]=DATA6;
//单片机端发送数据函数
voidSend(void)
ucharxdataj=0;
ucharxdatalen=0;
ucharxdataCheckSum=0;
t_buf[0]=0x24;
//起始位
t_buf[1]=0x07;
//7个数据字节
len=t_buf[1];
CheckSum=CheckSum+len;
for(j=0;
j++;
j<
len)
t_buf[j+2]=Data[j];
CheckSum=CheckSum+t_buf[j+2];
t_buf[9]=CheckSum;
//校验和字节
t_buf[10]=0x2A;
//停止位
for(j=0;
TI=0;
SBUF=t_buf[j];
while(TI==0);
//通知PC机端发送结束函数
voidSendOver(void)
SBUF=0x24;
SBUF=0x01;
SBUF=SEND_OVER;
//通知PC机端“发送结束”
SBUF=0x99;
//校验字节
SBUF=0x2A;
voidmain(void)
ClearT_buf();
TXEN=0;
//初始为接收状态
PWR=1;
//正常工作模式
CS=0;
//选择通道0
EA=0;
//11.0592MHz,9600波特率,工作方式1,8数据位,1停止位,无奇偶校验
TMOD=0x21;
SCON=0x50;
//串行口工作方式1,REN=1
PCON=0x00;
//SMOD=0
TL1=0xfd;
TH1=0xfd;
TR1=1;
//定时器1开始计时
PT0=1;
//定时器0高优先级
//5ms
IE=0x90;
//EA=1,ES=1
while
(1)
if(Flag_RSend)//“请求发送”指令
TXEN=1;
//改变为发射状态
Delay();
//延时5ms
GetData();
//采集数据
Send();
//发送
Flag_RSend=0;
SendOver();
//通知PC机发送结束
//重设为接收状态
elseif(Flag_ReSend)//“请求重发”指令
//重发
Flag_ReSend=0;
//设为接收状态