您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > RS485总线通信实验
实验二RS485总线通信实验一、实验目的学习单片机串行通信协议的设计,设计程序实现单片机与PC机间的RS485串口通信。二、实验设备及器件计算机(带串口)一台单片机实验仪一台三、实验内容在单片机上用定时器0实现编写电子钟程序,将时分秒在LCD上显示,同时编写串口程序,实现由PC机通过RS485总线修改和读取电子钟时间,通信采用ASCII码,波特率4800,协议如下:PC机发送单片机回送1、读取电子钟的“时分秒”#RT=XXYYZZ2、修改电子钟的“时分秒”#SXXYYZZ无回送四、实验步骤图2、RS485转TTL接口1、RS485接PC机的串行口上的RS232转RS485模块,J9的RXD、TXD分别接单片机的P3.0、P3.1;2、编写程序并仿真后,用STC下载器下载到单片机执行,首先验证电子种的功能。3、PC机上采用STC下载器中的串口助手,通过发送ASCII码的命令,进行电子钟时间的读取和修改。五、实验预习要求学习单片机的串口设置的有关特殊寄存器的设置,学习ASCII码通信协议的有关知识。#includereg51.h#defineucharunsignedchar#defineuintunsignedint#definetim0-50000#defineBPS4800-13bitdis;sbitLT1=P2^0;sbitLT2=P2^1;////////////////////////////////////////////////////////////////支持字节和字类型,由于他的浮点怪异所以不支持idataucharDatB[8];//组态字节idatauintDatW[8];//组态整数idatafloatDatF[4];//组态浮点bitRECV=0;ucharAddr=1;idataucharRbuf[40],Rptr,Rnum;idataucharTbuf[40],Tptr,Tnum;codeucharasc[]=0123456789ABCDEF;ucharAscHex(ucharm){if(m=0&&m='9')returnm-'0';elseif(m='A'&&m='Z')returnm-'A'+10;elseif(m='a'&&m='z')returnm-'a'+10;return0;}ucharAscByte(ucharp)//ok{ucharx1,x2;x1=AscHex(Rbuf[p]);x2=AscHex(Rbuf[p+1]);x2=x2+x1*16;returnx2;}voidByteAsc(ucharp)//ok{Tbuf[Tnum++]=asc[p4];Tbuf[Tnum++]=asc[p&15];}ucharChkLRC()//ok{uchari,d,s=0;for(i=0;iRnum-2;i++)s^=Rbuf[i];d=AscByte(Rnum-2);returns^d;}voidSetLRC()//ok{uchari,s=0;for(i=0;iTnum;i++)s^=Tbuf[i];ByteAsc(s);Tbuf[Tnum++]=0x0d;SBUF=0x40;}voidserial()interrupt4using2{ucharm;if(RI){RI=0;m=SBUF;if(m==0x40){Rptr=0;Rnum=0;}elseif(m==0x0D){RECV=1;}elseif(Rnum40){Rbuf[Rptr++]=m;Rnum++;}}if(TI){TI=0;if(Tnum0){SBUF=Tbuf[Tptr++];Tnum--;}}}//////////////////////////////////////////////////////voidModbusASC(){uintp;ucharn,cmd,i;uchar*s;LT2=!LT2;p=AscByte(4)*256+AscByte(6);n=AscByte(8);cmd=AscByte(2)&0xf;if((cmd&1)==0)//Readfrommcu{Tnum=0;Tptr=0;ByteAsc(Addr);ByteAsc(n);switch(cmd&0x0c){case0x00://byteoks=(uchar*)DatB+p;for(i=0;in;i++)ByteAsc(s[i]);break;case0x04://wordoks=(uchar*)DatW+2*p;for(i=0;in/2;i++){ByteAsc(s[2*i]);ByteAsc(s[2*i+1]);}break;}SetLRC();}else//Writetomcu{switch(cmd&0x0c){case0x00://byteoks=(uchar*)DatB+p;for(i=0;in;i++)s[i]=AscByte(10+2*i);break;case0x04://wordoks=(uchar*)DatW+2*p;for(i=0;in/2;i++){s[2*i]=AscByte(10+4*i);s[2*i+1]=AscByte(12+4*i);}break;}Tnum=0;Tptr=0;ByteAsc(Addr);Tbuf[Tnum++]='#';Tbuf[Tnum++]='#';SetLRC();}Rnum=0;Rptr=0;}///////////////////////////////////////////////////////main(){ucharw;IE=0x90;TMOD=0X21;SCON=0X50;PCON=0X80;TH0=tim08;TL0=tim0&0xff;TR0=1;TH1=BPS4800;TL1=BPS4800;TR1=1;DatB[0]=12;DatB[1]=34;DatB[2]=56;DatB[3]=78;DatB[4]=21;DatB[5]=43;DatB[6]=65;DatB[7]=87;DatW[0]=123;DatW[1]=234;DatW[2]=345;DatW[3]=456;DatW[4]=567;DatW[5]=678;DatW[6]=789;DatW[7]=890;DatF[0]=-1.123;DatF[1]=-1.145;DatF[2]=10.123;DatF[3]=100.145;while(1){if(RECV){RECV=0;if(ChkLRC()==0){w=AscByte(0);if(w==Addr)ModbusASC();}}}}
本文标题:RS485总线通信实验
链接地址:https://www.777doc.com/doc-5288383 .html