单片机双机点对点通信设计

控制/MCU

1822人已加入

描述

/*双机点对点通信的从机部分*/

#ifndef__P2P_S_C__

#define__P2P_S_C__

#include

#include

#define__MAX_LEN_64//数据最大长度

#define_MHz_11//设置单片机使用的晶振频率(11.0592MHz)

/*以下为程序协议中使用的握手信号*/

#define__RDY_0x06//主机开始通信时发送的呼叫信号

#define__BUSY_0x15//从机忙应答

#define__OK_0x00//从机准备好

#define__SUCC_0x0f//数据传送成功

#define__ERR_0xf0//数据传送错误

voidinit_serial();//串口初始化

unsignedcharrecv_data(unsignedchar*buf);//接收数据

voidBeep_ok();//蜂鸣表示数据接收ok,该函数代码未给出

voidmain()

{

charbuf[__MAX_LEN_];

unsignedchari=0;

unsignedchartmp=0xff;

/*串口初始化*/

init_serial();//初始化串口

EA=0;//关闭所有中断

/*进入设备应答阶段*/

while(1)

{

/*如果接收到的数据不是握手信号__RDY_,则继续等待*/

while(tmp!=__RDY_)

{

RI=0;

while(!RI);

tmp=SBUF;

RI=0;

}

/*程序通过检测P0口数据判断当前设备状态,若P0=0xab,表示当前设备忙*/

P0=0xff;

tmp=P0;

if(tmp==0xab)//如果P0口数据为0x,则当前设备忙,发送__BUSY_信号

{

TI=0;

SBUF=__BUSY_;

while(!TI);

TI=0;

continue;

}

TI=0;//否则发送__OK_信号表示可以接收数据

SBUF=__OK_;

while(!TI);

TI=0;

/*数据接收*/

tmp=0xff;

while(tmp==0xff)

{

tmp=recv_data(buf);//校验失败返回0xff,接收成功则返回0

}

Beep_ok();//蜂鸣表示数据接收成功

}

}

/*初始化串口*/

voidinit_serial()

{

TMOD=0x20;//定时器T1使用工作方式2

TH1=250;//设置初值

TL1=250;

TR1=1;//开始计时

PCON=0x80;//SMOD=1

SCON=0x50;//工作方式1,波特率9600bps,允许接收

}

/*接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用’’表示数据结束

*返回值为0,数据校验成功,返回值为0xff,数据校验失败

*/

unsignedcharrecv_data(unsignedchar*buf)

{

unsignedcharlen;//该字节用于保存数据长度

unsignedcharecc;//该字节用于保存校验字节

unsignedchari,tmp;

/*接收数据长度*/

RI=0;

while(!RI);

len=SBUF;

RI=0;

/*使用len的值为校验字节ecc赋初值*/

ecc=len;

/*接收数据*/

for(i=0;i{

while(!RI);

*buf=SBUF;//接收数据

ecc=ecc^(*buf);//进行字节校验

RI=0;

buf++;

}

*buf=0;//表示数据结束

/*接收校验字节*/

while(!RI);

tmp=SBUF;

RI=0;

/*进行数据校验*/

ecc=tmp^ecc;

if(ecc!=0)//校验失败

{

*(buf-len)=0;//清空数据缓冲区

TI=0;//发送校验失败信号

SBUF=__ERR_;

while(!TI);

TI=0;

return0xff;//返回0xff表示校验错误

}

TI=0;//校验成功

SBUF=__SUCC_;

while(!TI);

TI=0;

return0;//校验成功,返回0

}

#endif

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分