第七章 89C51串行口及串行通信技术 本书前几章涉及的数据传送都是采用并行方式,如8051与存储器,存储器与存储器,8051与并行打印机之间的通信。89C51处理8位数据,若以并行传送方式一次传送一个字节的数据,至少需要8条数据线。当89C51与打印机连接时,除8条数据线外,还需要状态、应答等控制线。一些微机系统,如IBM-PC系列机,由于磁盘机、CRT、打印机与主机系统的距离有限,所以,使用多条电缆线以提高数据传送速度还是合算的。但是,计算机之间、计算机与其终端之间的距离有时非常远,此时,电缆线过多是不经济的 2018年12月4日星期二
第七章 89C51串行口及串行通信技术 串行通信只用一位数据线传送数据的位信号,即使加上几条通信联络控制线,也用不了很多电缆线。因此,串行通信适合远距离数据传送,如大型主机与其远程终端之间、处于两地的计算机之间采用串行通信就非常经济。当然,串行通信要求有转换数据格式、时间控制等逻辑电路,这些电路目前已被集成在大规模集成电路中(称为可编程串行通信控制器),使用很方便。 2018年12月4日星期二
第七章 89C51串行口及串行通信技术 本章将介绍89C51串行口的结构及应用,PC机与89C51间的双机通信,一台PC机控制多台89C51前沿机的分布式系统,以及通信接口电路和软件设计,并给出设计实例,包括接口电路、程序框图、主程序和接收/发送子程序。 2018年12月4日星期二
第七章 89C51串行口及串行通信技术 7.1 串行通信基本知识 7.2 串行口及应用 7.3 RS-232C标准接口总线及串行通信硬件设计 7.1 串行通信基本知识 7.2 串行口及应用 7.3 RS-232C标准接口总线及串行通信硬件设计 7.4 89C51与89C51点对点异步通信 7.5 89C51与PC机间通信软件的设计 7.6 PC机与多个单片机间的通信 7.7 思考题与习题 返回 2018年12月4日星期二
7.1 串行通信基本知识 7.1.1 数据通信 7.1.2 串行通信的传输方式 7.1.3 异步通信和同步通信 7.1 串行通信基本知识 7.1.1 数据通信 7.1.2 串行通信的传输方式 7.1.3 异步通信和同步通信 7.1.4 串行通信的过程及通信协议 返回 2018年12月4日星期二
7.1.1数据通信 在实际工作中,计算机的CPU与外部设备之间常常要进行信息交换,一台计算机与其他计算机之间也往往要交换信息,所有这些信息交换均可称为通信。 通信方式有两种,即并行通信和串行通信。 通常根据信息传送的距离决定采用哪种通信方式。 例如,在IBM-PC机与外部设备(如打印机等)通信时,如果距离小于30m,可采用并行通信方式;当距离大于30m时,则要采用串行通信方式。89C51单片机具有并行和串行二种基本通信方式。 返回 2018年12月4日星期二
7.1.1数据通信 并行通信是指数据的各位同时进行传送(发送或接收)的通信方式。 其优点是传送速度快; 缺点是数据有多少位,就需要多少根传送线。 例如,89C51单片机与打印机之间的数据传送就属于并行通信。 图7-1(a)所示为89C51与外设间8位数据并行通信的连接方法。并行通信在位数多、传送距离又远时就不太合适了。 返回 2018年12月4日星期二
7.1.1数据通信 串行通信指数据是一位一位按顺序传送的通信方式。 它的突出优点是只需一对传输线(利用电话线就可作为传输线),这样就大大降低了传送成本,特别适用于远距离通信; 其缺点是传送速度较低。假设并行传送N位数据所需时间位T,那么串行传送的时间至少为NT,实际上总是大于NT的。 图7-1(b)所示为串行通信方式的连接方法。 返回 2018年12月4日星期二
图7-1 数据通信方式 返回 2018年12月4日星期二
7.1.2串行通信的传输方式 串行通信的传送方向通常有三种: 单向(或单工)配置,只允许数据向一个方向传送; 半双向(或半双工)配置,允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送; 全双向(全双工)配置,允许同时双向传送数据,因此,全双工配置是一对单向配置,它要求两端的通信设备都具有完整和独立的发送和接受能力。 图7-2所示为串行通信中的数据传送方式。 返回 2018年12月4日星期二
图7-2 串行通信中的数据传送方式 返回 2018年12月4日星期二
7.1.3异步通信和同步通信 串行通信有两种基本通信方式,即异步通信和同步通信。 1、异步通信 在异步通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的,每一帧的数据格式如图7-3所示 返回 2018年12月4日星期二
图7-3 异步通信数据格式 返回 2018年12月4日星期二
1、异步通信 在帧格式中,一个字符由四个部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始为(0),然后是5位--8位数据(规定低位在前,高位在后),接下来是奇偶校验位(可省略),最后是停止位(1)。 返回 2018年12月4日星期二
1、异步通信 起始位(0)信号只占用一位,用来通知接收设备一个待接收的字符开始到达。线路上在不传送字符时应保持为1。接收端不断检测线路的状态,若连续为1以后又测到一个0,就知道发来一个新字符, 应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。 起始位后面紧接着是数据位,它可以是5位(D0--D4)、6位、7位或8位(D0--D7)。 奇偶校验(D8)只占一位,但在字符中也可以规定不用奇偶校验位,则这一位就可省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址/数据等)。 停止位用来表征字符的结束,它一定是高电位(逻辑1)。停止位可以是1位、1.5位或2位。接收端收到停止位后,知道上一字符已传送完毕,同时,也为接收下一个字符做好准备--只要再接收到0,就是新的字符的起始位。若停止位以后不是紧接着传送下一个字符,则使线路电平保持为高电平(逻辑1)。 返回 2018年12月4日星期二
1、异步通信 图7-3(a)表示一个字符紧接一个字符传送的情况,上一个字符的停止位和下一个字符的起始位是紧邻的; 图7-3(b)则是两个字符间有空闲位的情况,空闲位为1,线路处于等待状态。存在空闲位正是异步通信的特征之一。 例如,规定用ASCII编码,字符为七位,加一个奇偶校验位、一个起始位、一个停止位,则一帧共十位。 返回 2018年12月4日星期二
2、同步通信 同步通信中,在数据开始传送前用同步字符来指示(常约定1个--2个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。 同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,仅在数据块开始时用同步字符SYNC来指示,其数据格式如图7-4所示。 返回 2018年12月4日星期二
图7-4 异步通信数据格式 返回 2018年12月4日星期二
2、同步通信 同步字符的插入可以是单同步字符方式或双同步字符方式,如图7-4所示,然后是连续的数据块。同步字符可以由用户约定,当然也可以采用ASCII码中规定的SYNC代码,即16H。按同步方式通信时,先发送同步字符,接收方检测到同步字符后,即准备接收数据。 在同步传送时,要求用时钟来实现发送端与接收端之间的同步。为了保证接收正确无误,发送方除了传送数据外,还要同时传送时钟信号。 同步传送可以提高传输速率(达56kb/s或更高),但硬件比较复杂。 返回 2018年12月4日星期二
3、波特率(Baud rate) 10b/字符×120字符/s=1200b/s 波特率对于CPU与外界的通信是很重要的。 假设数据传送速率是120字符/s,而每个字符格式包含1个代码位(1个起始位、1个终止位、8个数据位)。这时,传送的波特率为: 10b/字符×120字符/s=1200b/s 返回 2018年12月4日星期二
3、波特率(Baud rate) Td=1b/(1200bs-1)=0.833ms 每一位代码的传送时间Td为波特率的倒数。 异步通信的传送速率在50b/s--19200b/s之间,常用于计算机到终端机和打印机之间的通信、直通电报以及无线电通信的数据发送等。 返回 2018年12月4日星期二
7.1.4串行通信的过程及通信协议 1、串←→并转换与设备同步 两个通信设备在串行线路上成功地实现通信必须解决两个问题: 一是串←→并转换,即如何把要发送的并行数据串行化,把接收的串行数据并行化; 二是设备同步,即同步发送设备与接收设备的工作节拍,以确保发送数据在接收端被正确读出。 返回 2018年12月4日星期二
1、串←→并转换与设备同步 (1)串←→并转换 串行通信是将计算机内部的并行数据转换成串行数据,将其通过一根通信线传送;并将接收的串行数据再转换成并行数据送到计算机中。 返回 2018年12月4日星期二
1、串←→并转换与设备同步 在计算机串行发送数据之前,计算机内部的并行数据被送入移位寄存器并一位一位地输出,将并行数据转换成串行数据。如图7-5所示。 在接收数据时,来自通信线路的串行数据被压入移位寄存器,满8位后并行送到计算机内部。 如图7-6所示。 在串行通信控制电路中,串--并、并--串转换逻辑被集成在串行异步通信控制器芯片中。89C51单片机的串行口和IBM-PC相同。 返回 2018年12月4日星期二
图7-5 返回 2018年12月4日星期二
图7-6 返回 2018年12月4日星期二
(2)设备同步 进行串行通信的两台设备必须同步工作才能有效地检测通信线路上的信号变化,从而采样传送数据脉冲。 设备同步对通信双方有两个共同要求: 一是通信双方必须采用统一的编码方法; 二是通信双方必须能产生相同的传送速率。 返回 2018年12月4日星期二
(2)设备同步 采用统一的编码方法确定了一个字符二进制表示值的位发送顺序和位串长度,当然还包括统一的逻辑电平规定,即电平信号高低与逻辑1和逻辑0的固定对应关系。 通信双方只有产生相同的传送速率,才能确保设备同步,这就要求发送设备和接收设备采用相同频率的时钟。发送设备在统一的时钟脉冲上发出数据,接收设备才能正确检测出与时钟脉冲同步的数据信息。 返回 2018年12月4日星期二
2、串行通信协议 通信协议是对数据传送方式的规定,包括数据格式定义和数据位定义等。 通信双方必须遵守统一的通信协议。串行通信协议包括同步协议和异步协议两种。 在此只讨论异步串行通信协议和异步串性协议规定的字符数据的传送格式。 返回 2018年12月4日星期二
2、串行通信协议 (1)起始位 通信线上没有数据被传送时处于逻辑1状态。 当发送设备要发送一个字符数据时,首先发出一个逻辑0信号,这个逻辑低电平就是起始位。 起始位通过通信线传向接收设备,接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。 起始位所起的作用就是设备同步,通信双方必须在传送数据位前协调同步。 返回 2018年12月4日星期二
2、串行通信协议 (2)数据位 当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5、6、7或8。IBM-PC中经常采用7位或8位数据传送,89C51串行口采用8位或9位数据传送。这些数据位被接收到移位寄存器中,构成传送数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接收设备中被转换为并行数据。 返回 2018年12月4日星期二
2、串行通信协议 (3)奇偶校验位 数据位发送完之后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通信双方需约定已知的奇偶校验方式。如果选择偶校验,那么组成数据位和奇偶位的逻辑1的个数必须是偶数;如果选择奇校验,那么逻辑1的个数必须是奇数。 返回 2018年12月4日星期二
2、串行通信协议 (4)停止位约定 在奇偶位或数据位(当无奇偶校验时)之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位,1.5位或2位的高电平。接收设备收到停止位之后,通信线路上便又恢复逻辑1状态,直至下一个字符数据的起始位到来。 返回 2018年12月4日星期二
2、串行通信协议 (5)波特率设置 通信线上传送的所有位信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,这个速度叫波特率。如果数据以300个二进制位每秒在通信线上传送,那么传送速度为300波特,通常记为300b/s。 返回 2018年12月4日星期二
2、串行通信协议 (6)挂钩(握手)信号约定 (见本章7.4节实例) 返回 2018年12月4日星期二
7.2 串行口及应用 此串行接口是一个全双工串行通信接口,即能同时进行串行发送和接收数据。 7.2 串行口及应用 89C51单片机除具有4个8位并行口外,还具有串行接口。 此串行接口是一个全双工串行通信接口,即能同时进行串行发送和接收数据。 它可以作UATR(通用异步接收和发送器)用,也可以作同步移位寄存器用。 使用串行接口可以实现89C51单片机系统之间点对点的单机通信和89C51与系统机(如IBM-PC机等)的单机或多机通信。 返回 2018年12月4日星期二
7.2 串行口及应用 7.2.1 89C51串行口 7.2.2 89C51串行口的工作方式及应用 返回 2018年12月4日星期二
7.2.1 89C51串行口 1、结 构 2、串行口控制字及控制寄存器 3、串行通信工作方式 4、波特率设计 返回 1、结 构 2、串行口控制字及控制寄存器 3、串行通信工作方式 4、波特率设计 返回 2018年12月4日星期二
1、结 构 89C51通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信。其内部结构简化示意图如图7-7所示。图中有两个物理独立的接收、发送缓冲器SBUF,它们占用同一低值99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。 串行发送与接收的速率与移位时钟同步。89C51用定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)后又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即是波特率。 返回 2018年12月4日星期二
图7-7 串行口内部结构示意简图 返回 2018年12月4日星期二
1、结 构 从图中可看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丢失前一个字节。 串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的。当向SBUF发“写”命令时(执行“MOV SBUF,A”指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。 在满足串行口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOV A,SBUF”命令),便由接收缓冲器(SBUF)取出信息通过89C51内部总线送CPU。 对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误,一般不需要用双缓冲器结构来保持最大传送速率。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 89C51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功能寄存器SCON(98H)和电源控制寄存器PCON(87H)中即可。 (1)SCON(98H) 89C51串行通信的方式选择、接收和发送控制以及串行口的状态标志等均由特殊功能寄存器SCON控制和指示,其控制字格式如图7-8所示。 返回 2018年12月4日星期二
图7-8 串行口控制寄存器SCON 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 ①SM0和SM1(SCON.7,SCON.6)——串行口工作方式选择位。两个选择位对应4种通信方式,如表7-1所示。其中,fosc是振荡频率。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 ②SM2(SCON.5)——多机通信控制位,主要用于方式2和方式3。 若置SM2=1,则允许多机通信。当一片89C51(主机)与多片89C51(从机)通信时,所有从机的SM2位都置1。主机首先发送的一帧数据为地址,即从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。 各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机清除SM2以接收主机发来的一帧数据。其他从机仍然保持SM2=1。 若SM2=0,即不属于多机通信情况,则接收一贞数据后,不管第九位数据是0还是1,都制RI=1,接收到的数据装入SBUF。 根据SM2这个功能,可实现多个89C51应用系统的串行通信。 在方式1时,若SM2=1,则只有接收到有效停止位时,RI才制1,以便接收下一贞数据。在方式0时,SM2必须是0。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 ③REN(SCON.4)——允许接收控制位。由软件置1或清0,只有当REN=1时才允许接收,相当于串行接收的开关;若REN=0,则禁止接收。 在串行通信接收控制过程中,如果满足RI=0和REN=1(允许接收)的条件,就允许接收,一帧数据就装载入接收SBUF中。 ④TB8(SCON.3)——发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需要由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可在多机通信中作为发送地址帧或数据帧的标志位。对于后者,TB8=1,说明该帧数据为地址;TB8=0,说明该帧数据为数据字节。在方式0或方式1中,该为未用。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 ⑤RB8(SCON.2)——接收数据的第9位。在方式2或方式3中,接收到的第9位数据放在RB8位。它或是约定的奇/偶校验位,或是约定的地址/数据标识位。在方式2和方式3多机通信中,若SM2=1,如果RB8=1,说明收到的数据为地址帧。 在方式1中,若SM2=0(即不是多机通信情况),RB8中存放的是已接收到的停止位。在方式0中,该位未用。 ⑥TI(SCON.1)——发送中断标志。在一帧数据发送完时被置位。在方式0串行发送第8位结束或其他方式串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断,TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须由软件清0。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 ⑦RI(SCON.0)——接收中断标志。在节收到一帧有效数据后由硬件置位。在方式0中,第8位数据发送结束时,由硬件置位;在其他三种方式中,当接收到停止位中间时由硬件置位。RI=1,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据。CPU响应中断,取走数据。RI也必须由软件清0,清除中断申请,并准备接收下一帧数据。 串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。 复位时,SCON所有位均清0。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 (2)PCON(87H) 电源控制寄存器PCON中只有SMOD位与串行口工作有关,如图7-9所示。 返回 2018年12月4日星期二
2、串行口控制字及控制寄存器 SMOD(PCON.7)——波特率倍增位。 在串行口方式1、方式2和方式3时,波特率和SMOD成正比,亦即当SMOD=1时,波特率提高一倍。 复位时,SMOD=0。 返回 2018年12月4日星期二
3、串行通信工作方式 根据实际需要,89C51串行口可设置4种工作方式,可有8位、10位或11位帧格式。 方式0以8位数据为一帧,不设起始位和停止位,先发送或接收最低位。其帧格式如下: 返回 2018年12月4日星期二
3、串行通信工作方式 方式1以10位为一帧传输,设有1个起始位(0),8个数据位和1个停止位(1)。其帧格式为: 返回 2018年12月4日星期二
3、串行通信工作方式 方式2和方式3以11位为1帧传输,设有1个起始位(0),8个数据位,1个附加第9位和1个停止位(1)。其帧格式为: 附加第9位(D8)由软件置1或清0。发送时在TB8中,接收时送RB8中。 返回 2018年12月4日星期二
3、串行通信工作方式 方式0为同步移位寄存器输入/输出方式,常用于扩展I/O口。 (1)串行口方式0 方式0为同步移位寄存器输入/输出方式,常用于扩展I/O口。 串行数据通过RXD输入或输出,而TXD用于输出移位时钟,作为外接部件的同步信号。 图7-10(a)为发送电路,图7-11(a)为接收电路。 这种方式不适用于两个89C51之间的直接数据通信,但可以通过外接移位寄存器来实现单片机的接口扩展。 返回 2018年12月4日星期二
图7-10 方式0发送电路及时序 返回 2018年12月4日星期二
图7-11 方式0接收电路及时序 返回 2018年12月4日星期二
例如,74LS164可用于扩展并行输出口,74LS165可用于扩展输入口。 3、串行通信工作方式 例如,74LS164可用于扩展并行输出口,74LS165可用于扩展输入口。 在这种方式下,收/发的数据为8位,低位在前,无起始位、奇偶校验位及停止位,波特率是固定的。 返回 2018年12月4日星期二
3、串行通信工作方式 发送过程中,当执行一条将数据写入发送缓冲器SBUF(99H)的指令时,串行口把SBUF中8位数据以fosc/12的波特率从RXD(P3.0)端输出,发送完毕置中断标志TI=1。方式0发送时序如图7-10(b)所示。写SBUF指令在S6P1处产生一个正脉冲,在下一个机器周期的S6P2处数据的最低位输出到RXD(P3.0)脚上;再在下一个机器周期的S3,S4,S5输出移位时钟为低电平,而在S6级下一个机器周期的S1,S2为高电平,就这样讲8位数据由低位至高位一位一位顺序通过RXD线输出,并在TXD脚上输出fosc/12的移位时钟,在“写SBUF”有效后的第10个机器周期的S1P1将发送中断标志TI置位。图中,74LS164是TTL“串入并出”移位寄存器。 返回 2018年12月4日星期二
3、串行通信工作方式 接收时,用软件置REN=1(同时,RI=0),即开始接收。接收时序如图7-11(b)所示。当使SCON中的REN=1(RI=0)时,产生一个正脉冲,在下一个机器周期的S3P1~S5P2,从TXD(P3.1)脚上输出低电平的移位时钟,在此机器周期的S5P2对P3.0脚采样,并在本机器周期的S6P2通过串行口内的输入移位寄存器将采样值移位接收;在同一个机器的S6P1到下一个机器周期的S2P2,输出移位时钟为高电平。于是,讲述句字节从地位至高位一位一位地接收下来病状如SBUF中,在启动接收过程(即写SCON,清RI位)将SCON中的RI清0之后的第10个机器周期的S1P1,RI被置位。这一帧数据接收完毕,可进行下一帧接收。图7-11(b)中,74LS165是TTL“并入串出”移位寄存器,QH端为74LS165的串行输出端,经P3.0输入至89C51。 返回 2018年12月4日星期二
3、串行通信工作方式 (2)串行口方式1 方式1真正用于串行发送或接收,为10位通用异步接口。TXD与RXD分别用于发送与接收数据。 收发一帧数据的格式为1位起始位、8位数据位(低位在前)、1位停止位,共10位。 在接收时,停止位进入SCON的RB8,此方式的传送波特率可调。 串行口方式1的发送和接收时序如图7-12(a)和(b)所示 返回 2018年12月4日星期二
图7-12 方式1发送和接收时序 返回 2018年12月4日星期二
3、串行通信工作方式 方式1发送时,数据从引脚TXD(P3.1)端输出。当执行数据写入发送缓冲器SBUF的命令时,就启动了发送器开始发送。发送时的定时信号,也就是发送移位时钟(TX时钟),是由定时器T1(见图7-7)送来的溢出信号经过16分频或32分频(取决于SMOD的值)而得到的,TX时钟就是发送波特率。可见,方式1的波特率是可变的。发送开始的同时,SEND变为有效,将起始位向TXD输出;此后每经过一个TX时钟周期(16分频计数器溢出一次为一个时钟周期,因此,TX时钟频率由波特率决定。)产生一个移位脉冲,并由TXD输出一个数据位;8位数据位全部发送完后,置为位TI,并申请中断置TXD为1作为停止位,再经一个时钟周期,SEND失效。 返回 2018年12月4日星期二
3、串行通信工作方式 方式1接收时,数据从引脚RXD(P3.0)端输入。接收是在SCON寄存器中REN位置1的前提下,并检测到起始位(RXD上检测到1→0的跳变,即起始位)而开始的。接收时,定时信号有两种(如图7-12(b)所示):一种是接收移位时钟(RX时钟),它的频率和传送波特率相同,也是由定时器T1的溢出信号经过16或32分频而得到的;另一种是位检测器采样脉冲,它的频率是RX时钟的16倍,亦即在一位数据期间有16位检测器采样脉冲,为完成检测,以16倍于波特率的速率对RXD进行采样。 返回 2018年12月4日星期二
3、串行通信工作方式 为了接受准确无误,在正式接受数据之前,还必须判定这个1→0跳变是否是干扰引起的。为此,在这位中间(即一位时间分成16等份,在第7,第8及第9等份)连续对RXD采样三次,取其中两次相同的值进行判断。这样能较好地消除干扰的影响。当确认是真正的起始位(0)后,就开始接受一帧数据。当一帧数据接受完毕后,必须同时满足以下两个条件,这次接受才真正有效。 返回 2018年12月4日星期二
3、串行通信工作方式 ①RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中数据已被取走。由软件使RI=0,以便提供“接收SBUF已空”的信息。 ②SM2=0或收到的停止位为1(方式1时,停止位进入RB8),则将接收到的数据装入串行口的SBUF和RB8(RB8装入停止位),并置位RI;如果不满足,接收到的数据不能装入SBUF,这意味着该帧信息将会丢失。 值得注意的是,在整个接收过程中,保证REN=1是一个先决条件。只有当REN=1时,才能对RXD进行检测。 返回 2018年12月4日星期二
3、串行通信工作方式 (3)串行口方式2和方式3 串行口工作在方式2和方式3均为每帧11位异步通信格式,由TXD和RXD发送与接收(两种方式操作是完全一样的,所不同的只是波特率)。 每帧11位,即1位起始位,8位数据位(低位在前),1位可编程的第9数据位和1位停止位。发送时,第9数据位(TB8)可以设置为1或0,也可将奇偶位装入TB8,从而进行奇偶校验;接收时,第9数据位进入SCON的RB8。 方式2和方式3的发送、接收时序如图7-13所示。其操作与方式1类似。 返回 2018年12月4日星期二
图7-13 方式2、方式3发送和接收时序 返回 2018年12月4日星期二
3、串行通信工作方式 发送前,先根据通信协议由软件设置TB8(如作奇偶校验位或地址/数据标志位),然后将要发送的数据写入SBUF,即可启动发送过程。串行口能自动把TB8取出,并装入到第9位数据位的位置,再逐一发送出去。发送完毕,使TI=1。 接收时,使SCON中的REN=1,允许接收。当检测到RXD(P3.0)端有1→0的跳变(起始位)时,开始接收9位数据,送入移位寄存器(9位)。当满足RI=0且SM2=0,或接收到的第9位数据为1时,前8位数据送入SBUF,附加的第9位数据送入SCON中的RB8,置RI为1;否则,这次接收无效,也不置位RI。 返回 2018年12月4日星期二
4、波特率设计 在串行通信中,收发双方对发送或接收的数据速率有一定的约定,通过软件对89C51串行口编程可约定四种工作方式。其中,方式0和方式2的波特率是固定的;而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。 串行口的四种工作方式对应着三种波特率。由于输入的移位时钟来源不同,因此,各种方式的波特率计算公式也不同。 返回 2018年12月4日星期二
4、波特率设计 图7-14 串行口方式0波特率的产生 (1)方式0的波特率 由图7-14可见,方式0时,发送或接收一位数据的移位时钟脉冲由S6(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。因此,波特率固定为振荡频率的1/12,并不受PCON寄存器中SMOD位的影响。 图7-14 串行口方式0波特率的产生 返回 2018年12月4日星期二
4、波特率设计 方式0波特率 ≌ fosc / 12 注意,符号“≌”表示左面的表达式只是引拥右面表达式的数值,即右面的表达式是提供了一种计算的方法。 返回 2018年12月4日星期二
4、波特率设计 即方式2波特率≌2SMOD/64×fosc (2)方式2的波特率 图7-15 串行口方式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 图7-15 串行口方式2波特率的产生 返回 2018年12月4日星期二
4、波特率设计 图7-16 串行口方式1、方式3波特率的产生 (3)方式1和方式3的波特率 方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定,如图7-16所示。因此,89C51串行口方式1和方式3的波特率由定时器T1的溢出率与SMOD值同时决定。即方式1、方式3波特率≌T1溢出率/n 图7-16 串行口方式1、方式3波特率的产生 返回 2018年12月4日星期二
方式1、方式3波特率≌2SMOD/32×(T1溢出速率) 4、波特率设计 当SMOD=0时,n=32;SMOD=1时,n=16。所以,可用下式确定方式1和方式3的波特率: 方式1、方式3波特率≌2SMOD/32×(T1溢出速率) 其中,T1溢出速率取决于T1的计数速率(计数速率≌fosc/12)和T1预置的处置。 若定时器T1采用模式1时,波特率公式如下: 串行方式1、方式3波特率≌2SMOD/32×(fosc/12)/(216-初值) 返回 2018年12月4日星期二
4、波特率设计 表7-2列出了串行口方式1、方式3常用波特率及其初值。 定时器T1用作波特率发生器时,通常选用定时器模式2(自动重装初值定时器)比较实用。要设置定时器T1为定时方式(使C/T=0),让T1计数内部振荡脉冲,即计数速率为fosc/12(注意应禁止T1中断,以免溢出而产生不必要的中断)。先设定TH1和TL1定时即输初值为X,那么每过“28-X”个机器周期,定时器T1就会产生一次溢出。 返回 2018年12月4日星期二
表7-2 常用波特率与其他参数选取关系 返回 2018年12月4日星期二
4、波特率设计 因此,T1溢出速率为 T1溢出速率≌(fosc/12)/(28-X) 于是,可得出定时器T1模式2的初始值X: 返回 2018年12月4日星期二
4、波特率设计 例7-1:89C51单片机时钟振荡频率为11.0592MHz,选用定时器T1工作模式2作为波特率发生器,波特率为2400b/s,求初值。 解:设置波特率控制为(SMOD)=0 所以,(TH1)=(TL1)=F4H。 返回 2018年12月4日星期二
4、波特率设计 系统晶体振荡频率选为11.0592MHz就是为了使初值为整数,从而产生精确的波特率。 如果串行通信选用很低的波特率,可将定时器T1置于模式0或模式1,即13位或16位定时方式;但在这种情况下,T1溢出时,需要中断服务程序重装初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的办法加以调整。 返回 2018年12月4日星期二
7.2.2 89C51串行口的工作方式及应用 如前所述,89C51串行口的工作主要受串行口控制寄存器SCON的控制,另外,也和电源控制寄存器PCON有些关系。SCON寄存器用来控制串行口的工作方式,还有一些其他的控制作用。 89C51单片机串行口的四种工作方式传送的数据位数叙述如下: 返回 2018年12月4日星期二
7.2.2 89C51串行口的工作方式及应用 ①方式0:移位寄存器输入/输出方式。串行数据通过RXD线输入或输出,而TXD线专用于输出时钟脉冲给外部移位寄存器。方式0可用来同步输出或接收8位数据(最低位首先输出),波特率固定为fosc/12,其中,fosc为单片机的时钟频率。 ②方式1:10位异步接收/发送方式。一帧数据包括1位起始位(0),8位数据位和1位停止位(1)。串行接口电路在发送时能自动插入起始位和停止位;在接收时,停止位进入特殊功能寄存器SCON的RB8位。方式1的传送波特率是可变的,可通过改变内部定时器的定时值来改变波特率。 ③方式2:11位异步接收/发送方式。除了1位起始位、8位数据位、1位停止位之外,还可以插入第9位数据位。 ④方式3:同方式2,只是波特率可变。 返回 2018年12月4日星期二
1、串行口方式0的应用 89C51单片机串行口基本上是异步通信接口,但在方式0时是同步操作。外接串入——并出或并入——串出器件,可实现I/O的扩展。 串行口方式0的数据传送可以采用中断方式,也可以采用查询方式。无论哪种方式,都要借助于TI或RI标志。 在串行口发送时,或者靠TI置位后引起中断申请,在中断服务程序中发送下一组数据;或者通过查询TI的值,只要TI为0就继续查询,直到TI为1后结束查询,进入下一个字符的发送。 在串行口接收时,由RI引起中断或对RI查询来决定何时接收下一个字符。无论采用什么方式,在开始串行通信前,都要先对SCON寄存器初始化,进行工作方式的设置。在方式0中,SCON寄存器的初始化只是简单地把00H送入SCON就可以了。 返回 2018年12月4日星期二
1、串行口方式0的应用 例7-2:用89C51串行口外接164串入——并出移位寄存器扩展8位并行口;8位并行口的每位都接一个发光二极管,要求发光二极管从左到右以一定延迟轮流显示,并不断循环。设发光二极管为共阴极接法,如图7-17所示。 解:设数据串行发送采用中断方式,显示的延迟通过调用延迟程序DELAY来实现。 图7-17 返回 2018年12月4日星期二
1、串行口方式0的应用 返回 程序清单: ORG 0023H ;串行口中断入口 AJMP SBR ;转入串行口中断服务程序 MOV SCON ,#00H ;串行口方式0初始化 MOV A ,#88H ;最左一位发光二极管先亮 CLR P1.0 ;关闭并行输出 MOV SBUF,A ;开始串行输出 LOOP : SJMP $ ;等待中断 SBR : SETB P1.0 ;启动并行输出 ACALL DELAY ;显示延迟一段时间 CLR TI ;清发送中断标志 RR A ;准备右边一位显示 CLR P1.0 ;关闭并行输出 MOV SBUF , A ;再一次串行输出 RETI ;中断返回 返回 2018年12月4日星期二
1、串行口方式0的应用 用方式0外加移位寄存器来扩展8位输出口时,要求移位寄存器带有输出控制,否则串行移位过程也会反映到并行输出口;另外,输出口最好再接一个寄存器或锁存器,以免在输出门关闭使(STB=0)输出又发生变化。 用方式0加上并入——串出移位寄存器可扩展一个8位并行输入口。移位寄存器必须带有预置/移位的控制端,由单片机的一个输出端子加以控制,以实现先由8位输入口置数到移位寄存器,然后再串行移位从单片机的串行口输入到接收缓冲器,最后再读入到CPU中。 返回 2018年12月4日星期二
1、串行口方式0的应用 例7-3:用89C51串行口外加移位寄存器165或166扩展8位输入口,输入数据由8个开关提供,另有一个开关K提供联络信号。当K=0时,表示要求输入数据,输入的8位为开关量,提供逻辑模拟子程序的输入信号。如图7-18所示。 图7-18 返回 2018年12月4日星期二
1、串行口方式0的应用 解:串行口方式0的接收要用SCON寄存器中的REN位作为开关来控制。因此,初值化时,除了设置工作方式之外,还要使REN位为1,其余各位仍然为0。 对RI采用查询方式来编写程序,当然,先要查询开关K是否闭合。 程序清单: START: MOV SCON ,#10H ;串行口方式0初始化 JB P1.1 ,$ ;开关K未闭合,等待 SETB P1.0 ;P/S=1,并行置入数据 CLR P1.0 ;PS=0,开始串行移位 JNB RI ,$ ;查询RI CLR RI ;查询结束,清RI MOV A ,SBUF ;读数据到累加器 ACALL LOGSIM ;进行逻辑模拟 SJMP START ;准备下一次模拟 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 例7-4:89C51串行口按双工方式收发ASCII字符,最高位用来作奇偶校验位,采用可校验方式,要求传送的波特率为1200b/s。编写有关的通信程序。 解:7位ASCII码加1位奇校验共8位数据,故可采用串行口方式1。 89C51单片机的奇偶校验位P是当累加器A中1的数目为奇数时,P=1。如果直接把P的值放入ASCII码的最高位,恰好成了奇偶校验,与要求不符。因此,要把P的值取反以后放入ASCII码最高位,才是要求的奇校验。 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 双工通信要求收、发能同时进行。实际上,收、发操作主要是在串行接口进行,CPU只是把数据从接收缓冲器读出和把数据写入发送缓冲器。数据传送用中断方式进行,响应中断以后,通过检测是RI置位还是TI置位来决定CPU是进行发送操作还是接收操作。发送和接收都通过调用子程序来完成,设发送数据区的首地址为20H,接收数据区的首地址为40H,fosc为6MHz,通过查波特率初值(表7-2)可知定时器的初装值为F3H。定时器T1采用工作模式2,可以避免计数溢出后用软件重装定时初值的工作。 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 中断服 ORG 0023H ;串行口中断入口 AJMP SBR1 ;转至中断服务程序 ORG 0100H 程序清单: 主程序 MOV TMOD ,#20H ;定时器1设为模式2 MOV TL1 , #0F3H ;定时器初值 MOV TH1 ,#0F3H ;8位重装值 SETB TR1 ;启动定时器1 MOV SCON ,#50H ;设置为方式1, ;REN=1 MOV R0 ,#20H ;发送数据区首址 MOV R1 ,#40H ;接收数据取首址 ACALL SOUT ;先输出一个字符 SETB ES SETB EA SJMP $ ;等待中断 中断服 ORG 0023H ;串行口中断入口 AJMP SBR1 ;转至中断服务程序 ORG 0100H SBR1: JNB RI ,SEND ;TI=1,为发送中断 ACALL SIN ;RI=1,为接收中断 SJMP NEXT ;转至统一的出口 SEND: ACALL SOUT ;调用发送子程序 NEXT: RETI ;中断返回 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 发送子程序 接收子程序 返回 SOUT: CLR TI SIN: CLR RI MOV A ,@R0 ;取发送数据到A MOV C ,P ;奇偶标识赋予C CPL C ;奇校验 INC R0 ;修改发送数据指针 MOV SBUF ,A ;发送ASCII码 RET ;返回 接收子程序 SIN: CLR RI MOV A ,SBUF ;读出接收缓冲区内容 MOV C ,P ;取出校验位 CPL C ;奇校验 ANL A ,#7FH ;删去校验位 MOV @R1 ,A ;读入接收缓冲区 INC RI ;修改接收数据指针 RET ;返回 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 在主程序中已初始化REN=1,则允许接收。以上程序基本上具备了全双工通信的能力,但不能说很完善。例如,再接收子程序中,虽然检验了奇偶校验位,但没有进行出错处理;另外,发送和接收数据区的范围都很有限,也不能满足实际需要。但有了一个基本的框架之后,逐渐完善还是可以做到的。 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 例7-5:采用查询方式由串行口发送带奇偶校验位的数据块。 解:本理由内部RAM单元20H-3FH取出ASCII码数据,在最高位上加奇偶校验位后由串行口发出。采用8位异步通信方式,波特率为1200b/s,fosc=11.059MHz。 由要求可知,应把串行口设置为方式1,采用定时器1模式2作为波特率发生器,预置值(TH1)=0E8H。 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 返回 程序清单: 主程序; MOV TMOD ,#20H ;设置定时器1为模式2 MOV TL1 ,#0E8H ;初值,波特率为1200b/s MOV TH1 ,#0E8H SETB TR1 ;启动T1运行 MOV SCON ,#01000000B ;设置串行口为方式1 MOV R0 ,#20H MOV R7 ,#32 ;数据块长度 LOOP: MOV A ,@R0 ACALL SP-OUT JNB P ,ERROR ;传输出错处理,由SP-OUT中“CPL C”结果决定 INC R0 DJNZ R7 ,LOOP …… 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 串行口发送子程序(奇校验); SP-OUT: MOV C ,PSW.0 ;设置奇校验位,校验位P=1为奇校验 CPL C ;奇校验(无此指令位偶校验) MOV ACC.7 ,C ;ACC.7补0或1 MOV SBUF ,A ;启动串行口发送过程 CLR TI ;清TI标志,允许在发送 RET ERROR: (略) 返回 2018年12月4日星期二
例7-6:由串行口接收带奇偶校验位的数据块。 2、串行口方式1的发送和接收 例7-6:由串行口接收带奇偶校验位的数据块。 解:采用查询方式,本例与上例相呼应,接收器把接收到的32B数据存放在20H-30H单元内,波特率同上,若奇偶校验出错则置进位位为1。 程序清单: 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 主程序; MOV SCON ,#01010000B ;设串口方式1,允许接收 MOV TMOD ,#20H ;设置定时器T1为模式2 MOV TL1 ,#0E8H ;初值,波特率为1200b/s MOV TH1 ,#0E8H SETB TR1 ;启动T1运行 MOV R0 ,#20H MOV R7 ,#32 ;数据块长度 LOOP: ACALL SP-IN ;调接收一帧子程序 JC ERROR ;由SP-IN中“CPL C”结果决定 MOV @R0 ,A ;存放接收的数据 INC R0 DJNZ R7 ,LOOP …… 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 接收一帧子程序; SP-IN: JNB RI ,$ ;RI由硬件置位 CLR RI ;软件清除RI MOV A ,SBUF MOV C ,P ;检查奇校验位 CPL C ;置C为主程序“JC ERROR”用 ANL A ,#7FH ;去掉奇校验位 RET ERROR: (略) 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 例7-7:利用串行口和堆栈技术发送字符串常量。 解: 上面两个例子中,发送和接收的都是一些变量数据,且存放在内部RAM单元中。现说明如何利用堆栈技术发送存放在程序存储器内的字符串常量。 下面的例子中,这些字符串是发送给CRT终端的,以回车符(CR)和换行符(LF)开始,以换码符(ESC)为结尾。下面是程序片断: 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 返回 CR EQU 0DH ;ASCII回车符 LF EQU 0AH ;ASCII换行符 ESC EQU 1BH ;ASCII换码符 …… MOV TMOD ,#20H ;设置定时器T1为模式2 MOV TL1 ,#0FDH ;设波特率位9600b/s ;(fosc=11.059MHz) MOV TH1 ,#0FDH SETB TR1 ;启动T1运行 MOV SCON ,#01000000B ;设置串行口方式1 ACALL XSTRING DB CR ,LF DB ‘NU&BIAA’ ;字符串常量 DB ESC XSTRING: POP DPH ;把第1个字符的地址装入DPTR POP DPL XSTR-1: CLR A ;设偏移量为零 MOVC A ,@A+DPTR ;取第1个字符 XSTR-2: MOV SBUF ,A ;启动一帧发送过程 JNB TI ,$ ;等待发送一帧完 CLR TI INC DPTR ;指向下一字符 CLR A ;偏移量为0 MOVC A ,@A+DPTR ;取下一字符 CJNE A ,#ESC ,XSTR-2 ;读到ESC符时, ;停止发送 MOV A ,#1 JMP @A+DPTR ;返回执行ESC符后 ;的一条指令,即接着 ;执行背景程序 返回 2018年12月4日星期二
2、串行口方式1的发送和接收 说明:程序中采用了“ACALL XSTRING”指令,而实际上由XSTRING开始的程序段形式上并不构成一个子程序,因为子程序,因为子程序应由RET作为结尾。 采用ACALL指令的目的在于利用子程序调用协议,即执行调用指令后,把一个单元(存放常量CR)的地址压入了堆栈。 这样,XSTRING段的第1,2条指令执行后,就把放置字符常量CR的单元地址置入DPTR了。 ESC后一个单元应是背景程序中送完字符串后要执行的那条指令,故执行完XSTRING程序段的最后2条指令,将继续执行背景程序。 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 串行口方式 2与方式 3基本一样(只是波特率设置不同),接收/发送 11位信息:开始为l位起始位(0),中间8位数据位,数据位之后为1位程控位(由用户置SCON的TB8决定),最后是1位停止位(1)。只比方式l多了一位程控位。 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 图7-18 例7-8:用第9个数据位作奇偶校验位,编制串行口方式2的发送程序。 解:设计一个发送程序,将片内RAM 50H~5FH中的数据串行发送;串行口设定为方式2状态,TB8作奇偶校验位。在数据写入发送缓冲器之前,先将数据的奇偶位P写入TB8,这时,第9位数据作奇偶校验用。 方式2发送程序流程图如图7-19所示。 图7-18 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 程序清单如下: TRT: MOV SCON ,#80H ;方式2设定 MOV PCON ,#80H ;取波特率为fosc/32 MOV R7 ,#10H ;数据长度10H→R7 LOOP: MOV A ,@R0 ;取数据→A MOV C ,PSW.0 ;P→TB8 MOV TB8 ,C MOV SBUF ,A ;数据→SBUF,启动发送 WAIT: JBC TI ,CONT ;判断发送中断标志 SJMP WAIT CONT: INC R0 DJNZ R7 ,LOOP RET 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 例7-9 编制一个串行口方式2接收程序,并核对奇偶校验位。 例7-9 编制一个串行口方式2接收程序,并核对奇偶校验位。 解:根据上面介绍的特点,在方式2、方式3的发送过程中,将数据和附加在TB8中的奇偶位一块发向对方。因此,作为接收的一方应设法取出该奇偶位进行核对,相应的接收程序段为: 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 RRR: MOV SCON ,#90H ;选方式2,并允许接收(REN=1) LOOP: JBC RI ,RECEIV ;等待接收数据并清RI SJMP LOOP RECEIV: MOV A ,SBUF ;将接收到的字符取出后,送到ACC。注意, ;传送指令影响PSW, 产生接收端的奇偶值 JB PSW.0 ,ONE ;判断接收端的奇偶值 JB RB8 ,ERR ;判断发送端的奇偶值 SJMP RIGHT ONE: JB RB8 ,ERR RIGHT: …… ;接收正确 …… ERR: …… ;接收有错 当接收到一个字符时,从SBUF转移到ACC中时会产生接收端的奇偶值,而保存在RB8中的值为发送端的奇偶值,两个奇偶值应相等,否则接收字符有错。发现错误要及时通知对方重发。 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 例7-10:编制一个发送程序,将片内RAM中50H—5FH的数据串行发送。串行口设定为工作方式2,TB8作奇偶校验位。 解:在数据写入发送SBUF之前,先将数据的奇偶标志P写入TB8,此时,第9位数据便可作奇偶校验用。可采用查询和中断两种方式发送。 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 (1)采用查询方式的程序段 ORG 0000H AJMP MAIN ;上电,转向主程序 MAIN: MOV SCON ,#80H ;设工作方式2 MOV PCON ,#80H ;取波特率为fosc/32 MOV R0 ,#50H ;首址50H送R0 MOV R7 ,#10H ;数值长度送R7 LOOP: MOV A ,@R0 ;取数据 MOV C ,PSW.0 ;P→C MOV TB8 ,C ;奇偶标志送TB8 MOV SBUF ,A ;发送数据 WAIT: JBC TI ,CONT AJMP WAIT ;等待中断标志TI=1 CONT: INC R0 DJNZ R7 ,LOOP ;数值尚未发送完, 继续发送下一个数据 SJMP $ END 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 (2)采用中断方式的程序段 返回 SERVE: ORG 0000H CLR TI ;清除发送中断标志 AJMP MAIN ;上电,转向主程序 ORG 0023H ;串行口的中断入口地址 AJMP SERVE ;转向中断服务程序 ORG 0100H ;主程序 MAIN: MOV SCON ,#80H MOV PCON ,#80H MOV R0 ,#50H MOV R7 ,#0FH SETB ES ;允许串行口中断 SETB EA ;CPU允许中断 MOV A ,@R0 MOV C ,PSW.0 ;P→C MOV TB8 ,C MOV SBUF ,A ;发送第一个数据 SJMP $ SERVE: CLR TI ;清除发送中断标志 INC R0 ;修改数据地址 MOV A ,@R0 MOV C ,PSW.0 ;P→C MOV TB8 ,C MOV SBUF ,A ;发送数据 DJNZ R7 ,ENDT ;判断数据块发送完否 ;若未发 送完, 则转ENDT CLR ES ;若发送完,则禁止串行口中断 ENDT: RETI ;中断返回 END 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 例7-11:编制一个接收程序,将接收的16B数据送入片内RAM的5OH—5FH单元中。设串行口工作于方式 3,波特率为2400b/s。 解:方式3为11位异步通信方式,波特率取决于TI的溢出率。查 表7-2可知,当晶振为11.059MHz,波特率为2400b/s时,可取SMOD=0。 返回 2018年12月4日星期二
3、串行口方式2、方式3的发送和接收 源程序如下: 返回 MAIN: MOV TMOD ,#20H ;设TI工作于模式2 MOV TH1 ,#0F4H ;赋循环计数初值 MOV TL1 ,#0F4H ;赋计数值 SETB TR1 ;启动定时器TI MOV R0 ,#50H ;首地址送R0 MOV R7 ,#10H ;数据长度送R7 MOV SCON ,#0D0H ;串行口工作与方式3,可接收 MOV PCON ,#00H ;设SMOD=0 WAIT: JBC RI ,PR1 ;接收完一帧数据,清RI,转PR1 SJMP WAIT ;否则等待 PR1: MOV A ,SBUF ;读入数据 JNB P ,PNP ;P=0,转PNP JNB RB8 ,PER ;P=1,RB8=0,转出错处理 SJMP RIGHT PNP: JB RB8 ,PER ;P=0,RB8=1,转出错处理 RIGHT: MOV @R0 ,A ;数据送内存 INC R0 ;修改地址指针 DJNZ R7 ,WAIT ;数据未接收完,继续接收下一个数据 CLR PSW.5 ;置正确接收完毕标志F0=0 RET PER: SETB PSW.5 返回 2018年12月4日星期二
7.3 RS-232C标准接口总线及串行通信硬件设计 前面介绍了有关串行通信的基本知识及单片机的串行口结构。下面介绍PC机与单片机间串行通信的硬件和软件设计。 在工业自动控制、智能仪器仪表中,单片机的应用越来越广泛。随着应用范围的扩大以及根据解决问题的需要,对某些数据要做较复杂的处理。由于单片机的运算功能较差,对数据进行较复杂的处理时,往往需要借助计算机系统。因此,单片机与PC机进行远程通信更具有实际意义。利用89C51单片机的串行口与PC机的串行口COM1或COM2进行串行通信,将单片机采集的数据传送到PC机中,由PC机的高级语言或数据库语言对数据进行整理及统计等复杂处理;或者实现PC机对远程前沿单片机进行控制。 返回 2018年12月4日星期二
7.3 RS-232C标准接口总线及串行通信硬件设计 在实现计算机与计算机、计算机与外设间的串行通信时,通常采用标准通信接口、这样就能很方便地把各种计算机、外部设备、测量仪器等有机地连接起来,进行串行通信。RS-232C是由美国电子工业协会(EIA)正式公布的,在异步串行通信中应用最广的标准总线(C表示此标准修改了三次)。它包括了按位串行传输的电气和机械方面的规定,适用于短距离或带调制解调器的通信场合。为了提高数据传输率和通信距离,EIA又公布了RS-422,RS-423和RS-485串行总线接口作准。 返回 2018年12月4日星期二
7.3 RS-232C标准接口总线及串行通信硬件设计 7.3.1 RS-232C标准接口总线 7.3.2信号电气特性与电平转换 7.3.3单片机与PC机通信的接口电路 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 ELA RS-232C是目前最常用的串行接口标准,用于实现计算机与计算机之间、计算机与外设之间的数据通信。 该标准的目的是定义数据终端设备(DTE)之间接口的电气特性。一般的串行通信系统是指微机和调制解调器(modem),如图7-20。调制解调器叫数据电路终端设备(简称DCE)。 RS-232C提供了单片机与单片机、单片机与PC机间串行数据通信的标准接口。通信距离可达到 15 m。 图7-20 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 RS-232C接口的具体规定如下: (l)范围 RS-232C标准适用于DCE和 DTE间的串行二进制通信,最高的数据速率为 19.2 kb/s。如果不增加其他设备的话,RS-232C标准的电缆长度最大为15 m。 RS-232C不适于接口两边设备间要求绝缘的情况。 (2) RS-232C的信号特性 为了保证二进制数据能够正确传送,设备控制准确完成,有必要使所用的信号电平保持一致。为满足此要求,RS-232C标准规定了数据和控制信号的电压范围。由于RS-232C是在TTL集成电路之前研制的,所以它的电平不是+5V和地,而是采用负逻辑,规定+3V—15V之间的任意电压表示逻辑0电平,-3V—15V之间的任意电压表示逻辑1电平。 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 (3) RS-232C接口信号及引脚说明 串行通信信号引脚分为两类: 一类为基本的数据传送信号引脚, 另一类是用于MODEM控制的信号引脚。 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 ①基本的数据传送信号 基本的数据传送信号引脚有TXD,RXD,GND 3个。 GDN为地信号引脚。GND是其他引脚信号的参考电位信号。 “在零调制解调器”连接中,最简单的形式就是只使用上述3个引脚,如图7-21。其中,收发端的TXD与RXD交错相连,GND与GND相连。 返回 2018年12月4日星期二
图7-21 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 ②MODEM控制(握手)信号引脚 从计算机到MODEM的信号引脚包括DTR和RTS两个: DTR信号引脚用于通知MODEM,计算机已经准备好。 RTS信号引脚用于通知MODEM,计算机请求发送数据。 从MODEM到计算机的信号包括DSR,CTS,DCD,RI共4个。 DSR信号引脚用于通知计算机,MODEM已经准备好。 CTS信号引脚用于通知计算机,MODEM可以接收传送数据。 DCD信号引脚用于通知计算机,MODEM已与电话线路连接好。 RI信号引脚为振铃指示,用于通知计算机有来自电话网的信号。 返回 2018年12月4日星期二
7.3.1 RS-232C标准接口总线 近年的RS-232C接口都是采用9针的连接器,(25针中有很多引脚是无意义的),如图7-22所示。 返回 2018年12月4日星期二
7.3.2信号电气特性与电平转换 1.电气特性 为了增加信号在线路上的传输距离和提高抗干扰能力,RS-232C提高了信号的传输电平。该接口采用双极性信号、公共地线和负逻辑。 使用RS-232C,数据通信的波传率允许范围为0b/s—20kb/s。在使用 19200b/s进行通信时,最大传送距离在 20 m之内。降低彼特率可以增加传输距离。 返回 2018年12月4日星期二
7.3.2信号电气特性与电平转换 2.电平转换 RS-232C规定的逻辑电平与一般微处理器、单片机的逻辑电平是不一致的。因此,在实际应用的,必须把微处理器的信号电平(TTL电平)转换为RS-232C电平,或者对两者进行逆转换。这两种转换是通过专用电平转换芯片实现的。 MAX232、MAX202和早期的MC1488,75188等芯片可实现TTL→RS-232C的电平转换;MC1489,75189等芯片可实现RS-232C→TTL的电平转换。 MC1488,MC1489的电路结构与引脚排列见图7-23。 返回 2018年12月4日星期二
图7-23 MC1488,MC1489的电路结构与引脚排列 返回 2018年12月4日星期二
7.3.2信号电气特性与电平转换 MC1488由3个“与非”门和1个反相器构成。Vcc可接+15V或+12V,VEE可接-15V或-12V,输入为TTL电平,输出为RS-232C电平。 MC1489由4个反相器组成。Vcc接+5V,每个反相器都有一个控制端,它可接到电源电压上,用以调整输入的门限特性,也可通过一滤波电容接地。 单片机的串行口通过电平转换芯片所组成的RS-232C标准接口电路如图7-24所示。 返回 2018年12月4日星期二
图7-24 RS-232C标准接口电路 返回 2018年12月4日星期二
7.3.3单片机与PC机通信的接口电路 利用PC机配置的异步通信适配器,可以很方便地完成IBM-PC系列机与MCS-51单片机的数据通信。 PC机与89C51单片机最简单的连接是零调制三线经济型,这是进行全双工通信所必须的最少数目的线路。 由于89C51单片机输入、输出电平为TTL电平,而IBM-PC机配置的是RS-232C标准串行接口,二者的电气规范不一致,因此,要完成PC机与单片机的数据通信,必须进行电平转换。 返回 2018年12月4日星期二
7.3.3单片机与PC机通信的接口电路 1.MAX232芯片简介 MAX232芯片是MAXIM公司生产的、包含两路接收器和驱动器的IC芯片,适用于各种EIA-232C和V.28/V.24的通信接口。MAX232芯片内部有一个电源电压变换器,可以把输入的+5V电源电压变换成为RS-232C输出电平所需的+10V电压。所以,采用此芯片接口的串行通信系统只需单一的+5V电源就可以了。对于没有+12V电源的场合,其适应性更强。加之其价格适中,硬件接口简单,所以被广泛采用。 返回 2018年12月4日星期二
1.MAX232芯片简介 MAX232芯片的引脚结构如图7-25所示。 MAX232芯片的典型工作电路如图7-26所示。 图7-26中上半部分电容C1,C2,C3,C4及V+,V-是电源变换电路部分。 在实际应用中,器件对电源噪声很敏感。因此,VCC必须要对地加去耦电容C5,其值为0.lμF。电容C1,C2, C3,C4取同样数值的钽电解电容1.0μF/16V,用以提高抗干扰能力,在连接时必须尽量靠近器件。 返回 2018年12月4日星期二
图7-25 MAX232芯片引脚图 图7-26 MAX232典型工作电路图 返回 2018年12月4日星期二
1.MAX232芯片简介 下半部分为发送和接收部分。实际应用中,T1IN,T2IN可直接接TTL/CMOS电平的MCS-51单片机的串行发送端 TXD;R1OUT,R2OUT可直接接TTL/CMOS电平的MCS-51单片机的串行接收端RXD;T1OUT,T2OUT可直接接PC机的 RS-232串口的接收端RXD;R1IN,R2IN可直接接PC机的RS-232串口的发送端TXD。 返回 2018年12月4日星期二
2.采用 MAX232芯片接口的 PC机与 MCS-5l单片机串行通信接口电路 现从MAX232芯片中两路发送接收中任选一路作为接口。要注意其发送、接收的引脚要对应。如使T1IN接单片机 的发送端TXD,则PC机的RS-232的接收端RXD一定要对应接T1OUT引脚。同时,R1OUT接单片机的RXD引脚,PC机的 RS-232的发送端TXD对应接R1IN引脚。其接口电路如图7-27所示。 返回 2018年12月4日星期二
图7-27采用 MAX232接口串行通信电路 返回 2018年12月4日星期二
7.4 89C51与89C51点对点异步通信 7.4.1通信协议 7.4.2 波特率设置 7.4.3 通信程序举例 返回 7.4.2 波特率设置 7.4.3 通信程序举例 返回 2018年12月4日星期二
7.4.1通信协议 要想保证通信成功,通信双方必须有一系列的约定,比如: 作为发送方,必须知道什么时候发送信息,发什么,对方是否收到,收到的内容有没有错,要不要重发,怎样 通知对方结束等等。作为接收方,必须知道对方是否发送了信息,发的是什么,收到的信息是否有错,如果有错怎 样通知对方重发,怎样判断结束等。 这种约定就叫做通信规程或协议,它必须在编程之前确定下来。要想使通信双方能够正确交换信息和数据,在 协议中对什么时候开始通信,什么时候结束通信,何时交换信息等等都必须作出明确的规定。只有双方遵守这些规 定才能顺利地进行通信。 返回 2018年12月4日星期二
7.4.2波特率设置 在串行通信中,一个重要的指标是波恃率,它反映了串行通信的速率,也反映了对于传输通道的要求。波特率越高,要求传输通道的频带越宽。一般异步通信的波特率在 50 b/s—600 b/s之间。 由于异步通信双方各用自己的时钟源,要保证捕捉到的信号正确,最好采用较高频率的时钟。一般选择时钟频率比波特率高16倍或64倍。若是时钟频率等于波特率,则频率稍有偏差便会产生接收错误。 返回 2018年12月4日星期二
7.4.2波特率设置 在异步通信中,收、发双方必须事先规定两件事: 一是字符格式,即规定字符各部分所占的位数是否采用奇偶校验以及校验的方式(偶校验还是奇校验)等通信协议; 二是采用的波特率以及时钟频率和波特率的比例关系。 89C51的串行通信的波特率(由图7-16可知)由定时器T1的溢出率获得(仅指串行口方式1、方式3时),当串行口工作于方式1或方式3时,波特率为 返回 2018年12月4日星期二
7.4.2波特率设置 其中,k为定时器1的位数 定时器模式0,k=13; 定时器模式1,k=16; 定时器模式2和摸式3.k=8。 返回 2018年12月4日星期二
7.4.2波特率设置 若定时器T1工作于模式1,采用11.059MHz的晶振,要求利用定时器1产生1200b/s的波特率,则 令SMOD=0,可算得初值为 那么,TH1的初值为0FFH,TL1的初值为0E8H。 返回 2018年12月4日星期二
7.4.2波特率设置 T1溢出中断服程序: 有关的程序如下: MAIN: SETB PT1 ;设定T1为高中断优先级 SETB EA ;开放CPU中断 SETB ET1 ;开放定时器T1中断 MOV TMOD ,#01H ;置定时器T1为莫时1 MOV TL1 ,#0E8H ;装入初值 MOV TH1 ,#0FFH MOV PCON ,#00H ;SMOD=0 SETB TR1 ;启动T1运行 …… 如果串行口工作于方式1,T1作为波特率发生器,需在T1溢出中断服务程序中重装初值。 T1溢出中断服程序: MOV TL1 ,#0E8H ;重新装入初值 MOV TH1 ,#0FFH RETI ;中断返回 返回 2018年12月4日星期二
7.4.2波特率设置 由于T1模式2是定时器自动重装载的操作模式,当定时器T1工作于模式2时,可直接用作串行口的波特率发生器。 与上例相同,算得重装载值 返回 2018年12月4日星期二
7.4.2波特率设置 有关程序为: MOV TMOD ,#20H ;置T1为模式2 MOV TL1 ,#0E8H ;装入初值 MOV TH1 ,#0E8H MOV PCON ,#00H ;SMOD=0 SETB TR1 ;启动T1运行 MOV SCON ,#01000000B ;设置串行口为方式1 …… 返回 2018年12月4日星期二
7.4.2波特率设置 除非波特率很低,一般都采用T1模式2。因为当T1溢出后,参数自动装入,可避免不必要的中断请求。 在第二节中,表7-2给出了晶振fosc=6MHz或12MHz时,常用波特率和定时器的初装值。但要注意,表中的初装值和波特率之间是有一定误差的。 返回 2018年12月4日星期二
7.4.2波特率设置 若晶指fosc=11.095MHz,设置波特率为9600b/s,则定时器T1的初装值为0FDH。设定时器操作于模式2,SMOD=0。 若要求比较准确的波特率,只能靠调整单片机的时钟频率fosc来得到。 返回 2018年12月4日星期二
7.4.3通信程序举例 例7-12:设甲机发送,乙机接收。串行接口工作于方式3(每帧数据为11位,第9位用于奇偶校验),两机均选用 6.0000MHz的振荡频率,波特率为 24O0 b/s。通信的功能为: 甲机:将片外数据存储器4000H—407FH单元的内容向乙机发送,每发送一帧信息,乙机对接收的信息进行奇偶校验。此例对发送的数据作偶校验,将P位值放在TB8中。若校验正确,则乙机向甲机回发“数据发送正确”的信号(例中以00H作为应答信号)。甲机收到乙机“正确”的应答信号后再发送下一个字节。若奇偶校验有错,则乙机发出“数据发送不正确”的信号(例中以FFH作为应答信号)。甲机接收到“不正确”应答信号后,重新发送原数据,直至发送正确。甲机将该数据块发送完毕后停止发送。 乙机:接收甲机发送的数据,并写入以4000H为首址的片外数据存储器中。每接收一帧数据,乙机对所接收的数据进行奇、偶校验,并发出相应的应答信号,直至接收完所有数据。 返回 2018年12月4日星期二
7.4.3通信程序举例 解: (1)计算定时器计数初值X 将已知数据fosc=6MHZ,波特率=2400b/s代人,得 返回 2018年12月4日星期二
取SMOD=0时,X=249.49。因取整数误差过大,故设SMOD=1,则X=242.98≈243=F3H。 7.4.3通信程序举例 取SMOD=0时,X=249.49。因取整数误差过大,故设SMOD=1,则X=242.98≈243=F3H。 因此,实际波特率=2403.85 b/S。 (2)能实现上述通信要求的甲、乙机的流程图如图7-28,图7-29所示。 返回 2018年12月4日星期二
图7-28 甲机发送流程 图7-29 已机发送流程 返回 2018年12月4日星期二
7.4.3通信程序举例 返回 2018年12月4日星期二 (3)源程序 ①甲机 主程序 ORG 0000H ①甲机 主程序 ORG 0000H LJMP MAIN ;上电,转向主程序 ORG 0023H ;串行口的中断入口地址 LJMP SERVE1 ;转向甲机中断服务程序 ORG 2000H ;主程序 MAIN: MOV TMOD ,#20H ;设T1工作与模式2 MOV TH1 ,#0F3H ;赋计数初值 MOV TL1 ,#0F3H ;赋计数值 SETB TR1 ;启动定时器T1 MOV PCON ,#80H ;设SMOD=1 MOV SCON ,#0D0H ;置串行口方式3,允许接收 MOV DPTR ,#4000H ;置数据块首址 MOV R0 ,#80H ;置发送字节数初值 SETB ES ;允许串行口中断 SETB EA ;CPU开中断 MOVX A ,@DPTR ;取第一个数据发送 MOV C ,P MOV TB8 ,C ;奇偶标志送TB8 MOV SBUF ,A ;发送数据 SJMP $ ;等待中断 中断服务程序 SERVE1: JBC RI ,LOOP ;是接收中断,清除RI,转入接收 ;乙机的应答信息 CLR TI ;是发送中断,清除此中断标志 SJMP ENDT LOOP: MOV A ,SBUF ;取乙机的应答信息 CLR C SUBB A ,#01H ;判应答信号是#00吗? JC LOOP1 ;是#00H,发送正确 ;(#00H- #01H),C=1,转LOOP1 MOVX A ,@DPTR ;否则甲机重发 MOV C ,P MOV TB8 ,C MOV SBUF ,A ;甲机重发原数据 LOOP1: INC DPTR ;修改地址指针,准备发送下 一个数据 MOVX A ,@DPTR MOV SBUF ,A ;发送 DJNZ R0 ,ENDT ;数据块未发送完,返回继续发送 CLR ES ;全部发送完,禁止串行口中断 ENDT: RETI ;中断返回 END 返回 2018年12月4日星期二
7.4.3通信程序举例 返回 ①乙机主程序; ORG 0000H LJMP MAIN ;上电,转向主程序 LJMP SERVE2 ;转向乙机中断服务程序 ORG 2000H ;主程序 MAIN: MOV TMOD ,#20H ;设T1工作与模式2 MOV TH1 ,#0F3H ;赋计数初值 MOV TL1 ,#0F3H ;赋计数值 SETB TR1 ;启动定时器T1 MOV PCON ,#80H ;设SMOD=1 MOV SCON ,#0D0H ;置串行口方式3, 允许接收 MOV DPTR ,#4000H ;置数据区首址 MOV R0 ,#80H ;置接收字节数初值 SETB ES ;允许串行口中断 SETB EA ;CPU开中断 SJMP $ ;等待中断 中断服务程序: SERVE2: JBC RI ,LOOP ;是接收中断,清除此中断 标志,转LOOP(接收) CLR TI ;是发送中断,清除此中断 标志,中断返回 SJMP ENDT LOOP: MOV A ,SBUF ;接收(读入)数据 MOV C ,P ;奇偶标志送C JC LOOP1 ;为奇数,转LOOP1 ORL C ,RB8 ;为偶数,检测RB8 JC LOOP2 ;奇偶校验错,转LOOP2 SJMP LOOP3 LOOP1: ANL C ,RB8 ;检测RB8 JC LOOP3 ;奇偶校验正确,转LOOP3 LOOP2: MOV A ,#0FFH MOV SBUF ,A ;发送“不正确”应答信号 LOOP3: MOVX @DPTR ,A ;存放接收数据 MOV A ,#00H MOV SBUF ,A ;发送“正确”应答信号 INC DPTR ;修改数据区指针 DJNZ R0 ,ENDT ;数据块未接收完,返回 CLR ES ;所有数据接收完毕,禁止串行口中断 ENDT: RETI ;中断返回 END 返回 2018年12月4日星期二
7.5 89C51与PC机间通信软件的设计 将一台IBM-PC机和若干台89C51单片机构成小型分散控制或测量系统,是目前微计算机应用的一大趋势。 在这样的系统中,以89C51芯片为核心的智能式测控仪表(作为从机)既能完成数据采集、处理和各种控制任务,又可将数据传送给PC机(作为主机),PC机将这些数据进行加工处理或显示、打印,同时将各种控制命令送给各个从机,以实现集中管理和最优控制。显然,要组成这样的系统,首先要解决PC机与各单片机之间的数据通信问题,这是一个多机通信问题。在解决该问题之前,先来讨论一下PC机与一台89C51之间点对点(亦即双机)通信的软件设计。 返回 2018年12月4日星期二
7.5 89C51与PC机间通信软件的设计 7.5.1 PC机通信软件设计 7.5.2 89C51通信软件设计 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 1.通信协议 波特率:1200b/s; 信息格式:8位数据位,1位停止位,无奇偶检验; 传送方式:PC机采用查询方式收发数据;89C51采用中断方式接收,查询方式发送; 校验方式:累加和校验; 握手信号:采用 软件握手。发送方在发送之前先发一联络信号(用“?”号的ASCII码,接收方接到“?”号后回送一个“·”号作为应答信号),随后依次发送数据块长度(字节数),发送数据,最后发送校验和。收方在收到发送方发过来的校验和后与自己所累加的校验和相比较,相同则回送一个“0”,表示正确传送并结束本次的通信过程;若不相同则回送一个“F”,并使发送方重新发送数据,直到接收正确为止。 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 2.PC机发送文件子程序 首先介绍通过串口发送一个文件的函数sendf()。规定欲发送的这个文件存在当前盘上,并且为了便于说明问题,只传送总字节小于256个字符的文件。 sendf()函数程序流程图如图7-30所示。 PC机发送文件子函数sendf()程序清单如下: 返回 2018年12月4日星期二
图7-30 PC机发送文件子函数sendf()流程图 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 3、PC机接收文件子程序 接收函数receivef()采用查询方式从串口接收一个总字节数小于256个字符的文件,接收的文件也存于当前盘上。 接收文件子函数receivef()的程序流程图如图7-31所示。 返回 2018年12月4日星期二
图7-31 PC机接收文件子函数receivef()流程图 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 返回 2018年12月4日星期二
返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 4、PC机主程序(函数) 在有了上述发送和接收文件两个子函数之后,主函数的编写就非常简单了。主函数的工作只是在完成串口初始化后,根据键入的命令来决定是发送文件还是接收文件。 主函数流程图如图7-32所示。 PC机主函数如下: 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 图7-32 PC机主函数流程图 返回 2018年12月4日星期二
7.5.1 PC机通信软件设计 这里采用的是带参主函数main(int argc,char *argv[ ])。其中,argc是一个整型变量,argv[ ]是一个字符型指针数组。利用main函数的参数可以使主程序从系统得到所需数据(也就是说带参函数可直接从DOS命令行中得到参数值,当然,这些值是字符串)。当程序运行时(在DOS下执行.EXE文件),可以根据输入的命令行参数进行相应的处理。 例如,执行程序mypro时,若要从当前盘上将名为f1.c的文件从串口发送出去,需键入下述命令: mypro s f1.c 其中,mypro是源文件mypro.c经编译连接后生成的可执行文件 mypro.exe。 键入命令: mypro r f2.c 可以从串口接收若干字符,并写入当前盘上名为f2.c的文件中去。 返回 2018年12月4日星期二
7.5.2 89C51通信软件设计 图7-33 单片机查询发送子程序流程图 1、单片机查询发送子程序 本程序将片外RAM从1000H开始的小于256B的数据从串行口发送出去,发送的数据字节数在R7中,用R6作累加和寄存器。程序流程图如图7-33所示。 单片机查询发送子程序如下: 图7-33 单片机查询发送子程序流程图 返回 2018年12月4日星期二
返回 SEND: MOV A,#3FH MOV SBUF,A JNB TI,$ CLR TI ;发‘?’号,即3FH JNB RI,$ CLR RI MOV A,SBUF CJNE A,#2EH,SEND ;应答信号是‘.’,即 ; 2EH,则发字节数 MOV A,R7 MOV R3,A ;暂存总字节数 CLR TI MOV R6,#00H MOV DPTR,#1000H SEND1: MOVX A,@DPTR MOV SBUF,A ;发送一个字符 JNB TI,$ CLR TI ADD A,R6 ;计算校验和 MOV R6,A INC DPTR DJNZ R7,SEND1 ;计数器(R7)不为零则转SEND1 MOV A,R6 MOV SBUF,A CLR TI ;发送校验和 MOV A,SBUF CJNE A,#46H,SEND2 ;如收到应答是‘F’,即 ;46H,则重发数据 RET SEND2: MOV DPTR,#1000H MOV R6,#00H MOV A,R3 MOV R7,A AJMP SEND1 返回 2018年12月4日星期二
7.5.2 89C51通信软件设计 2、单片即接收中断服务子程序 在中断服务子程序中,为了区别所接收的信号是联络信号还是字节数、是数据还是校验和,需要设立不同的标志位,为此在可位寻址的RAM中设定: 位地址 00H 接收联络信号标志位 01H 接收字节数标志位 02H 接收数据标志位 03H 接收文件结束标志位 在初始化时,这些位均为0。程序流程图如图7-34所示。 在中断服务子程序中,将接收到的字节数存入R7中,接收的数据存入片外RAM从1000H开始的单元中。 单片机接收中断服务子程序如下: 返回 2018年12月4日星期二
图7-34 单片机接收中断服务子程序流程图 返回 2018年12月4日星期二
返回 INC DPTR DJNZ R7,RECE7 SETB 02H RECE7: SETB ES RETI RECE: CLR ES CLR RI JB 00H,RECE1 MOV A,SBUF CJNE A,#3FH,RECE2 ;收的不是‘?’号则 退出 MOV A,#2EH MOV SBUF,A JNB TI,$ CLR TI ;发送应答信号‘.’, 即2EH SETB 00H SETB ES RETI RECE2: MOV A,#24H CLR TI ;发送应答信号‘$’,即24H RECE1: JB 01H,RECE4 MOV A,SBUF ;接收字节数 MOV R7,A MOV R3,A ;暂存总字节数 SETB 01H RECE4: JB 02H,RECE5 MOV A,SBUF ;接收一字符 MOVX @DPTR,A ;存入外RAM中 ADD A,R6 MOV R6,A INC DPTR DJNZ R7,RECE7 SETB 02H RECE7: SETB ES RETI RECE5: MOV A,SBUF CJNE A,06H,RECE8 ;06H为R6的字节地址 MOV A,#4FH ;校验和不正确,重发 数据 MOV SBUF,A JNB TI,$ CLR TI ;校验正确发‘0’,即4FH SETB 03H SETB ES RECE8: MOV DPTR,#1000H MOV R6,#00H MOV A,R3 MOV R7,A MOV A,#46H CLR TI ;校验不正确,发‘F’,即46H CLR 02H 返回 2018年12月4日星期二
7.5.2 89C51通信软件设计 3、单片机主程序 主程序流程图如图7-35所示。 单片机主程序如下: 图7-35 单片机的主程序流程图 返回 2018年12月4日星期二
返回 AJMP MAIN ORG 0023H AJMP RECE ORG 0040H MAIN: MOV SP,#60H MOV SCON,#50H ;串口初始化 MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#00H ;设置波特率 SETB TR1 ;启动定时器1 SETB EA ;开放中断 SETB ES ;开放串行中断 L3: CLR 00H CLR 01H CLR 02H CLR 03H MOV R6,#00H MOV DPTR,#1000H L2: JB 03H,L1 SJMP L2 L1: ACALL SEND AJMP L3 返回 2018年12月4日星期二
7.6 PC机与多个单片机间通信 应用IBM-PC系列微机和多个单片机构成小型分布系统在一定范围内是最经济可行的方案,已被广泛采用。这种分布系统在许多实时工业控制和数据采集系统中,充分发挥了单片机功能强、抗干扰性能好、温限宽、面向控制等优点,同时又可以利用PC机弥补单片机在数据处理及交互性等方面的不足。在应用系统中,一般是以IBM-PC系列微机作为主机,定时扫描以单片机为核心的智能化控制器(即从机作为前沿机)以便采集数据或发送控制信息。在这样的系统中,智能化控制器既能独立完成数据处理和控制任务,又可以将数据传送给PC机。PC机则将这些数据形象地显示在 CRT上或通过打印机打印成各种报表,并将控制命令传送给各个前沿单片机,以实现集中管理和最优控制。下面将讨论PC机与多个单片机之间的通信问题。 返回 2018年12月4日星期二
7.6 PC机与多个单片机间通信 7.6.1采用RS-232C标准总线通信 7.6.2采用RS-422A标准总线的通信系统 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 1、采用MAX232芯片的RS-232C接口的通信电路 PC机与多个单片机通信接口电路如图7-36所示。整个通信系统的硬件结构设计为主从式串行总线型。PC机串口给出的已是标准的RS-232C电平,而单片机则为TTL/CMOS电平。采用单一电源的MAX232芯片就可实现电平的转换和驱动。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 图7-36多个单片机与PC机通信电路 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 2、多个单片机与PC机通信协议的约定 PC机和89C51单片机双向传送数据代码和功能代码。数据代码是通信过程必须传送的目的代码;功能代码是应答信号(如PC机要向单片机发数据,PC机允许单片机发数据,有误码重发等)以及表征数据特 征和数量的代码。 通信程序除具备前述的通信协议约定以外,还必须具有以下功能: 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 (1)帧格式 PC机必须能够向单片机发送被寻呼的单片机站号(地址)、命令、字段、数据首地址长度、数据块及各种核验值。单片机必须能够向PC机发进自身站号(地址)、国据长度、国据块及校验值。 (2)差错检测 通信线的传输差错是不可避免的,通信系统必须具有识别这种差错的能力。例如,可以采用数据位累加法,即统计信息位中1的个数来进行差错检测,也可采用累加和校验法。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 (3)差错处理 每发送一数据块,仅当数据块接收正确时,才会发送一个响应帧;否则,回送出错信息,要求重发该数据块,直至被正确接收为止。为了防止系统出错引起撍浪鴶,最多只允许重发三次,否则转出错处理程序,显示系统出错。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 我们把通信协议分为三段,即主机与从机的连接挂钩、握手阶段,发送(接收)阶段以及结束阶段。连接阶段主要是完成通信联络任务,主机发送从机的地址信号,从机接收到后如果与本机地址相符,回送应答信号,置SM2=0;否则不予理睬(SM2仍为1),实现主机与从机间的点对点通信。然后便可以开始发送或接收数据。在发送或接收数据过程中,选择校验方法,对数据的传输进行校验。结束阶段则是当通信系统出错或误码次数越限时宣告通信失败而结束通信。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 PC机的通信软件必须包括如下内容: ①根据用户的要求和通信协议规定,对 8250初始化,即设置波特率(1200 b/s)、数据位数(8位)、奇偶类型和停止位位数(l位)。需要指出的是,这里的奇偶校验位用作发送地址码或数据的特征值,而数据通信的校核采用累加和校验方法。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 ②确定数据传送方式。采用查询方式发送和接收。在发送地址或数据时,首先由输入指令检查发送保持寄存器是否为空,若空,则由输出指令将一个数据输出给8250,8250会自动依据初始化设置的要求把二进制数串行发送到串行通信线上。 在接收数据时,8250把串行数据转换成并行数据送到接收器的数据寄存器中,并把“接收数据准备好”信号放入状态寄存器中。计算机读到这个信号后,就可以用输入指令从接收器的数据寄存器中读入一个数据了。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 ③确定PC机为主机,所有单片机为从机。从机的地址码为0F1H—0F4H。 下面给出查询方式的PC机通信主程序框图。如图7-37所示。PC机开始设置为地址传送方式。从0F1H地址码开始发送,然后接收地址回送码,如回送地址等于发送地址码,则说明与1号从机握手成功。继而可以设置为数据传送方式,开始与1号从机交换数据。传送数据结束后,又开始与2号从机(地址码0F2H)联络。如PC机发送从机地址后,接收回送地址码与发送地址码不等,则与此地址码的从机握手失败。继续与其他从机联络…… ④为了避免出现死循环,设置了按PC机任意键退出的功能。 返回 2018年12月4日星期二
图7-37多个单片机与PC机通信主程序框图 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 4、单片机的通信软件 单片机的波特率要与PC机一致。定时器T1作为波特率发生器,设置为工作模式2。串口设置为工作方式3,数据的传送格式为11位,即1位起始位、8位数据位、1位停止位和作为数据/地址控制位的第9位。采用查询方式发送和接收数据。单片机在通信开始阶段,首先设置为传送地址方式,等待接收地址,只有当接收到本机的地址码时,才回送本机地址给PC机,以作为应答信号。 然后设置为传送数据方式,以便开始传送救据。其通信数据的约定要与PC机一致,即以什么样的数据为结束标志,多少位数据为一个数据块或多少位数据进行一次累加和校验。校验回送码为00H时表示发进正确,0FFH为错误,需要重发。重发的次数也要与PC机取得一致,不超过三次。 返回 2018年12月4日星期二
7.6.1采用RS-232C标准总线通信 图7-38单片机查询方式通信的主程序 下面给出单片机查询方式通信的主程序。其程序框图如图7-38所示。4台从机的通信程序基本相同,不同之处只是地址码不同。 图7-38单片机查询方式通信的主程序 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 RS-422A标准是美国电气工业协会(EIA)公布的“平衡电压数字接口电路的电气特性”标准,是为改善RS-232C标准的电气特性,又考虑与RS-232C兼容而制定的。 RS-422A比RS-232C传输信号距离长、速度快,传输率最大为 10 Mb/s,在此速率下,电缆允许长度为 120 m;如采用较低传输速率,如在 90000 b/s时,最大距离可达1200 m。 RS-422A每个通道要用二相信号线,如果其中一根是逻辑1状态,另一根就为逻辑0。RS-422A电路由发送路、平衡连接电缆、电缆终端负载、接收器几部分组成。规定电路中只允许有一个发送器,可有多个接收器。因此,通常采用点对点通信方式。该标准允许驱动器输出为±(2V—6V),接收器可以检测到的输入信号电平可低到200mV。 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 目前,RS-422与TTL的电平转换最常用的芯片是传输线驱动器SN75174或MC3487和传输线接收器SN75175或MC3486,其内部结构及引脚如图7-39所示。 SN75174是具有三态输出的单片4差分线驱动器,其设计符合EIA标准RS-422A规范,适用于噪声环境中长总线线路的多点传输,采用+5V电源供电,功能上可与MC3487互换。 SN75175是具有三态输出的单片4差分接收器,其设计符合EIA标准RS-422A规范,适用于噪声环境中长总线线路上的多点总线传输,该片采用+5V电源供电,功能上可与MC3486互换。 这里主要讨论采用RS-422A标准总线实现上位机与多台前沿下位控制机之间的远距离通信。 返回 2018年12月4日星期二
图7-39 RS-422电平转换芯片SN75174和SN75175 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 图7-40 控制网络系统结构图 分布式通信系统网络采用了主从式串行总线结构,如图7-40所示。所有下位控制机全部挂在上位PC机的串行通信RS-422A标准总线上,下位控制机之间不进行通信,只在上位机和下位机之间进行主从方式通信。 图7-40 控制网络系统结构图 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 PC机中一般都有一块RS-232串行通信板,该板完成串行数据转换和串行数据接收、发送的任务,采用RS-232C通信标准。这块板使用简单,不加调制解调器时,只用三条线即可完成通信功能。其不足之处是带负载能力差、通信范围小——不超过十几米,很难满足一般集散控制系统的需要。 为了充分利用这块现有的串行接口板,并且进一步扩大通信范围,可制作一块RS-232/RS-422通信转接板,接在PC机RS-232串行总线和通信线路之间,这样就把通信标准从 RS-232C标准变成了RS-422A标准。 RS-232/RS-422通信转接板电路如图7-40中虚线框内部分所示。 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 转接板中的MC1488和MC1489是实现RS-232标准通信的一对芯片。前者发送,完成TTL电平到RS-232标推电平的转换;后者接收,完成从RS-232标准电平到TTL电平的转换。MC3487和MC3486是实功RS-422标准通信的一对芯片。前者发送,把TTL电平变成RS-422标准电平;后者接收,将RS-422标准电平变成TTL电平。 通信标准改变以后,采用了平衡传输方式,带负载能力和抗干扰能力大大提高,通信距离可以达到 1200m以上,完全可以满足一般集散控制系统多机通信的要求。通信软件与前例大同小异。 返回 2018年12月4日星期二
7.6.2采用RS-422A标准总线的通信系统 一个实际的PC机RS-232/RS-422接口转接板电路如图7-41所示。当PC机发送数据时,首先由RS-232口的请求发送信号RTS的1电平经MC1489→74LS05→光电隔离器到达75174的三态控制端,打开75174的三态门;发送的数据由TXD经MC1489→74LS05→光电隔离器到75174的输入端,经75174输出转换成双端输出的RS-422标准电平信号,从而完成了RS-232到RS-422的转换。 当PC及接收数据时,75175的三态控制端接高电平,三态门是常开的,75175双端输入(RXD+和RXD-)的信号变成单端输出到达74LS05→光电隔离器→MC1488输入给PC机RS-232口的RXD端,从而完成了RS-422标准的转换。 返回 2018年12月4日星期二
图7-41 PC机RS-232/RS-422接口转接板电路 返回 2018年12月4日星期二
7.7 思考题与习题 1、什么是串行异步通信,它有哪些作用? 2、89C51单片记得串行口由哪些功能部件组成?各有什么作用? 7.7 思考题与习题 1、什么是串行异步通信,它有哪些作用? 2、89C51单片记得串行口由哪些功能部件组成?各有什么作用? 3、简述串行口接收和发送数据的过程。 4、89C51串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 5、若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率是多少? 6、89C51中SCON的SM2,TB8,RB8有何作用? 7、设fosc=11.059MHz,试编写一段程序,其功能为对串行口初始化,使之工作与方式1,波特率为1200b/s;并用查询串行口状态的方法,读出接收缓冲器的数据并回送到发送缓冲器。 返回 2018年12月4日星期二
7.7 思考题与习题 8、若晶振为11.0592MHz,串行口工作与方式1,波特率为4800b/s。写出用T1作为波特率发生器的方式字和计数初值。 9、为什么定时器T1用作串行口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用的波特率,如何计算其初值? 10、若定时器T1设置成模式2作波特率发生器,已知fosc=6MHz。求可能产生的最高和最低的波特率是多少? 11、串行通信的总线标准是什么?有哪些内容? 12、简述单片几多机通信的原理。 13、以89C51串行口按工作方式1进行串行数据通信。假定波特率为1200b/s,以中断方式传送数据。请编写全双工通信程序。 14、以89C51串行口按工作方式3进行串行数据通信。假定波特率为1200b/s,第9数据位作奇偶校验位,以中断方式传送数据。请编写通信程序。 返回 2018年12月4日星期二
7.7 思考题与习题 15、某异步通信接口,其帧格式由1个起始位(0),7个数据位,1个奇偶校验位和1个停止位(1)组成。当该接口每分钟传送1800个字符时,试计算出传送波特率。 16、串行口工作在方式1和方式3时,其波特率与fosc、定时器T1工作模式2的初值及SMOD位的关系如何?设fosc=6MHz,现利用定时器T1模式2产生的波特率为110b/s。试计算定时器初值。 17、设计一个单片机的双机通信系统,并编写通信程序。将甲机内部RAM 40H--4FH存储区中去。 返回 2018年12月4日星期二
请继续学习第八章 谢谢! 2018年12月4日星期二