485通信程序51单片机_第1页
485通信程序51单片机_第2页
485通信程序51单片机_第3页
485通信程序51单片机_第4页
485通信程序51单片机_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第页#include<reg52.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedint/*通信命令*/#define_ACTIVE_0x01//主机询问从机是否存在#define_GETDATA_0x02//主机发送读设备请求#define_OK_0x03//从机应答#define_STATUS_0x04//从机发送设备状态信息#define_MAXSIZE0x08//缓冲区长度#define_ERRLEN12//任何通信帧长度超过12则表示出错uchardbuf[MAXSIZE]; //该缓冲区用于保存设备状态信息uchardev;//该字节用于保存本机设备号sbitM_DE=P1^0;//驱动器使能,1有效sbitM_RE=P1^1;//接收器使能,0有效voidget_status();//调用该函数获得设备状态信息,函数全码未给出voidsend_data(uchartype,ucharlen,uchar*buf);//发送数据帧bitrecv_cmd(uchar*type);//接收主机命令,主机请求包含命令信息。voidsend_byte(ucharda);//该函数发送一帧数据中的一个字节,由send_data()函数调用voidmain()uchartype;ucharlen;/*系统初始化*/P1=0xff;//读取本机设备号dev=(P1>>2);TMOD=0x20;//定时器T1使用方式2TH1=250;TL1=250;TR1=1;//开始计时PCON=0x80;//SMOD=1;SCON=0x50;//工作方式1,波特优选法9600bps,允许接收ES=0; //关闭串品中断IT0=0;//外部中断0使有电平触发模式EX0=1;//开启外部中断0EA=0;//开启总中断/*主程序流程*/while(1)if(recv_cmd(&type)==0)//发送帧错误或帧地址及本机地址不符,丢弃当前帧后返回 continue; switch(type) case_ACTIVE_://主机询问从机是否存在 send_data(_OK_,0,dbuf);//发送应答信息,这里的buf的内容并未用到 break; case_GETDATA_://主机发送读设备请求 len=strlen(dbuf); snd_data(_STATUS_,len,dbuf);//发送设备信息 break; default: break;//命令类型错误,丢弃当前帧返回voidREADSTATUS()interrput0using1//产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1get_status();//获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一个字节置0表示数据结束/*该函数接收一帧数据度进行检测,无论该帧是否错误,函数均会返回。*函数参数type保存接收到的命令字*当接收的数扭帧错误或其地址位不为0时(非主机发送帧),快活数返回0,反之返回1bitrecv_cmd(uchar*type) bitdb=0;//当接收到的上一个字节为0xdb时,该位置位 bitc0=0;//当接慢到的上一个字节为0xc0时,该位置位 uchardata_buf[_ERRLEN];//保存接收到的帧 uchartmp; ucharecc=0; uchari; M_DE=0;//置发送禁止,接收允许 M_RE=0; /*接收一帧数据*/ i=0; while(!c0)//循环直至帧接收完毕 RI=0; while(RI); tmp=SBUF; RI=0; if(db==1)//接收到的上一个字节为0xdb swithc(tmp) case0xdd: data_buf[i]=0xdb;//0xdbdd表示0xdb ecc=ecc^0xdb; db=0; break; case0xdc: data_buf[i]=0xc0;//0xdbdc表示0xc0 ecc=0; db=0; break; default: return0;//帧错误,返回 i++; switch(tmp)//正常情况下 case0xc0://帧结束 c0=1; break; case0xdb: //检测到转义字符 db=1; break; default://普通数据 data_buf[i]=tmp;//保存数据 ecc=ecc^tmp;//计算校验字节 i++; if(i==_ERRLEN)//帧超长,错误,返回 return0; /*判断帧是否错误*/ if(i<4)//帧过短,错误,返回 return0; if(ecc!=0)//校验错误,返回 return0; if(data_buf[i!=dev) //非访问本机命令,错误,返回 return0; *type=data_buf[1];//获得命令字 return1;//函数成功返回/*该函数发送一数据帧,参数type为命令字,len为数据长度,buf为要发送的数据内容*/voidsend_data(uchartype,ucharlen,uchar*buf)uchari;ucharecc=0;M_DE=1;//置发送允许,接收禁止M_RE=1;send_byte(dev);//发送本机地址ecc=dev;send_byte(type);//发送命令字ecc=ecc^type;send_byte(len);//发送长度ecc=ecc^len;for(i=0;i<len;i++)send_byte(*buf);ecc=ecc^(*buf);buff++;send_byte(ecc);//发送校验字节TI=0;//发送帧结束标志SBUF=0xc0;while(!TI);TI=0;/*该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0,则发送0xdbdc*/voidsend_byte(ucharda)switch(da)case0xdb://字节为0xdb,发送0xdbdd TI=0; SBUF=0xdb; while(!TI); TI=0; SBUF=0xdd; while(!TI); TI=0; break; case0xc0://字节为0xc0,则发送0xdbdc TI=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论