串口通信协议程序.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

串口通信协议程序

主机程序:

/*

主机主要处理:

主—从1.给从机发送命令

2.给从机发送数据

3.命令从机向主机发送数据

从—主由中断程序处理根据从机发送过来的请求类型

0.请求主机发送命令(包括主到从的1,2命令)

1.请求主机接收数据

2,3保留

*/

#includereg51.h

#includestring.h

#defineucharunsignedchar#defineuintunsignedint#defineslav1_addr0x01#defineslav2_addr0x02#defineCOMEND0#defineREC_DATE1//主机向从机发送多数据命令高四位为1111,所以其他命令高四位不能为1111

#definecmd_X0x12#definecmd_rec_data0x11

sbitsignal=P3^2;

uchartemp_addr,num,rec,style,re_addr;

ucharbuf[20];

ucharrec_data[10];

voiddelay(unsignedinti){

while(i--);

}

voidinit_uart(void)

{

TMOD=0x20;//定时器方式2--8位reload模式

TH1=0xfd;

TL1=0xfd;

PCON=0;//波特率不加倍

SCON=0xf0;//方式三

TB8=1;//发送地址时第九位为1

SM2=1;//接收到第九位为1时才能接收数据

TR1=1;//要在设置scon后开定时

ES=1;//开中断

EA=1;

}

//发送命令

voiduart_send_cmd(ucharaddr,ucharcmd)//uchar*date)

{

while(signal==0);//检查总线是否被占

signal=0;//占用总线

EA=0;//关中断

do

{

do

{

SBUF=addr;//发送从机地址

while(TI!=1);

TI=0;

}

while(RI!=1);//一直等待从机响应

//while循环里可加入出错处理

temp_addr=SBUF;

RI=0;

}

while(temp_addr!=addr);//一直等到从机回应的地址相同

//while循环里可加入出错处理

TB8=0;//发送数据第9位为0//SM2=0;//接收到第九位为1时才置位RI

//每次一个数据

SBUF=cmd;

while(TI!=1);

TI=0;

TB8=1;

//SM2=1;

RI=0;

TI=0;//不处理期间发生的中断

EA=1;

signal=1;//释放总线

}

//主机向从机发送多数据

//自动计算发送数据长度

voiduart_send_data(ucharaddr,uchar*date)

{

ucharn;

while(signal==0);//检查总线是否被占

signal=0;//占用总线

EA=0;//关中断

do

{

do

{

SBUF=addr;//发送从机地址

while(TI!=1);

TI=0;

}

while(RI!=1);//一直等待从机响应

//while循环里可加入出错处理

temp_addr=SBUF;

RI=0;

}

while(temp_addr!=addr);//一直等到从机回应的地址相同

//while循环里可加入出错处理

TB8=0;//发送数据第9位为1

SM2=0;//接收到第九位为1时才置位RI

num=strlen(date);

SBUF=(0xf0|num);//向从机发送接收多数据命令

//高四位为标志位低四位为数据长度

while(TI!=1);

TI=0;

delay(200);//等待从机能稳定(从机产生接收中断需要时间)

for(n=0;nnum;n++)//发送多个数据

{

SBUF=date[n];

while(TI!=1);

TI=0;

delay(2);//放慢发送速度使从机能稳定接收

}

TB8=1;

SM2=1;

RI=0;

TI=0;//不处理期间发生的中断

EA=1;

signal=1;

}

//主机请求从机发送数据过来

voidcmd_rec(ucharaddr)

{

ucharnumb,n;

while(signal==0)

文档评论(0)

kirin + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档