89C51串行口及串行通信技术_第1页
89C51串行口及串行通信技术_第2页
89C51串行口及串行通信技术_第3页
89C51串行口及串行通信技术_第4页
89C51串行口及串行通信技术_第5页
已阅读5页,还剩236页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章89C51串行口

及串行通信技术本书前几章涉及的数据传送都是采用并行方式,如89C51与存储器,存储器与存储器,89C51与并行打印机之间的通信。89C51处理8位数据,假设以并行传送方式一次传送一个字节的数据,至少需要8条数据线。1/10/20241当89C51与打印机连接时,除8条数据线外,还需要状态、应答等控制线。一些微机系统,如IBM-PC系列机,由于磁盘机、CRT、打印机与主机系统的距离有限,所以,使用多条电缆线以提高数据传送速度还是合算的。但是,计算机之间、计算机与其终端之间的距离有时非常远,此时,电缆线过多是不经济的。第7章89C51串行口

及串行通信技术1/10/20242串行通信只用一位数据线传送数据的位信号,即使加上几条通信联络线,也用不了很多电缆线。因此,串行通信适合远距离数据传送。当然,串行通信要求有转换数据格式、时间控制等逻辑电路,这些电路目前已被集成在大规模集成电路中〔称为可编程串行通信控制器〕,使用很方便。第7章89C51串行口

及串行通信技术1/10/20243第七章89C51串行口及串行通信技术

