51单片机实现的485通讯程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

51单片机实现的485通讯程序#ifndef__485_C__#define__485_C__#includereg51.h#includestring.h#defineunsignedcharuchar#defineunsignedintuint/*通信命令*/#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=(P12);TMOD=0x20;//定时器T1使用工作方式2TH1=250;//设置初值TL1=250;TR1=1;//开始计时PCON=0x80;//SMOD=1SCON=0x50;//工作方式1,波特率9600bps,允许接收ES=0;//关闭串口中断IT0=0;//外部中断0使用电平触发模式EX0=1;//开启外部中断0EA=1;//开启中断/*主程序流程*/while(1)//主循环{if(recv_cmd(&type)==0)//发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case__ACTIVE_://主机询问从机是否存在send_data(__OK_,0,dbuf);//发送应答信息,这里buf的内容并未用到break;case__GETDATA_:len=strlen(dbuf);send_data(__STATUS_,len,dbuf);//发送设备状态信息break;default:break;//命令类型错误,丢弃当前帧后返回}}}voidREADSTATUS()interrupt0using1//产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1{get_status();//获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束}/*该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回*函数参数type保存接收到的命令字*当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1*/bitrecv_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{switch(tmp){case0xdd:data_buf[i]=0xdb;//0xdbdd表示0xdbecc=ecc^0xdb;db=0;break;case0xdcdata_buf[i]=0xc0;//0xdbdc表示0xc0ecc=ecc^0xc0;db=0;break;defaultreturn0;//帧错误,返回}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(i4)//帧过短,错误,返回return0;if(ecc!=0)//校验错误,返回return0;if(data_buf[0]!=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;ilen;i++)//发送数据{send_byte(*buf);ecc=ecc^(*buf);buf++;}send_byte(ecc);//发送校验字节TI=0;//发送帧结束标志SBUF=0xc0;while(!TI);TI=0;}/*该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc*/voidsend_byte(ucharda){switch(da){case0xdb://字节为0xdb,发送0xdbddTI=0;SBUF=0xdb;while(!TI);TI=0;SBUF=0xdd;while(!TI)TI=0;break;case0xc0://字节为0xc0,发送0xdbdcTI=0;SBUF=0xdb;while(!TI);TI=0;SBUF=0xdc;while(!TI)TI=0;break;default://普通数据则直接发送TI=0;SBUF=da;while(!TI);TI=0;}}#endifRS-232接口实现计算机和单片机通信程序作者:佚名来源:本站原创点击数:…更新时间:2008年07月10日【字体:大中小】//此程序通过RS-232接口来完成计算机和单片机通信(程序已用p18f458试验板上调试通过)//程序的调试可以用串口调试助手V2.1辅助完成,此程序可在下载//此程序首先发送测试数据55H,再通过中断实现数据的接收和发送#includep18f458.hvoidInterruptHandlerHigh(void);//初始化程序voidinitial(){SPBRG=0X19;//选择传输波特率为9600bpsTXSTA=0X04;//选择异步高速方式传输8位数据RCSTA=0X80;//允许同步串行口工作TRISC=0X80;//将RC7,RC6设置为输入,断绝与外接电路的连接TXSTAbits.TXEN=1;//发送允许RCSTAbits.CREN=1;//接受数据允许PIE1bits.RCIE=1;//接收中断使能INTCON=0XC0;//总中断和外围中断允许}//高优先级中断向量#pragmacodeInterruptVectorHigh=0x08voidInterruptVectorHigh(void){_asmgotoInterruptHandlerHigh//跳到中断程_endasm}//高优先级中断服务程序#pragmacode#pragmainterruptInterruptHandlerHighvoidInterruptHandlerHigh(){while(PIR1bits.RCIF==1)//若接收中断标志不为1,则为误操作,返回{TXREG=RCREG;//将接收到的数据放入发送寄存器,并启动发送}}//主程序main(){initial();//系统初始化TXREG=0X55;//发送数据55H进行测试for(;;);}------------------------------------------汇编语言版本的RS-232接口实现计算机和单片机通信程序------------;此程序通过RS-232接口来完成计算机和单片机通讯(程序以在p18f458试验板上调通);本单片机程序由提供;此程序首先发送测试数据55H,再通过中断实现数据的接收和发送;程序的调试可以用串口调试助手V2.1辅助完成LISTP=18f458INCLUDEP18f458.INCORG0x00GOTOMAINORG0x08GOTOINTSERVEORG0X30;**************中断服务子程序***************INTSERVEBTFSSPIR1,RCIF;接收中断标志为1?GOTOERR_RE;误操作,返回MOVFRCREG,0;否则,将接收到的数据通过W寄存器MOVWFTXREG;放入发送寄存器,并启动发送ERR_RENOPRETFIE;****************初始化程序***************INITIALNOPMOVLW0X19;选择传输波特率为9600bpsMOVWFSPBRGMOVLW0X04;选择异步高速方式传输8位数据MOVWFTXSTAMOVLW0X80;允许同步串行口工作MOVWFRCSTAMOVLW0X80;将RC7,RC6设置为输入,断绝与外接电路的连接MOVWFTRISCBSFTXSTA,TXEN;发送允许BSFRCSTA,CREN;接受数据允许BSFPIE1,RCIE;接收中断使能MOVLW0XC0;总中断和外围中断允许MOVWFINTCONRETURN;**********************主程序*********************MAINNOPCLRWDTCALLINITIALMOVLW0X55;发送数据55H进行测试MOVWFTXREGLOOPGOTOLOOPEND两片51单片机互相通信的串行通信程序(一个发送程序,一个接收程序)2007-05-2708:27;系统晶振是11.0592MHz;51单片机发送单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSP,#60HMOVSCON,#50H;串口方式1MOVTMOD,#20H;T1方式2MOVTL1,#0FDH;波特率9600的常数MOVTH1,#0FDHSETBTR1movr5,#00hWAIT:movp1,#0ffhmova,p1movr5,alcalldelay;读键盘,这里去抖动,还要加几句话mova,p1nopCJNEA,5,WAIT;是否有键输入MOVSBUF,a;串口输出键盘输入的值NOPSS:JBCTI,WAIT;是否发送完毕SJMPSSDELAY:;延时子程序PUSH0;保存现场PUSH1MOV0,#06HDELAY1:MOV1,#0HDJNZ1

1 / 24
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功