6.2MCS-51串行口6.2.0串行通信基本知识串行通信是指数据一位一位地按顺序传送的通信方式;串行通信的突出优点是只需一根传输线,可大大降低硬件成本,特别适合远距离通信。串行通信的缺点是传输速度较低;串行通信每秒钟内能发送或接收的二进制位数称为波特率。若发送一位时间为t,则波特率为1/t。MCS-51单片机内部有一个全双工串行接口只能接收或只能发送的称为单工串行口;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称之为全双工串行口。6.2.1串行通信的两种基本方式1.异步传送方式在异步传送方式中,字符的发送是随机进行的。因此,对于接收方来说就有一个如何判断有字符来,何时是一个新的字符开始的问题。在异步通信时,对传送字符必须规定一定的格式。图6-10异步通信字符格式1/01/01/01/01/01/01/01/01/01/0101/0101/01/0起始位奇偶位停止位奇偶位停止位起始位8位数据第n个字符第n+1个字符1/0数据一帧数据LSBMSB一个字符在异步传送中又称为一帧数据,一帧数据由四部分组成:起始位、数据位、奇偶校验位和停止位。起始位:为逻辑“0”信号,占用一位,用来通知接收设备,一个新的字符开始了。数据位:紧跟着起始位的是5~8位数据,数据的最低位LSB。异步传送规定低位在前,高位在后。奇偶位:紧跟在数据最高位MSB之后,占用一位,奇偶校验时,根据协议置“1”或“0”。停止位:为逻辑“1”信号,可占用一位,也可占用两位。接收端收到停止位时,表示一帧数据结束。同时为接收下一帧数据作好准备,只要再收到一个逻辑“0”就是一个新字符的开始。在同步通信时,在数据块开始就有1~2个同步字符SYNC来指示,一旦检测到同步字符,下面就是按顺序传送的数据块。由于数据传送时无起始位和停止位等附加位,故传送速度较高。同步传送的波特率与时钟频率是一致的。但硬件上要插入同步字符或相应的检测手段,这种方式对硬件要求较高。2.同步传送方式(略)6.2.2MCS-51串行口结构1.数据缓冲器SBUF串行口中有两个物理空间上各自独立的发送缓冲器和接收缓冲器。两个缓冲器公用一个地址99H,发送缓冲器只写不读,接收缓冲器只读不写。接收缓冲器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时响应接收器中断,没有把上一帧数据读走而产生两帧数据重叠问题。2.串行口控制寄存器SCON位地址98H~9FH。格式如下:SCON(98H)SM0SM1SM2RENTB8RB8TIRID0D7SM0、SM1:串行口方式选择位SM2:允许方式2和方式3多机通信控制位REN:允许接收控制位TB8:在方式2和方式3中要发送的第9位数据RB8:在方式2和方式3中是接收到的第9位数据TI:发送中断标志RI:接收中断标志系统复位时,SCON=00000000BSM0、SM1:串行口方式选择位SM0SM1方式功能说明000移位寄存器方式(用于I/O扩展)0118位UART,波特率可变(T1溢出率/n)1029位UART,波特率为fosc/64或fosc/321139位UART,波特率可变(T1溢出/n)SM2:允许方式2和方式3多机通信控制位。在方式2或方式3中:如SM2=1,则接收到的第9位数据(RB8)为“1”时,置位接收中断标志RI(RI=1);如SM2=0,则RB8无论为何值,均置位RI。在方式1时,如SM2=1,则只有在接收到有效停止位时才置位RI,若没有接收到有效停止位,则RI清“0”。在方式0中,SM2应为“0”。REN:允许接收控制位。由软件置“1”时,允许接收,置“0”时,禁止接收。TB8:在方式2和方式3中要发送的第9位数据。需要时由软件置位或复位。RB8:在方式2和方式3中是接收到的第9位数据。在方式1时,如SM2=0,RB8是接收到的停止位。在方式0中,不使用RB8。TI:发送中断标志。在方式0串行发送第8位结束时由硬件置“1”,或在其它方式中串行发送停止位的开始时置“1”。必须由软件清“0”。RI:接收中断标志。在方式0接收到第8位结束时由硬件置“1”,或其它方式接收到停止位的中间时置“1”。必须由软件清“0”。3.特殊功能寄存器PCON其字节地址97H,没有位寻址功能。与串行口有关的只有PCON的最高位。SMOD:波特率选择位。当SMOD=1时,波特率加倍。PCON(97H)SMODD0D7书上给出的地址87H是错误的,应当是97H系统复位时,PCON=0×××0000B6.2.3串行口工作方式1.方式0(移位寄存器方式)(0)概述:方式0为移位寄存器输入/输出方式,可外接移位寄存器扩展I/O口,也可接同步输入/输出设备。按方式0工作时,波特率是固定的,为fosc/12。无论是输入还是输出,数据的传送均通过引脚RXD(P3.0)端,移位同步脉冲由TXD(P3.1)输出。发送/接收一帧数据为8位二进制数,低位(LSB)在先,高位(MSB)在后。(1)方式0发送在方式0状态,当一个数据写入发送缓冲器SBUF(99H)时,串行口即将8位数据以振荡频率的十二分之一的波特率,将数据从RXD端串行移位输出;TXD端输出移位同步信号;8位数据发送完时,中断标志TI置“1”。(2)方式0接收当串行口定义为方式0并置“1”REN后,便启动串行口接收数据;RXD为数据输入端,TXD为同步移位信号输出端,当接收器接收满8位数据时,置“1”中断标志RI。数据输出移位脉冲RXD8051TXD1274LS1648345610111213D7~D0(a)移位寄存器输出数据输入移位脉冲RXD8051TXD974LS16512111213143456D7~D0(b)移位寄存器输入图6-12方式0扩展I/0口硬件逻辑图串入并出并入串出123456ABCD654321DCBATitleNumberRevisionSizeBDate:17-Apr-2005SheetofFile:D:\SCH-PCB\MCS51-N.ddbDrawnBy:A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U?74LS164补充:用74LS164扩展串行口74LS164是串行移位寄存器,常用于串、并转换。引脚说明:A、B(1、2)串行数据输入,通常并联在一起使用;CLK(8)时钟脉冲引脚,时钟的上升沿移位锁存;MR(9)清0所有输出端;Q0~Q7锁存输出端;用74LS164通过串并转换扩展输出电路,具有节约端口、灵活方便的特点。1234ABCD4321DCBATitleNumberRevisionSizeADate:21-Oct-2007SheetofFile:D:\51tools\参考程序\TINY.ddbDrawnBy:A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U174LS164R1R2R3R4R5R6R7R8A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U274LS164R9R10R11R12R13R14R15R16A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U374LS164R17R18R19R20R21R22R23R24A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U474LS164R25R26R27R28R29R30R31R32A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U574LS164R33R34R35R36R37R38R39R40A1B2Q03Q14Q25Q36Q410Q511Q612Q713CLK8MR9U674LS164R41R42R43R44R45R46R47R48VCCVCCVCCVCCVCCVCCabhcdefgcomN1abhcdefgcomN2abhcdefgcomN3abhcdefgcomN4abhcdefgcomN5abhcdefgcomN6VCCP3.0P3.1补充示例:用74LS164扩展LED数码管显示电路[补充示例]显示子程序设计要求:显示的内容是0~F的16进制数;显示缓冲区在片内RAM从48H开始的连续6个存储单元;用标志位F0表示是否显示小数点:F0=1显示小数点F0=0不显示小数点;显示子程序,影响ACC、R0、4EH、4FH单元LEDD:MOV4EH,#6;初始化字循环计数器MOVR0,#48H;初始化显示缓冲区指针MOVDPTR,#DTAB;8段数码管的段码转换表的首地址LEDD1:MOVA,@R0;取1个显示码MOVCA,@A+DPTR;查表转换JNBF0,LEDD3;显示小数点吗?CLRACC.7;置小数点段LEDD3:MOV4FH,#08H;初始化位循环计数器LEDD2:RRCA;左移1位于C标志位MOVP3.0,C;C送串行口的数据引脚CLRP3.1;在CLK时钟脚SETBP3.1;送1个负脉冲DJNZ4FH,LEDD2;循环移位INCR0;显示缓冲区指针加1DJNZ4EH,LEDD1;显示下一个字RETDTAB:DB0C0H,0F9FH,0A4H,0B0H,99H,92H,82H,0F8H;0~7的段码DB80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH;8~F的段码MOVSCON,#0MOVSBUF,AJNBTI,$2.方式1串行口定义为方式1时,传送一帧数据为10位:其中1位起始位(0)、8位数据位(先低位后高位)、1位停止位(1)。方式1的波特率可变,波特率=2SMOD/32×(T1的溢出率)。(1)方式1发送CPU执行一条写入发送数据缓冲SBUF的指令(例如,MOVSBUF,A)数据字节写入SBUF后,便启动串行口发送器发送。方式1开始发送时,先把起始位(0)输出到TXD,一位时间后,数据在移位脉冲的作用下由TXD端输出,最后送出停止位(1),一个字节发送结束。当发送完数据后,中断标志TI置“1”。(2)方式1接收在REN置“1”后,就允许接收器接收。方式1接收时,数据从RXD端输入。接收器以波特率16倍的速率采样RXD端的电平。当采样到RXD引脚上“1”到“0”的跳变时启动接收器接收并复位内部的16分频计数器以便实现同步。计数器的16个状态把一位的时间分成16等份,在每位时间的第7、8和9计数状态,位检测器采样RXD的值,接收的值是3次采样中取至少二次相同的值(用3取2举手表决),以排除噪声干扰。若起始位接收到的值不是“0”,则起始位无效,复位接收电路。在检测到起始位有效时,则移入输入移位寄存器,开始接收本帧其余数据信息。当RI=0,同时接收到停止位为“1”(或SM2=0)时,停止位进入RB8,置“1”中断标志RI。若以上二个条件任一条件不满足,所有接收信息将丢失,因此中断标志RI必须在中断服务程序中由用户清“0”。通常串行口以方式1工作时,SM2置为“0”。3.方式2串行口定义为方式2时,串行口被定义为9位异步通信接口;传送一帧信息为11位,其中1位起始位、8位数据位、1位附加(可程控为“1”或“0”的)的第9位数据位、1位停止位。方式2的波特率是固定的,波特率为2SMOD/64×fosc。(1)方式2发送在方式2发送时,数据由TXD端输出。附加的第9位数据是SCON中的TB8,可由软件置位或清零,作多机通信中的地址、数据标志,也可作数据的奇偶校验位。CPU执行一条写入发送缓冲器指令(例如MOVSBUF,A),就启动发送器发送。发送完一帧信息,置“1”TI中断标志。(2)方式2接收REN被置“1”以后,接收器开始以波特率16倍的速率采样RXD电平,检测到RXD端由高到低的负跳变时,启动接收器接收,复位内部16分频计数器,以实现同步。当采样到RXD端从“1”到“0”的跳变,并确认起始位有效后,则开始接收本帧其余信息。接收完一帧信息后,在RI=0,SM2=0(或S