- C51单片机高效入门(第2版)
- 徐玮
- 6565字
- 2021-04-01 23:03:19
2.7 串行通信
单片机除了需要控制外围器件完成特定的功能外,在很多应用中还要完成单片机和单片机之间、单片机和外围器件之间,以及单片机和计算机之间的数据交换和指令的传输,称为单片机的通信。单片机的通信方式可以分为并行通信和串行通信。并行方式传送1个字节的数据至少需要8条数据线。一般来讲MCS-51单片机与打印机等外围设备连接时,除8条数据线外,还要状态、应答等控制线,当传送距离过远时电线要求过多,成本会增加很多。单片机的串行通信方法较为多样,传统的串行通信方式是通过单片机自带的串行口进行RS232方式的通信。串行通信是以一位数据线传送数据的位信号,即使加上几条通信联络控制线,也比并行通信用线少。因此,串行通信适合远距离数据传送,如大型主机与其远程终端之间,处于两地的计算机之间,采用串行通信就非常经济。
2.7.1 串行通信概述
1.并行通信与串行通信
所谓通信就是指计算机与计算机或外围设备之间的数据传送。通信的数据是由数字“0”和“1”构成的具有一定规则并反映确定信息的一个数据或一批数据。这种数据传送有两种基本方式,即并行通信和串行通信。
并行通信比较简单,根据CPU字长和总线特点以及外围设备数据口的宽度,可分为不同位数的并行通信,如16位并行通信、32位并行通信等。并行通信的特点是数据的每位被同时传输出去或接收进来,传输速度较快。与并行通信不同,串行通信其数据传输是逐位传输的,因而相同条件下,比并行通信传输速度慢。
虽然串行通信速度比并行通信慢,但采用串行通信,不管发送或接收的数据是多少,最多只需要两根线,一根用于发送,另一根用于接收。根据串行通信的不同操作方式,还可以将发送接收线合二为一,成为发送/接收复用线(如半双工)。即使在实际应用中可能还要加一些信号线,但在多字节数据通信中,串行通信与并行通信相比,其工程造价要低得多。因此,串行通信已被越来越广泛地采用。
2.异步通信和同步通信
1)异步通信:异步通信传输的数据格式一般由1个起始位、7个或8个数据位、1~2个停止位和一个校验位组成。它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如图2-16所示。
图2-16 异步通信
在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。用这种格式表示字符,则字符可以一个接一个地传送。
在异步通信中,通信双方采用独立的时钟,起始位触发双方同步时钟。在异步通信中CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义。原则上字符格式可以由通信的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。
2)同步通信:在同步通信中所传输的数据格式是由多个数据组成,每帧有一个或两个同步字符作为起始位以触发同步时钟开始发送或接收。在异步通信中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用了时间,所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。同步传输方式比异步传输方式速度快,这是它的优势。但同步传输方式也有其缺点,即它必须要用一个时钟来协调收发器的工作,所以它的设备也较复杂。同步通信数据格式如图2-17所示。
图2-17 同步通信
3.串行通信波特率
波特率是串行通信中的一个重要概念。波特率(bitpersecond)是单位时间里传输的数据位数,即:波特率=1bit/s。例如,数据传送的速率是240字符/s,而每个字符如上述规定包含10数位,则传送波特率为2400波特。波特率的倒数就是传送每位数据所需要的时间。相互通信的双方必须具有相同的波特率,否则无法成功地完成数据通信。异步通信一般速度较慢,一般适用于50~9600bit/s。
4.串行通信操作模式
在异步方式和同步方式中,串行通信都具有多种操作模式,常用于数据通信的传输方式有单工、半双工、全双工和多工方式。
单工方式:双方通信数据仅按一个固定方向传送,系统定型后也就固定了发送方和接收方。因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。
半双工方式:通信双方都具有收发器,数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。
全双工方式:通信双方都具有收发器,允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备较复杂。
多工方式:以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能,我们称之为多工传输方式。
2.7.2 MCS-51单片机的串行接口结构
对于单片机来说,为了进行串行数据通信,同样也需要有相应的串行接口电路。只不过这个接口电路不是单独的芯片,而是集成在单片机内部,成为单片机芯片的一个组成部分。MCS-51单片机内部有一个可编程的全双工的串行通信口,它可用作异步通信方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通信协议进行全双工的8051多机系统,也可以通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。
MCS-51单片机内的SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同的名字和地址空间,但不会出现冲突,因为一个只能被CPU读出数据,一个只能被CPU写入数据。MCS-51单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通信。这个通信口既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。如果在串行口的输入/输出引脚加上电平转换器,就可方便地构成标准的RS232接口。
2.7.3 MCS-51的串行口数据缓冲器SBUF
MCS-51单片机串行口寄存器结构如图2-18所示。SBUF为串行口的收发缓冲器,它是一个可寻址的专用寄存器,其中包含了接收器和发送器寄存器,可以实现全双工通信。MCS-51的串行数据传输很简单,只要向发送缓冲器写入数据即可发送数据。而从接收缓冲器读出数据即可接收数据。从图2-18中可看出,接收缓冲器前还加上一级输入移位寄存器,MCS-51的这种结构目的在于接收数据时避免发生数据帧重叠现象,以免出错。而发送数据时就不需要这样设置,因为发送时,CPU是主动的,不可能出现这种现象。
图2-18 MCS-51的串行口数据缓冲器SBUF
2.7.4 串行通信控制寄存器
1.串行中断控制寄存器SCON
在中断系统中我们已经分析了SCON控制寄存器,它是一个可寻址的专用寄存器,用于串行数据的通信控制,单元地址是98H,其结构格式见表2-9。
下面我们对各控制位功能介绍如下:
SM0、SM1:串行口工作方式控制位见表2-10。
表2-9 SCON寄存器结构
表2-10 SM0、SM1位置位作用
表中fosc为晶振频率。
SM2:多机通信控制位。多机通信工作于方式2和方式3,所以SM2位主要用于方式2和方式3。接收状态:当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都把前8位数据送入SBUF,并发出中断申请。工作于方式0时,SM2必须为0。
REN:接收允许控制位。REN用于控制数据接收的允许和禁止,REN=1时,允许接收;REN=0时,禁止接收。由软件置位以允许接收,又由软件清零来禁止接收。
TB8:要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清零。例如,可约定作为奇偶校验位,或在多机通信中作为区别地址帧或数据帧的标志位。在方式2和方式3中,TB8是要发送的第9位数据位。在多机通信中同样亦要传输这一位,并且它代表传输的地址或是数据,TB8=0时为数据,TB8=1时为地址。
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若SM2=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其他方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。TI必须用软件清零。可寻址标志位。
RI:接收中断标志位。在方式0中,当接收完第8位数据后,由硬件置位。在其他方式中,在接收到停止位的中间时刻由硬件置位(例外情况见关于SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。RI也必须用软件清零。可寻址标志位。
2.电源控制寄存器PCON
PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,单元地址是87H,其结构格式见表2-11。
表2-11 电源控制寄存器PCON
在CHMOS型单片机中,除SMOD位外,其他位均为虚设的。SMOD是串行口波特率倍增位,当SMOD=1时,串行口波特率加倍。系统复位默认为SMOD=0。
3.中断允许寄存器IE
中断允许寄存器在中断系统中已经阐述,这里重述一下对串行口有影响的位ES。ES为串行中断允许控制位,见表2-12。ES=1,允许串行中断,ES=0,禁止串行中断。
表2-12 IE中断允许控制寄存器结构
4.串行通信工作方式
8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
(1)方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口,也可以外接同步输入/输出设备。8位串行数据都是从引脚RXD输入或输出,引脚TXD用来输出同步脉冲。
1)数据发送:串行数据从引脚RXD输出,引脚TXD输出移位脉冲。CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fosc/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。使用方式0实现数据的输入输出时,实际上是把串行口变成并行口用。
2)数据接收:当串行口以方式0接收时,先置位允许接收控制位REN。此时,引脚RXD为串行数据输入端,引脚TXD仍为同步脉冲移位输出端。当RI=0和REN=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。
3)波特率:方式0的波特率固定为主振频率的1/12。若fosc=6MHz,则波特率为500bit/s,即2μs移位一次。
(2)方式1为波特率可变的10位异步通信接口方式。发送或接收一帧信息,包括1个起始位0,8个数据位和1个停止位1。
1)数据发送:当CPU执行一条指令将数据写入发送缓冲SBUF时,就启动发送。在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式,然后在移位脉冲的作用下串行数据从引脚TXD输出。发送完一帧数据后引脚TXD一直维持在“1”状态下,并由硬件置位TI通知CPU可以发送下一个字符。
2)数据接收:在REN=1时,串行口采样引脚RXD,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。只有当RI=0且停止位为1或者SM2=0时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。
3)波特率:方式1的波特率是可变的,由定时/计数器1的计数溢出率来决定,公式为
波特率=2SMOD(定时器1溢出率)/32
4)SMOD:PCON寄存器的最高位值,SMOD=1表示波特率增倍。
(3)方式2为固定波特率的11位UART方式。即1个起始位,9个数据位和1个停止位。在方式2中,字符还是8个数据位,第9个数据位既可以作为奇偶校验位也可作为控制位使用,功能由用户自己定。
1)数据发送:发送的串行数据由引脚TXD输出,一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。准备好第9个数据位之后,当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI,其过程与方式1相同。
2)数据接收:方式2的接收过程也与方式1基本相同,不同之处在于第9个数据位,串行口把收到的8位数据送入SBUF,把收到的第9位数据送入RB8。
3)波特率:方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示
波特率=2SMODfosc/64,也就是当SMOD=1时,波特率为fosc/32,当SMOD=0时,波特率为fosc/64。
(4)方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。
2.7.5 波特率选择与设置
如前所述,在串行通信中,收发双方的数据传送率(波特率)要有一定的约定。在8051串行口的4种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。各种方式的波特率如下:
方式0:波特率=fosc/12
方式2:波特率=2SMODfosc/64
方式1和方式3(定时器T1作为波特率发生器):波特率=2SMOD(定时器1溢出率)/32
T1溢出率=T1计数率/产生溢出所需的周期数
式中,T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式0:溢出所需周期数=8192-X,X为初值。
定时器T1工作于方式1:溢出所需周期数=65536-X,X为初值。
定时器T1工作于方式2:溢出所需周期数=256-X,X为初值。
因为方式2为自动重装入初值的8位定时/计数器模式,所以用它来做波特率发生器最恰当。
当时钟频率选用11.0592MHz时,极易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。方式1和方式3的常用波特率的设置见表2-13。
有了上述表格,在C语言中可以很方便地对串口进行初始化。如在11.0592MHz晶振下,设置串行口用9.6K的传输率进行传输,工作于工作方式3,用C语言可进行如下设定:
表2-13 数据传输率与晶振频率的关系
2.7.6 RS232标准接口总线及串行通信设计
通过以上枯燥的理论学习之后对MCS-51单片机的串行口有了基本了解,接下来重点介绍单片机与PC之间的通信。相信每个初学者都会对这部分内容感兴趣。
在工业自动控制、智能产品中,单片机应用越来越广泛,同时也需要对数据进行较复杂的处理。由于单片机的运算能力较差,在处理复杂数据时速度较慢,所以需要借助计算机进行运算。因此,单片机与PC间的通信便显得非常重要。
大多数的计算机都具有RS232C接口,尽管它的性能指标并非很好。在广泛的市场支持下依然常盛不衰。就使用而言,RS232也确实有其优势:仅需3根线便可在两个数字设备之间全双工的传送数据。不过,RS232C的控制要比使用并行通信的打印机接口更难于控制。RS232C使用了远比并行口更多的寄存器。这些寄存器用来实现串行数据的传送及RS232C设备之间的握手与流量控制。PC上的RS232口各引脚功能如图2-19所示。
图2-19 RS232接口定义
1.RS232总线标准
串行通信接口标准以RS232C为主。RS232C标准是美国EIA与BELL等公司一起开发的,它适合于数据传输率在0~20000bit/s范围内的通信。RS232C还对电器特性、逻辑电平和各种信号线功能都作了规定。RS232C使用-3~-25V表示数字“1”,使用3~25V表示数字“0”,RS232C在空闲时处于逻辑“1”状态。在开始传送时,首先产生一个起始位,起始位为一个宽度的逻辑“0”,紧随其后的为要传送的数据,所要传送的数据由最低位开始送出,最后以一个结束位标志表示该字节传送完毕,结束位为一个宽度的逻辑“1”。
2.RS232C接口电路
由于RS232C信号与MCS-51单片机信号电平不一致(前者为RS232电平,后者为TTL电平),因此,采用RS232C与单片机通信时必须要进行信号电平转换。目前,RS232C与TTL电平转换最常用的芯片有MAX232、MC1488等,以下就以MAX232为例,介绍其接口电路。MAX232芯片是MAXIM公司生产的、包含两路接收器和驱动器的IC芯片,外部引脚和内部电路如图2-20所示。
图2-20 MAX232芯片接口定义
a)引脚排列 b)内部功能
实际应用中可以接成如图2-21所示电路,实现单片机与PC间数据通信。
图2-21 MAX232串行通信电路
MAX232内部有两组收、发器,实际应用中可以从中任选一组使用,电平转换的硬件电路在此不作更多介绍,读者可以从网上找到许多类似资料。
3.单片机与PC通信的软硬件设计
51单片机有一个全双工的串行通信口,所以单片机和计算机之间可以方便地进行串行通信。进行串行通信时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个晶体管进行模拟转换,但还是用专用芯片更简单可靠。具体硬件电路如图2-21,这是最简单的连接方法,但是对我们来说已经足够使用了。
为了能够在计算机端看到单片机发出的数据,我们必须借助一个Windows软件进行观察,这里我们推荐一个免费的计算机串口调试软件——串口调试助手。此软件如图2-22所示,可设定串口号、波特率、校验位等参数,非常实用。
图2-22 串口调试软件界面
程序设计:利用单片机串行口将PC发送的数据信号接收并返回给PC,利用串口调试助手发送并验证收到的数据是否正确。在使用中注意波特率两部分一定要统一,否则数据将出错。单片机上程序如下:
[1]TMOD只能按字节寻址。