本章将介绍89C51串行口的结构及应用,PC机与89C51间的双机通信,一台PC机控制多台89C51前沿机的分布式系统,以及通信接口电路和软件设计,并给出设计实例,包括接口电路、程序框图、主程序和接收/发送子程序。1/10/20244第七章89C51串行口及串行通信技术7.1串行通信根本知识7.2串行口及应用7.389C51与89C51点对点异步通信7.489C51与PC机间通信7.5思考题与习题返回1/10/202457.1串行通信根本知识7.1.1数据通信7.1.2串行通信的传输方式7.1.3异步通信和同步通信7.1.4串行通信的过程及通信协议返回1/10/202467.1.1数据通信在实际工作中,计算机的CPU与外部设备之间常常要进行信息交换,一台计算机与其他计算机之间也往往要交换信息,所有这些信息交换均可称为通信。通信方式有两种,即并行通信和串行通信。通常根据信息传送的距离决定采用哪种通信方式。返回1/10/202477.1.1数据通信例:在IBM-PC机与外部设备(如打印机等)通信时如果距离小于30m,可采用并行通信方式;当距离大于30m时,那么要采用串行通信方式。89C51单片机具有并行和串行二种根本通信方式。返回1/10/202487.1.1数据通信并行通信:是指数据的各位同时进行传送〔发送或接收〕的通信方式。P148图7-1(a)优点:是传送速度快;缺点:是数据有多少位,就需要多少根传送线。例:89C51单片机与打印机之间的数据传送就属于并行通信。图7-1〔a〕:为89C51与外设间8位数据并行通信的连接方法。并行通信在位数多、传送距离又远时就不太适宜了。返回1/10/202497.1.1数据通信串行通信:指数据是一位一位按顺序传送的通信方式。它的突出优点:是只需一对传输线〔利用线就可作为传输线〕,这样就大大降低了传送本钱,特别适用于远距离通信;返回1/10/2024107.1.1数据通信其缺点:是传送速度较低。假设并行传送N位数据所需时间位T,那么串行传送的时间至少为NT,实际上总是大于NT的。P148图7-1(b):为串行通信方式的连接方法。返回1/10/202411图7-1数据通信方式1/10/2024127.1.2串行通信的传输方式串行通信的传送方式通常有三种:单向〔或单工〕配置,只允许数据向一个方向传送;半双向〔或半双工〕配置,允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;全双向〔全双工〕配置,允许同时双向传送数据,因此,全双工配置是一对单向配置,它要求两端的通信设备都具有完整和独立的发送和接受能力。P146图7-2:串行通信中的数据传送方式。返回1/10/202413图7-2串行通信中的数据传送方式1/10/2024147.1.3异步通信和同步通信串行通信有两种根本通信方式:即异步通信、同步通信。1、异步通信在异步通信中,数据是一帧一帧〔包括一个字符代码或一字节数据〕传送的。每一帧的数据格式:P149图7-3返回1/10/202415图7-3异步通信数据格式1/10/2024161、异步通信在帧格式中,一个字符由四个局部组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位〔0〕,然后是5--8位数据位(规定低位在前,高位在后),接下来是奇偶校验位〔可省略〕,最后是停止位〔1〕。返回1/10/2024171、异步通信起始位〔0〕信号只占用一位,用来通知接收设备一个待接收的字符开始到达。线路上在不传送字符时应保持为1。接收端不断检测线路的状态,假设连续为1以后又测到一个0,就知道发来一个新字符,应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。起始位后面紧接着是数据位,它可以是5位(D0--D4)、6位、7位或8位〔D0--D7〕。返回1/10/2024181、异步通信奇偶校验(D8)只占一位,但在字符中也可以规定不用奇偶校验位,那么这一位就可省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质〔地址/数据等〕.停止位用来表征字符的结束,它一定是高电位(逻辑1).停止位可以是1位、1.5位或2位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一个字符做好准备--只要再接收到0,就是新的字符的起始位。假设停止位以后不是紧接着传送下一个字符,那么使线路电平保持为高电平〔逻辑1〕。返回1/10/202419P149图7-3〔a〕:表示一个字符紧接一个字符传送的情况,上一个字符的停止位和下一个字符的起始位是紧邻的;P149图7-3〔b〕:是两个字符间有空闲位的情况,空闲位为1,线路处于等待状态。存在空闲位正是异步通信的特征之一。例:规定用ASCII编码,字符为七位,加一个奇偶校验位、一个起始位、一个停止位,那么一帧共十位。1、异步通信返回1/10/2024202、同步通信同步通信中,在数据开始传送前用同步字符来指示(常约定1个--2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,仅在数据块开始时用同步字符SYNC来指示,其数据格式:P150图7-4。返回1/10/202421图7-4异步通信数据格式1/10/2024222、同步通信同步字符的插入可以是单同步字符方式或双同步字符方式,如P150图7-4所示,然后是连续的数据块。同步字符可以由用户约定,当然也可以采用ASCII码中规定的SYNC代码,即16H。按同步方式通信时,先发送同步字符,接收方检测到同步字符后,即准备接收数据。

返回1/10/2024232、同步通信在同步传送时,要求用时钟来实现发送端与接收端之间的同步。为了保证接收正确无误,发送方除了传送数据外,还要同时传送时钟信号。同步传送可以提高传输速率(达56kb/s或更高),但硬件比较复杂。返回1/10/2024243、波特率〔Baudrate〕波特率:即数据传送速率,表示每秒钟传送二进制代码的位数,它的单位是b/s。波特率对于CPU与外界的通信是很重要的。设:数据传送速率是120字符/s,每个字符格式包含10个代码位〔1个起始位、1个终止位、8个数据位〕。那么:传送的波特率为:120字符/s×10b/字符=1200b/s返回1/10/2024253、波特率〔Baudrate〕每一位代码的传送时间Td为波特率的倒数。Td=1/〔1200b·s-1〕=0.833ms/b异步通信的传送速率在50b/s--19200b/s之间,常用于计算机到终端机和打印机之间的通信、直通电报以及无线电通信的数据发送等。返回1/10/2024267.1.4串行通信的过程及通信协议1、串←→并转换与设备同步两个通信设备在串行线路上成功地实现通信必须解决两个问题:

(1)串←→并转换,即如何把要发送的并行数据串行化,把接收的串行数据并行化;

(2)设备同步,即同步发送设备与接收设备的工作节拍,以确保发送数据在接收端被正确读出。返回1/10/2024271、串←→并转换与设备同步〔1〕串←→并转换:P151图7-5、图7-6串行通信:是将计算机内部的并行数据转换成串行数据,将其通过一根通信线传送;并将接收的串行数据再转换成并行数据送到计算机中。返回1/10/202428在计算机串行发送数据之前,计算机内部的并行数据被送入移位存放器并一位一位地输出,将并行数据转换成串行数据。如P151图7-5所示。在接收数据时,来自通信线路的串行数据被压入移位存放器,满8位后并行送到计算机内部。如P151图7-6所示。在串行通信控制电路中,串--并、并--串转换逻辑被集成在串行异步通信控制器芯片中。89C51单片机的串行口和IBM-PC相同。返回1/10/202429图7-5发送时的并-串转换1/10/202430图7-6接收时的串-并转换1/10/202431〔2〕设备同步进行串行通信的两台设备必须同步工作才能有效地检测通信线路上的信号变化,从而采样传送数据脉冲。设备同步对通信双方有两个共同要求:(1)通信双方必须采用统一的编码方法;(2)通信双方必须能产生相同的传送速率。返回1/10/202432采用统一的编码方法确定了一个字符二进制表示值的位发送顺序和位串长度,当然还包括统一的逻辑电平规定,即电平信号上下与逻辑1和逻辑0的固定对应关系。通信双方只有产生相同的传送速率,才能确保设备同步,这就要求发送设备和接收设备采用相同频率的时钟。发送设备在统一的时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同步的数据信息。返回1/10/2024332、串行通信协议通信协议:是对数据传送方式的规定,包括数据格式定义和数据位定义等。通信双方必须遵守统一的通信协议。串行通信协议包括同步协议和异步协议两种。在此只讨论异步串行通信协议和异步串行协议规定的字符数据的传送格式。返回1/10/202434〔1〕起始位通信线上没有数据被传送时处于逻辑1状态。当发送设备要发送一个字符数据时,首先发出一个逻辑0信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。起始位所起的作用就是设备同步,通信双方必须在传送数据位前协调同步。返回1/10/202435〔2〕数据位当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5、6、7或8。IBM-PC中经常采用7位或8位数据传送,89C51串行口采用8位或9位数据传送。这些数据位被接收到移位存放器中,构成传送数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接收设备中被转换为并行数据。返回1/10/202436〔3〕奇偶校验位数据位发送完之后,可以发送奇偶校验位。奇偶校验用于有限过失检测,通信双方需约定的奇偶校验方式。如果选择偶校验,那么组成数据位和奇偶位的逻辑1的个数必须是偶数;如果选择奇校验,那么逻辑1的个数必须是奇数。返回1/10/202437〔4〕停止位在奇偶位或数据位〔当无奇偶校验时〕之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位,1.5位或2位的高电平。接收设备收到停止位之后,通信线路上便又恢复逻辑1状态,直至下一个字符数据的起始位到来返回1/10/202438〔5〕波特率设置通信线上传送的所有位信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,这个速度叫波特率。如果数据以300个二进制位每秒在通信线上传送,那么传送速度为300波特,通常记为300b/s。返回1/10/202439〔6〕挂钩〔握手〕信号约定〔见本章7.4节实例〕返回1/10/2024407.2串行口及应用89C51单片机除具有4个8位并行口外,还具有串行接口。此串行接口是一个全双工串行通信接口,即能同时进行串行发送和接收数据。它可以作UART〔通用异步接收和发送器〕用,也可以作同步移位存放器用。使用串行接口可以实现89C51单片机系统之间点对点的单机通信和89C51与系统机〔如IBM-PC机等〕的单机或多机通信。返回1/10/2024417.2串行口及应用

89C51串行口

89C51串行口的工作方式及应用返回1/10/2024427.2.189C51串行口1、结构2、串行口控制字及控制存放器3、串行通信工作方式4、波特率设计返回1/10/2024431、结构89C51通过引脚RXD〔P3.0,串行数据接收端〕和引脚TXD〔P3.1,串行数据发送端〕与外界进行通信。其内部结构简化示意图:P153图7-7图中有两个物理独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送、接收数据发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。返回1/10/202444串行发送与接收的速率与移位时钟同步。89C51用定时器T1作为串行通信的波特率发生器T1溢出率经2分频〔或不分频〕后又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即是波特率。返回1/10/202445图7-7串行口内部结构示意简图1/10/202446从图中可看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收〔串行输入至移位存放器〕,但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丧失前一个字节。对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误,一般不需要用双缓冲器结构来保持最大传送速率。返回1/10/202447串行口的发送和接收都是以特殊功能存放器SBUF的名义进行读或写的。当向SBUF发“写〞命令时(执行“MOVSBUF,A〞指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。返回1/10/202448在满足串行口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1就会接收一帧数据进入移位存放器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOVA,SBUF〞命令)便由接收缓冲器〔SBUF〕取出信息通过89C51内部总线送CPU。返回1/10/2024492、串行口控制字及控制存放器89C51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功能存放器SCON(98H)和电源控制存放器PCON(87H)中即可。〔1〕SCON〔98H〕作用:89C51串行通信的方式选择、接收和发送控制以及串行口的状态标志等均由特殊功能存放器SCON控制和指示格式:P154图7-8返回1/10/202450图7-8串行口控制存放器SCON1/10/202451①SM0和SM1〔SCON.7,SCON.6〕——串行口工作方式选择位。两个选择位对应4种通信方式如P154表7-1所示。其中,fosc是振荡频率。1/10/202452②SM2〔SCON.5〕——多机通信控制位,主要用于方式2和方式3。 假设置SM2=1,那么允许多机通信。当一片89C51(主机)与多片89C51(从机)通信时,所有从机的SM2位都置1。主机首先发送的一帧数据为地址,即从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。返回1/10/202453各个从机根据收到的第9位数据〔RB8中〕的值来决定从机可否再接收主机的信息。假设〔RB8〕=0,说明是数据帧,那么使接收中断标志位RI=0,信息丧失;假设〔RB8〕=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机去除SM2,以接收主机发来的一帧数据。其他从机仍然保持SM2=1。返回1/10/202454假设SM2=0,即不属于多机通信情况,那么接收一贞数据后,不管第九位数据是0还是1,都置RI=1,接收到的数据装入SBUF。根据SM2这个功能,可实现多个89C51应用系统的串行通信。在方式1时,假设SM2=1,那么只有接收到有效停止位时,RI才置1,以便接收下一贞数据。在方式0时,SM2必须是0。返回1/10/202455③REN〔SCON.4〕——允许接收控制位。由软件置1或清0,只有当REN=1时才允许接收,相当于串行接收的开关;假设REN=0,那么禁止接收。在串行通信接收控制过程中,如果满足RI=0和REN=1〔允许接收〕的条件,就允许接收,一帧数据就装载入接收SBUF中。返回1/10/202456④TB8〔SCON.3〕——发送数据的第9位〔D8〕装入TB8中。在方式2或方式3中,根据发送数据的需要由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可在多机通信中作为发送地址帧或数据帧的标志位。对于后者,TB8=1,说明该帧数据为地址;TB8=0,说明该帧数据为数据字节。在方式0或方式1中,该位未用。返回1/10/202457⑤RB8〔SCON.2〕——接收数据的第9位。在方式2或方式3中,接收到的第9位数据放在RB8位。它或是约定的奇/偶校验位,或是约定的地址/数据标识位。在方式2和方式3多机通信中,假设SM2=1,如果RB8=1,说明收到的数据为地址帧。在方式1中,假设SM2=0〔即不是多机通信情况),RB8中存放的是已接收到的停止位。在方式0中,该位未用。返回1/10/202458⑥TI〔SCON.1〕——发送中断标志。在一帧数据发送完时被置位。在方式0串行发送第8位结束或其他方式串行发送到停止位的开始时,由硬件置位,可用软件查询。它同时也申请中断,TI置位意味着向CPU提供“发送缓冲器SBUF已空〞的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须由软件清0。返回1/10/202459⑦RI〔SCON.0〕——接收中断标志。在接收到一帧有效数据后由硬件置位。在方式0中,第8位数据接收结束时,由硬件置位;在其他三种方式中,当接收到停止位中间时由硬件置位。RI=1,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据。CPU响应中断,取走数据。RI也必须由软件清0,去除中断申请,并准备接收下一帧数据。返回1/10/202460串行发送中断标志TI和接收中断标志RI是同一个中断源〔P122表5-1〕,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时,SCON所有位均清0。返回1/10/202461〔2〕PCON〔87H〕:电源控制存放器PCON中只有SMOD位与串行口工作有关,如P156图7-9所示。图7-9电源控制存放器PCON1/10/202462SMOD〔PCON.7〕——波特率倍增位。在串行口方式1、方式2、方式3时,波特率和2SMOD成正比,亦即当SMOD=1时,波特率提高一倍。复位时,SMOD=0。返回1/10/2024633、串行通信工作方式根据实际需要,89C51串行口可设置4种工作方式

