您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > 第七章 MCS51单片机串行接口(1)
第七章MCS-51单片机串行接口1串行口控制寄存器(SCON)SCON是MCS-51单片机的一个可位寻址的专用寄存器,用于串行数据通信的控制。单元地址为98H,位地址为98H~9FH。寄存器的内容及位地址表示如下:位地址9FH9EH9DH9CH9BH9AH99H98H位符号SM0SM1SM2RENTB8RB8TIRI7-1串行口控制寄存器各位的说明如下:1)SM0、SM1——串行口工作方式选择位其状态组合和对应工作方式为:SM0SM1工作方式00方式001方式110方式211方式32)M2——允许方式2、3的多机通信控制位在方式2和3中,若SM2=1且接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8位数据。若SM2=0,则不论第九位数据(RB8)为1还是为0,都将前8位送入接收SBUF中,并产生中断请求。方式0时,SM2必须置0。3)REN——允许接收位REN=0禁止接收数据REN=1允许接收数据4)TB8——发送数据位8在方式2、3时,TB8的内容是要发送的第9位数据,其值由用户通过软件来设置。5)RB8——接收数据位8在方式2、3时,RB8是接收的第9位数据。在方式1时,RB8是接收的停止位在方式0时,不使用RB86)TI——发送中断标志位在方式0时,发送完第8位数据后,该位由硬件置位。在其它方式下,于发送停止位之前,由硬件置位。因此,TI=1表示帧发送结束,其状态既可供软件查询使用,也可请求中断。TI由软件清“0”。7)RI——接收中断标志位在方式0时,接收完第8位数据后,该位由硬件置位。在其它方式下,于接收到停止位之前,该位由硬件置位。因此,RI=1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。RI由软件清“0”。2串行口缓冲区SBUFSBUF是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据。两个缓冲器只用一个字节地址99H,可通过指令对SBUF的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。CPU在写SBUF,就是修改发送缓冲器;读SBUF,就是读接收缓冲器。串行口对外也有两条独立的收发信号线RxD、TxD,因此可以同时发送、接收数据,实现全双工。PCON不可位寻址,字节地址为87H。它主要是为CHMOS型单片机80C51的电源控制而设置的专用寄存器。其内容如下:与串行通信有关的只有D7位(SMOD),该位为波特率倍增位,当SMOD=1时,串行口波特率增加一倍,当SMOD=0时,串行口波特率为设定值。当系统复位时,SMOD=0。位序D7D6D5D4D3D2D1D0位符号SMOD///GF1GF0PDIDL3电源控制寄存器(PCON)7-2MCS-51串行的工作方式SM0SM1方式功能说明波特率00方式0移位寄存器方式fosc/1201方式18位UART可变10方式29位UARTfosc/64或者fosc/3211方式39位UART可变表8-1串行口工作方式串行口的工作方式由SM0和SM1确定,编码和功能如表8-1所示。方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由T1的溢出率决定。1数据输出(发送)当数据写入SBUF后,数据从RXD端在移位脉冲(TXD)的控制下,逐位移入74LS164,74LS164能完成数据的串并转换。当8位数据全部移出后,TI由硬件置位,发生中断请求。若CPU响应中断,则从0023H单元开始执行串行口中断服务程序,数据由74LS164并行输出。其接口逻辑如图8.3所示。RXDTXD0D7D。。。。。。CLK74LS1648051STB0.1PAB图8.3接口逻辑一、串行工作方式02数据输入(接收)要实现接收数据,必须首先把SCON中的允许接收位REN设置为1。当REN设置为1时,数据就在移位脉冲的控制下,从RXD端输入。当接收到8位数据时,置位接收中断标志位RI,发生中断请求。其接口逻辑如图8.4所示。由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。RXDTXD0D7D......CLK74LS1658051STB0.1PQ图8.4外接移位寄存器输入【例7-1】使用74LS164的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从左到右依次点亮,并反复循环。假定发光二极管为共阴极接法。RXDTXD0D7D.........CLK74LS1648051AB。。。。。。STB0.1P图8.5电路设计ORG0000HLJMPMAINORG1000HMAIN:MOVSCON,#00H;串行口工作在方式0CLRES;禁止串行中断MOVA,#80H;发光二极管从左边亮起DELR:CLRP1.0;关闭并行输出MOVSBUF,A;串行输出WAINT:JNBTI,WAIT;状态查询SETBP1.0;开启并行输出ACALLDELAY;调用延时子程序CLRTI;清发送中断标志RRA;发光右移AJMPDELR;继续EDN解:电路如图8.5。软件部分如下:方式1为10位为一帧的异步串行通信方式。其帧格式为1个起始位、8个数据位和1个停止位。如图8.6所示:起始位0D1D2D3D4D5D6D7D停止位图8.6方式1的帧格式1.数据输出(发送)数据写入SBUF后,开始发送,此时由硬件加入起始位和停止位,构成一帧数据,由TXD串行输出。输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符的发送。二、串行工作方式12数据输入(接收)当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个字符。3波特率的设定工作在方式1时,其波特率是可变的,波特率的计算公式为:的溢出率)定时器波特率=1(322SMOD其中,SMOD为PCON寄存器最高位的值,其值为1或0。当定时器1作波特率发生器使用时,选用工作方式2(即自动加载定时初值方式)。选择方式2可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。假定计数初值为X,则计数溢出周期为:)X256(fosc12溢出率为溢出周期的倒数。则波特率的计算公式为:)X256(12fosc322SMOD波特率=实际使用中,波特率是已知的。因此需要根据波特率的计算公式求定时初值X。用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。4应用举例(用方式1实现双机串行通信)(1)通信双方的硬件连接作为应用系统首先要研究通信双方如何连接。一种办法是把两片8051的串行口直接相连,一片8051的TXD与另一片的RXD相连,RXD与另一片的TXD相连,地与地连通。由于8051串行口的输出是TTL电平,两片相连所允许的距离极短。(2)通信双方的软件约定为实现双机通信,我们规定如下:•假定A机为发送机,B机为接收机。•当A机发送时,先送一个“AA”信号,B机收到后回答一个“BB”信号,表示同意接收。•当A机接收到“BB”后,开始发送数据,每发送一次求一次“检查和”,假定数据块长16个字节,起始地址为30H,一个数据块发送完后再发出“检查和”。HFx2024313256120038411062566为使波特率不倍增,设定PCON寄存器的SMOD=0,则PCON=00H..(3)基本的通信程序设计程序框图如图8.7所示。B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。若两者相等,说明接收正确,B机回答一个00;若两者不相等,说明接收不正确,B机回答一个FF,请求重发。A机收到00的答复后,结束发送。若收到的答复非0,则重新将数据发送一次。双方均以1200波特的速率传送。假设晶振频率为6MHz,计算定时器1的计数初值:指针初始化检查和清零设置串行口工作方式发请求发送信号B机允许发送?发送一个数据字节求检查和发送检查和B机接收正确码?返回设置波特率启动定时器T1数据块发送完?向A机发应答信号设置串行口工作方式等待A机联络信号A机请求发送吗?指针初始化检查和清零设置波特率启动定时器T1NNNA机通信程序接收一个数据字节求检查和数据块收齐吗?接收A机检查和并比较B机检查和返回接收正确吗?发出错误标志B机通信程序NNN图8.7双机通信程序结构图A机通信程序:ASTART:MOVTMOD,#20H;设定定时器1工作方式2MOVTL1,#0F2H;设定计数初值MOVTH1,#0F2H;计数重装值MOVPCON,#00H;波特率不倍增SETBTR1;启动T1MOVSCON,#50H;设置串行口方式1ATT1:MOVSBUF,#0AAH;发送“AA”AWAIT1:JBCTI,ARR1;等待一帧发送完SJMPAWAIT1ARR1:JBCRI,ARR2;等待应答信号SJMPARR1根据结构图设计出下述通信程序:ARR2:MOVA,SBUFXRLA,#0BBHJNZATT1;判断是否是应答信号“00”ATT2:MOVR0,#30HMOVR7,#10MOVR6,#00HATT3:MOVSBUF,@R0MOVA,R6ADDA,@R0MOVR6,AINCR0AWAIT2:JBCTI,ATT4SJMPAWAIT2;发送有效数据ATT4:DJNZR7,ATT3;判断是否传送完毕MOVSBUF,R6AWAIT3:JBCTI,ARR3SJMPAWAIT3;等待ARR3:JBCRI,ARR4SJMPARR3;等待ARR4:MOVA,SBUFJNZATT2AEND:RETB机通信程序:BST\ART:MOVTMOD,#20H;设定定时器1工作方式2MOVTH1,#0F2H;设定计数初值MOVTL1,#0F2H;计数重装值MOVPCON,#00H;波特率不倍增SETBTR1MOVSCON,#50HBRR1:JBCRI,BRR2SJMPBRR1;等待BRR2:MOVA,SBUF;把接收到的数据送入AXRLA,#0AAH;判断接收到数据是否是“AA”JNZBRR1;如果不是继续等待BTT11:MOVSBUF,0BBH;发送应答信号BWAIT1:JBCTI,BRR3;等待SJMPBWAIT1BRR3:MOVR0,#30H;接收有效数据MOVR7,#10MOVR6,#00HBRR4:JBCRI,BRR5SJMPBRR4BRR6:MOVA,SBUFXRLA,R6JZBENDMOVSBUF,#0FFHBWAIT3:JBCTI,BRR3SJMPBWAIT3BEND:MOVSBUF,#00HRET方式2为11位为一帧的异步串行通信方式。其帧格式为1个起始位、9个数据位和1个停止位。如图8.8所示。起始位0D1D2D3D4D5D6D7D8D停止位图8.8方式2的帧格式三、串行工作方式2在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。在发送数据时,应先在SCON的TB8位中把第9个数据位的内容准备好。这可使用如下指令完成:SETBTB8;TB8位置“1”CLRTB8;TB8位置“0”发送数据(D0~D7)由MOV指令向SBUF写入,而D8位的内容则由硬件电路从TB8中直接送到发送移位器的第九位,并以此来启动串行发送。一个字符帧发送完毕后,将TI位置“1”,其他过程与方式1相同。方式2的接收过程也于方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB。方式2的波特率时固定的,而且有两种。一种是晶振频率的三十二分之一;另一种是晶振频率的六十四分之一。即fosc/32和fosc/64。如用公式表示则为:foscSMOD642波特率=由此公式可知,当SMOD为0时,波特率为fosc/64,当SMOD为1时,波特率为fosc/32。方式3同方式2几乎完全一样,只不过方式3的波特率是可变的,有用户来确定。其波
本文标题:第七章 MCS51单片机串行接口(1)
链接地址:https://www.777doc.com/doc-3199604 .html