资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第10章,单片机串行数据通信,10.1 串行通信的基础知识,串行数据通信要解决两个关键技术问题,一个是数据传送,另一个是数据转换。所谓数据传送就是指数据以什么形式进行传送。所谓数据转换就是指单片机在接受数据时,如何把接收到的串行数据转化为并行数据,单片机在发送数据时,如何把并行数据转换为串行数据进行发送。,10.1.1,数据传送,单片机的串行通信使用的是异步串行通信,所谓异步就是指发送端和接收端使用的不是同一个时钟。异步串行通信通常以字符(或者字节)为单位组成字符帧传送。字符帧由发送端一帧一帧地传送,接收端通过传输线一帧一帧地接收。,1.字符帧的帧格式,字符帧由四部分组成,分别是起始位、数据位、奇偶校验位、停止位。如图10.1所示:,1),起始位:位于字符帧的开头,只占一位,始终位逻辑低电平,表示发送端开始发送一帧数据。,2),数据位:紧跟起始位后,可取5、6、7、8位,低位在前,高位在后,。,3)奇偶校验位:占一位,用于对字符传送作正确性检查,因此奇偶校验位是可选择的,共有三种可能,即奇偶校验、偶校验和无校验,由用户根据需要选定。,4)停止位:末尾,为逻辑“1”高电平,可取1、1.5、2位,表示一帧字符传送完毕。,图,10.1,字符帧格式,2.传送的速率,串行通信的速率用波特率来表示,所谓波特率就是指一秒钟传送数据位的个数。每秒钟传送一个数据位就是1波特。即:1波特1bps(位/秒)。,在串行通信中,数据位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。时钟频率高,则波特率高,通信速度就快;反之,时钟频率低,波特率就低,通信速度就慢。,10.1.2,数据转换,串行接口电路为用户提供了两个串行口缓冲寄存器(SBUF),一个称为发送缓存器,它的用途是接收片内总线送来的数据,即发送缓冲器只能写不能读。发送缓冲器中的数据通过TXD引脚向外传送。另一个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。接收缓冲器通过RXD引脚接收数据。因为这两个缓冲器一个只能写,一个只能读,所以共用一个地址99H。串行接口电路如图8.2所示。,图,10.2 MCS-51,串行口寄存器结构,10.2,MCS-51,单片机串行通信的控制寄存器,1.串行口控制寄存器(SCON),SCON是MCS-51单片机的一个可位寻址的专用寄存器,用于串行数据通信的控制。单元地址为98H,位地址为98H9FH。寄存器的内容及位地址表示如下:,位地址,9FH,9EH,9DH,9CH,9BH,9AH,99H,98H,位符号,SM,0,SM,1,SM,2,REN,TB,8,RB,8,TI,RI,各位的说明如下:,1)SM0、SM1串行口工作方式选择位,其状态组合和对应工作方式为:,SM0 SM1 工作方式,0 0 方式0,0,1 方式1,1,0 方式2,1,1 方式3,2)M,2,允许方式2、3的多机通信控制位,在方式2和3中,若SM,2,1且接收到的第九位数据(RB,8,)为1,才将接收到的前8位数据送入接收SBUF 中,并置位RI产生中断请求;否则丢弃前8位数据。若 SM,2,0,则不论第九位数据(RB,8,)为1还是为0,都将 前8位送入接收SBUF中,并产生中断请求。,方式0时,SM,2,必须置0。,3)REN允许接收位,REN0 禁止接收数据,REN1 允许接收数据,4)TB,8,发送数据位8,在方式2、3时,TB,8,的内容是要发送的第9位数据,其值由用户通过软件来设置。,为使波特率不倍增,设定PCON寄存器的SMOD=0,则 PCON00H.,另一种是晶振频率的六十四分之一。,当系统复位时,SMOD=0。,WAINT:JNBTI,WAIT ;,ARR1:JBC RI,ARR2 ;,DELR:CLRP1.,MOV TH1,#0F2H ;,BSTART:MOVTMOD,#20H;,MOV SCON,#50H;,用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。,根据结构图设计出下述通信程序:,假定计数初值为X,则计数溢出周期为:,数据输出(发送),5)RB,8,接收数据位8,在方式2、3时,RB,8,是接收的第9位数据。,在方式1时,RB,8,是接收的停止位,在方式0时,不使用RB,8,6)TI发送中断标志位,在方式0时,发送完第8位数据后,该位由硬件置位。,在其它方式下,于发送停止位之前,由硬件置位。,因此,TI1表示帧发送结束,其状态既可供软件查询使用,也可请求中断。,TI,由软件清“,0,”。,7,)RI接收中断标志位,在方式0时,接收完第8位数据后,该位由硬件置位。,在其它方式下,于接收到停止位之前,该位由硬件置位。,因此,RI1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。,RI,由软件清“,0,”。,2.电源控制寄存器(PCON),PCON不可位寻址,字节地址为87H。它主要是为CHMOS型单片机80C51的电源控制而设置的专用寄存器。其内容如下:,与串行通信有关的只有,D,7,位(,SMOD,),该位为波特率倍增位,当,SMOD=1,时,串行口波特率增加一倍,当,SMOD=0,时,串行口波特率为设定值。当系统复位时,,SMOD=0,。,位序,D,7,D,6,D,5,D,4,D,3,D,2,D,1,D,0,位符号,SMOD,/,/,/,GF,1,GF,0,PD,IDL,10.3 MCS-51单片机串行通信工作方式,串行口的工作方式由,SM0,和,SM1,确定,编码和功能如表,8-1,所示。,方式,0,和方式,2,的波特率是固定的,而方式,1,和方式,3,的波特率是可变的,由,T1,的溢出率决定。,SM0 SM1,方式,功能说明,波特率,0 0,方式0,移位寄存器方式,fosc/12,0 1,方式1,8位UART,可变,1 0,方式2,9位UART,fosc/64 或者fosc/32,1 1,方式3,9位UART,可变,表9-1 串行口工作方式,10.3.1,串行工作方式,0,1.数据输出(发送),当数据写入,SBUF,后,数据从,RXD,端在移位脉冲(,TXD,)的 控制下,逐位移入,74LS164,,,74LS164,能完成数据的串并转换。当,8,位数据全部移出后,,TI,由硬件置位,发生中断请求。若,CPU,响应中断,则从,0023H,单元开始执行串行口中断服务程序,数据由,74LS164,并行输出。其接口逻辑如图所示。,图接口逻辑,2.数据输入(接收),要实现接收数据,必须首先把SCON中的允许接收位REN设置为1。当REN设置为1时,数据就在移位脉冲的控制下,从RXD端输入。当接收到8位数据时,置位接收中断标志位RI,发生中断请求。其接口逻辑如图8.4所示。由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。,图,10.4,外接移位寄存器输入,【例10,-1,】使用,74LS164,的并行输出端接,8,支发光二极管,利用它的串入并出功能,把发光二极管从左到右依次点亮,并反复循环。假定发光二极管为共阴极接法。,图10,.5,电路设计,解:电路如图10,.5,。软件部分如下:,ORG0000H,LJMPMAIN,ORG1000H,MAIN,:,MOVSCON,,,#00H,;串行口工作在方式,0,CLRES,;禁止串行中断,MOVA,,,#80H,;发光二极管从左边亮起,DELR,:,CLRP1.0,;关闭并行输出,MOVSBUF,,,A,;串行输出,WAINT,:,JNBTI,,,WAIT,;状态查询,SETBP1.0,;开启并行输出,ACALLDELAY,;调用延时子程序,CLRTI,;清发送中断标志,RRA,;发光右移,AJMPDELR,;继续,EDN,10.3.2,串行工作方式,1,方式1为10位为一帧的异步串行通信方式。其帧格式为1个起始位、8个数据位和1个停止位。如图8.6所示。,图,10.6,方式,1,的帧格式,1.数据输出(发送),数据写入SBUF后,开始发送,此时由硬件加入起始位和 停止位,构成一帧数据,由TXD串行输出。输出一帧数据后,TXD保持在高电平状态下,并将TI置位,通知CPU可以进行下一个字符的发送。,2.数据输入(接收),当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB,8,中,并置位RI,通知CPU接收到一个字符。,3.波特率的设定,工作在方式1时,其波特率是可变的,波特率的计算公式为:,其中,SMOD为PCON寄存器最高位的值,其值为1 或0。,当定时器,1,作波特率发生器使用时,选用工作方式,2,(即自动加载定时初值方式)。选择方式,2,可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。假定计数初值为,X,,则计数溢出周期为:,溢出率为溢出周期的倒数。则波特率的计算公式为:,实际使用中,波特率是已知的。因此需要根据波特率的计算公式求定时初值,X,。用户只需要把定时初值设置到定时器,1,,就能得到所要求的波特率。,4.应用举例(用方式1实现双机串行通信),(,1,)通信双方的硬件连接,作为应用系统首先要研究通信双方如何连接。一种办法是把两片8051的串行口直接相连,一片8051的TXD与另一片的RXD相连,RXD与另一片的TXD相连,地与地连通。由于8051串行口的输出是TTL电平,两片相连所允许的距离极短。,(,2,)通信双方的软件约定,为实现双机通信,我们规定如下:,假定A机为发送机,B机为接收机。,当A机发送时,先送一个“AA”信号,B机收到后回答一个“BB”信号,表示同意接收。,当,A,机接收到“,BB,”后,开始发送数据,每发送一次求一次“检 查和”,假定数据块长,16,个字节,起始地址为,30H,,一个数据块发送完后再发出“检查和”。,B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。若两者相等,说明接收正确,B机回答一个00;若两者不相等,说明接收不正确,B机回答一个FF,请求重发。,A机收到00的答复后,结束发送。若收到的答复非0,则重新将数据发送一次。,双方均以,1200,波特的速率传送。假设晶振频率为,6MHz,,计算定时器,1,的计数初值:,为使波特率不倍增,设定,PCON,寄存器的,SMOD=0,,则,PCON,00H,.,(,3,)基本的通信程序,设计程序框图如图8.7所示。,图,10.7,双机通信程序结构图,根据结构图设计出下述通信程序:,A机通信程序:,ASTART:MOV TMOD,#20H ;设定定时器1工作方式2,MOV TL1,#0F2H ;设定计数初值,MOV TH1,#0F2H ;计数重装值,MOV PCON,,,#00H,;波特率不倍增,SETB TR1;启动T1,MOV SCON,#50H;设置串行口方式1,ATT1:MOV SBUF,#0AAH;发送“AA”,AWAIT1:JBC TI,ARR1 ;等待一帧发送完,SJMP AWAIT1,ARR1:JBC RI,ARR2 ;等待应答信号,SJMP ARR1,ARR2:MOVA,SBUF,XRLA,#0BBH,JNZATT1 ;判断是否是应答信号“00”,ATT2:MOVR0,#30H,MOVR7,#10,MOVR6,#00H,ATT3:MOVSBUF,R0,MOVA,R6,ADDA,R0,MOVR6,A,INCR0,AWAIT2:JBCTI,ATT4,SJMPAWAIT2 ;发送有效数据,ATT4:DJNZR7,ATT3 ;判断是否传送完毕,MOVSBUF,R6,方式1为10位为一帧的异步串行通信方式。,当REN=1且接收到起始位后,在移位脉冲的控制下,把接收到的数据移入接收缓冲寄存器(SBUF)中,停止位到来后,把停止位送入RB8中,并置位RI,通知CPU接收到一个字符。,B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。,数据输入(接收),5)RB8接收数据位8,因此,RI1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。,SETB TB8 ;,SETBTR1,5)RB8接收数据位8,在方式2和3中,若SM21且接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF 中,并置位RI产生中断请求;,若两者不相等,说明接收不正确,B机回答一个FF,请求重发。,判断是否是应答信号“00”,另一个称为接收缓冲器,它的用途是向片内总线发送数据,即接收缓冲器只能读不能写。,MOV SCON,#50H;,若两者不相等,说明接收不正确,B机回答一个FF,请求重发。,工作在方式1时,其波特率是可变的,波特率的计算公式为:,MOVSBUF,A ;,AWAIT3:JBCTI,ARR3,SJMPAWAIT3,;等待,ARR3:JBCRI,ARR4,SJMPARR3 ;等待,ARR4:MOVA,SBUF,JNZATT2,AEND:RET,B机通信程序:,BSTART:MOVTMOD,#20H;设定定时器1工作方式2,MOVTH1,#0F2H ;设定计数初值,MOVTL1,#0F2H ;计数重装值,MOVPCON,#00H ;波特率不倍增,SETBTR1,MOVSCON,#50H,BRR1:JBC RI,BRR2,SJMP BRR1 ;等待,BRR2:MOV A,SBUF ;把接收到的数据送入A,XRL A,#0AAH ;判断接收到数据是否是“AA”,JNZ BRR1 ;如果不是继续等待,BTT11:MOVSBUF,0BBH;发送应答信号,BWAIT1:JBCTI,BRR3;等待,SJMPBWAIT1,BRR3:MOVR0,#30H ;接收有效数据,MOVR7,#10,MOVR6,#00H,BRR4:JBCRI,BRR5,SJMPBRR4,用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。,双方均以1200波特的速率传送。,B机接收的数据并转存到数据区,起始地址也为30H,同时每接收一次也计算一次“检查和”,当一个数据块收齐后,再接收A机发来的“检查和”,并将它与B机的“检查和”进行比较。,由逻辑图可知,通过外接74LS165,串行口能够实现数据的并行输入。,设定定时器1工作方式2,BRR1:JBC RI,BRR2,因此,RI1表示帧接收结束,其状态既可供软件查询使用,也可请求中断。,若 SM20,则不论第九位数据(RB8)为1还是为0,都将 前8位送入接收SBUF中,并产生中断请求。,MOV TL1,#0F2H ;,接收缓冲器通过RXD引脚接收数据。,AWAIT1:JBC TI,ARR1 ;,为使波特率不倍增,设定PCON寄存器的SMOD=0,则 PCON00H.,ATT2:MOVR0,#30H,RET,AEND:RET,则波特率的计算公式为:,BRR6:MOV A,SBUF,XRL A,R6,JZ BEND,MOV SBUF,#0FFH,BWAIT3:JBC TI,BRR3,SJMP BWAIT3,BEND:MOV SBUF,#00H,RET,10.3.3,串行工作方式,2,方式2为11位为一帧的异步串行通信方式。其帧格式为1个起始位、9个数据位和1个停止位。如图10.8所示。,图10,.8,方式,2,的帧格式,在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D,8,),而且其功能由用户确定,是一个可编程位。,在发送数据时,应先在SCON的TB,8,位中把第9个数据位的内容准备好。这可使用如下指令完成:,SETB TB,8,;TB,8,位置“1”,CLR TB,8,;TB,8,位置“0”,发送数据(D,0,D,7,)由MOV指令向SBUF写入,而D,8,位的内容则由硬件电路从TB,8,中直接送到发送移位器的第九位,并以此来启动串行发送。一个字符帧发送完毕后,将TI位置“1”,其他过程与方式1相同。,方式2的接收过程也于方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB。,方式,2,的波特率时固定的,而且有两种。一种是晶振频率的三十二分之一;另一种是晶振频率的六十四分之一。即,fosc/32,和,fosc/64,。如用公式表示则为:,由此公式可知,当,SMOD,为,0,时,波特率为,fosc/64,,当,SMOD,为,1,时,波特率为,fosc/32,。,10.3.4,串行工作方式,3,方式,3,同方式,2,几乎完全一样,只不过方式,3,的波特率是可变的,有用户来确定。其波特率的确定同方式,1,。,
展开阅读全文