可有8位、10位、11位帧格式。方式0:以8位数据为一帧,不设起始位和停止位先发送或接收最低位。其帧格式如下:返回1/10/2024643、串行通信工作方式方式1:以10位为一帧传输,设有1个起始位(0)、8个数据位、1个停止位〔1〕。其帧格式为:返回1/10/2024653、串行通信工作方式方式2和方式3:以11位为1帧传输,设有1个起始位(0),8个数据位,1个附加第9位、1个停止位(1)。其帧格式为:附加第9位〔D8〕:由软件置1或清0。发送时在TB8中,接收时送RB8中。返回1/10/202466〔1〕串行口方式0方式0:为同步移位存放器输入/输出方式,常用于扩展I/O口。串行数据通过RXD输入或输出,而TXD用于输出移位时钟,作为外接部件的同步信号。图7-10(a):发送电路,图7-11(a):接收电路。这种方式不适用于两个89C51之间的直接数据通信,但可以通过外接移位存放器来实现单片机的接口扩展。返回1/10/202467图7-10方式0发送电路及时序1/10/202468图7-11方式0接收电路及时序1/10/202469例:74LS164可用于扩展并行输出口,74LS165可用于扩展输入口。在这种方式下,收/发的数据为8位,低位在前,无起始位、奇偶校验位及停止位,波特率是固定的。返回1/10/202470发送过程中,当执行一条将数据写入发送缓冲器SBUF〔99H〕的指令时,串行口把SBUF中8位数据以fosc/12的波特率从RXD〔P3.0〕端输出,发送完毕置中断标志TI=1。方式0发送时序:P157图7-10〔b〕返回1/10/202471写SBUF指令在S6P1处产生一个正脉冲,在下一个机器周期的S6P2处数据的最低位输出到RXD〔P3.0〕脚上;再在下一个机器周期的S3,S4,S5输出移位时钟为低电平,而在S6及下一个机器周期的S1,S2为高电平,就这样将8位数据由低位至高位一位一位顺序通过RXD线输出,并在TXD脚上输出fosc/12的移位时钟,在“写SBUF〞有效后的第10个机器周期的S1P1将发送中断标志TI置位。图中,74LS164是TTL“串入并出〞移位存放器。返回1/10/202472接收时,用软件置REN=1〔同时,RI=0〕,即开始接收。接收时序:图7-11〔b〕当使SCON中的REN=1(RI=0)时,产生一个正脉冲,在下一个机器周期的S3P1~S5P2,从TXD〔P3.1〕脚上输出低电平的移位时钟,在此机器周期的S5P2对P3.0脚采样,并在本机器周期的S6P2通过串行口内的输入移位存放器将采样值移位接收;在同一个机器的S6P1到下一个机器周期的S2P2,输出移位时钟为高电平。返回1/10/202473于是,将数据字节从低位至高位一位一位地接收下来并装入SBUF中,在启动接收过程〔即写SCON,清RI位〕将SCON中的RI清0之后的第10个机器周期的S1P1,RI被置位。这一帧数据接收完毕,可进行下一帧接收。P158图7-11〔b〕中,74LS165是TTL“并入串出〞移位存放器,QH端为74LS165的串行输出端,经P3.0输入至89C51。返回1/10/202474〔2〕串行口方式1方式1:真正用于串行发送或接收,为10位通用异步接口。TXD与RXD分别用于发送与接收数据。一帧数据的格式:为1位起始位、8位数据位(低位在前)、1位停止位,共10位。在接收时,停止位进入SCON的RB8,此方式的传送波特率可调。串行口方式1的发送和接收时序:P159图7-12〔a〕和〔b〕所示返回1/10/202475图7-12方式1发送和接收时序1/10/202476方式1发送时,数据从引脚TXD(P3.1)端输出。当执行数据写入发送缓冲器SBUF的命令时,就启动了发送器开始发送。发送时的定时信号,也就是发送移位时钟(TX时钟),是由定时器T1(见图7-7)送来的溢出信号经过16分频或32分频〔取决于SMOD的值〕而得到的,TX时钟就是发送波特率。可见,方式1的波特率是可变的。返回1/10/202477发送开始的同时,SEND变为有效,将起始位向TXD输出;此后每经过一个TX时钟周期(16分频计数器溢出一次为一个时钟周期,因此,TX时钟频率由波特率决定。)产生一个移位脉冲,并由TXD输出一个数据位;8位数据位全部发送完后,置位TI,并申请中断置TXD为1作为停止位,再经一个时钟周期,SEND失效。返回1/10/202478方式1接收时,数据从引脚RXD(P3.0)端输入。接收是在SCON存放器中REN位置1的前提下,并检测到起始位(RXD上检测到1→0的跳变,即起始位)而开始的。返回1/10/202479接收时,定时信号有两种(如图7-12(b)所示〕:一种是接收移位时钟〔RX时钟〕,它的频率和传送波特率相同,也是由定时器T1的溢出信号经过16或32分频而得到的;另一种是位检测器采样脉冲,它的频率是RX时钟的16倍,亦即在一位数据期间有16位检测器采样脉冲,为完成检测,以16倍于波特率的速率对RXD进行采样。返回1/10/202480为了接受准确无误,在正式接受数据之前,还必须判定这个1→0跳变是否是干扰引起的。为此,在这位中间〔即一位时间分成16等份,在第7,第8及第9等份〕连续对RXD采样三次,取其中两次相同的值进行判断。这样能较好地消除干扰的影响。当确认是真正的起始位〔0〕后,就开始接受一帧数据。当一帧数据接受完毕后,必须同时满足以下两个条件,这次接受才真正有效。返回1/10/202481①RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中数据已被取走。由软件使RI=0,以便提供“接收SBUF已空〞的信息。②SM2=0或收到的停止位为1〔方式1时,停止位进入RB8〕,那么将接收到的数据装入串行口的SBUF和RB8〔RB8装入停止位〕,并置位RI;如果不满足,接收到的数据不能装入SBUF,这意味着该帧信息将会丧失。注意:在整个接收过程中,保证REN=1是一个先决条件。只有当REN=1时,才能对RXD进行检测。返回1/10/202482〔3〕串行口方式2和方式3串行口工作在方式2和方式3均为每帧11位异步通信格式,由TXD和RXD发送与接收〔两种方式操作是完全一样的,所不同的只是波特率〕。返回1/10/202483每帧11位,即1位起始位,8位数据位〔低位在前〕,1位可编程的第9数据位、1位停止位。发送时,第9数据位〔TB8〕可以设置为1或0,也可将奇偶位装入TB8,从而进行奇偶校验;接收时,第9数据位进入SCON的RB8。方式2和方式3的发送、接收时序:P160图7-13其操作与方式1类似。返回1/10/202484图7-13方式2、方式3发送和接收时序1/10/202485发送前,先根据通信协议由软件设置TB8〔如作奇偶校验位或地址/数据标志位〕,然后将要发送的数据写入SBUF,即可启动发送过程。串行口能自动把TB8取出,并装入到第9位数据位的位置,再逐一发送出去。发送完毕,使TI=1。返回1/10/202486接收时,使SCON中的REN=1,允许接收。当检测到RXD(P3.0)端有1→0的跳变(起始位)时开始接收9位数据,送入移位存放器〔9位〕。当满足RI=0且SM2=0,或接收到的第9位数据为1时,前8位数据送入SBUF,附加的第9位数据送入SCON中的RB8,置RI为1;否那么,这次接收无效,也不置位RI。返回1/10/2024874、波特率设计在串行通信中,收发双方对发送或接收的数据速率有一定的约定,通过软件对89C51串行口编程可约定四种工作方式。其中:方式0和方式2的波特率是固定的;方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。串行口的四种工作方式对应着三种波特率。由于输入的移位时钟来源不同,因此,各种方式的波特率计算公式也不同。返回1/10/202488〔1〕方式0的波特率由P161图7-14可见,方式0时,发送或接收一位数据的移位时钟脉冲由S6〔即第6个状态周期,第12个节拍〕给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。因此,波特率固定为振荡频率的1/12,并不受PCON存放器中SMOD位的影响。返回1/10/202489图7-14串行口方式0波特率的产生返回1/10/202490方式0波特率≌fosc/12注意:符号“≌〞表示左面的表达式只是引用右面表达式的数值,即右面的表达式提供了一种计算的方法。返回1/10/202491〔2〕方式2的波特率串行口方式2波特率的产生与方式0不同,即输入的时钟源不同,其时钟输入局部:图7-15控制接收与发送的移位时钟由振荡频率fosc的第二节拍P2时钟〔即fosc/2〕给出,所以,方式2波特率取决于PCON中SMOD位的值:SMOD=0时,波特率为fosc的1/64;SMOD=1时,波特率为fosc的1/32。即方式2波特率≌(2SMOD/64)×fosc返回1/10/202492图7-15串行口方式2波特率的产生返回1/10/202493〔3〕方式1和方式3的波特率方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,如P162图7-16所示。因此,89C51串行口方式1和方式3的波特率由定时器T1的溢出率与SMOD值同时决定。即:方式1、方式3波特率≌T1溢出率/n当SMOD=0时,n=32;SMOD=1时,n=16。返回1/10/202494返回图7-16串行口方式1、方式3波特率的产生1/10/202495所以,可用下式确定方式1和方式3的波特率:方式1、方式3波特率≌(2SMOD/32)×(T1溢出速率)T1溢出速率取决于T1的计数速率〔计数速率≌fosc/12〕和T1预置的初值。假设定时器T1采用模式1时,波特率公式如下:串行方式1、方式3波特率≌(2SMOD/32)×(fosc/12)/(216

-初值)返回1/10/202496P163表7-2列出了串行口方式1、方式3常用波特率及其初值。定时器T1用作波特率发生器时,通常选用定时器模式2(自动重装初值定时器)比较实用。要设置定时器T1为定时方式(使C/T=0),让T1计数内部振荡脉冲,即计数速率为fosc/12(注意应禁止T1中断,以免溢出而产生不必要的中断)。先设定TH1和TL1定时计数初值为X,那么每过(28-X)个机器周期,定时器T1就会产生一次溢出返回1/10/202497表7-2常用波特率与其他参数选取关系1/10/202498因此:T1溢出速率≌(fosc/12)/(28-X)于是,可得出定时器T1模式2的初始值X:返回1/10/202499例7-1:89C51单片机时钟振荡频率为11.0592MHz,选用定时器T1工作模式2作为波特率发生器,波特率为2400b/s,求初值。解:设置波特率控制位〔SMOD〕=0所以,(TH1)=(TL1)=0F4H。返回1/10/2024100系统晶体振荡频率选为11.0592MHz就是为了使初值为整数,从而产生精确的波特率。如果串行通信选用很低的波特率,可将定时器T1置于模式0或模式1,即13位或16位定时方式;但在这种情况下,T1溢出时,需要中断效劳程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。返回1/10/20241017.2.289C51串行口的应用如前所述,89C51串行口的工作主要受串行口控制存放器SCON的控制,另外,也和电源控制存放器PCON有关系。SCON存放器用来控制串行口的工作方式,还有一些其他的控制作用。返回1/10/202410289C51单片机串行口的四种工作方式传送的数据位数表达如下:①方式0:移位存放器输入/输出方式。串行数据通过RXD线输入或输出,而TXD线专用于输出时钟脉冲给外部移位存放器。方式0可用来同步输出或接收8位数据〔最低位首先输出〕,波特率固定为fosc/12,其中,fosc为单片机的时钟频率。返回1/10/2024103②方式1:10位异步接收/发送方式。一帧数据包括1位起始位(0),8位数据位、1位停止位(1)。串行接口电路在发送时能自动插入起始位和停止位;在接收时,停止位进入特殊功能存放器SCON的RB8位。方式1的传送波特率是可变的,可通过改变内部定时器的定时值来改变波特率。③方式2:11位异步接收/发送方式。除了1位起始位、8位数据位、1位停止位之外,还可以插入第9位数据位。④方式3:同方式2,只是波特率可变。返回1/10/20241041、串行口方式0的应用89C51单片机串行口根本上是异步通信接口,但在方式0时是同步操作。外接串入—并出或并入—串出器件,可实现I/O的扩展。串行口方式0的数据传送可采用中断方式,也可采用查询方式。无论哪种方式,都要借助于TI或RI标志。返回1/10/2024105在串行口发送时,或者靠TI置位后引起中断申请,在中断效劳程序中发送下一组数据;或者通过查询TI的值,只要TI为0就继续查询,直到TI为1后结束查询,进入下一个字符的发送。在串行口接收时,由RI引起中断或对RI查询来决定何时接收下一个字符。无论采用什么方式,在开始串行通信前,都要先对SCON存放器初始化,进行工作方式的设置。在方式0中,SCON存放器的初始化只是简单地把00H送入SCON就可以了。返回1/10/2024106例7-2:用89C51串行口外接164串入—并出移位存放器扩展8位并行口;8位并行口的每位都接一个发光二极管,要求发光二极管从左到右以一定延迟轮流显示,并不断循环。设发光二极管为共阴极接法,如P165图7-17所示。解:设数据串行发送采用中断方式,显示的延迟通过调用延迟程序DELAY来实现。返回1/10/2024107图7-17串入并出电路返回1/10/2024108程序清单:ORG0023H;串行口中断入口AJMPSBR;转入串行口中断效劳程序ORG2000H;主程序起始地址MOVSCON,#00H;串行口方式0初始化MOVA,#80H;最左一位发光二极管先亮CLRP1.0;关闭并行输出MOVSBUF,A;开始串行输出LOOP:SJMP$;等待中断返回1/10/2024109SBR:SETBP1.0 ;启动并行输出 ACALLDELAY ;显示延迟一段时间 CLRTI ;清发送中断标志 RRA ;准备右边一位显示 CLRP1.0 ;关闭并行输出 MOVSBUF,A ;再一次串行输出 RETI ;中断返回返回1/10/2024110用方式0外加移位存放器来扩展8位输出口时,要求移位存放器带有输出控制,否那么串行移位过程也会反映到并行输出口;另外,输出口最好再接一个存放器或锁存器,以免在输出门关闭时〔STB=0〕输出又发生变化返回1/10/2024111用方式0加上并入—串出移位存放器可扩展一个8位并行输入口。移位存放器必须带有预置/移位的控制端,由单片机的一个输出端子加以控制,以实现先由8位输入口置数到移位存放器,然后再串行移位从单片机的串行口输入到接收缓冲器,最后再读入到CPU中。返回1/10/2024112例7-3:用89C51串行口外加移位存放器165或166扩展8位输入口,输入数据由8个开关提供,另有一个开关K提供联络信号。当K=0时,表示要求输入数据,输入的8位为开关量,提供逻辑模拟子程序的输入信号。如P165图7-18所示。返回1/10/2024113图7-18并入串出电路返回1/10/2024114解:串行口方式0的接收要用SCON存放器中的REN位作为开关来控制。因此,初值化时,除了设置工作方式之外,还要使REN位为1,其余各位仍然为0。对RI采用查询方式来编写程序,先要查询开关K是否闭合。程序清单:返回1/10/2024115START:MOVSCON,#10H;串行口方式0初始化 JBP1.1,$ ;开关K未闭合,等待 SETBP1.0 ;SHIFT=1,并行置入数据 CLRP1.0 ;SHIFT=0,开始串行移位 JNBRI,$ ;查询RI CLRRI ;查询结束,清RI MOVA,SBUF ;读数据到累加器 ACALLLOGSIM ;进行逻辑模拟 SJMPSTART ;准备下一次模拟返回1/10/20241162、串行口方式1的发送和接收例7-4:89C51串行口按双工方式收发ASCII字符最高位用来作奇偶校验位,采用奇校验方式,要求传送的波特率为1200b/s。编写有关的通信程序。返回1/10/2024117解:7位ASCII码加1位奇校验共8位数据,故可采用串行口方式1。89C51单片机的奇偶校验位P是当累加器A中1的数目为奇数时,P=1。如果直接把P的值放入ASCII码的最高位,恰好成了偶校验,与要求不符。因此,要把P的值取反以后放入ASCII码最高位,才是要求的奇校验。返回1/10/2024118双工通信要求收、发能同时进行。实际上,收、发操作主要是在串行接口进行,CPU只是把数据从接收缓冲器读出和把数据写入发送缓冲器。

数据传送用中断方式进行,响应中断以后通过检测是RI置位还是TI置位来决定CPU是进行发送操作还是接收操作。返回1/10/2024119发送和接收都通过调用子程序来完成,设:发送数据区的首地址为20H,接收数据区的首地址为40H,fosc为6MHz,通过查波特率初值〔P163表7-2〕可知定时器的初装值为0F3H。定时器T1采用工作模式2,可以防止计数溢出后用软件重装定时初值的工作。返回1/10/2024120程序清单:主程序MOVTMOD,#20H;定时器1设为模式2:P132MOVTL1,#0F3H;定时器初值MOVTH1,#0F3H;8位重装值SETBTR1;启动定时器1返回1/10/2024121MOVSCON,#50H;将串行口设置为方式1,;REN=1:P154MOVR0,#20H;发送数据区首址MOVR1,#40H;接收数据区首址ACALLSOUT;先输出一个字符SETBES;P118SETBEASJMP$;等待中断

返回1/10/2024122中断效劳程序ORG0023H;串行口中断入口AJMPSBR1;转至中断效劳程序ORG0100HSBR1:JNBRI,SEND;TI=1,为发送中断ACALLSIN;RI=1,为接收中断SJMPNEXT;转至统一的出口SEND:ACALLSOUT;调用发送子程序NEXT:RETI;中断返回返回1/10/2024123发送子程序SOUT:CLRTIMOVA,@R0;取发送数据到AMOVC,P;奇偶标识赋予CCPLC;奇校验MOVACC.7,C;加到ASCII码高位INCR0;修改发送数据指针MOVSBUF,A;发送ASCII码RET;返回返回1/10/2024124接收子程序

SIN:CLRRI MOVA,SBUF;读出接收缓冲区内容 MOVC,P;取出校验位 CPLC;奇校验 ANLA,#7FH;删去校验位 MOV@R1,A;读入接收缓冲区 INCRI;修改接收数据指针 RET;返回返回1/10/2024125假设在主程序中已初始化REN=1,那么允许接收。以上程序根本上具备了全双工通信的能力,但不能说很完善。例如:再接收子程序中,虽然检验了奇偶校验位,但没有进行出错处理;另外,发送和接收数据区的范围都很有限,也不能满足实际需要。但有了一个根本的框架之后,逐渐完善还是可以做到的。返回1/10/2024126例7-5:采用查询方式由串行口发送带奇偶校验位的数据块。解:本例由内部RAM单元20H-3FH取出ASCII码数据,在最高位上加奇偶校验位后由串行口发出。采用8位异步通信方式,波特率为1200b/s,fosc=11.059MHz。由要求可知,应把串行口设置为方式1,采用定时器1模式2作为波特率发生器,预置值〔TH1〕=0E8H。返回1/10/2024127程序清单:主程序;MOVTMOD,#20H;设置定时器1为模式2:P132MOVTL1,#0E8H;初值,波特率为1200b/sMOVTH1,#0E8HSETBTR1 ;启动T1运行MOVSCON,#01000000B;设置串行口为方式1MOVR0,#20HMOVR7,#32;数据块长度返回1/10/2024128LOOP:MOVA,@R0ACALLSP-OUTJNBP,ERROR;传输出错处理,P83;由SP-OUT中“CPLC〞结果断定INCR0DJNZR7,LOOP;P77 ……返回1/10/2024129串行口发送子程序〔奇校验〕SP-OUT:MOVC,PSW.0;设置奇校验位;校验位P=1为奇校验CPLC;奇校验(无此指令为偶校验)MOVACC.7,C;ACC.7补0或1MOVSBUF,A;启动串行口发送过程CLRTI;清TI标志,允许再发送RETERROR:〔略〕返回1/10/2024130例7-6:由串行口接收带奇偶校验位的数据块。解:采用查询方式,本例与上例相照应,接收器把接收到的32字节数据存放在20H-3FH单元内,波特率同上,假设奇校验出错那么置进位位为1。程序清单:返回1/10/2024131主程序;MOVSCON,#01010000B;设串口方式1,;允许接收MOVTMOD,#20H;设置定时器T1为模式2MOVTL1,#0E8H;初值,波特率为1200b/sMOVTH1,#0E8HSETBTR1 ;启动T1运行MOVR0,#20HMOVR7,#32 ;数据块长度返回1/10/2024132LOOP:ACALLSP-IN ;调接收一帧子程序JCERROR;由SP-IN中“CPLC〞结果断定MOV@R0,A ;存放接收的数据INCR0DJNZR7,LOOP;P77……返回1/10/2024133接收一帧子程序;SP-IN:JNBRI,$ ;RI由硬件置位CLRRI ;软件去除RIMOVA,SBUFMOVC,P;检查奇校验位CPLC;置C为主程序“JCERROR〞用ANLA,#7FH;去掉奇校验位RETERROR: 〔略〕返回1/10/2024134例7-7:利用串行口和堆栈技术发送字符串常量。解:上面两个例子中,发送和接收的都是一些变量数据,且存放在内部RAM单元中。现说明如何利用堆栈技术发送存放在程序存储器内的字符串常量。下面的例子中,这些字符串是发送给CRT终端的以回车符〔CR〕和换行符〔LF〕开始,以换码符〔ESC〕为结尾。下面是程序片断:返回1/10/2024135CREQU0DH;ASCII回车符:P108LFEQU0AH;ASCII换行符ESCEQU1BH;ASCII换码符……MOVTMOD,#20H;设置定时器T1为模式2MOVTL1,#0FDH;设波特率为9600b/s;(fosc=11.059MHz)MOVTH1,#0FDH

SETBTR1;启动T1运行返回1/10/2024136MOVSCON,#01000000B;设置串行口方式1ACALLXSTRING;P79DBCR,LF;P109DB‘NU&BIAA’;字符串常量DBESC……XSTRING:POPDPH;把第1个字符的地址POPDPL;装入DPTRXSTR-1:CLRA;设偏移量为零MOVCA,@A+DPTR;取第1个字符返回1/10/2024137XSTR-2:MOVSBUF,A;启动一帧发送过程JNBTI,$;等待发送一帧完CLRTIINCDPTR;指向下一字符CLRA;偏移量为0MOVCA,@A+DPTR;取下一字符CJNEA,#ESC,XSTR-2;读到ESC符时,停止发送MOVA,#1JMP@A+DPTR;返回执行ESC符后的一条指令;即接着执行背景程序返回1/10/2024138说明:程序中采用了“ACALLXSTRING〞指令,而实际上由XSTRING开始的程序段形式上并不构成一个子程序,因为子程序应由RET作为结尾。采用ACALL指令的目的在于利用子程序调用协议,即执行调用指令后,把一个单元〔存放常量CR〕的地址压入了堆栈。返回1/10/2024139这样,XSTRING段的第1,2条指令执行后,就把放置字符常量CR的单元地址置入DPTR了。ESC后一个单元应是背景程序中送完字符串后要执行的那条指令,故执行完XSTRING程序段的最后2条指令,将继续执行背景程序。返回1/10/20241403、串行口方式2、方式3的发送和接收串行口方式2与方式3根本一样〔只是波特率设置不同〕,接收/发送11位信息:开始为1位起始位〔0〕,中间8位数据位,数据位之后为1位程控位〔由用户置SCON的TB8决定〕,最后是1位停止位〔1〕。只比方式1多了一位程控位。返回1/10/2024141例7-8:用第9个数据位作奇偶校验位,编制串行口方式2的发送程序。解:设计一个发送程序:要求:将片内RAM50H~5FH中的数据串行发送;

串行口设定为方式2状态,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时,第9位数据作奇偶校验用。方式2发送程序流程图:P171图7-19返回1/10/2024142图7-19程序流程图1/10/2024143程序清单如下:TRT:MOVSCON,#80H(10000000);方式2设定MOVPCON,#80H;取波特率为fosc/32 MOVR0,#50H ;首地址50H→R0MOVR7,#10H ;数据长度10H→R7LOOP:MOVA,@R0;取数据→A MOVC,PSW.0;P→TB8 MOVTB8,C MOVSBUF,A;数据→SBUF,启动发送返回1/10/2024144WAIT:JBCTI,CONT;判断发送中断标志 SJMPWAITCONT:INCR0 DJNZR7,LOOP RET返回1/10/2024145例7-9编制一个串行口方式2接收程序,并核对奇偶校验位。解:根据上面介绍的特点,在方式2、方式3的发送过程中,将数据和附加在TB8中的奇偶位一起发向对方。因此,作为接收的一方应设法取出该奇偶位进行核对,相应的接收程序段为:返回1/10/2024146RRR:MOVSCON,#90H(10010000);选方式2;并允许接收(REN=1):P154LOOP:JBCRI,RECEIV;等待接收数据并清RI SJMPLOOPRECEIV:MOVA,SBUF;将接收到的字符取出后,送到ACC ;传送指令影响PSW,产生接收端的奇偶值 JBPSW.0,ONE;判断接收端的奇偶值 JBRB8,ERR ;判断发送端的奇偶值 SJMPRIGHTONE:JNBRB8,ERR返回1/10/2024147RIGHT: …… ;接收正确 ……ERR: …… ;接收有错当接收到一个字符时,从SBUF转移到ACC中时会产生接收端的奇偶值,P59而保存在RB8中的值为发送端的奇偶值,两个奇偶值应相等,否那么接收字符有错。发现错误要及时通知对方重发。返回1/10/2024148例7-10:编制一个发送程序。将片内RAM中50H—5FH的数据串行发送。串行口设定为工作方式2,TB8作奇偶校验位。解:在数据写入发送SBUF之前,先将数据的奇偶标志P写入TB8,此时,第9位数据便可作奇偶校验用。可采用查询和中断两种方式发送。返回1/10/2024149〔1〕采用查询方式的程序段 ORG0000H AJMPMAIN ;上电,转向主程序 ORG0100H;主程序MAIN:MOVSCON,#80H;设工作方式2:P154 MOVPCON,#80H;取波特率为fosc/32 MOVR0,#50H;首址50H送R0 MOVR7,#10H;数值长度送R7返回1/10/2024150LOOP:MOVA,@R0;取数据 MOVC,PSW.0;P→C MOVTB8,C;奇偶标志送TB8 MOVSBUF,A;发送数据WAIT:JBCTI,CONT AJMPWAIT;等待中断标志TI=1CONT:INCR0 DJNZR7,LOOP;数值尚未发送完,;继续发送下一个数据 SJMP$ END返回1/10/2024151〔2〕采用中断方式的程序段ORG0000HAJMPMAIN;上电,转向主程序ORG0023H;串行口的中断入口地址AJMPSERVE;转向中断效劳程序

返回1/10/2024152ORG0100H;主程序MAIN:MOVSCON,#80H(10000000);P154MOVPCON,#80H(10000000)MOVR0,#50HMOVR7,#10HSETBES;允许串行口中断:P118SETBEA;CPU允许中断MOVA,@R0MOVC,PSW.0;P→CMOVTB8,CMOVSBUF,A;发送第一个数据SJMP$返回1/10/2024153SERVE:CLRTI;去除发送中断标志INCR0;修改数据地址MOVA,@R0MOVC,PSW.0;P→CMOVTB8,CMOVSBUF,A;发送数据DJNZR7,ENDT;判断数据块发送完否;假设未发送完,那么转ENDTCLRES;假设发送完,那么禁止串行口中断ENDT:RETI;中断返回END返回1/10/2024154例7-11:编制一个接收程序,将接收的16字节数据送入片内RAM的50H—5FH单元中。设串行口工作于方式3,波特率为2400b/s。解:方式3为11位异步通信方式,

波特率取决于TI的溢出率。查P163表7-2可知:当晶振为11.059MHz,波特率为2400b/s时,可取SMOD=0,T1的计数初值为0F4H。返回1/10/2024155源程序如下:MAIN:MOVTMOD,#20H;设TI工作于模式2 MOVTH1,#0F4H;赋循环计数初值MOVTL1,#0F4H ;赋计数值 SETBTR1;启动定时器TI MOVR0,#50H;首地址送R0 MOVR7,#10H;数据长度送R7 MOVSCON,#0D0H;串行口工作于;方式3,可接收 MOVPCON,#00H;设SMOD=01/10/2024156WAIT:JBCRI,PR1;接收完一帧数据,;清RI,转PR1 SJMPWAIT;否那么等待PR1:MOVA,SBUF;读入数据JNBP,PNP;P=0,转PNPJNBRB8,PER;P=1,RB8=0,转出错处理SJMPRIGHTPNP:JBRB8,PER;P=0,RB8=1,转出错处理1/10/2024157

RIGHT:MOV@R0,A;数据送内存 INCR0 ;修改地址指

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论