第 9章 串行通信及实验第 9章 串行通信及实验
9.1 串行通信基础
在单片机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信。并行通信,即数据的各位同时传送,如图 9.1(a)所示;串行通信,即数据一位一位顺序传送,
如图 9.1(b)所示。
第 9章 串行通信及实验
图 9.1 两种通信方式的示意图第 9章 串行通信及实验串行通信的优点与缺点
两种基本通信方式比较起来,串行通信方式能够节省传输线,特别是数据位数很多和远距离数据传送时,这一优点更为突出;
串行通信方式的主要缺点是传送速度比并行通信要慢。
第 9章 串行通信及实验
9.1.1 串行通信的分类
按照串行数据的时钟控制方式,串行通信可分为同步通信和异步通信两类。
在异步通信中,接收端是依靠字符帧格式来判断发送端是何时开始发送,何时结束发送的。字符帧格式是异步通信的一个重要指标。
第 9章 串行通信及实验
9.1.1.1 异步通信异步通信 ( Asynchronous Communication)
在异步通信中,数据通常是以字符为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,每一帧数据是低位在前,高位在后,通过传输线被接收端一帧一帧地接收。发送端和接收端由各自独立的时钟来控制数据的发送和接收,这两个时钟彼此独立,互不同步。
第 9章 串行通信及实验
9.1.1.2 字符帧( Character Frame)
字符帧也叫数据帧,由起始位、数据位、
奇偶校验位和停止位等四部分组成,如图
9.2所示。
第 9章 串行通信及实验图 9.2 异步通信的字符帧格式第 9章 串行通信及实验
起始位:位于字符帧开头,只占一位,为逻辑 0低电平,用于向接收设备表示发送端开始发送一帧信息。
数据位:紧跟起始位之后,用户根据情况可取 5位,6位,7位或 8位,低位在前高位在后。
第 9章 串行通信及实验奇偶校验位与停止位
奇偶校验位:位于数据位之后,仅占一位,
用来表征串行通信中采用奇校验还是偶校验,由用户决定。
停止位:位于字符帧最后,为逻辑 1高电平。
通常可取 1位,1.5位或 2位,用于向接收端表示一帧字符信息已经发送完,也为发送下一帧作准备。
第 9章 串行通信及实验两相邻字符帧之间
在串行通信中,两相邻字符帧之间可以没有空闲位,也可以有若干空闲位,这由用户来决定。图 9.2( b)表示有 3个空闲位的字符帧格式。
第 9章 串行通信及实验
9.1.1.3 波特率( baud rate)
异步通信的另一个重要指标为波特率。
波特率为每秒钟传送二进制数码的位数,
也叫比特数,单位为 bit/s,即位 /秒。波特率用于表征数据传输的速度,波特率越高,
数据传输速度越快。但波特率和字符的实际传输速率不同,字符的实际传输速率是每秒内所传字符帧的帧数,和字符帧格式有关。
第 9章 串行通信及实验异步通信的优点
通常,异步通信的波特率为 50~ 9600bit/s。
异步通信的优点是不需要传送同步时钟,
字符帧长度不受限制,故设备简单。缺点是字符帧中因包含起始位和停止位 而降低了有效数据的传输速率。
第 9章 串行通信及实验
9.1.1.4 同步通信( Synchronous
Communication)
同步通信是一种连续串行传送数据的通信方式,一次通信只传输一帧信息。这里的信息帧和异步通信的字符帧不同,通常有若干个数据字符,如图 9.3所示。
第 9章 串行通信及实验
图 9.3 同步通信的字符帧格式第 9章 串行通信及实验三部分组成
图 9.3( a)为单同步字符帧结构,图
9.3( b)为双同步字符帧结构,但它们均由同步字符、数据字符和校验字符 CRC三部分组成。在同步通信中,同步字符可以采用统一的标准格式,也可以由用户约定。
第 9章 串行通信及实验同步通信的缺点
同步通信的数据传输速率较高,通常可达
56Kb/s或更高,其缺点是要求发送时钟和接收时钟必须保持严格同步。
第 9章 串行通信及实验
9.1.2 串行通信的制式
在串行通信中数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工( simplex)、半双工( half duplex)
和全双工( full duplex)三种制式。图 9.4为三种制式的示意图。
第 9章 串行通信及实验图 9.4为三种制式的示意图第 9章 串行通信及实验
在单工制式下,通信线的一端接发送器,
一端接接收器,数据只能按照一个固定的方向传送。如图 9.4(a)所示。
单工制式第 9章 串行通信及实验半双工制式
在半双工制式下,系统的每个通信设备都由一个发送器和一个接收器组成,如图
9.4(b)所示。在这种制式下,数据能从 A站传送到 B站,也可以从 B站传送到 A站,但是不能同时在两个方向上传送,即只能一端发送,一端接收。其收发开关一般是由软件来进行控制的。
第 9章 串行通信及实验全双工通信系统
全双工通信系统的每端都有发送器和接收器,可以同时发送和接收,即数据可以在两个方向上同时传送。如图 9.4(c)所示。
在实际应用中,尽管多数串行通信接口电路具有全双工功能,一般情况只工作于半双工制式下,这种用法简单、实用。
第 9章 串行通信及实验
9.1.3 串行通信的接口电路
串行接口电路的种类和型号很多。能够完成异步通信的硬件电路称为 UART,即通用异步接收器 /发送器;能够完成同步通信的硬件电路称为 USRT;既能够完成异步又能同步通信的硬件电路称为 USART。
第 9章 串行通信及实验串行接口电路数据形式
从本质上说,所有的串行接口电路都是以并行数据形式与 CPU连接,以串行数据形式与外部逻辑设备连接。它们的基本功能是从外部逻辑设备接收串行数据,转换成并行数据后传送给 CPU,或从 CPU接收并行数据,转换成串行数据后输出到外部逻辑设备。
第 9章 串行通信及实验
9.2 串行通信总线标准及其接口
在单片机应用系统中,数据通信主要采用异步串行通信。在设计通信接口时,必须根据需要选择标准接口,并考虑传输介质、
电平转换等问题。采用标准接口后,能够方便地把单片机和外设、测量仪器等有机地连接起来,从而构成一个测控系统。例如当需要单片机和 PC机通信时,通常采用
RS-232接口进行电平转换。
第 9章 串行通信及实验异步串行通信接口主要有三类
异步串行通信接口主要有三类,RS-232接口; RS-449,RS-422和 RS-485接口以及
20mA电流环。下面介绍较常用的 RS-232接口标准。
第 9章 串行通信及实验
9.2.1 RS-232C接口
RS-232C是使用最早、应用最多的一种异步串行通信总线标准。它是美国电子工业协会( EIA) 1962年公布,1969年最后修订而成的。其中 RS表示 Recommended Standard,
232是该标准的标识号,C表示最后一次修订。
第 9章 串行通信及实验
RS-232C
RS-232C主要用来定义计算机系统的一些数据终端设备( DTE)和数据电路终接设备
( DCE)之间的电气性能。例如 CRT、打印机与 CPU的通信大都采用 RS-232C接口,
MCS-51单片机与 PC机的通信也是采用该种类型的接口。由于 MCS-51系列单片机本身有一个全双工的串行接口,因此该系列单片机用 RS-232C串行接口总线非常方便。
第 9章 串行通信及实验
RS-232C
RS-232C串行接口总线适用于:设备之间的通信距离不大于 15米,传输速率最大为
20kB/s。
第 9章 串行通信及实验
9.2.2 RS-232C信息格式标准
RS-232C采用串行格式,如图 9.5所示。该标准规定,信息的开始为起始位,信息的结束为停止位 ;信息本身可以是 5,6,7,8位再加一位奇偶位。如果两个信息之间无信息,
则写,1”,表示空。
第 9章 串行通信及实验图 9.5 RS-232C信息格式第 9章 串行通信及实验
9.2.3 RS-232C电平转换器
RS-232C规定了自己的电气标准,由于它是在 TTL电路之前研制的,所以它的电平不是 +5V和地,而是采用负逻辑,即:
逻辑,0”,+5V~ +15V
逻辑,1”,-5V~ -15V
第 9章 串行通信及实验
RS-232C不能和 TTL电平直接相连
因此,RS-232C不能和 TTL电平直接相连,
使用时必须进行电平转换,否则将使 TTL
电路烧坏,实际应用时必须注意!常用的电平转换集成电路是传输线驱动器 MC1488
和传输线接收器 MC1489。
第 9章 串行通信及实验
MC1488内部有三个与非门和一个反相器,
供电电压为 ± 12V,输入为 TTL电平,输出为 RS-232C电平,MC1489内部有四个反相器,供电电压为 ± 5V,输入为 RS-232C电平,输出为 TTL电平。
另一种常用的电平转换电路是 MAX232,
图 9.6为 MAX232的引脚图。
第 9章 串行通信及实验图 9.6 MAX232引脚图第 9章 串行通信及实验
9.2.4 RS-232C总线规定
RS-232C标准总线为 25根,采用标准的 D型
25芯插头座。各引脚的排列如图 9.7所示。
第 9章 串行通信及实验简单的全双工系统
在最简单的全双工系统中,仅用发送数据、
接收数据和信号地三根线即可,对于 MCS-
51单片机,利用其 RXD(串行数据接收端)
线,TXD(串行数据发送端)线和一根地线,就可以构成符合 RS-232C接口标准的全双工通信口。
第 9章 串行通信及实验

