您好,欢迎访问三七文档
实验9点对点串行通信实验9点对点串行通信一、实验目的二、实验设备与器材三、实验电路四、实验内容、过程及要求实验9点对点串行通信一、实验目的(1)理解串行通信概念。(2)掌握MCS-51串行通信口的初始化方法、步骤。(3)掌握串行发送、接收程序的编写方法。理解串行通信波特率误差允许范围。实验9点对点串行通信二、实验设备与器材仿真器及其附件、图1所示的实验电路板各两套,RS-232串行通信电缆一条,导线数条。实验9点对点串行通信三、实验电路按实验7的要求设置实验板上跳线,将JP105、JP106的1-2引脚短路,用RS-232电缆或导线将第一块实验电路板的TXD(发送端)引脚与第二块电路板的RXD(接收端)引脚连在一起,第一块实验电路板的RXD(接收端)引脚与第二块电路板的TXD(发送端)引脚连在一起;再用导线将两块电路板地线连在一起(用RS-232通信电缆连接时,两块实验电路板地线已通过DB9插座的第5引脚连在一起),这样就形成了没有联络信号的串行通信方式。实验9点对点串行通信四、实验内容、过程及要求1.串行通信格式的约定(1)波特率(CPS)为4800。假设晶振频率为11.0592MHz,使用定时器T1溢出率作发送、接收波特率,则定时器T1重装初值C=0FAH(不倍增)。(2)数据长度为9位,其中b7~b0为数据位,b8为奇偶校验位。(3)采用偶校验方式,即传送的8位数据中含有奇数个“1”时,校验位为1。实验9点对点串行通信2.没有协议的单字节收/发对于单字节串行收/发来说,无需约定通信协议,完成了串行口初始化后,即可通过写串行输出缓冲寄存器SBUF,启动串行发送;当接收有效标志RI置1时,就表示已接收了一字节的数据信息。试在实验7的基础上,增加单字节串行通信功能,使程序具备在任一实验板上按下某一按键时,两块板同时显示被按下的键名。下面给出了与串行通信有关的程序段,完整程序由读者编写。实验9点对点串行通信;初始化定时器T1(将定时器T1的溢出信号作串行通信波特率发生器输入信号)MOVTL1,#250;4800波特率对应定时器初值MOVTH1,#250ANLTMOD,#0F0HORLTMOD,#00100000B;定时器T1工作在方式2(8位自动重装初值)SETBTR1;启动定时器T1CLRET1;禁止T1中断;初始化串行口实验9点对点串行通信MOVSCON,#11010000B;串行口工作在方式3,SM2=0,以便用TB8位;作奇偶校验位;SETBREN;允许接收SETBES;允许串行中断SETBEA;开中断;单字节串行发送初始化MOVA,KEYNAME;取按键值送AMOVC,P实验9点对点串行通信MOVTB8,C;奇偶标志P送TB8,即b8位MOVSBUF,A;写串行发送缓冲器即可将一字节信息按设定的波特率发送到串行口上PROCUART;串行中断服务程序UART:PUSHACCPUSHPSWJNBTI,NEXT1;串行发送结束引起中断CLRTI;清除发送中断标志实验9点对点串行通信NEXT1:JNBRI,EXIT;串行接收有效CLRRI;清除接收有效中断MOVA,SBUF;读串行接收缓冲器;奇偶校验,即检查P标志与RB8位是否相同,否则奇偶校验错MOVC,PANLC,/RB8;计算P×MOVF0,C;暂时保存在F0标志中MOVC,RB8ANLC,/P;计算RB8×RB8P实验9点对点串行通信ORLC,F0;完成了P与RB8的异或运算JCEXIT;校验正确!MOVRXDBUF,A;数据送串行接收缓冲区SETBRXDB;串行接收有效标志置1EXIT:POPPSWPOPACCRETIEND实验9点对点串行通信3.按约定协议收/发的双机串行通信将JP201、JP202跳线的1-2引脚短路,即串行数据从P1.2引脚输出,串行移位脉冲从P3.4引脚输出,并行输出锁存信号从P3.5输出。在实验6的基础上,通过串行口将电子钟时间送到另一实验板显示出来,通信协议如下:(1)数据帧格式为:0AAH(起始标志)+4字节信息+1字节的和校验信息。实验9点对点串行通信(2)接收方正确接收后回送A5作应答;如果错误,则回送A6,请求重发。(3)发送/接收缓冲区在30H~35H单元,其中35H单元存放和校验信息(b7作接收缓冲数据有效标志)。(4)发送、接收均采用中断方式。实验9点对点串行通信与串行发送有关的发送参考程序如下:TXDBDATA30H;发送缓冲区TXDCDATA35H;发送/接收字节计数器TXDOKBIT07H;发送成功标志(1表示成功;0表示失败);初始化串行口MOVSCON,#11010000B;串行口工作在方式3,SM2=0,以便用TB8位;作奇偶校验位;SETBREN;允许接收PROCTIMETXB;时间送发送缓冲区实验9点对点串行通信TIMETXB:MOVA,SECONDMOVB,#10DIVAB;转换为BCD码;十位在A中,个位在B中MOVR0,#TXDB+2MOV@R0,AINCR0MOV@R0,B;秒低位送发送缓冲区缓冲区;分单元计数器笔段码送显示缓冲区实验9点对点串行通信MOVA,MINUTEMOVB,#10DIVAB;转换为BCD码;十位在A中,个位在B中MOV@R0,AINCR0MOV@R0,B;分低位送发送缓冲区缓冲区;计算校验和MOVR0,#TXDBMOVR7,#4CLRA;清累加器实验9点对点串行通信LOOP1:ADDA,@R0;累加求和INCR0DJNZR7,LOOP1ANLA,#7FH;保留和的低7位,避免与帧首标志相同MOV@R0,A;校验和存入发送缓冲区MOVA,#0AAH;先发送帧首标志MOVC,P;奇偶标志P送CMOVTB8,C;奇偶标志P送TB8,即b8位MOVSBUF,A;写串行口缓冲寄存器,启动发送MOVTXDC,#0;初始化发送字节数RETEND实验9点对点串行通信PROCUART;串行中断服务程序UART:PUSHACCPUSHPSWSETBRS0;切换工作寄存器区SETBRS1JNBTI,NEXT2;串行发送结束中断CLRTI;清除发送结束中断;检查发送字节计数器,确定是否已发送了所有数据MOVA,TXDCCJNEA,#5,NEXT1实验9点对点串行通信NEXT1:JNCNEXT2;小于5,说明尚未完成发送ADDA,#TXDB;加上发送缓冲区首地址MOVR0,AMOVA,@R0;取发送数据MOVC,P;奇偶标志P送CMOVTB8,C;奇偶标志P送TB8,即b8位MOVSBUF,A;写串行口缓冲寄存器,启动发送INCTXDC;发送字节计数器加1实验9点对点串行通信NEXT2:JNBRI,EXIT;退出CLRRI;清除接收有效中断;串行接收有效MOVA,SBUF;执行奇偶校验,P标志与RB8位应该相同,否则就错MOVC,PANLC,/RB8;计算P×MOVF0,C;暂时保在存F0标志中MOVC,RB8ANLC,/P;计算RB8×ORLC,F0;完成了P与RB8的异或运算RB8P实验9点对点串行通信JCEXIT;奇偶校验错;奇偶校验正确CJNEA,#0A5H,NEXT3;等于0A5H,说明接收方已准确接收,成功标志置1SETBTXDOKSJMPEXITNEXT3:CJNEA,#0A6H,EXIT;重新发送CLRTXDOK;清除发送成功标志MOVTXDC,#0;初始化发送字节计数器MOVA,#0AAH;发送帧首标志实验9点对点串行通信MOVC,P;奇偶标志P送CMOVTB8,C;奇偶标志P送TB8,即b8位MOVSBUF,A;写串行口缓冲寄存器,启动发送EXIT:POPPSWPOPACCRETIEND实验9点对点串行通信与串行接收有关的参考程序段如下:;初始化串行口MOVSCON,#11010000B;串行口工作在方式3,SM2=0,以便用TB8位作奇偶校验位;SETBREN;允许接收ORLPCON,#40H;将b6位置1,启用帧错误侦测功能;初始化中断控制器SETBES;允许串行口中断SETBEA;开中断;接收显示处理实验9点对点串行通信WAIT:MOVR0,#RXDB+4MOVA,@R0;读接收缓冲区有效标志JNBACC.7,WAIT;接收缓冲区无效,等待CLRACC.7MOV@R0,A;清除接收缓冲区有效标志;把接收缓冲区信息送显示缓冲区显示MOVDPTR,#LEDTAB;0~F字模表首地址送DPTRMOVR0,#DISPBUFMOVR1,#RXDBMOVR7,#4实验9点对点串行通信LOOP1:MOVA,@R1;取显示数码MOVCA,@A+DPTR;取数码对应字模MOV@R0,A;字模送显示缓冲区INCR0INCR1DJNZR7,LOOP1;显示分与秒之间的小数点MOVR0,#DISPBUF+1MOVA,@R0CLRACC.7;使b7,即DP位亮实验9点对点串行通信MOV@R0,A;回写SETBREN;允许串行口接收新的数据LCALLS_DISP;执行串行输出子程序,将笔段码送LEDSJMPWAIT;等待ENDPROCUART;串行中断服务子程序UART:PUSHACCPUSHPSWSETBRS0;切换工作寄存器区SETBRS1实验9点对点串行通信JNBRI,NEXT1CLRRI;清除接收中断JBCSCON.7,RERROR;帧错误MOVA,SBUF;执行奇偶校验,P标志与RB8位应该相同,否则偶校验错MOVC,PANLC,/RB8;计算P×MOVF0,C;暂保存在F0标志中MOVC,RB8ANLC,/P;计算RB8×ORLC,F0;完成了P与RB8的异或运算JCRERROR;奇偶校验错RB8P实验9点对点串行通信;奇偶校验正确!判别是否为帧首信息CJNEA,#0AAH,NEXT11;等于0AAH,属于一信息帧开始MOVRXDC,#0;复位接收字节计数器SETBFRAMES;帧开始标志有效SJMPNEXT1NEXT11:;非帧首信息JNBFRAMES,RERROR;在这之前尚未接收到帧开始标志;当前接收内容为帧内数据信息MOVA,RXDC实验9点对点串行通信ADDA,#RXDB;加接收缓冲区首地址MOVR0,AMOV@R0,SBUF;接收数据送接收缓冲区INCRXDC;接收字节计数器加1;判别接收的字节数MOVA,RXDCCJNEA,#5,NEXT1;已经接收了五字节,做和校验MOVR0,#RXDBMOVR7,#4;对30H~33H单元求和,共四字节CLRA;清除累加器实验9点对点串行通信LOOP1:ADDA,@R0;累加求和INCR0DJNZR7,LOOP1XRLA,@R0;与接收到的和校验字节异或JNZRERROR;正确MOVA,@R0ORLA,#80HMOV@R0,A;接收缓冲区数据有效标志置1MOVA,#0A5H;发送0A5H应答信号CLRREN;停止接收,等待处理接收数据SJMPTXDACK实验9点对点串行通信RERROR:MOVA,#0A6H;错误标志TXDACK:CLRFRAMES;清除帧开始标志MOVRXDC,#0;复位接收字节计数器MOVC,P;奇偶标志P送CMOVTB8,C;奇偶标志P送TB8,即b8位MOVSBUF,A;写串行口缓冲寄存器,启动发送SJMPEXIT实验9点对点串行通信NEXT1:JNBTI,EXIT;串行发送结束中断CLRTI;清除发送结束中断EXIT:POPPSWPOPACCRETIEND实验9点对点串行通信4.实验过程(1)分别在两台仿真器上输入、汇编上述程序,并执行。(2)修改定时器T1的初值(最好换上振荡频率为12.0MHz的晶振),使两者波特率误差从1%逐渐增大到5%,然后再进行数据传送,验证波特率误差允许范围。(3)接收方改用定时器T2溢出率作为串行口波特率,重复上述通信过程。(4)选择其他的通信约定,写出相应的发送、接收程序,并在仿真器上调试。
本文标题:点对点串行通信
链接地址:https://www.777doc.com/doc-317393 .html