两设备进行全双工异步串行通讯时的连接关系全双工可以同时收发,互不干(TX发数据,RX收数据);串行是指在一条线上发送8位数据(另一设备在该线接收数据)共地的目的:什么是全双工异步串行通讯异步:接收方何时采样?通讯双方实现约定波特率(发送方每秒发多少位,即接收方隔多长时间采样1次),为了避免累计误差,每次通讯传输1个字节。发送方控制数据线,在空闲时保持高电平。开始一次通讯时发送方将数据线拉低,低电平保持时间1位,用该下降沿使双方保持同步。在起始位后传输8位数据,最后传输1位的停止位,停止位为高电平,使数据线回归空闲时的高电平。什么是全双工异步串行通讯为了增加传输距离,提高抗干扰能提,加快传输速率,引入电平转换。常用电平转换RS232,RS422,RS485(电平转换无智能)什么是全双工异步串行通讯串口0是一个具有帧错误检测、地址识别硬件并支持多处理器通信的增强型串口。串口0支持半双工同步通讯和全双工异步通讯。串口0有4种工作方式:方式0、1、2、3方式0是半双工同步方式,我们不介绍。方式1、2、3是全双工异步方式,我们介绍。串口0C8051F120要通过串口0发送一个字节时,需将待发送的数据写入“发送SBUF0寄存器”(是一个SFR),串口0硬件自动按下图时序将“发送SBUF0寄存器”中的数据通过串口发出,发送完成后硬件将TI0(是一个中断源,表示串口发送完一个字节)置1。发送数据当其他设备按串口时序发来一个字节时,数据是1个位1个位传来的(如下图),每来1个位,该位进入移位寄存器(用来缓存不完整的数据)最高位,当所有的8位到齐后C8051F120串口0的硬件检查该数据,如无误则将该字节写入“接收SBUF0寄存器”(是一个SFR),然后将RI0置1(是一个中断源,表示串口接收到一个字节),等待C8051F120的CPU读走该字节。接收数据接收数据由于具有二级接收缓存(移位寄存器&接收SBUF0),这就允许UART0在软件尚未从“接收SBUF0”读取第k个字节数据的情况下,开始接收第(k+1)个字节数据。由于只有二级缓存,如果第k个字节没从“接收SBUF0”读走,第k+1个字节的数据已经接收完了,此时第k+1个字节的数据从移位寄存器写入“接收SBUF0”(丢了1个字节数据)该情况发生后,一个“接收覆盖位”(SFR)被置1,用于指示新的接收数据已被锁存到接收缓冲器而前一个接收数据尚未被读取。解决办法:收到RI0,尽快去读“接收SBUF0”“发送SBUF0寄存器”、“接收SBUF0寄存器”在物理上是2个独立的特殊功能寄存器。其中:“发送SBUF0寄存器”C8051F120的CPU只能写不能读;“接收SBUF0寄存器”C8051F120的CPU只能读不能写。因此“发送SBUF0寄存器”、“接收SBUF0寄存器”的字节地址相同,合称SBUF0。读SBUF0时访问“接收SBUF0寄存器”,写SBUF0时访问“接收SBUF0寄存器”对UART0的控制是通过串行控制寄存器SCON0(SFR)实现的。UART0有两个中断源:TI0(SCON0.1),1个字节发送完成后置1RI0(SCON0.0),接收完1个字节后置1。中断方式:当CPU转向中断服务程序时硬件不清除TI0、RI0,进入串口中断服务子程序后,先分析时什么原因计入串口中断,然后用软件清除这些标志位,最后再作出不同的处理。UART0也可以工作在查询方式,此时占用CPU。比较复杂,不看图识字了UART0工作方式UART0提供4种工作方式,通过设置SCON0选择。这4种方式提供不同的波特率和通信协议见下表。方式3和方式1的区别9位数据方式2、3的唯一区别:波特率不同,因此只学方式1即可SCON0:UART0控制寄存器SCON0:UART0控制寄存器位5:SM20:多处理器通信使能位位4:REN0:接收允许0:UART0接收禁止1:UART0接收允许位3:TB80:第九发送位位2:RB80:第九接收位位1:TI0:发送中断标志位0:RI0:接收中断标志方式1:8位UART,可变波特率方式1是全双工异步方式,每传输1个字节共收发10位数据:一个起始位、8个数据位(LSB在先)和一个停止位。数据从TX0引脚发送,在RX0引脚接收。在接收时,8个数据位存入SBUF0,停止位进入RB80(见上页)。方式1发送数据如何启动方式1发送数据?向SBUF0写入一个字节,硬件就将该字节按时序发出。在发送结束时,TI0置1方式1接收数据REN0=0时,串口0不接收任何数据。在REN0=1后任何时间串口0都可以开始数据接收。收到的数据先进入到移位寄存器中缓存,收到停止位后如果满足下述2个条件则数据字节将被装入接收寄存器SBUF0,否则丢弃该数据(数据不写入SBUF0,如果再有新数据来到,则被覆盖)。①RI0为逻辑0;②如果SM20=1则停止位必须为1(如果SM20=0,停止位随意)。如果这3个条件都满足(REN,RI,SM2),则8位数据存入SBUF0,停止位存入RB80,RI0标志置1。如果这3个条件不都满足,则不装入SBU0F和RB80,RI0不置1。SM20=1时,串口硬件检查跟在8位数据后的那一位数据,这位如果是1且满足REN0=1,RI0=1则接收;这位如果是0则一定会丢弃该字节。SM20=0时,串口硬件不检查跟在8位数据后的那一位数据,只要满足满足REN0=1,RI0=1则接收SM20处理逻辑方式1的波特率方式1的波特率可以由定时器1,2,3,4产生。发送波特率和接收波特率可以独立设置。寄存器SSTA0(SFR)选择波特率由哪一个定时器产生。实际上定时器溢出事件=输入脉冲的若干分频。波特率=定时器溢出事件的若干分频。产生波特率时:定时器1工作在8位自动重装载方式。定时器2、3、4工作在自动重装载方式。SSTA0:UART0状态和时钟选择寄存器位4:SMOD0见下页方式1的波特率使用定时器1自动重载方式方式1波特率=(2^SMOD0/32)×定时器1溢出率当SMOD0=0时:方式1波特率=1/32×定时器1溢出率当SMOD0=1时:方式1波特率=1/16×定时器1溢出率定时器1溢出率=定时器1每秒溢出次数定时器1溢出率由定时器1的输入脉冲频率f和重载值(TH1)确定。定时器的溢出率用下式计算。定时器1溢出率=f/(256-TH1)方式1的波特率使用定时器2,3,4自动重载方式方式1波特率=(1/16)×定时器2、3或4溢出率假设定时器2、3或4输入脉冲频率位f,则定时器2、3或4溢出率=f/(65536-RCAPn)方式2:9位UART,固定波特率每个数据字节共使用11位:一个起始位、8个数据位(LSB在先)、一个可编程的第九位和一个停止位。在发送时,第9数据位就是TB80(SCON0.3)。第9位用来干什么?它可以被赋值为PSW中的奇偶标志P,或用于多处理器通信(后面讲)。在接收时,第9数据位进入RB80(SCON0.2),停止位被忽略。方式2发送先写TB80,在写SBUF0,其他同方式1。方式2接收接收过程除了以下一点外,其它同方式1。方式2、3中,紧跟着D7后面的不是停止位,是TB80。当SM20=0时,满足REN0=1&RI0=0时接收数据当SM20=1时,收到的D8(对方发来的TB8)是1,且REN0=1&RI0=0时接收数据,数据仅SBUF0,D8进RB8。方式2波特率方式2波特率同方式1,其它同方式2。SSTA0:UART0状态和时钟选择寄存器串口0是一个具有帧错误检测、地址识别硬件并支持多处理器通信的增强型串口。这3位只作标志位使用,不用于产生中断。串口多机通信串口通讯采用点对点拓扑结构,如图。通讯时只有2个设备参与,没有第三方存在。如果能让多个设备(大于2个)用串口通讯,就是所谓的串口多机通讯。多机通讯仅适用与串口方式2、方式3!!!串口多机通信①多机通讯时,只有一个主机,可以有多个从机。②主机的TX和所有从机的RX连接;主机的RX和从机的所有TX连接,因此主机和任一从机可以通讯,从机只能和主机通讯。串口多机通信③主机发送数据时,所有从机可以接收到,从机之间互不影响。串口多机通信④主机的RX和所有从机的TX连接,该线电平取决于从机的TX。为了防止冲突,此时所有从机的TX被配置位开漏输出(开漏时,输出0为低电平,输出1为高阻),外接上拉电阻。串口多机通信当所有从机输出0时,该线位低电平。当有的从机输出0,有的从机输出1时,由于输出1的从机为高阻状态,相当于和该线断开,不影响该线。此时该线为低电平。当所有从机输出0时,该线为低电平。为什么要开漏,外接上拉?串口多机通信由此可以看出,多机通讯主机接收数据时,从机之间相互影响。必须保证在任意时刻,最多有1个从机控制主机的RX线。这就意味着,在任一时刻,主机最多只能和1个从机通讯。串口多机通信多机通讯过程如下:A.系统启动后,所有从机处于不激活状态:不发送数据(软件控制),仅能接收数据。B.主机想和某个主机通讯,必须先激活它。此后该从机和主机通讯。当主机和该从机通讯完成后(例如激活后从机发送100个字节),从机自动转入不激活状态(从机软件控制)C.转入B地址识别硬件串口0是一个具有帧错误检测、地址识别硬件并支持多处理器通信的增强型串口。地址识别硬件完成如下功能:设置本机串口的地址;对收到的数据进行识别,和本机地址匹配才接收数据。与地址识别硬件相关的SFR有两个:UART0从地址设置寄存器SADDR0UART0从地址掩码寄存器SADEN0地址识别硬件A.如果SM2=0,则必须保证①REN=1&②RI=0才接收数据,否则丢弃该数据;B.如果SM2=1,则必须保证①REN=1&②RI=0&③接收到的D8=1&④接收到的D0-D7必须和自己的地址匹配,才接收数据,否则丢弃数据;串口接收数据的条件地址设置举例地址由SADDR0和SADEN0设置。SADEN0中某位为1,则在SADDR0中对应位作为串口地址;SADEN0中某位为0,则在SADDR0中对应位无关。如何理解x主机1有16个不同的地址(多个地址分配给1个从机)也可以将一个地址分配给多个主机,这样就允许同时向多个从机进行“广播”式发送。广播地址是寄存器SADDR0和SADEN0的逻辑或,结果为‘0’的那些位被视为“无关”位。广播寻址从机1接收时,如果收到的D0-D7=xxxx0101或xx111111都认为地址匹配成功。广播寻址广播寻址注意观察:或结果为1时广播地址位1,或结果位0时广播地址位x,既然位x,那x=1也是广播地址。所以无论个从机如何设置,0xFF必时所有从机的广播地址。多机通讯流程A.所有从机初始化为SM2=1,REN=1。B.当主机想要向一个或多个从机发送数据数据时,它先发送一个用于选择目标从机的地址字节,且TB8=1。所有从机能满足REN=1,RI=0,收到的第9个位为1,只有本机地址=D0---D7的才满足条件④,才会接收这个字节。C.收到这个字节后,该从机将SM2改为0。D.主机和该从机通讯,收发数据,TB8=0。其他从机不满足条件③,不会接收数据。E.当主机和该从机通讯结束后,该从机将SM2改为1F.回到B表12.2.产生标准波特率的振荡器频率*假定SMOD=1且TIM=1。**括号里的数是实际波特率。12.4UART1串口1和串口0类似,有空可自学。在C8051F120的片内数据存储器20H—3FH单元中共有32个字节的数据,要求使用串口0方式1发送出去,传输的波特率为9600,SYSCLK=11.0592MHz。分别用查询和中断方式实现发送和接收程序。例1:[(2^SMOD)/32]*定时器T1的溢出率=9600定时器T1的溢出率=9600*32=307200定时器T1的溢出时间=1/307200(1/(11.0592M/12))*(256-x)=1/307200X=253T1工作在方式2,作为波特率发生器,T1M=0(主频/12),SMOD=0.查询方式发送程序:注意:没写端口初始化,时钟初始化TMODTCONCKCONT1M=0,使用预分频时钟(见前框