9.7
RS-
232C
引脚图第 9章 串行通信及实验
9.3 MCS-51单片机的串行接口
MCS-51单片机的内部有一个可编程全双工串行通信接口,它具有 UART的全部功能,
该接口不仅可以同时进行数据的接收和发送,也可做同步移位寄存器使用。该串行口有 4种工作方式,帧格式有 8位,10位和
11位,并能设置各种波特率。本节将对其结构、工作方式和波特率进行介绍。
第 9章 串行通信及实验
9.3.1 MCS-51单片机的串行口结构
MCS-51单片机内部有两个独立的接收、发送缓冲器 SBUF,SBUF属于特殊功能寄存器。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,二者共用一个字节地址( 99H)。串行口的结构如图 9.8
所示。
第 9章 串行通信及实验特殊功能寄存器
与 MCS-51串行口有关的特殊功能寄存器有
SBUF,SCON,PCON,下面对它们分别详细介绍。
第 9章 串行通信及实验图 9.8 MCS-51单片机串行口结构示意图第 9章 串行通信及实验
9.3.2 串行口数据缓冲器 SBUF
SBUF是两个在物理上独立的接收、发送寄存器,一个用于存放接收到的数据,另一个用于存放欲发送的数据,可同时发送和接收数据。两个缓冲器共用一个地址 99H,
通过对 SBUF的读、写指令来区别是对接收缓冲器还是发送缓冲器进行操作。 CPU在写 SBUF时,就是修改发送缓冲器;读
SBUF,就是读接收缓冲器的内容。
第 9章 串行通信及实验接收或发送数据
接收或发送数据,是通过串行口对外的两条独立收发信号线 RXD( P3.0)、
TXD(P3.1)来实现的,因此可以同时发送、
接收数据,为全双工制式。
第 9章 串行通信及实验
9.3.3 串行口控制寄存器 SCON
SCON用来控制串行口的工作方式和状态,可以位寻址,字节地址为 98H。
其格式如图 9.9所示。
SCON 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
图 9.9 SCON的各位定义
SM0 SM1 SM2 REN TB8 RB8 TI RI
第 9章 串行通信及实验
SM0,SM1:串行工作方式选择位。定义如下表 9.1所示。
表 9.1 串行工作方式选择位
SM0 SM1 工作方式 功 能 波特率
0 0 方式 0 8位同步移位寄存器 fosc/12
0 1 方式 1 10位 UART 可变
1 0 方式 2 11位 UART fosc/64或f
osc/32
1 1 方式 3 11位 UART 可变第 9章 串行通信及实验多机通信控制位
SM2:多机通信控制位,用于方式 2和方式
3中。在方式 2和方式 3处于接收时,若 SM2=1,
且接收到的第 9位数据 RB8为 0时,不激活 RI;
若 SM2=1,且 RB8=1时,则置 RI=1。
第 9章 串行通信及实验方式 2,3处于接收或发送方式
在方式 2,3处于接收或发送方式,若
SM2=0,不论接收到第 9位 RB8为 0还是为 1,
TI,RI都以正常方式被激活。在方式 1处于接收时,若 SM2=1,则只有收到有效的停止位后,RI置 1。在方式 0中,SM2应为 0。
第 9章 串行通信及实验允许串行接收位
REN:允许串行接收位。由软件置位或清零。 REN=1时,允许接收,REN=0时,禁止接收。
第 9章 串行通信及实验
TB8:
发送数据的第 9位。在方式 2和方式
3中,由软件置位或复位,可做奇偶校验位。在多机通信中,可作为区别地址帧或数据帧的标识位,一般约定地址帧时 TB8为 1,数据帧时 TB8为 0。
RB8:
接收数据的第 9位。功能同 TB8。
发送数据的第 9位第 9章 串行通信及实验发送中断标志位
TI:发送中断标志位。在方式 0中,发送完
8位数据后,由硬件置位;在其他方式中,
在发送停止位之初由硬件置位。因此 TI是发送完一帧数据的标志,可以用指令来查询是否发送结束。 TI=1时,也可向 CPU申请中断,响应中断后都必须由软件清除 TI。
第 9章 串行通信及实验接收中断标志位
RI:接收中断标志位。在方式 0中,接收完
8位数据后,由硬件置位;在其他方式中,
在接收停止位的中间由硬件置位。同 TI一样,也可以通过指令来查询是否接收完一帧数据。 RI=1时,也可申请中断,响应中断后都必须由软件清除 RI。
第 9章 串行通信及实验
SCON中的低 2位与中断有关
SCON中的低 2位与中断有关,在中断的有关章节中有详细论述。
第 9章 串行通信及实验
9.3.4 电源及波特率选择寄存器
PCON
PCON主要是为 CHMOS型单片机的电源控制而设置的专用寄存器,不可以位寻址,字节地址为 87H。在 HMOS的 8051单片机中,PCON除了最高位以外其它位都是虚设的。其格式如图 9.10所示。
第 9章 串行通信及实验图 9.10 PCON的各位定义第 9章 串行通信及实验
SMOD为波特率选择位
与串行通信有关的只有 SMOD位。 SMOD
为波特率选择位。在方式 1,2和 3时,串行通信的波特率与 SMOD有关。当 SMOD=1
时,串行通信波特率乘 2,当 SMOD=0时,
串行通信波特率不变。
其他各位用于电源管理,在此不再赘述。
第 9章 串行通信及实验
9.3.5 MCS-51单片机串行口的工作方式
MCS-51单片机串行口有 4种工作方式,由
SCON中的 SM1,SM0位来决定,如表 9.1
所示。
第 9章 串行通信及实验
9.3.5.1 方式 0
在工作方式 0下,串行口作同步移位寄存器用,其波特率固定为 fosc/12。串行数据从
RXD( P3.0)端输入或输出,同步移位脉冲由 TXD(P3.1)送出。这种方式常用于扩展
I/O口。
第 9章 串行通信及实验
当一个数据写入串行口发送缓冲器 SBUF时,
串行口将 8位数据以 fosc/12的波特率从 RXD
引脚输出(低位在前),发送完置中断标志 TI为 1,请求中断。在再次发送数据之前,
必须由软件清 TI为 0。具体接线图如图 9.11
所示。其中 74LS164为串入并出移位寄存器。
发送第 9章 串行通信及实验图 9.11 方式 0用于扩展 I/O口输出第 9章 串行通信及实验接收
在满足 REN=1和 RI=0的条件下,串行口即开始从 RXD端以 fosc/12的波特率输入数据
(低位在前),当接收完 8位数据后,置中断标志 RI为 1,请求中断。在再次接收数据之前,必须由软件清 RI为 0。具体接线图如图 9.12 所示。其中 74LS165为并入串出移位寄存器。
第 9章 串行通信及实验图 9.12 方式 0用于扩展 I/O口输入第 9章 串行通信及实验串行控制寄存器 SCON
串行控制寄存器 SCON中的 TB8和 RB8在方式 0中未用。值得注意的是,每当发送或接收完 8位数据后,硬件会自动置 TI或 RI为 1,
CPU响应 TI或 RI中断后,必须由用户用软件清 0。方式 0时,SM2必须为 0。
第 9章 串行通信及实验
在工作方式 1下,串行口为波特率可调的 10
位通用异步接口 UART,发送或接收一帧信息,包括 1位起始位,8位数据位和 1位停止位。其帧格式如图 9.13所示:
9.3.5.2 方式 1
第 9章 串行通信及实验图 9.13 10位的帧格式第 9章 串行通信及实验
发送时,数据从 TXD输出,当数据写入发送缓冲器 SBUF后,启动发送器发送。当发送完一帧数据后,置中断标志 TI为 1。方式 1所传送的波特率取决于定时器 T1的溢出率和
PCON中的 SMOD位。
发送第 9章 串行通信及实验接收接收时,由 REN置 1允许接收,串行口采样 RXD,当采样到 1到 0的跳变时,确认是起始位,0”,就开始接收一帧数据。当
RI=0且停止位为 1或 SM2=0时,停止位进入
RB8位,同时置位中断标志 RI;否则信息将丢失。所以,在工作方式 1接收时,应先用软件清除 RI或 SM2标志。
第 9章 串行通信及实验在工作方式 2下,串行口为 11位
UART,传送波特率与 SMOD有关。发送或接收一帧数据包括 1位起始位,8
位数据位,1位可编程位 (用于奇偶校验 )和 1位停止位。其帧格式如图 9.14所示。
9.3.5.3 方式 2
第 9章 串行通信及实验图 9.14 11位的帧格式第 9章 串行通信及实验发送时,先根据通信协议由软件设置
TB8,然后用指令将要发送的数据写入
SBUF,则启动发送器。写 SBUF的指令,
除了将 8位数据送入 SBUF外,同时还将
TB8装入发送移位寄存器的第 9位,并通知发送控制器进行一次发送。一帧信息即从
TXD发送,在送完一帧信息后,TI被自动置 1,在发送下一帧信息之前,TI必须由中断服务程序或查询程序清 0。
发送第 9章 串行通信及实验接收
当 REN=1时,允许串行口接收数据。数据由 RXD端输入,接收 11位的信息。当接收器采样到 RXD端的负跳变,并判断起始位有效后,开始接收一帧信息。当接收器接收到第 9位数据后,若同时满足以下两个条件,RI=0; SM2=0或接收到的第 9位数据为
1,则接收数据有效,8位数据送入 SBUF,
第 9位送入 RB8,并置 RI=1。若不能同时满足上述两个条件,则丢弃信息。
第 9章 串行通信及实验
9.3.5.4 方式 3
工作方式 3为波特率可变的 11位 UART通信方式,除了波特率设定方式不同之外,工作方式 3和工作方式 2完全相同。
第 9章 串行通信及实验
9.3.6 MCS-51单片机串行口的波特率设定在串行通信中,收发双方对传送的数据速率即波特率要有一定的约定。通过上一小节的论述,我们已经知道,MCS-51单片机的串行口通过编程可以有 4种工作方式。
其中工作方式 0和工作方式 2的波特率是固定的,工作方式 1和工作方式 3的波特率可变,由定时器 T1的溢出速率决定。
第 9章 串行通信及实验
9.3.6.1 工作方式 0和工作方式 2
在工作方式 0中,波特率为时钟频率的
1/12,即 fosc/12,固定不变。
在工作方式 2中,波特率取决于 PCON中的
SMOD值,当 SMOD=0时,波特率为
fosc/64;当 SMOD=1时,波特率为 fosc/32。
即:
波特率 = fOSC (2SMOD/64)。
第 9章 串行通信及实验
9.3.6.2 工作方式 1和工作方式 3
在工作方式 1和工作方式 3下,波特率由定时器 T1的溢出速率和 SMOD共同决定。即:
波特率 = T1溢出速率 (2SMOD/32)。
第 9章 串行通信及实验计数速率为外部输入时钟频率
其中 T1的溢出速率取决于单片机定时器 T1
的计数速率和定时器的预置值。计数速率与 TMOD寄存器中的 C/ T位有关,当 C/ T=0
时,计数速率为 fosc/12,当 C/ T=1时,计数速率为外部输入时钟频率。
第 9章 串行通信及实验
实际上,当定时器 T1作为波特率发生器使用时,通常是工作在模式 2,即自动重装计数初值的 8位定时器,此时 TL1作计数用,
自动重装的值在 TH1内。假设计数的预置值(初始值)为 X,那么每过 256-X个机器周期,定时器溢出一次。为了避免溢出而产生不必要的中断,此时应禁止 T1中断。
溢出周期为,12 (256-X)/fOSC
第 9章 串行通信及实验溢出速率为溢出周期的倒数
溢出速率为溢出周期的倒数,所以
波特率 = (2SMOD/32)(fOSC /12(256-X))
表 9.2列出了各种常用的波特率及获得办法。
第 9章 串行通信及实验第 9章 串行通信及实验
9.4 MCS-51单片机的串行接口实验
9.4.1 串行转并行实验
MCS-51单片机的串口工作于方式 0时,通常是用作串行信号 /并行信号的转换器。
MCS-51单片机的 TXD(P3.1)提供频率为
fosc/12的串行时钟,RXD(P3.0)提供待转换的串行信号。
第 9章 串行通信及实验
9.4.1.1 硬件电路
硬件电路如图 9-15所示。
第 9章 串行通信及实验图 9-15 串并转换实验硬件电路第 9章 串行通信及实验
在工作目录下创建 serial_parellel工程,将
serial_parellel.c源文件添加进去,经编译、
连接后得到载入单片机的十六进制目标文件 serial_parellel.hex即可。
工程窗口如图 9-16所示。
9.4.1.2 软件第 9章 串行通信及实验图 9-16 工程窗口第 9章 串行通信及实验以下为 serial_parellel.c源程序。
//---串行信号转并行信号实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
第 9章 串行通信及实验
//---延时子程序 ---
delay()
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验主程序
main()
{ SCON=0x00; //串口工作于方式 0
while(1)
{ SBUF=0xc0; //发送 "0"的显示编码
delay(); //延时
}
第 9章 串行通信及实验
9.4.1.3 运行结果
实验的运行结果如图 9-17所示。
图 9-17 串行信号转并行信号实验运行结果第 9章 串行通信及实验
9.4.2 单机自发自收实验
该实验中,单片机的串口工作于方式 1下,
为简单起见,实现的功能是本机自发自收信息。为此,将串口的发送端和接收端直接连接,TXD(P3.1)发送信息,本机的
RXD(P3.0)接收信息。
9.4.2.1 硬件电路
硬件电路如图 9-18所示。
第 9章 串行通信及实验图 9-18 单机自发自收实验硬件电路第 9章 串行通信及实验
9.4.2.2 软件
在工作目录下创建 one_cpu工程,将
one_cpu.c源文件添加进去,经编译、连接后得到载入单片机的十六进制目标文件
one_cpu.hex即可。
工程窗口如图 9-19所示。
第 9章 串行通信及实验图 9-19 单机自发自收实验工程窗口第 9章 串行通信及实验以下为 one_cpu.c源程序。
//---单机自发自收实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
//---主程序 ---
main( )
{ SCON=0x50;//串口工作于方式 1,允许接收
PCON=0x80;//SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff;
TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{ SBUF=0xc0; //发送 "0"的显示编码
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P1=0xc0; //显示发送信息
delay(); //延时
while(!RI);//等待接收完毕
RI=0; //清除接收标志位
P0=SBUF; //显示接收信息
delay(); //延时
}
}
第 9章 串行通信及实验
9.4.2.3 实验运行结果
从图 9-20和图 9-21可以看到串口发送和接收信息的过程。
图 9-20 发送信息显示第 9章 串行通信及实验图 9-21 发送接收信息显示第 9章 串行通信及实验
9.4.3 双机通信实验
该实验中,单片机的串口工作于方式 1下,
实现的功能是甲机和乙机实现通信。为此,
将甲机串口的发送端和乙机串口的接收端连接;将甲机串口的接收端和乙机串口的发送端连接。
第 9章 串行通信及实验双机通信实验
为了便于观察实验结果,由甲机先发送,0”
的显示码,乙机接收到之后,再发送,1”
的显示码作为应答,甲机接收到之后,再发送,0”的显示码,如此循环下去。
第 9章 串行通信及实验
9.4.3.1 硬件电路
双机通信实验的硬件电路见图 9-22。
图 9-22 双机通信实验的硬件电路第 9章 串行通信及实验
9.4.3.2 软件
在工作目录下分别创建 two_cpu_1和
two_cpu_2工程,将 two_cpu_1.c和
two_cpu_2.c源文件添加进去,经编译、连接后得到载入甲机和乙机的十六进制目标文件 two_cpu_1.hex和 two_cpu_2.hex即可。
工程窗口如图 9-23和图 9-24所示。
第 9章 串行通信及实验图 9-23 two_cpu_1工程窗口第 9章 串行通信及实验图 9-24 two_cpu_2工程窗口第 9章 串行通信及实验以下为 two_cpu_1.c源程序。
//---双机通信实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
//---主程序 ---
main( )
{ SCON=0x50;//串口工作于方式 1,允许接收
PCON=0x80;//SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff;
TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{ SBUF=0xc0; //发送 "0"的显示编码
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P0=0xc0; //显示发送信息
P2=0xff; //不显示接收信息
delay(); //延时
while(!RI);//等待接收完毕
RI=0; //清除接收标志位
P2=SBUF; //显示接收信息
P0=0xff; //不显示发送信息
delay(); //延时
}
}
第 9章 串行通信及实验以下为 two_cpu_2.c源程序。
//---双机通信实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
//---主程序 ---
main( )
{ SCON=0x50;//串口工作于方式 1,允许接收
PCON=0x80;//SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff;
TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{ while(!RI);//等待接收完毕
RI=0; //清除接收标志位
P2=SBUF; //显示接收信息
P0=0xff; //不显示发送信息
delay(); //延时第 9章 串行通信及实验
SBUF=0xf9; //发送 "1"的显示编码
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P0=0xf9; //显示发送信息
P2=0xff; //不显示接收信息
delay(); //延时
}
}
第 9章 串行通信及实验
9.4.3.3 双机通信实验运行结果
从图 9-25和图 9-26可看到实验运行结果。
图 9-25 甲机发送、乙机接收示意图第 9章 串行通信及实验图 9-26 乙机发送、甲机接收示意图第 9章 串行通信及实验
9.4.4 多机通信实验
该实验使用了 3片 AT89C51,分别为甲机、
乙机和丙机。其中,甲机为主机,乙机和丙机为从机,乙机地址为 0x01,丙机地址为 0x02。串口工作于方式 3,通过 SM2来实现地址帧和数据帧的区别,主机发送信息中 TB8若为 1,则表示发送信息为地址帧;
第 9章 串行通信及实验
TB8=0
若 TB8为 0,则表示发送信息为数据帧。从机的 SM2初始值均为 1,接收地址帧后与本机地址进行比较,若一致则将 SM2清零以接收后续数据帧,若不一致则维持 SM2不变,不接收数据帧。实验中为简单起见,
数据帧只有一帧,从机在接收到数据帧后将 SM2置位为 1,回复到初始状态。
第 9章 串行通信及实验
9.4.4.1 硬件电路
多机通信实验的硬件电路见图 9-27。
图 9-27 多机通信实验的硬件电路第 9章 串行通信及实验
9.4.4.2 软件
在工作目录下分别创建 three_cpu_1、
three_cpu_2和 three_cpu_3工程,将
three_cpu_1.c,three_cpu_2.c和
three_cpu_3.c源文件添加进去,经编译、连接后得到载入甲机和乙机的十六进制目标文件 three_cpu_1.hex,three_cpu_2.hex和
three_cpu_3.hex即可。
为简单起见,three_cpu_1(主机 )工程窗口如图 9-28所示。
第 9章 串行通信及实验图 9-28 多机通信实验 three_cpu_1(主机 )工程窗口第 9章 串行通信及实验以下为 three_cpu_1.c源文件。
//---多机通信实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
#define ADDRESS1 0x01
#define ADDRESS2 0x02
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
//---主程序 ---
main( )
{ SCON=0xd8;//串口工作于方式 3,允许接收,TB8=1
PCON=0x80;//SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff;
TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{ TB8=1;
SBUF=ADDRESS1; //发送地址帧,寻址乙机
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P1=0xf9; //显示发送地址信息
delay(); //延时
while(!RI);//等待从机应答
RI=0; //清除接收标志位第 9章 串行通信及实验
If (SBUF==ADDRESS1)
{ TB8=0;//数据帧
SBUF=0xf8;//发送 "7"的显示码
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P0=0xf8; //显示发送数据信息
delay(); //延时
}
第 9章 串行通信及实验
TB8=1;
SBUF=ADDRESS2; //发送地址帧,寻址丙机
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P1=0xa4; //显示发送地址信息
delay(); //延时
while(!RI);//等待从机应答
RI=0; //清除接收标志位第 9章 串行通信及实验
if(SBUF==ADDRESS2)
{TB8=0;//数据帧
SBUF=0x80;//发送 "8"的显示码
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P0=0x80; //显示发送数据信息
delay(); //延时
}
}
}
第 9章 串行通信及实验以下为 three_cpu_2.c源文件。
//---多机通信实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
#define ADDRESS 0x01
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
---主程序 ---
main( )
{ SCON=0xf0; //串口工作于方式 3,允许接收,SM2=1
PCON=0x80; //SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff; TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{while(!RI);//等待地址接收完毕
RI=0; //清除接收标志位
if(SBUF==ADDRESS)
{SM2=0; //可以接收数据帧
SBUF=ADDRESS;//发送地址
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P1=0xf9; //显示地址信息
delay(); //延时第 9章 串行通信及实验
while(!RI);//等待地址接收完毕
RI=0; //清除接收标志位
P0=SBUF; //显示接收信息
delay(); //延时
SM2=1; //等待接收地址帧
P1=0xff;
P0=0xff; //清除显示
}
}
}
第 9章 串行通信及实验以下为 three_cpu_3.c源文件。
//---多机通信实验 ---
//---包含头文件 ---
#include "reg51.h"
//---宏定义 ---
#define uchar unsigned char
#define uint unsigned int
#define ADDRESS 0x02
第 9章 串行通信及实验
---延时子程序 ---
delay( )
{ uint j;
uchar k;
for(j=0;j<50000;j++)
for(k=0;k<10;k++);
}
第 9章 串行通信及实验
---主程序 ---
main( )
{ SCON=0xf0;//串口工作于方式 3,允许接收,
SM2=1
PCON=0x80;//SMOD=1
TMOD=0x20;//T1作为波特率发生器
TH1=0xff;
TL1=0xff;
TR1=1; //启动 T1
第 9章 串行通信及实验
while(1)
{while(!RI);//等待地址接收完毕
RI=0; //清除接收标志位
if(SBUF==ADDRESS)
{SM2=0; //可以接收数据帧
SBUF=ADDRESS;//发送地址
while(!TI);//等待发送完毕
TI=0; //清除发送标志位
P1=0xa4; //显示地址信息
delay(); //延时第 9章 串行通信及实验
while(!RI);//等待接收完毕
RI=0; //清除接收标志位
P0=SBUF; //显示接收信息
delay();
delay(); //延时
SM2=1; //等待接收地址帧
P1=0xff;
P0=0xff; //清除显示
}
}
}
第 9章 串行通信及实验
9.4.4.3 实验运行结果
从图 9-29至图 9-32可见双机通信实验运行结果。
图 9-29 甲机发送地址帧,乙机接收地址帧后准备接收数据帧第 9章 串行通信及实验图 9-30 甲机发送数据帧,乙机接收第 9章 串行通信及实验图 9-31 甲机发送地址帧,丙机接收地址帧后准备接收数据帧第 9章 串行通信及实验图 9-32 甲机发送数据帧,丙机接收