770 likes | 910 Views
第 7 章 串行通信. 本章要点: n 串行通信基本知识 n MCS-51 单片机的串行口及控制寄存器 n MCS-51 单片机的串行通信. 第 7 章 串行通信. 7.1 串行通信基础知识 7.2MCS-51 单片机的串行口及控制寄存器 7.3MCS-51 单片机的串行通信. 7.1 串行通信基础知识. 计算机的数据传送共有两种方式: 并行数据传送和串行数据传送。
E N D
第7章 串行通信 本章要点: n串行通信基本知识 n MCS-51单片机的串行口及控制寄存器 n MCS-51单片机的串行通信
第7章 串行通信 7.1串行通信基础知识 7.2MCS-51单片机的串行口及控制寄存器 7.3MCS-51单片机的串行通信
7.1串行通信基础知识 计算机的数据传送共有两种方式:并行数据传送和串行数据传送。 并行数据传送的特点是:各数据位同时传送,传送速度快、效率高。但并行数据传送有多少数据位就需多少根数据线,因此传送成本高。并行数据传送的距离通常小于30米,在计算机内部的数据传送都是并行的。 串行数据传送的特点是:数据传送按位顺序进行,最少只需一根传输线即可完成,成本低但速度慢。计算机与外界的数据传送大多数是串行的,其传送的距离可以从几米到几千公里。
通常把计算机与其外界的数据传送称之为通信,因此我们通常所说的通信就是指串行通信,串行通信又分为异步和同步两种方式。在单片机中使用的串行通信都是异步方式,因此本章只介绍异步通信。通常把计算机与其外界的数据传送称之为通信,因此我们通常所说的通信就是指串行通信,串行通信又分为异步和同步两种方式。在单片机中使用的串行通信都是异步方式,因此本章只介绍异步通信。 1.异步串行通信的字符格式 异步串行通信以字符为单位,即一个字符一个字符地传送。那么字符传送的格式又是如何呢?图7-1就是一个字符的异步串行通信格式。
对异步串行通信的字符格式作如下说明: (1)在这种格式标准中,信息的两种状态分别为mark和space标志。其中“mark”译为“标号”,对应逻辑“1”状态。在发送器空闲时,数据线应保持在mark状态;“space”译为“空格”,对应逻辑“0”状态。 (2)起始位。发送器是通过发送起始位而开始一个字符的传送。起始位使数据线处于“space”状态 (3)数据位。起始位之后就传送数据位。在数据位中,低位在前(左),高位在后(右)。由于字符编码方式的不同,数据位可以是5、6、7或8位。 (4)奇偶校验位。用于对字符传送作正确性检查,因此奇偶校验位是可选择的,共有3种可能,即奇校验、偶校验和无校验,由用户根据需要选定。 (5)停止位。停止位在最后,用以标志一个字符传送的结束,它对应于mark状态。停止位可能是1、1.5或2位,在实际应用中根据需要确定。
(6)位时间。一个格式位的时间宽度。 (7)帧(frame)。从起始位开始到停止位结束的全部内容称之为一帧,帧是一个字符的完整通信格式,因此也就把串行通信的字符格式称之为帧格式。 异步串行通信是一帧接一帧进行的,传送可以是连续的,也可以是断续的。连续的异步串行通信,是在一个字符格式的停止位之后立即发送下一个字符的起始位,开始一个新的字符传送,即帧与帧之间是连续的。而断续的异步串行通信,则是在一帧结束之后并不一定接着传送下一个字符,不传送时维持数据线的mark状态,使数据线处于空闲。其后,新的字符传送可在任何时刻开始,并不要求整数倍的位时间。
2.异步串行通信的信号形式 虽然都是串行通信,但近程的串行通信和远程的串行通信在信号形式上却有所不同,因此对近程、远程两种情况分别加以说明。 (1)近程通信 近程通信又称本地通信。进程通信采用数字信号直接传送形式,即在传送过程中不改变原数据代码的波形和频率。这种数据传送方式称之为基带传送方式。图7-2为两台计算机近程串行通信的连接和代码波形图。
从图中可见,计算机内部的数据信号是TTL电平标准,而通信线上的数据信号却是RS-232C电平标准。然而,尽管电平标准不同,但数据信号的波形和频率并没有改变。近程串行通信只需用传输线把两端的接口电路直接连起来即可实现,既方便又经济。从图中可见,计算机内部的数据信号是TTL电平标准,而通信线上的数据信号却是RS-232C电平标准。然而,尽管电平标准不同,但数据信号的波形和频率并没有改变。近程串行通信只需用传输线把两端的接口电路直接连起来即可实现,既方便又经济。 (2)远程通信 在远程串行通信中,应使用专用的通信电缆,但出于经济考虑也可以使用电话线作为传输线。如图7-3所示。
远距离直接传送数字信号,信号会发生畸变,因此要把数字信号转变为模拟信号再进行传送。信号形式的转变通常使用频率调制法,即以不同频率的载波信号代表数字信号的两种不同电平状态。这种数据传送方式就称之为频带传送方式。远距离直接传送数字信号,信号会发生畸变,因此要把数字信号转变为模拟信号再进行传送。信号形式的转变通常使用频率调制法,即以不同频率的载波信号代表数字信号的两种不同电平状态。这种数据传送方式就称之为频带传送方式。 为此,在串行通信的发送端应该有调制器,以便把电平信号调制为频率信号;而在接收端则应有解调器,以便把频率信号解调为电平信号。远程串行通信多采用双工方式,即通信双方都具有发送和接收功能。为此在远程串行通信线路的两端都应设置调制器和解调器,二者合在一起称之为调制解调器(Modem)。 电话线本来是用于传送声音(模拟信号)的,人讲话的声音频率范围大约在300~3000 Hz之间。因此使用电话线进行串行数据传送,其调频信号的频率也应在此范围之内。通常以1270 Hz或2225 Hz的频率信号代表RS-232C标准的mark电平,以1070 Hz或2025 Hz的频率信号代表space电平。
对于半双工方式,即用一条传输线完成两个方向的数据传送。发送端串行接口输出的是RS-232C标准的电平信号,由调制器把电平信号分别调制成1270Hz和1070Hz的调频信号后再送上电话线进行远程传送。在接收端,由解调器把调频信号解调为RS-232C标准的电平信号,再经串行接口电路调制为TTL电平信号。另一个方向的数据传输,其过程完全相同,所不同的只是调频信号的频率分别为2225 Hz和2025Hz。 3.串行通信的数据通路形式 串行数据通信共有以下几种数据通路形式。 (1)单工(Sim-Plex)形式 单工形式的数据传送是单向的。通信双方中一方固定为发送端,另一方则固定为接收钱。单工形式的串行通信,只需要一条数据线。如图7-4(a)所示。 例如计算机与打印机之间的串行通信就是单工形式,因为只能有计算机向打印机传送数据,而不可能有相反方向的数据传送。
(2)全双工(Full-duplex)形式 全双工形式的数据传送是双向的,且可以同时发送和接收数据.因此全双工形式的串行通信需要两条数据线。如图7-4(b)所示。 (3)半双工(Half-duplex)形式 半双工形式的数据传送也是双向的。但任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式既可以使用一条数据线,也可以使用两条数据线。如图7-4(c)所示。 图7-4(a) 单工形式串行通信
4.串行通信的传送速率 传送速率用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送格式位的数目来表示,称之为波特率(band rate)。每秒传送一个格式位就是1波特。即: 1波特=1bps(位/秒) 在串行通信中,格式位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。时钟频率高,则波特率也高,通信速度就快;反之,时钟频率低,则波特率也低,通信速度就慢。串行通信可以使用的标准波特率在RS-232C标准中已有规定,使用时应根据速度需要、线路质量以及设备情况等因素选定。波特率选定之后,对于设计者来说,就是如何得到能满足波特率要求的发送时钟脉冲和接收时钟脉冲。
7.1.2RS-232总线标准 串行通信使用RS-232C标准,为美国电子工业协会(Electronic Industry Asso -ciation)的推荐标准,现已在全世界范围内被广泛采用。RS-232C实际上是串行通信的总线标准。 1.RS-232C信号引脚定义 该总线标准定义了25条信号线,使用25个引脚的连接器,各信号引脚的定义见表7-1。
2.RS-232C主要串行通信信号 • RS-232C标准中的许多信号是为通信业务联系或信息控制而定义的,在计算机串行通信中主要使用如下信号: • (1)数据传送信号 发送数据(TXD) • 接收数据(RXD)
(2)调制解调器控制信号 请求发送(RTS) 清除发送(CTS) 数据通信设备准备就绪(DSR) 数据终端设备准备就绪(DTR) (3)定位信号 接收时钟(RXC) 发送时钟(TXC) (4)信号地(SG)和保护地(PG)
3.RS-232C的其它规定 除信号定义外,RS-232C标准的其它规定还有: (1)RS-232C是一种电压型总线标准,以不同极性的电压表示逻辑值: -3 V~-25 V表示逻辑“1”(mark) +3V~+25V表示逻辑“0”(space) (2)标准数据传送速率有50、75、110、150、300、600、1200、2400、4800、9600、19200波特等。 (3)采用标准的25芯插头座(DB-25)进行连接,因此该插头座也称之为RS-232C连接器。
7.1.3 串行接口电路 串行数据通信主要有两个技术问题。一个是数据传送,另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。而数据转换则是指数据的串并行转换。因为在计算机中使用的数据都是并行数据,因此在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行数据转换为并行数据。 数据转换由串行接口电路实现,这种电路也称之为通用异步接收发送器(UART)。
从原理上说,一个UART应包括发送器电路、接收器电路和控制电路等内容,其主要功能是:从原理上说,一个UART应包括发送器电路、接收器电路和控制电路等内容,其主要功能是: l.数据的串行化/反串行化 所谓串行化处理就是把并行数据格式变换为串行数据格式,即按帧格式要求把格式信息(起始位、奇偶位和停止位)插入,和数据位一起构成串行数据的位串,然后进行串行数据传送。在UART中,完成数据串行化的电路属发送器。 所谓反串行化就是把串行数据格式变换为并行数据格式,即把帧中的格式信息滤除而保留数据位。在UART中,实现数据反串行化处理的电路属接收。 2.错误检验 错误检验的目的在于检验数据通信过程是否正确。在串行通信中可能出现的错误包括奇偶错和帧错等。 但请注意,要完成串行数据通信,光有硬件电路还不够,还需要有软件的配合。
7.2MCS-51单片机的串行口及控制寄存器 在单片机芯片中,UART已集成在其中,作为其组成部分,构成一个串行口。MCS-51系列单片机的串行口是全双工的,这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为同步移位寄存器使用。 在串行口中可供用户使用的是它的寄存器,因此其寄存器结构对用户来说十分重要。 7.2.1 串行口寄存器结构 MCS-51单片机串行口寄存器的基本结构如图7-5所示。
图中共有两个串行口的缓冲寄存器(SBUF),一个是发送寄存器,一个是接收寄存器,以便MCS-51能 以全双工方式进行通信。串行发送时,从片内总线向发送SBUF写入数据;串行接收时,从接收SBUF向片内总线读出数据。它们都是可寻址的寄存器。但因为发送与接收不能同时进行,所以给这两个寄存器以同一地址(99H),用同一个标号SBUF,根据读写指令来确定访问其中哪一个。在第二章的专用寄存器表中已经列出。 在接收方式下,串行数据通过RXD(P3.0)引脚进入。由于在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,以避免在数据接收过程中出现帧重叠错误(即在帧数据来时,前一帧数据还没有读走)。 在发送方式下,串行数据通过引脚TXD(P3.1)送出.与接收数据情况不同,发送数据时,不会发生帧重叠错误,因此发送电路就不需双重缓冲结构,这样可以提高数据发送速度。
7.2.2 串行通信控制寄存器 8051的串行口是一个可编程接口,因此对它的初始化编程只需把控制字写入相关寄存器即可,与串行有关的控制寄存器共有3个,分别为SCON、PCON和IE。下面分别进行介绍。 1.行控制寄存器SCON SCON是MCS-51的一个可位寻址的专用寄存器,用于串行数据通信的控制。字节地址98H,位地址9FH~98H。寄存器格式内容及位地址如表7-2所示。 表7-2行控制寄存器SCON
各位功能说明如下: (1)SM0、SM1:串行口工作方式选择 其状态组合所对应的工作方式为: SM0 SM1 工作方式 0 0 0 0 1 1 1 0 2 1 1 3 (2)SM2 :多机通信控制位 因多机通信是在方式2和方式3下进行,因此SM2位主要用于方式2和方式3。当串行口以方式3接收时,如SM2=1,则只有当接收到的第9位数据(RB8)为“1”,才将接收到的前8位数据送入SBUF,并置位RI产生中断请求;否则,将接收到的前8位数据丢弃。而当SM2=0时,则不论第9位数据为“0”还是为“1”,前8位数据都装入SBUF中,并产生中断请求。 在方式0时,SM2必须为“0”
(3)REN:允许接收位 REN位用于对串行数据的接收进行控制: REN=0 禁止接收 REN=1 允许接收 该位由软件置位或复位 (4)TB8:发送数据位 在方式2和方式3时,TB8的内容是要发送的第9位数据,其值由用户通过软件设置。在双机通信时,TB8一般作为奇偶校验位使用;在多机通信中,常以TB8位的状态表示主机发送的是地址帧还是数据帧,且一般约定:TB8=0为数据帧,TB8=1为地址帧。 (5)RB8:接收数据位 在方式2或方式3时,RB8存放接收到的第9位数据,代表着接收数据的某种特征(与TB8的功能类似),故应根据其状态对接收数据进行操作。
(6)TI:发送中断标志 当方式0时,发送完第8位数据后,该位由硬件置位。在其它方式下,该位在发送停止位之前,由硬件置位。因此TI=1,表示帧发送结束,其状态既可供软件查询用,也可作为中断申请标志向CPU请求中断。 TI位由软件清“0”。 (7)RI:接收中断标志 当工作于方式0时,接收完第8位数据后,该位由硬件置位。在其它方式下,当接收到停止位时,该位由硬件置位。因此RI=1,表示帧接收结束。其状态既可供软件查询使用,也可作为中断申请标志向CPU请求中断。 RI位由软件清“0”。
2.电源控制寄存器PCON PCON主要是为CHMOS型单片机80C51的电源控制而设置的专用寄存器。字节地址为87H。其内容如表7-3所示。 表7-3电源控制寄存器PCON 在HMOS的单片机中,该寄存器除最高位之外,其它位都没有定义。最高位(SMOD)是串行口波特率的倍增位,当 SMOD=1时,串行口波特率加倍。系统复位时,SMOD=0。 PCON寄存器不能进行位寻址,因此表中写了“位序”而没有标明“位地址”。
3.中断允许寄存器IE 该寄存器已在第五章中介绍过,但为介绍串行数据通信再在此将它列出。IE各位定义如表7-4所示。 表7-4中断允许寄存器IE 其中,ES为串行中断允许位。 ES=0 禁止串行中断 ES=1 允许串行中断
7.3MCS-51单片机的串行通信 MCS-5l单片机的串行口共有4种工作方式,4种方式的基本情况如表7-5所示。 从表中可以看到,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,其值由定时器T1的溢出率控制。下面分别介绍各种工作方式。
… D0 D1 D2 D3 D4 D5 D6 D7 … 7.3.1 串行工作方式0 在方式0下,串行口作为同步移位寄存器使用,这时以RXD(P3.0)端作为数据移位的入口和出口,而由TXD(P3.1)端提供移位时钟脉冲。这种方式主要用于扩展I/O接口。移位数据的发送和接收以8位为一组,低位在前高位在后。其格式为: 1. 数据发送与接收 使用方式0实现数据的移位输入输出时,实际上是把串行口变成为并行口使用。串行口作为并行输出口使用时,要有“串入并出”的移位寄存器(例如CD4094或74LS164、74HC164等)配合,其电路连接如图7-6(a)所示。
数据预先写入串行口数据缓冲寄存器,然后从串行口RXD端在移位时钟脉冲(TXD)的控制下逐位移入CD4094。当8位数据全部移出后,SCON寄存器的发送中断标志TI被自动置“1”。其后程序可以中断或查询的方法,通过设置STB状态的控制,把CD4094的内容并行输出。当STB=1时,移位寄存器中的数据并行输出。数据预先写入串行口数据缓冲寄存器,然后从串行口RXD端在移位时钟脉冲(TXD)的控制下逐位移入CD4094。当8位数据全部移出后,SCON寄存器的发送中断标志TI被自动置“1”。其后程序可以中断或查询的方法,通过设置STB状态的控制,把CD4094的内容并行输出。当STB=1时,移位寄存器中的数据并行输出。 图7-6(a)串行口扩展并行输出口
并 行 输 入 Q C D 4 0 1 4 R X D S C L K P / S T X D 8 0 C 5 1 P 1 . 0 如果把能实现“并入串出”功能的移位寄存器(例如CD4014或74LS165、74HC165等)与串行口配合使用,就可以把串行口变为并行输入口使用。如图7-6(b)所示。此电路工作时,先由80 C51的一根I/O线(P1.0)输出高电平,使P/S=1,这时CD4014的8位数据装入移位积存器,然后使P/S=0,CD4014处于移位状态,在CLK端移位脉冲作用下,移位寄存器的数据从QS输出,从RXD端串行输入单片机。 图7-6(b) 串行口扩展并行输入口
CD4014移出的串行数据同样经RXD端串行输入,移位时钟脉冲由TXD端提供。8位数据串行接收需要有允许接收的控制,具体由SCON寄存器的REN位实现。REN=0,禁止接收;REN=1,允许接收。当软件置位REN时,即开始从RXD端输入数据(低位在前),当接收到8位数据时,置位接收中断标志RI。 方式0时,移位操作(串入或串出)的波特率是固定的,为单片机晶振频率的十二分之一,如晶振频率以fosc表示,则:波特率=fosc/12。按此波特率也就是一个机器周期进行一次移位,如fosc=6MHZ,则波特率为500K(bps),即2μs移位一次。如fosc=12 MHZ,则波特率为1M(bps),即1μs移位一次。
2.应用举例 【例7-1】在MCS-51系统中,若串行口未被占用,则可用串行口的工作方式0来扩展并行I/O口。此时不占用片外RAM的地址。 设电路连接如图7-7所示,将CD4094的并行输出端接8支发光二极管,利用它的串入并出功能,把发光二极管从左向右依次点亮,并反复循环之。假定发光二极管为共阴极型。 图7-7 串行移位输出电路连接
分析:串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,若采用中断方式,可在发完一帧数据后由TI置位发出中断申请,在中断服务程序中发送下一帧数据;若采用查询方式,可通过程序查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器SCON进行初始化。在方式0中,只要将控制字00H送SCON就可以了。分析:串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,若采用中断方式,可在发完一帧数据后由TI置位发出中断申请,在中断服务程序中发送下一帧数据;若采用查询方式,可通过程序查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制寄存器SCON进行初始化。在方式0中,只要将控制字00H送SCON就可以了。 把80C51串行口8位状态码串行移位输出后,TI置“l”,把TI作为状态查询标志,则使用查询方式完成的参考程序如下:
MOV SCON,#00H ;串行口方式0工作 CLR ES ;禁止串行中断 MOV A,#80H ;发光管从左边亮起 DELR:CLR P1.0 ;关闭并行输出 MOV SBUF,A ;串行输出 JNB TI,$;状态查询 SETB P1.0 ;开启并行输出 ACALL DELAY ;状态维持 CLR TI ;清发送中断标志 RR A ;发光组合右移 AJMP DELR ;继续 在使用时要注意SM2的状态必须为“0”。如采用中断方法,系统同样不能自动清除TI和RI状态,需由用户软件复位。 此外.串行口的并行I/O扩展功能还常用于LED显示器接口电路,但这种应用有时受速度的限制。
起始 D0 D1 D2 D3 D4 D5 D6 D7 停止 7.3.2 串行工作方式1 方式1是10位为一帧的异步串行通信方式。共包括1个起始位(低电平),8个数据位(最低位在前)和1个停止位。其帧格式为: 1.数据发送与接收 方式1的数据发送是由一条写发送寄存器(SBUF)的指令开始,随后在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式,然后在移位脉冲的作用下,由TXD端串行输出。一个字符帧发送完后,使TXD输出线维持在“l”(mark)状态下,并将SCON寄存器的TI置“1”,通知CPU可以接着发送下一个字符。
接收数据时,SCON的REN位应处于允许接收状态(REN=1)。在此前提下,串行口采样RXD端,当采样到从“l”向“0”的状态跳变时,则认定为接收到起始位,随后在移位脉冲的控制下,把接收到的数据位移入接收寄存器中,直到停止位到来之后把停止位送RB8中,并置位中断标志位RI,通知CPU从SBUF取走接收到的字符。接收数据时,SCON的REN位应处于允许接收状态(REN=1)。在此前提下,串行口采样RXD端,当采样到从“l”向“0”的状态跳变时,则认定为接收到起始位,随后在移位脉冲的控制下,把接收到的数据位移入接收寄存器中,直到停止位到来之后把停止位送RB8中,并置位中断标志位RI,通知CPU从SBUF取走接收到的字符。 2.波特率的设定 方式0的波特率是固定的,但方式1的波特率则是可变的,以定时器T1作波特率发生器使用,其值由定时器1的计数溢出率和PCON寄存器中SMOD位的值来决定,其公式为: 波特率=
其中smod为PCON寄存器最高位的值,其值为1或0。其中smod为PCON寄存器最高位的值,其值为1或0。 当定时器1作波特率发生器使用时,通常使T1工作在工作方式2模式(即8位自动加载方式)。定时器之所以选择工作方式2,是因为方式2具有自动加载功能,可避免通过程序反复装入初值所引起的定时误差,使波特率更加稳定。假定计数初值为X,那么每过“256-X”个机器周期,定时器T1就会产生一次溢出,为了避免因溢出而产生不必要的中断,所以此时应禁止T1中断。 溢出周期为:
mod s 2 f × × osc - 256 波特率 32 12 × 溢出率为溢出周期的倒数,因此溢出率为: 将溢出率带入波特率计算公式,则有: 波特率= 实际使用时,总是先确定波特率,再计算定时器1的计数初值,然后进行定时器的初始化。根据上述波特率计算公式,得出计数初值的计算公式为: X= 由于T1作为波特率发生器是由系统硬件决定的,因此硬件电路接好后,无需用户在硬件上再做额外的工作,只需根据通信所要求的波特率计算出定时器TI的计数初值,以便在程序中使用即可。
【例7-2】假定甲、乙机以方式1进行串行数据通信,其波特率为1200。甲机发送,发送数据在外部RAM 4000H~401FH单元中。乙机接收,并把接收到的数据块首末地址及数据依次存入外部RAM 5000H开始的区域中。 解题说明: 假设晶振频率为6 MHZ,按1200波特率,计算定时器1的计数初值: X=256-(6×106×1)÷(384×1200)=256一13=243=0F2H smod=0,波特率不倍增,则应使PCON=00H。 串行发送的内容包括数据块的首末地址和数据两部分内容。对数据块首末地址的传送以查询方式进行,而数据则以中断方式传送。因此在程序中要先禁止串行中断,后允许串行中断。 下面是发送和接收的参考程序。 甲机发送主程序:
ORG 0023H AJMP ACINT ORG 1030H MOV TMOD,#20H ;设置定时器1工作方式2 MOV TL1,#0F2H ;定时器1计数初值 MOV TH,#OF2H ;计数重装值 SETB EA ;中断总允许 CLR ES ;禁止串行中断 MOV PCON,#00H ;波特率不倍增 SETB TR1 ;启动定时器1 MOV SCON,#40H ;设置串行口方式1,REN=0 MOV SBUF,#40H ;发送数据区首地址高位
SOUTI: JNB TI,$;等待一帧发送完毕 CLR TI ;清发送中断标志 MOV SBUF,#00H ;发送数据区首地址低位 SOUT2: JNB TI,$ ;等待一帧发送完毕 CLR TI MOV SBUF,#40H ;发送数据区未地址高位 SOUT3:JNB TI,$;等待一帧发送完毕 CLR TI ;清发送中断标志 MOV SBUF,#IFH ;发送数据区本地址低位 SOUT4:JNB TI,$;等待一帧发送完毕 CLR TI MOV DPTR,#4000 H ;数据区地址指针 MOV R7,#20H ;数据个数 SETB ES ;开放串行中断 AHALT:AJMP $ ;等待中断
甲机中断服务程序: ORG 2100H ACINT: MOVX A,@DPTR ;读数据 CLR TI ;清发送中断 MOV SBUF,A ;发送字符 CJNE R7,#00H,AENDI;发送完转AEND1 INC DPTR AJMP AEND2 ;未发送完转AEND2 AEND1:CLR ES ;禁止串行中断 CLR TR1 ;定时器1停止计数 AEND2:RETI ;中断返回
乙机接收主程序: ORG 0023H AJMP BCINT ORG 1030H MOV TMOD,#20H ;设置定时器1工作方式2 MOV TH1,#DF2H ;定时器l计数初值 MOV TL1,#0F2H ;计数重装值 SETB EA ;中断总允许 CLR ES ;禁止串行中断 MOV PCON,#00H ;波特率不倍增 SETB TR1 ;启动定时 MOV SCON,#50H ;设置串行口方式1, REN=1 MOV DPTR,#5000H ;数据存放首地址 MOV R7,#24H ;接收数据个数
SIN1:JNB RI,$ ;等待 CLR RI ;清接收中断标志 MOV A,SBUF ;接收数据区首地址高位 MOVX @DPTR,A ;在首地址高位 INC DPTR ;地址指针增量 SIN2:JNB RI,﹩ CLR RI MOV A,SBUF ;接收数据区首地址低位 MOVX @DPTR,A ;存首地址低位 INC DPTR SIN3:JNB RI,$