- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)