我们平时使用的电子设备,比如计算机,手机,电视机等这些大多数电子产品都不是由单一控制器芯片构成。它们内部除了MCU,CPU,GPU等控制芯片,还会包含众多的附属芯片,比如:RAM,ROM,信号处理芯片,传感器芯片,电源管理芯片等等。这么多的芯片,它们之间是怎么配合的呢?这就涉及到芯片之间的通信知识了。通信是单片机应用中的重要一环,也是非常复杂的一部分,但是一般情况下我们掌握一些常见的通信方式后一些复杂的通信方式就可以类推很快就能掌握了,所以不要被吓到了。
通信方式包含的种类很多,并且在我们日常生活随处可见,按通信介质分类有有线通信也就有无线通信,按数据传输方向分为单工通信,半双工通信,全双工通信,按数据传输方式分为串行通信和并行通信,串口通信又分为同步通信和异步通信,至于通信协议那就更加丰富多样了。比如我们可以通过手机上网就是因为手机可以接收到运营商基站或WIFI等设备发出的无线信号。我们手机通过数据线连接电脑拷贝文件,照片等就属于有线通信,并且这种通信方式是串行通信方式,而计算机CPU与内存卡之间的连接包含并行通信。通过我们日常用生活中的这些应用我们大概就能知道,一般情况下有线通信比较稳定,而无线通信比较方便;并行通信优势在于近距离高速通信,串行通信在于相对成本低。
说明了以上知识之后,现在我来介绍51单片机的通信内容待会你可能就会比较好理解它了。当然51单片机也可以进行并行通信和串行通信,我们这一节内容主要讲解它的串行通信,并行通信后面的内容进行讲解。以下两图就是这它的两种通信方式的基本示意图:
在并行通信中,有多个数据位同时在两个设备间传输,发送方将这些数据位通过对应的数据线传输给接收方,接收方接收到这些数据后不需要任何处理就可以直接使用。并行通信的特点是传送速度快、效率高、处理简单,但通信成本高,只适用于短距离传送数据。并行通信使用8位数据线同时传送数据,一字节(8位)的数据,可以一次性地传输完毕。
在串行通信中,数据一位一位地按顺序传送。发送方首先将数据由并行转为串行后,逐位传送到接收方,接收方将接收到的串行数据再次恢复成并行数据。串行通信的特点是通信速度慢,但线路简单、成本低,非常适用于长距离的数据传送。串行通信仅使用一位数据线进行数据传送,一字节(8位)的数据,要分8次才能传输完毕。由此可见,串行通信在速度上较并行通信会慢很多。
51系列单片机内部集成有一个通用异步收发器(Universal Asynchronous Receiver Transmitter),简称UART或串行口。单片机通过串行通信接口,可以与其他芯片构成同步通信系统,也可以与PC或其他设备组建起异步通信系统,实现与外部设备的信息交换。本节内容我们将介绍的是51系列单片机串行通信接口的原理和使用方法。
51单片机串口通信原理
51系列单片机的通用异步收发器内部结构如上图所示,UART与单片机内部8位数据总线相连,SBUF是收发缓冲器,由接收缓冲器和发送缓冲器两部分构成,二者具有同一地址(99H),但他们之间是相互独立的,即发送缓冲器只能写入而不能读出数据,而接收缓冲器则只能读出而不能写入数据。实际使用时通过不同的读缓冲器和写缓冲器指令来区分对哪个缓冲器操作。所以51系列单片机的串行数据通信的启动方法很简单,只要将数据写入发送缓冲器就能启动数据的发送,而在接收数据时,只要读取保存在接收缓冲器中的内容即可。单片机会按照读或写的方式不同,自动分配要访问的目标寄存器是发送SBUF还是接收SBUF。
UART工作时,定时器用于产生通信需要的时钟,控制寄存器用于对串行口的工作状态进行相应的监控和设置。当数据写入发送SBUF后,数据在发送控制器的控制下,按位从TXD引脚移出;外部数据在接收控制器的控制下,从RXD引脚移入移位寄存器并对串行数据进行恢复,恢复后的数据保存至接收SBUF中供软件读取。
当接收SBUF中的数据没有被软件读取时,移位寄存器还可以暂时接收并保存下一个新数据,从而避免发生数据溢出,这种结构也是串行口特有的接收双缓冲结构。发送器则没有类似的数据缓冲结构,因为在发送数据时单片机是主动的,不存在数据过载的问题。
接下来
51单片机串口通信相关寄存器
51系列单片机的串行接口有两个特殊功能寄存器SCON和PCON。其中,SCON用于存放串行接口的控制和状态信息,PCON用于改变串行接口的波特率。另外,51系列单片机的串行口共有4种工作模式,对应有3种波特率。其中,模式0和模式2具有固定的波特率;而模式1和模式3的波特率是可变的,一般由定时器的溢出率来决定。当然除了以两个基本的寄存器,还会用到其他几个寄存器控制,下面分别介绍一下这些寄存器。
电源控制寄存器PCON:
电源控制寄存器PCON的高2位作为串行口通信的控制使用,
SMOD:波特率选择位,当串行口工作在方式1、2、3时,如果SMOD = 0,波特率正常。如果SMOD = 1,则波特率加倍。
SMOD0:(这位是STC单片机设定的,普通51单片机没有这位,需参考数据手册)帧错误检测位,当SMOD0 = 0时,SCON寄存器中的SM0/FE位用于SM0功能,当SMOD0 = 1时,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能。
串行口控制寄存器SCON:
SM0/FE:当PCON寄存器中的SMOD0 = 1时,该位用于帧错误检测,当检测到无效停止位时,由硬件将该位置位,该位必须由软件清零(PCON没有SMOD0位普通51单片机,则没有FE功能,默认就是SM0)。当SMOD0 = 0时,该位和SM1一起用来设置串行口通信的方式。
SM1:SM1和SM0一起用来设置串行口通信的方式,配置结果如下:
至于这几种模式下的波特率的计算方法我们在具体应用部分再做介绍。
SM2:允许方式2或方式3多机通信位。如果SM2 = 1,REN = 1,则从机只有接收到RB8位为1时才将中断请求位RI置位,并向系统申请中断。如果SM2 = 0,则无论RB8收到什么数据都会将RI位置位,请求中断。通过设置SM2的值,可以区分主机和从机,实现多机通信。在方式0时,SM2必须为0,在方式1时,只有收到有效停止位,就将RI置位。
REN:允许串行口接收位。当REN = 1时,允许串行口接收数据;当REN = 0时,禁止串行口接收数据。
TB8:在方式2和方式3,TB8作为发送数据的第9位,其值由软件修改。
RB8:在方式2和方式3,RB8保存接收到的第9位数据。在方式0,不用RB8。在方式1,如果SM2 = 0,则RB8是接收到的停止位。
TI:发送完成中断标志位。当1帧数据发送完成时,由硬件将该位置位,请求中断,响应中断后,用软件清零。
RI:接收完成标志位。当接收完1帧数据时,由硬件将该位置位,请求中断,响应中断后,用软件清零。
数据缓存寄存器SBUF:
51单片机的SBUF寄存器在单片机内部的地址是0x99H。但应该要注意的是,上一节中我们说过发送和接收是独立的,所以SBUF实际上是包含寄存器,分别是数据接收寄存器和数据发送寄存器。当我们对SBUF进行读操作时,它就是接收寄存器;当我们对SBUF进行写操作时,它就是发送寄存器,他们之间的数据互不干扰。
当单片机从串行口接收数据时,并不是直接将数据保存到接收寄存器SBUF,而是先接收到一个输入移位寄存中当中,当一帧数据接受完成后,再从输入移位寄存器装入SBUF。这时,单片机可以开始接收下一帧数据,同时,用户可以取走SBUF接收寄存器中的数据。
另外需要特别提出的是,当单片机接收完一帧数据之后,用户应该及时取走SBUF缓冲区中的数据。因为串行口接收数据往往是一个连续的过程,如果没有及时取出数据,那么下一帧接收到的数据就会覆盖当前SBUF中的内容,这样就会造成数据丢失,实际使用时需要特别注意!
中断允许寄存器IE:
ES位用来控制单片机串行口的使能。当ES = 0时,不允许串口中断,当ES = 1时,则允许串口产生中断。
注意,串口的中断同时还受到单片机的总中断控制位EA的控制。当EA=0时,单片机屏蔽所有的中断请求,只有当EA=1,且ES=1时才允许产生串口中断。
以上就是51单片机串口应用时需要使用的寄存器详细信息,使用时一定要对照单片机数据手册看看是否与这里的信息相符,信息以你的单片机为准!
51单片机串口通信模式
上面内容中我们提到了51单片机有4种串口通信模式,现在什么一起来看看他们具体的内容。
模式0:8位同步移位寄存器模式。
方式0时,UART作为一个8位的移位寄存器使用,波特率为Fosc /12。数据由RXD从低位开始收发,TXD用来发送同步移位脉冲。因此,方式0不支持全双工。这种方式可用来和某些具有8位串行口的EEPROM器件通信。
当向SBUF写入字节时,开始发送数据。数据发送完毕时,TI位置位。置位REN时,将开始接收数据;接收完8位数据时,RI位将置位。时序示意图如下:
模式0输出
模式0输入
模式1:波特率可变的8位数据异步收发。
方式1是10位数据的异步通信口。TXD为数据发送引脚,RXD为数据接收引脚。其中,1位起始位,8位数据位,1位停止位。时序示意图如下:
模式1数据串格式
模式1输出
模式1输入
模式2:波特率固定的9位数据异步收发。
模式3:波特率可变的9位数据异步收发。
模式2和模式3都是9位异步收发模式,不同点是模式3可以设置波特率,所以可以放在以前说明。
方式2和方式3时起始位1位,数据9位(含1位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器的溢出率决定。
发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。
第一次移位时,停止位“1”移入输出移位寄存器的第9位上,以后每次移位左边都移入0。当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,控制电路进行最后一次移位并置TI=1,向CPU请求中断。示意图如下:
接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失且不置位RI,继续搜索RXD引脚的负跳变。示意图如下:
计算波特率:
数据传送的速率称为波特率(Band Rate),即每秒钟传送二进制代码的位数,也称为比特数,单位为bit/s(bit per second),即位/秒。波特率是串行通信中的一个重要性能指标,用于表示数据传输的速度。波特率越高,数据传输速度越快。波特率和字符实际的传输速率不同,字符的实际传输速率是指每秒钟内所传字符帧的帧数,它与字符帧格式有关。
要保证串行口通信双方能够正确收发数据,就要让它们使用同样的波特率来传输。
模式0和模式2的波特率是固定的,由系统时钟频率fosc 决定。在模式0下,波特率为fosc / 12。
在模式2下,波特率还与PCON寄存器中的SMOD位有关,其计算波特率的表达式为:波特率 = (fosc × 2SMOD ) / 64。
模式1和模式3的波特率是可变的,由定时器1的溢出率决定,波特率 = (溢出率 × 2SMOD ) / 32。定时器1作为波特率发生器,需要以方式2,8位自动重装模式运行,它的溢出率 = fosc / 12 / (256 – TH1)。
以我们常用的9600bps波特率,11.0592MHz晶振为例,计算TH1的值。
定时器每计256 – TH1个数溢出一次,计一个数的时间是12T,也就是12 / fosc ,那么定时器溢出一次的时间是(256 – TH1)×(12 / fosc ),溢出率是其倒数fosc / (12 × (256 – TH))。
把以上结果带入波特率计算公式:
9600 = ( (fosc / (12 × (256 – TH1)) ) × 20 ) / 32,得到TH1 = 253,即0XFD。
其实在51单片机的应用中,常用的晶振频率为12 MHz和11.0592 MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数是可以确定的。串行口工作之前应对串口通信进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
① 确定T1的工作方式(编程TMOD寄存器)。
② 计算T1的初值,装载TH1、TL1。
③ 启动T1(编程TCON中的TR1位)。
④ 确定串行口控制(编程SCON寄存器)。
串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。常用串口波特率与定时初值参考下图:
评论
查看更多