无线传输c语言程序,PTR2000无线收发C语言程序

PTR2000基于SCT89C52单片机的无线收发程序:

#include//引用标准库的头文件

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineREQ_SEND 0x33

#defineREQ_RESEND 0x66

#defineSEND_OVER 0x99

//为简化起见,假设了7位固定的采集数据

#define DATA0 0x10

#define DATA1 0x20

#define DATA2 0x30

#define DATA3 0x40

#define DATA4 0x50

#define DATA5 0x60

#define DATA6 0x70

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长度字节LEN,

//1字节指令,1校验和字节,

//1结束字节"*"

// 定时器0中断服务子程序

voidtimer()interrupt 1using2

{

Flag_Delay=0;

TH0=-5000/256;

TL0=-5000%6;

}

//串口中断服务子程序

voidserial()interrupt 4using1

{

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)

{

ucharxdatai ;

for (i=0;i++;i<5)

{

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

{

t_buf[j+2]=Data[j];

CheckSum=CheckSum+t_buf[j+2];

}

t_buf[9]=CheckSum;//校验和字节

t_buf[10]=0x2A;//停止位

for (j=0;j++;j<11)

{

TI=0;

SBUF=t_buf[j];

while(TI==0);

TI=0;

}

}

//通知PC机端发送结束函数

voidSendOver(void)

{

TI=0;

SBUF=0x24;

while(TI==0);

TI=0;

SBUF=0x01;

while(TI==0);

TI=0;

SBUF=SEND_OVER;//通知PC机端“发送结束”

while(TI==0);

TI=0;

SBUF=0x99;//校验字节

while(TI==0);

TI=0;

SBUF=0x2A;

while(TI==0);

TI=0;

}

voidmain(void)

{

ClearT_buf();

ClearR_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高优先级

TH0=-5000/256;//5ms

TL0=-5000%6;

IE=0x90;//EA=1,ES=1

while(1)

{

if (Flag_RSend)//“请求发送”指令

{

TXEN=1;//改变为发射状态

Delay();//延时5ms

GetData();//采集数据

Send();//发送

Flag_RSend=0;

SendOver();//通知PC机发送结束

TXEN=0;//重设为接收状态

}

elseif (Flag_ReSend)// “请求重发”指令

{

TXEN=1;//改变为发射状态

Delay();//延时5ms

Send();//重发

Flag_ReSend=0;

SendOver();//通知PC机发送结束

TXEN=0;// 设为接收状态

}

}

}

下面是原理图:

a4c26d1e5885305701be709a3d33442f.png

更多免费资源请大家多关注免费单片机教程及学习博客,有问题记得留言哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值