资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,*,*,*,7,串行口,通信的基本方式有两种:,并行通信,与,串行通信,(,1,)并行通信,:,数据的各位同时传送,特点:,传送速度快、效率高。但有多少数据位就需多少根数据线,因此传送成本高。,在集成电路芯片的内部、同一插件板上各部件之间、同一机箱内各插件板之间等的数据传送都是并行的。,并行通信的距离通常,小于,30,米,。,1,7,串行口,(,2,)串行通信:,数据一位一位顺序传送,特点:,数据传送按位顺序进行,最少只需一根传输线即可完成,成本低但速度慢,在图中可以看到,并行传送,8,位数只需串行发送一位的时间,1T,。,计算机与远程终端或终端与终端之间的数据传送通常都是串行的。,串行通信的距离可以从,几米到几千公里。,2,3,9.3,串行口,按照串行数据的同步方式,串行通信又分为两种方式,:,异步通信和同步通信。,8051,中,使用,异步,通信方式,.,异步通信:,数据通常是以字符(字节)为单位组成,字符帧,传送的。,字符帧由发送端,一帧一帧,地发送,通过传输线由接收设备一帧,一帧地接收。,发送端和接收端可以有,各自的时钟,来控制数据的发送和接收,,这两个时钟源彼此独立,互不同步。,在异步通信中,发送端和接收端依靠,字符帧格式,规定和,波特率,来协调数据的发送和接收。字符帧格式和波特率由用户根据实际,情况选定。,4,9.3,串行口,字符帧格式,字符帧也叫数据帧,由,起始位,、,数据位,、,奇偶校验位,和,停止,位,四部分组成。,5,异步通信数据格式,6,9.3,串行口,在这种格式标准中,信息的两种状态:,“,mark”,:译为“标记”或“传号”,对应逻辑状态。,在发送器空闲时,数据线应保持在,mark,状态,;,“,space”,:译为“空白”或“空号”,对应逻辑状态。,起始位:,位于字符帧开头,占一位,使数据线处于“,space”,(逻辑)状态,用于向接收设备表示发送端开始发送一帧信息。,数据位:,紧跟起始位之后就传送数据位。在数据位中,低位在前(左),高位在后(右)。根据字符编码方式的不同,数据位可取,5,位、,6,位、,7,位或,8,位。若传送数据为,ASCII,码,则常取,7,位。,奇偶校验位:,位于数据位之后,仅占一位,用于对字符传送作正确性检查。奇偶校验位有,3,种可能的选择:奇、偶或无校验,由用户根据需要选定。,停止位:,位于字符帧末尾,它对应于“,mark”,(逻辑,1,)状态,用于向接收端表示一帧字符信息已发送完毕。停止位可以是,1,、,1.5,或,2,位的高电平,在实际应用中由用户根据需要确定。,7,9.3,串行口,波特率(,baud rate,),波特率的定义:,是每秒钟传送二进制数码的位数,(亦称比特数),单位是,bps,(,bit per second,),即位,/,秒。,字符的实际传送速率:,是指每秒钟内所传字符帧的帧数,与字符帧格式有关,。字符的实际传送速率与波特率不同。,波特率是串行通信的重要指标,用于表征数据传送的速率 波特率越高,数据传输速度越快。,位时间:,每位的传送时间定义为波特率的倒数。,例如:,波特率为,2400bps,的通信系统,其位时间,Td,为:,Td=1/2400bps=0.417ms,8,9.3,串行口,同步通信,同步通信是以一种连续串行传送数据的通信方式,,一次通信只传送一帧信息,。,这里的信息帧,与异步通信中的字符帧不同,,通常含有若干个数据字符,如下图所示。,分为,单同步信息帧结构和双同步信息帧结构,。它们都是由同步字符、数据字符和校验字符三部分组成,9,9.3,串行口,同步字符,:,位于帧结构的开头,用于确认数据字符的开始。由于接收端不断对传输线采样,并把采样到的字符与双方约定的同步字符比较,只有比较成功后才会把后面接收到的字符数据加以存储。,数据字符,:,在同步字符之后,个数不受限制,由所传送的数据块长度决定。,校验字符,CRC:,位于帧结构末尾,有,12,个,用于接收端对接收到的数据字符的正确性校验。,关于同步字符:,在单同步信息帧结构中,常采用,ASCII,码中规定的,SYN,(即,16H,),在双同步信息帧结构中,一般采用国际通用标准代码,EB90H,。除了可以采用统一的标准格式外,还可以由用户约定。,10,9.3,串行口,在串行通信中,数据是在两个不同的站之间传送的,。按照数据传送的方向,串行通信可分为,3,种制式:,单工,半双工,全双工,8051,的串行口采用全双工制式,11,串行通信中的数据传送方式,12,串行口内部结构示意简图,13,7.1,与串行口有关的特殊功能寄存器,(,1,)数据缓冲器,SBUF,(,99H,),8051,单片机通过引脚,RXD,(,P3.0,,串行数据接收端)和引脚,TXD,(,P3.1,,串行数据发送端)与外界通讯。,SBUF,是串行口缓冲寄存器,在物理上,它对应着两个独立的寄存器,一个发送寄存器,一个接收寄存器。,它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被,CPU,读出数据,一个只能被,CPU,写入数据,MOV SBUF,A,;发送,MOV A,SBUF,;读入,14,7.1,与串行口有关的特殊功能寄存器,(,2,)串行口控制寄存器,SCON,(,98H,),它用于定义串行口的工作方式及实施接收和发送控制,D7,D6,D5,D4,D3,D2,D1,D0,SM0,SM1,SM2,REN,TB8,RB8,TI,RI,SM0,、,SM1,:串行口工作方式选择位,15,串行口控制寄存器,SCON,16,7.1,与串行口有关的特殊功能寄存器,SM2,:,多机通讯控制位(主要用于方式,2,和,3,)。在方式,0,时,,SM2,一定要等于,0,。在方式,1,中,当(,SM2,),=1,则只有接收到有效停止位时,,RI,才置,1,。在方式,2,或方式,3,中,当(,SM2,),=1,且接收到的第九位数据,RB8=0,时,,RI,才置,1,。,REN,:,接收允许控制位。由软件置位以允许接收,又由软件清,0,来禁止接收。,REN=1,允许接收;,REN,0,禁止接收。,TB8:,是要发送数据的第,9,位。在方式,2,或方式,3,中,要发送的第,9,位数据,根据需要由软件置,1,或清,0,。例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。,RB8,:,接收到的数据的第,9,位。在方式,0,中不使用,RB8,。在方式,1,中,若(,SM2,),=0,,,RB8,为接收到的停止位。在方式,2,或方式,3,中,,RB8,为接收到的第,9,位数据。,17,7.1,与串行口有关的特殊功能寄存器,TI,:,发送中断标志。在方式,0,中,第,8,位发送结束时,由硬件置位。在其它方式的发送停止位前,由硬件置位。,TI,置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。,TI,必须用软件清,0,。,RI,:,接收中断标志位。在方式,0,,当接收完第,8,位数据后,由硬件置位。在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于,SM2,的说明)。,RI,置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。,RI,也必须用软件清,0,。,18,7.1,与串行口有关的特殊功能寄存器,(3),电源控制寄存器,PCON(87H),特殊功能寄存器,PCON,中,只有一位(最高位),SMOD,与串行口的工作有关,该位是串行口波特率系数的控制位,:SMOD=1,时,波特率加倍,否则不加倍。,不可位寻址,因此初始化时需要字节传送。,19,7.2,串行口的工作方式,方式,0,移位寄存器输入,/,输出方式,方式,1,波特率可变的,10,位,UART,方式,方式,2,固定波特率的,11,位,UART,方式,方式,3,波特率可变的,11,位,UART,方式,20,方式,0:,移位寄存器输入,/,输出方式,(,同步,),可外接移位寄存器以扩展,I/O,口,也可以外接同步输入,/,输出设备。,8,位,串行数据是从,RXD,输入或输出,,TXD,用来输出同步脉冲。,输出串行数据从,RXD,引脚输出,,TXD,引脚输出移位脉冲。,CPU,将数据写入发送寄存器时,立即启动发送,将,8,位数据以,fos/12,的固定波特率从,RXD,输出,低位在前,高位在后。发送完一帧数据后,发送中断标志,TI,由硬件置位。,输入串行数据从,RXD,引脚输入,先置位允许接收控制位,REN,。此时,,RXD,为串行数据输入端,,TXD,仍为同步脉冲移位输出端。当(,RI,),=0,和(,REN,),=1,同时满足时,开始接收。当接收到第,8,位数据时,将数据移入接收寄存器,并由硬件置位,RI,。,7.2,串行口的工作方式,21,7.2,串行口的工作方式,(2),方式,1:,波特率可变的,10,位,UART,方式,发送或接收一帧信息,包括,1,个起始位,0,,,8,个数据位和,1,个停止位,1,。,输出:当,CPU,执行一条指令将数据写入发送缓冲,SBUF,时,就启动发送。串行数据从,TXD,引脚输出,发送完一帧数据后,就由硬件置位,TI,。,输入:在(,REN,),=1,时,串行口采样,RXD,引脚,当采样到,1,至,0,的跳变时,确认是开始位,0,,就开始接收一帧数据。只有当(,RI,),=0,且停止位为,1,或者(,SM2,),=0,时,停止位才进入,RB8,,,8,位数据才能进入接收寄存器,并由硬件置位中断标志,RI,;否则信息丢失。,22,7.2,串行口的工作方式,(3),方式,2:,固定波特率的,11,位,UART,方式,它比方式,1,增加了一位可程控为,1,或,0,的第,9,位数据。,输出,:,发送的串行数据由,TXD,端输出一帧信息为,11,位,附加的第,9,位来自,SCON,寄存器的,TB8,位,用软件置位或复位。它可作为多机通讯中地址,/,数据信息的标志位,也可以作为数据的奇偶校验位。当,CPU,执行一条数据写入,SUBF,的指令时,就启动发送器发送。发送一帧信息后,置位中断标志,TI,。,输入,:,在(,REN,),=1,时,串行口采样,RXD,引脚,当采样到,1,至,0,的跳变时,确认是开始位,0,,就开始接收一帧数据。在接收到附加的第,9,位数据后,当(,RI,),=0,或者(,SM2,),=0,时,第,9,位数据才进入,RB8,,,8,位数据才能进入接收寄存器,并由硬件置位中断标志,RI,;否则信息丢失。且不置位,RI,。再过一位时间后,不管上述条件时否满足,接收电路即行复位,并重新检测,RXD,上从,1,到,0,的跳变。,23,7.2,串行口的工作方式,(4),方式,3:,波特率可变的,11,位,UART,方式,除波特率外,其余与方式,2,相同。,24,7.3,串行口初始化,(,1,)波特率选择,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在,8051,串行口的四种工作方式中,方式,0,和,2,的波特率是固定的,而方式,1,和,3,的波特率是可变的,由定时器,T1,的溢出率控制。,方式,0,:,固定波特率,fosc/12,方式,2,:,方式,2,的波特率由,PCON,中的选择位,SMOD,来决定,可由下式表示:,固定波特率,=(,2,SMOD,/64)fosc,当,SMOD=1,时,波特率为,1/32fosc,,,当,SMOD=0,时,波特率为,1/64fosc,25,7.3,串行口初始化,方式,1,和方式,3,:,定时器,T1,作为波特率发生器,,方式,1,、,3,的的波特率,其公式如下:,波特率,=(,2,SMOD,/32),定时器,T1,的溢出率。,定时器采用模式,1,时:,(,2,SMOD,/32)(focs/12)/(,2,16,-,初值),式中,T1,计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,,T1,计数率为,fosc/12;,当工作于计数器状态时,,T1,计数率为外部输入频率,此频率应小于,fosc/24,。产生溢出所需周期与定时器,T1,的工作方式、,T1,的预置值有关。,定时器,T1,工作于方式,0,:溢出所需周期数,=,8192-x,定时器,T1,工作于方式,1,:溢出所需周期数,=,65536-x,定时器,T1,工作于方式,2,:溢出所需周期数,=,256-x,因为方式,2,为自动重装入初值的,8,位定时器,/,计数器模式,所以用它来做波特率发生器最恰当。当时钟频率选用,11.0592MHZ,时,最易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理,26,7.3,串行口初始化,初值计算举例:,89C51,单片机时钟振荡频率为,11.0592MHz,,选定定,时器,T1,工作模式,2,作为波特率发生器,波特率为,2400b/s,,设,SMOD=0,,求初值。,解:,2400,(1/32)(11.05921000000/12)/(256-x),X=244=F4H,27,7.3,串行口初始化,(,2,)初始化步骤,在使用串行口之前,应对其进行编程初始化,主要是设置产生波特率的定时器,1,、串行口控制和中断控制。具体步骤如下:,28,7.4,串行通信应用,除了前面的初始化,还要,编写发送子程序和接收子,程序,。,例,1,:,直接将,8031,的发送端,TXD,与接收端相连接,并采用方式,3,进行串行数据传送,共发送,16,个数据,00,0F,,接收端接收数据置于,40,4FH,单元内。,29,7.4,串行通信应用,汇编程序:,30,9.3.4,串行通信应用,例,3,:点对点通信,主方:发一个,收一个,从方:收一个,发一个,设置,1200,波特,串行口方式,1,,,fosc,=11.0592MHz,31,9.3.4,串行通信应用,SLAVE:MOVTMOD,#20H;T/C1,方式,2,MOVTH1,#0E8H;1200,波特初值,MOVTL1,#0E8H,SETBTR1,MOVPCON,#0;,不加倍,MOVSCON,#50H;,方式,1,,允许接收,SLP:JNBRI,$;,判接收到否,CLR RI,MOV A,,,SBUF ;,取回,MOV SBUF,A ;,发送,JNB TI,$;,判发送完否,CLR TI,SJMPSLP,32,9.3.4,串行通信应用,MASTER,:,MOVTMOD,#20H,MOV TH1,#0E8H,MOV TL1,#0E8H,SETBTR1,MOVPCON,#0,MOV SCON,#50H,MOV A,#DATA,MOV SBUF,A,JNB TI,$;,发送出去,CLR TI,JNB RI,$,CLR RI,MOVA,SBUF,SJMP$,33,例,7-4,:,89C51,串行口按双工方式收发,ASCII,字符,最高位用来作奇偶校验位,采用可校验方式,要求传送的波特率为,1200b/s,。编写有关的通信程序。,解:,7,位,ASCII,码加,1,位奇校验共,8,位数据,故可采用串行口方式,1,。,89C51,单片机的奇偶校验位,P,是当累加器,A,中,1,的数目为奇数时,,P=1,。如果直接把,P,的值放入,ASCII,码的最高位,恰好成了奇偶校验,与要求不符。因此,要把,P,的值取反以后放入,ASCII,码最高位,才是要求的奇校验。,34,双工通信要求收、发能同时进行。实际上,收、发操作主要是在串行接口进行,,CPU,只是把数据从接收缓冲器读出和把数据写入发送缓冲器。数据传送用中断方式进行,响应中断以后,通过检测是,RI,置位还是,TI,置位来决定,CPU,是进行发送操作还是接收操作。发送和接收都通过调用子程序来完成,设发送数据区的首地址为,20H,,接收数据区的首地址为,40H,,,fosc,为,6MHz,,通过查波特率初值(,表,7-2,)可知定时器的初装值为,F3H,。定时器,T1,采用工作模式,2,,可以避免计数溢出后用软件重装定时初值的工作。,35,程序清单:,主程序,MOV TMOD,#20H ;,定时器,1,设为模式,2,MOV TL1,#0F3H ;,定时器初值,MOV TH1,#0F3H ;8,位重装值,SETB TR1 ;,启动定时器,1,MOV SCON,#50H ;,设置为方式,1,,,;,REN=1,MOV R0,#20H ;,发送数据区首址,MOV R1,#40H ;,接收数据取首址,ACALL SOUT ;,先输出一个字符,SETB ES,SETB EA,SJMP$;,等待中断,中断服务,ORG 0023H ;,串行口中断入口,AJMP SBR1 ;,转至中断服务程序,ORG 0100H,SBR1:,JNB RI,SEND ;TI=1,为发送中断,ACALL SIN ;RI=1,为接收中断,SJMP NEXT ;,转至统一的出口,SEND:,ACALL SOUT ;,调用发送子程序,NEXT:,RETI ;,中断返回,36,发送子程序,SOUT:CLR TI,MOV A,R0 ;,取发送数据到,A,MOV C,P ;,奇偶标识赋予,C,CPL C ;,奇校验,INC R0 ;,修改发送数据指针,MOV SBUF,A ;,发送,ASCII,码,RET ;,返回,接收子程序,SIN:CLR RI,MOV A,SBUF ;,读出接收缓冲区内容,MOV C,P ;,取出校验位,CPL C ;,奇校验,ANL A,#7FH ;,删去校验位,MOV R1,A ;,读入接收缓冲区,INC RI ;,修改接收数据指针,RET ;,返回,37,例,7-5,:采用查询方式由串行口发送带奇偶校验位的数据块。,解:由内部,RAM,单元,20H-3FH,取出,ASCII,码数据,在最高位上加奇偶校验位后由串行口发出。采用,8,位异步通信方式,波特率为,1200b/s,,,fosc,=11.059MHz,。,由要求可知,应把串行口设置为方式,1,,采用定时器,1,模式,2,作为波特率发生器,预置值(,TH1,),=0E8H,。,38,程序清单:,主程序;,MOV TMOD,#20H ;,设置定时器,1,为模式,2,MOV TL1,#0E8H ;,初值,波特率为,1200b/s,MOV TH1,#0E8H,SETB TR1 ;,启动,T1,运行,MOV SCON,#01000000B ;,设置串行口为方式,1,MOV R0,#20H,MOV R7,#32 ;,数据块长度,LOOP:,MOV A,R0,ACALL SP-OUT,JNB P,ERROR ;,传输出错处理,由,SP-OUT,中“,CPL C”,结果决定,INC R0,DJNZ R7,LOOP,39,串行口发送子程序(奇校验);,SP-OUT:MOV C,PSW.0 ;,设置奇校验位,校验位,P=1,为奇校验,CPL C ;,奇校验(无此指令位偶校验),MOV ACC.7,C ;ACC.7,补,0,或,1,MOV SBUF,A ;,启动串行口发送过程,CLR TI ;,清,TI,标志,允许在发送,RET,ERROR:,(略),40,例,7-6,:由串行口接收带奇偶校验位的数据块。,解:采用查询方式,本例与上例相呼应,接收器把接收到的,32B,数据存放在,20H-30H,单元内,波特率同上,若奇偶校验出错则置进位位为,1,。,程序清单:,41,主程序;,MOV SCON,#01010000B ;,设串口方式,1,,允许接收,MOV TMOD,#20H ;,设置定时器,T1,为模式,2,MOV TL1,#0E8H ;,初值,波特率为,1200b/s,MOV TH1,#0E8H,SETB TR1 ;,启动,T1,运行,MOV R0 ,#20H,MOV R7 ,#32 ;,数据块长度,LOOP:,ACALL SP-IN ;,调接收一帧子程序,JC ERROR ;,由,SP-IN,中“,CPL C”,结果决定,MOV R0,A ;,存放接收的数据,INC R0,DJNZ R7,LOOP,42,接收一帧子程序;,SP-IN:JNB RI,$;RI,由硬件置位,CLR RI ;,软件清除,RI,MOV A,SBUF,MOV C,P ;,检查奇校验位,CPL C ;,置,C,为主程序“,JC ERROR”,用,ANL A,#7FH ;,去掉奇校验位,RET,ERROR:,(略),43,
展开阅读全文