单片机-第9章MCS-51单片机串行口.ppt_第1页
单片机-第9章MCS-51单片机串行口.ppt_第2页
单片机-第9章MCS-51单片机串行口.ppt_第3页
单片机-第9章MCS-51单片机串行口.ppt_第4页
单片机-第9章MCS-51单片机串行口.ppt_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章 单片机的串行接口,9.1 串行通信基本知识 9.2 串行接口结构及控制 9.3 串行接口工作方式与波特率 9.4 串行口应用举例,9.1.1 数据通信,计算机与外界的信息交换称为通信。基本的通信方法有并行通信和串行通信两种。 1并行通信 单位信息(通常指一个字节)的各位数据同时传送的通信方法称为并行通信。 2串行通信 单位信息的各位数据被分时一位一位依次顺序传送的通信方式称为串行通信。,图1 并行通信示意图,图 2 串行通信示意图,1异步通信 异步通信中,传送的数据可以是一个字符代码或一个字节数据,数据以帧的形式一帧一帧传送。,9.1.2 异步通信和同步通信,异步通信的一帧数据格式,2

2、同步通信 在同步通信中,每一数据块发送开始时,先发送一个或两个同步字符,使发送与接收取得同步,然后再顺序发送数据。数据块的各个字符间取消起始位和停止位,所以通信速度得以提高 。,串行通信的制式,9.1.3 串行通信接口种类,根据串行通信格式及约定(如同步方式、通信速率、数据块格式等)不同,形成了许多串行通信接口标准,如常见的: UART(串行异步通信接口)、 USB(通用串行总线接口)、 I2C(集成电路间的串行总线)、 SPI(串行外设总线)、 485总线、CAN总线接口等。,RS-232C接口,RS-232C标准接口是EIA(美国电子工业协会)于1969年颁布的串行通信接口标准。RS是“R

3、ecommended Standard”(推荐标准)的缩写,232为标准的编号,C为版本号。在RS-232C之前为RS-232A与RS-232B,1987年修订为EIA-232D,1991年修订为EIA-232E,1997年又修订为EIA-232F。其中,RS-232C最为常用。,RS-232C接口在远程数据通信系统中的应用,当两台计算机(DTE)借助公用电话网进行远程数据通信时。RS-232C用于将DTE和DCE进行连接,使两者能进行串行通信。,图9-6 RS-232C接口在远程数据通信系统中的应用,1RS-232C的机械特性,RS-232C接口规定使用25针连接器(DB-25),连接器的尺

4、寸及每个插针的排列位置都有明确的定义。由于一般的应用中很少用到RS-232C标准的全部信号线,所以在实际应用中常常使用9针连接器(DB-9)替代25针连接器。两者的外形与引脚排列如图9-7所示。通常一端做成插针,另一端做成插孔。,DB-25和DB-9连接器,图9-7 DB-25和DB-9连接器,2RS-232C的引脚功能(表9-1 ),注:引脚序号栏中带括号的序号为DB-9连接器的引脚序号。,注:引脚序号栏中带括号的序号为DB-9连接器的引脚序号,3RS-232C的电气特性, RS-232C的信号电平:RS-232C标准规定采用负逻辑电平。信号源点的逻辑0(空号)电平范围为+5V+15V,逻辑

5、1(传号)电平范围为5V15V;信号目的点的逻辑0(空号)电平范围为+3V+15V,逻辑1(传号)电平范围为3V15V,噪声容限为2V。RS-232C的信号电平如图9-8所示。,RS-232C的信号电平,图9-8 RS-232C的信号电平,通常,RS-232C的逻辑电平采用12V表示逻辑0,12V表示逻辑1。,RS-232C的传输距离与传输速率:, RS-232C的传输距离:DTE和DEC之间采用RS-232C传输的最大距离不大于15m。 RS-232C的传输速率:小于20kbit/s。,4RS-232C与DTE和DCE的连接, RS-232C在远程通信中的连接 远程通信是指传输距离在15m以

6、上的远距离通信如图9-6:,RS-232C在远程通信中的连接,远程通信通常需要采用调制解调器(MODEM),这时,RS-232C与DTE和DEC之间的连接方式如图9-9:,图9-9 RS-232C在远程通信中的连接方式,近程通信是通信距离小于15m的通信,这时,无需使用调制解调器,两台具有RS-232C接口的计算机可采用图9-10所示的两种连接方式中的任意一种进行直接连接。,RS-232C在近程通信中的连接,图9-10 RS-232C在近程通信中的连接方式,5RS-232C与MCS-51系列单片机的连接,由于MCS-51系列单片机的串行口不是标准RS-232C接口,采用的是正逻辑TTL电平:即

7、逻辑1为2.4V;逻辑0为0.4V。 所以使用RS-232C接口将MCS-51系列单片机与计算机或其他具有RS-232C接口的设备进行连接时,必须考虑电平转换问题。 通常使用专用的电平转换芯片来进行电平转换。,MC1488、MC1489电平转换芯片,图9-11 MC1488、MC1489的内部结构和引脚排列,MC1488用于将输入的TTL电平转换为RS-232C电平,MC1489用于将输入的RS-232C电平转换为TTL电平输出。它们的内部结构和引脚排列如图9-11所示。,由MC1488、MC1489构成的电平转换电路,图9-12 由MC1488、MC1489构成的电平转换电路,为了减少使用双

8、电源的麻烦,现在市场上出现了使用单电源供电的电平转换芯片,这种芯片体积更小,连接更简便,而且抗干扰能力更强,常见的有MAXIM公司生产MAX232。它仅需要+5V电源,由内置的电子泵电压转换器将+5V转换成10V+10V。该芯片与TTL/CMOS电平兼容,片内有2个发送器和2个接收器,使用比较方便。由它构成的电平转换电路如图9-13所示。,MAX232电平转换芯片,由MAX232构成的电平转换电路,图9-13 由MAX232构成的电平转换电路,6RS-232C的缺点, 接口的信号电平值较高,易损坏接口电路的芯片。 与TTL电平不兼容,与TTL电平接口连接需进行电平转换。 传输距离短,使用时传输

9、距离一般不超过15m,线路条件好时也不超过几十米。 传输速率较低,最高传送速率为20kbit/s。 由于收发信号采用共地传输,容易产生共模干扰,所以抗干扰能力较差。,9.2 串行接口的结构与控制,9.2.1 串行接口的结构 9.2.2 串行接口的控制寄存器,图9-14 MCS-51单片机串行口的结构,9.2.1 串行接口的结构,串行口由发送电路和接收电路两部分组成。图中有两个物理上独立的串行口接收、发送缓冲器SBUF。 SBUF(发送)用于存放将要发送的字符数据;SBUF(接收)用于存放串行口接收到的字符数据,数据的发送、接收可同时进行。 SBUF(发送)和SBUF(接收)同属于特殊功能寄存器

10、SBUF,占用同一个地址99H。但发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。因此,对SBUF进行写操作时,是把数据送入SBUF(发送)中;对SBUF进行读操作时,读出的是SBUF(接收)中的数据。,1串口发送过程,当单片机执行“写”SBUF命令(如MOV SBUF,A)时,将累加器A中欲发送的字符送入SBUF(发送)后,发送控制器在发送时钟的作用下,自动在发送字符前后添加起始位、停止位和其他控制位,然后在发送时钟的控制下,逐位从TXD线上串行发送字符帧。发送完后使发送中断标志TI=1,发出串口发送中断请求。,2串口接收过程,串行口在接收时,接收控制器会自动对RXD线进行监视。

11、当确认RXD线上出现起始位后,接收控制器就从起始位后的数据位开始,将一帧字符中的有用位逐位移入接收缓冲寄存器SBUF(接收)中,自动去掉起始位、停止位或空闲位,并使接收中断标志RI=1,发出串口接收中断请求。这时,只要执行“读”SBUF命令(如MOV SBUF,A),便可以得到接收的数据。,9.2.2 串行接口的控制寄存器,1串行口控制寄存器SCON 2电源控制寄存器PCON,1串行口控制寄存器SCON,SCON用于设定串行口的工作方式、接收/发送控制以及设置状态标志等。它的字节地址为98H,可进行位寻址,其各位的定义如图9-15所示。,图9-15 串行口控制寄存器,SCON各位名称和功能,

12、SM0和SM1(SCON.7和SCON.6):串行口工作方式选择位。可选择4种工作方式,如表9-2所示。,表9-2串行口的工作方式, RI(SCON.0):接收中断标志位。用于指示一帧信息是否接收完毕它的工作过程是:在方式0中,当串行接收完第8位数据时;在其他方式下,当串行口接收到停止位时;由内部硬件电路使RI=1。一旦RI被硬件置1,便产生串口中断请求(假设串口中断是开放的,下同)。,SCON各位名称和功能, TI(SCON.1):发送中断标志位。用于指示一帧信息是否发送完毕它的工作过程是:在方式0中,当串行发送第8位数据结束时;在其他方式下,开始串行发送停止位时,由内部硬件电路使TI=1,

13、并向CPU发出串口中断请求。与RI标志的清除方法相似,TI也必须通过软件才能将其清0(如执行CLR TI指令)。,SCON各位名称和功能, RB8(SCON.2):接收数据第9位。在方式2或方式3中,用于存放接收数据的第9位,此时,该位可能是奇偶校验位,也可能是多机通信中的地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8为接收到的停止位。方式0时,不使用RB8。,SCON各位名称和功能, TB8(SCON.3):发送数据第9位。在方式2或方式3中,用于存放发送数据的第9位,此时,该位可以用作奇偶校验位,在多机通信中,可以作为地址帧/数据帧的标志位。 REN(SCON.4):允许接收控

14、制位。若使REN=1,则启动串行口接收数据;若使REN=0,则禁止串口接收。,SCON各位名称和功能,SM2(SCON.5):多机通信控制位。主要用于方式2和方式3中。 若接收方单片机的SM2=1,则由收到的RB8来控制是否使RI置1:当收到的RB8=0时, RI不被置1,收到的信息被丢弃;当收到的RB8=1时,收到的数据进入SBUF(接收),并将RI置1,向CPU发出串口中断请求,接收方可在串口中断服务中将数据从SBUF(接收)中读走。也可以通过查询RI的办法,在发现RI为1后,将SBUF(接收)中的数据读走。,SCON各位名称和功能,若接收收方单片机的SM2=0,则RB8不再具有控制RI激

15、活的功能,不论收到的RB8为0还是1,收到的数据都会进入SBUF,并使RI=1。 运用SM2的控制功能,便可以实现多机通信(将在下一节中详细介绍)。 在方式0时,不使用SM2控制位,应将SM2设定为0。在方式1时,通常也将SM2设为0,若使SM2=1,则只有接收到有效的停止位时,RI才被置1。,SCON各位名称和功能,2电源控制寄存器PCON,PCON的字节地址为87H,不能按位寻址,只能按字节寻址。各位的定义如图9-16所示。其中,只有一位SMOD与串行口工作有关。编程时只能使用字节操作指令对它赋值。,图9-16 电源控制寄存器,PCON控制位的名称和功能, SMOD(PCON.7):波特率

16、倍增位。在串行口方式1、方式2、方式3中,用于控制是否倍增波特率。当SMOD=0时,波特率不倍增;当SMOD=1时,波特率提高一倍。 PCON其余的位,只定义了4位,GF1、GF0为通用标志位,PD、IDL用于节电方式控制:前者为掉电控制位,后者为空闲控制位。,9.3 串行接口的工作方式与波特率,9.3.1 串行接口的工作方式 9.3.2 串行接口的波特率,9.3.1 串行接口的工作方式,1方式0 2方式1 3方式2和方式3,1方式0,图9-17 串口工作在方式0时的内部结构,方式0时,串行口被设定为同步移位寄存器。这时,串行口的内部结构可简化为图9-17所示。,图9-17说明,由图9-17可

17、见,当串行口工作于方式0时,RXD(P3.0)引脚用于输入或输出数据,TXD(P3.1)引脚用于输出同步移位脉冲。波特率固定为fosc/12。发送和接收均为8位数据,低位在前,高位在后。 串口工作于方式0时,SM2、RB8和TB8皆不起作用,通常将它们均设置为0状态。,(1)方式0发送,方式0发送时,SBUF(发送)相当于一个并入串出的移位寄存器。 当TI=0时,通过指令向发送数据缓冲器SBUF写入一个数据,就会启动串行口的发送过程。从RXD引脚逐位移出SBUF中的数据,同时从TXD引脚输出同步移位脉冲。这个移位脉冲可供与串口通信的外设作为输入移位脉冲移入数据。 当SBUF中的8位数据完全移出

18、后,硬件电路自动将中断标志TI置1,产生串口中断请求。如要再发送下一字节数据,必须用指令先将TI清0,再重复上述过程。,图9-18 串口方式0的发送时序,方式0发送时的时序,(2)方式0接收,在方式0接收时,SBUF(接收)相当于一个串入并出的移位寄存器。 当SCON中的接收允许位REN=1,并用指令使RI为0时,就会启动串行口接收过程。外设送来的串行数据从RXD引脚输入,同步移位脉冲从TXD引脚输出,供给外设作为输出移位脉冲用于移出数据。 当一帧数据完全移入单片机的SBUF后,由硬件电路将中断标志RI置1,产生串口中断请求。接收方可在查询到RI=l后或在串口中断服务程序中将SBUF(接收)中

19、的数据读走。 如要再接收数据,必须用指令将RI清0,再重复上述过程。,串口方式0的接收时序,图9-19 串口方式0的接收时序,2方式1,工作方式1时,串口被设定为10位异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,所传送的字符帧格式如图9-20所示。,图9-20 串口方式1的字符帧格式,(1)方式1发送,在TI=0时,当执行一条写SBUF的指令后,即可启动串行口发送过程: 发送电路自动在写入SBUF中的8位数据前后分别添加1位起始位和1位停止位。在发送移位脉冲作用下,从TXD引脚逐位送出起始位、数据位和停止位。发送完一个字符帧后,自动维持TXD线为高电平。并使发送中断标志TI置1,产

20、生串口中断请求。通过软件将TI清0,便可继续发送。,串口方式1的发送时序,图9-21 串口方式1的发送时序,(2)方式1接收,当使用命令使RI=0,REN=1时,串口开始接收过程: 接收控制器先以速率为所选波特率的16倍的采样脉冲对RXD引脚电平进行采样,当连续8次采样到RXD线为低电平时,便可确认RXD线上有起始位。 此后,接收控制器就改为对第7、8、9三个脉冲采样到的值进行位检测,并以三中取二原则来确定所采样数据的值,如图9-22所示。,串口接收时对RXD引脚电平的采样,图9-22 串口接收时对RXD引脚电平的采样,方式1接收过程,RXD上的数据被逐位移入接收移位寄存器,当接收到停止位时,

21、将去除起始位和停止位后的8位数据装入接收缓冲器SBUF,并使RI=1,向CPU发出串口中断请求。但此时,若SM2=1,则只有接收到有效的停止位时,RI才被置1。 方式1的接收时序如图9-23所示。,图9-23 串口方式1的接收时序,3方式2和方式3,将串行口定义为工作方式2或方式3时,串口被设定为11位异步通信口。TXD为数据发送引脚,RXD为数据接收引脚,所传送的字符帧格式如图9-24所示。,图9-24 串口方式2和方式3的字符帧格式,(1)方式2和方式3发送,方式2和方式3的发送过程类似于方式1的发送过程,所不同的是,方式2和方式3有9位有效数据位。 因此,发送时,除了通过写SBUF指令将

22、8位数据装入SBUF(发送)外,还要把第9位数据预先装入SCON的TB8中。 第9位数据可以是奇偶校验位,也可以是其他控制位。 通常先使用指令SETBTB8(第9位为1时)或CLRTB8(第9位为0时)装入第9位数据。然后再执行一条写SBUF指令,将低8位发送数据送入SBUF中,便可以启动发送过程。一帧字符发送完后,TI=1。通过软件将其清0后,可用同样方法发送下一字符帧。,方式2和方式3的发送时序,图9-25 串口方式2和方式3的发送时序,(2)方式2和方式3 接收,方式2和方式3的接收过程也和方式l的接收过程类似。但不同的是:方式1时,RB8中存放的是停止位,方式2和方式3时,RB8中存放

23、的是第9位数据。 方式2和方式3正常接收时的接收时序如图9-26所示。其中,TB8被接收后存为RB8。,图9-26 串口方式2和方式3的正常接收时序,9.3.2 串行接口的波特率,在串行通信中,为了保证接收方能正确识别数据,收发双方必须事先约定串行通信的波特率。 MCS-51单片机在不同的串口工作方式下,其串行通信的波特率是不同的。其中,方式0和方式2的波特率是固定的; 方式1和方式3的波特率是可变的,由定时器T1的溢出率决定。计算公式如下。,波特率计算公式:, 方式0的波特率=fosc/12 方式1的波特率=(2SMOD/32)(T1溢出率) 方式2的波特率=(2SMOD/64)fosc 方

24、式3的波特率=(2SMOD/32)(T1溢出率),其中,T1溢出率是指定时器T1每秒钟溢出的次数。,T1溢出率计算公式:,由于T1每溢出一次所需的时间即为T1的定时时间,所以T1溢出率等于T1定时时间的倒数。计算公式如下(详见第6章)。,T1的定时时间=(2n计数初值)12/fosc,T1溢出率=1/(T1的定时时间) =fosc/(2n计数初值)12,公式中,n是定时器T1的位数,取值与T1的工作方式有关: 若定时器T1为方式0,则n=13 若定时器T1为方式1,则n=16 若定时器T1为方式2或方式3,则n=8,T1工作于方式2时 ,T1溢出率计数初值(TH1),在实际应用中,通常将定时器

25、T1选定为方式2。因为定时器T1在方式2时,为自动重装初值的8位定时器/计数器 (当TL1从全l变为全0时,TH1重装TL1)。这种方式,可避免因重装计数初值而带来的定时误差。此时,T1溢出率取决于T1的计数初值(TH1),即:,T1溢出率=fosc/256(TH1)12,综合以上分析,可得到定时器T1工作于方式2时,计数初值(TH1)的计算公式如下:,常用波特率参数表,在单片机应用中,常用的晶振频率为6MHz或12MHz(或11.0592MHz)。为避免繁杂的计算,表9-3列出了波特率和有关参数的关系,以方便查用。 (见P.176表9-3常用波特率参数表 ),表9-3 常用波特率参数表,9.

26、4 串行接口的应用举例,9.4.1 串行口方式0的应用 9.4.2 串行口方式1的应用 9.4.3 串行口方式2和方式3的应用,9.4.1 串行口方式0的应用,1将串行口作为并行输入口使用 2将串行口作为并行输出口使用,1将串行口作为并行输入口使用,串行口在方式0下,通过外接一个“并入串出”的8位移位寄存器(74LS165或CD4014),可以作为并行输入口使用。例如,通过外接CD4014将8路开关状态从串口读入单片机的电路:,图9-27 单片机与CD4014连接电路,图9-27说明:,CD4014是一个8位串入/并入-串出移位寄存器,CP为同步移位脉冲输入端,P1P8为并行输入端,Q8为串行

27、输出端。P/ 为控制端: 若P/ =0,则CD4014为串行输入(该输入端图中未画出); 若P/ =1,则CD4014为并行输入。开关KC用于提供控制信号,当KC闭合时,表示要求单片机读入开关量。 只要在程序中对P1.1引脚进行查询,发现P1.1=0(即开关KC闭合),便通过P1.0使CD4014的P/ =1,然后再启动单片机串口方式0接收过程,即可将CD4014并行输入的开关状态通过串口输入到单片机中。,图9-27相应的程序:,ORG0500H CLRES ; 关串口中断, 使用查询 方式控制 START:JBP1.1,$ ; 若KC未闭合, 则等待 SETBP1.0; 若KC未闭合, 令

28、CD4014并行输入开关量 NOP; 适当延时 NOP CLR P1.0; 令CD4014停止并行输入, 准备串行输出 MOV SCON, #10H ; 置串口为方式0、RI=0、 REN=1、启动接收 JNB RI, $ ; 若未接收完, 则等待 CLR RI; 接收完,清RI MOV A, SBUF ; 将开关量读入单片机的A中 ; 进行开关量处理 SJMP START; 准备下一次读入开关量 END,2将串行口作为并行输出口使用,串行口在方式0下,通过外接一个“串入并出”的8位移位寄存器74LS164(或CD4094),可以作为并行输出口使用。 例如,可以将应用项目中的LED显示电路改为

29、使用串行口来驱动。,【项目应用】将应用项目中单片机通过8155与LED数码管连接的接口电路,改为使用串行口与LED数码管连接。,(1)硬件电路:串行口与LED的连接电路如图9-28所示。,图9-28 串行口与LED的连接电路,图9-28工作原理,在图9-28中,8031单片机串行口工作于方式0,作为移位寄存器,RXD用于输出字形码(段码),TXD用于输出移位脉冲。 74LS164为8位并行输出串行移位寄存器,TXD每输入一个移位脉冲,74LS164便按QAQH的次序移位一次,8个移位脉冲过后,RXD输出的8位二进制数便全部移入一片74LS164中,并从QAQH引脚并行输出至LED的dpa引脚。

30、由于后级74LS164的输入端与前级74LS164的QH相连,6片74LS164首尾相串,因此,当6组(每组8个)移位脉冲过后,从RXD输出的6个字形码(对应时、分、秒的数值)便会从左到右送入6片74LS164,再并行输出到LED5LDE0,从而显示出实时时间。,(2)应用程序, 程序所用到的内部RAM数据存储单元如下。,27H:秒计数单元 28H:分计数单元 29H:时计数单元 4AH4FH:显示缓冲区, 源程序(见.179), DISP:CLRES ; 关串口中断,使用查询方式控制 MOVSCON, #00H ; 置串口为方式0 MOVR0, #4FH; 准备向缓冲区放数 MOVA, 27

31、H; 取秒值 ACALLPUTT; 放秒值 MOVA, 28H; 取分值 ACALLPUTT; 放分值 MOVA, 29H; 取小时值 ACALLPUTT; 放小时值 MOVR0, #4FH; 指向显示缓冲区低字节(秒单元) MOVR2, #06H; 共显示6位字符 MOVDPTR, #SEGTAB; 指向字形码表首 DISP1:MOVA, R0; 取出要显示的数, 源程序(见.179),DISP1:MOVA, R0; 取出要显示的数 MOVCA, A+DPTR; 查表,获得字形码 MOVSBUF, A; 字形码送串口输出 WAIT:JNBTI, $; 等待发送完一帧 CLRTI; 发送完,清

32、TI DECR0; 准备取下一个要显示的数 DJNZR2, DISP1; 6位数未显示完,继续 RET; 显示完6位,返回 PUTT:MOVRl , A; 暂存 ACALLPUTTl; 低4位先放入缓冲区 MOVA, R1; 取出原数 SWAPA; 高4位放入低4位中 PUTT0:ANLA, #0FH; 屏蔽高4位 MOVR0, A; 放进显示缓冲区 DECR0 ; 缓冲区地址指针减1 RET ; 字形码表: SEGTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H DB0F8H,80FH,90H,9.4.2 串行口方式1的应用,串行口工作在方式1时为10位异步通信口。

33、除去1位起始位和1位停止位,有效的数据为8位。这种方式通常应用于点对点的双机通信中,实现单片机和单片机或单片机与通用微机之间的信息交换。 下面以单片机的双机通信为例,介绍串行口在方式1中的应用。,1硬件连接,当进行通信的两台单片机距离很近时,它们的串行口之间可直接连接,如图9-29 所示。,图9-29 短距离双机通信的硬件连接,1硬件连接,当进行通信的两台单片机距离较远(5m15m)时,两台单片机之间则不宜直接连接。此时,通常采用RS-232C接口进行点对点的通信连接,如图9-30所示。,图9-30 长距离(5m15m)双机通信的硬件连接,2通信协议, 1号机是发送方,2号机是接收方。 1号机

34、发送时,先发送一个“E1”联络信号,2号机收到后回答一个“E2”应答信号,表示同意接收。 1号机收到应答信号“E2”后,开始发送数据,每发送一个数据字节都要计算“校验和”。 假定数据块长度为16个字节,起始地址为40H,一个数据块发送完毕后立即发送“校验和”。 2号机接收数据并转存到数据缓冲区,起始地址也为40H,每接收到一个数据字节便计算一次“校验和”。当接收完一个数据块后,再接收1号机发来的“校验和”,并将它与本机求出的校验和进行比较。,2通信协议,若校验和进行比较时,两者相等,说明接收正确,2号机回答00H;若两者不相等,说明接收不正确,2号机回答FFH,请求重发。1号机接到00H后结束

35、发送。若收到的答复不是00H,则重新发送数据一次。 双方约定采用串行口方式1进行通信,波特率为2400波特。 T1工作在定时器方式2,晶体振荡器频率选用11.0592MHz,PCON寄存器的SMOD位为0,通过计算或查表9-3,可得定时器T1的初值为(TH1)=(TL1)=0F4H。,3程序流程图 (1号机),图9-31 单片机双机通信的程序流程图 (a),3程序流程图(2号机),图9-31 单片机双机通信的程序流程图 (b),4应用程序(1号机源程序),ASTART:CLRES ; 关串口中断,使用查询方式控制收发 MOVTMOD, #20H ; 置定时器T1为方式2 MOVTH1, #0F

36、4H ; 装载定时初值, 波特率为2400 MOVTL1, #0F4H MOVPCON, #00H ; 置SMOD=0 SETBTR1; 启动定时器T1 MOVSCON, #50H ; 置串口为方式1, 允许接收, 清TI、RI ALOOP1:MOV SBUF, #0E1H ; 发联络信号 JNBTI, $ ; 等待一帧发完 CLRTI ; 发完清TI, 允许再发 JNBRI, $ ; 等待2号机的应答信号 CLRRI ; 收到应答, 清RI, 允许再接收 MOVA, SBUF; 读2号机应答信号至A XRLA, #0E2H; 判断2号机是否准备完毕 JNZALOOP1 ;2号机未准备好, 继

37、续联络 ALOOP2:MOV R0, #40H;2号机准备好, 设定数据块指针初值,4应用程序(1号机源程序),ALOOP2:MOV R0, #40H;2号机准备好, 设定数据块指针初值 MOVR7, #10H; 设定数据块长度 MOVR6, #00H ; 校验和单元清0 ALOOP3:MOV SBUF, R0; 发送一个字节数据 MOVA, R6; 取出校验和 ADDA, R0 ; 求校验和 MOVR6, A ; 保存校验和 INCR0; 数据块指针加1 JNBTI, $ ; 等待一帧发完 CLRTI ; 一帧发完,清TI, 允许再发 DJNZR7, ALOOP3 ; 整个数据块是否发送完毕

38、 MOVSBUF, R6 ; 发送校验和 JNBTI, $ CLRTI ; 发完,清TI JNBRI, $ ; 等待2号机的应答信号 CLRRI ; 收到应答,清TI MOVA, SBUF; 读2号机应答信号至A JNZALOOP2 ; 2号机应答“错误”, 转重新发送 RET; 2号机应答“正确”, 返回主程序,4应用程序(2号机源程序),BSTART:CLRES; 关串口中断,使用查询方式控制收发 MOVTMOD, #20H; 置定时器T1为方式2 MOVTH1, #0F4H; 装载定时初值,波特率为2400 MOVTL1, #0F4H MOVPCON, #00H ; 置SMOD = 0

39、SETBTR1; 启动定时器T1 MOVSCON, #50H ; 置串口为方式1,允许接收,清T1、RI BLOOP1:JNBRI, $; 等待1号机的联络信号 CLRRI; 收到1号机联络信号, 清RI MOVA, SBUF ; 读1号机联络信号到A XRLA, #0E1H ; 判断是否为1号机联络信号 JNZBLOOP1 ; 不是1号机联络信号, 再等待 MOVSBUF, #0E2H ; 是1号机联络信号, 发应答信号 BLOOP2:JNB TI, $ CLRTI ; 发完,清TI MOVR0, #40H ; 准备接收数据, 设定数据块指针初值 MOVR7, #10H ; 设定数据块长度

40、MOVR6, #00H; 清校验和单元 BLOOP3:JNB RI, $; 等待接收数据,4应用程序(2号机源程序),BLOOP3:JNB RI, $; 等待接收数据 CLRRI ; 收到清RI MOVA, SBUF; 读入接收数据至A MOVR0, A ; 保存接收数据 INCR0; 数据指针加1 ADDA, R6 ; 求校验和 MOVR6, A; 保存校验和 DJNZ R7, BLOOP3 ; 判数据块是否接收完毕 JNBRI, $ ; 完毕, 接收1号机发来的校验和 CLRRI ; 收到,清R2 MOVA, SBUF; 读入校验和至A XRLA, R6 ; 比较校验和 JZDONE ;

41、校验和相等, 发“正确”标志 MOVSBUF, #0FFH ; 校验和不相等, 发“错误”标志 SJMPBLOOP2; 重新接收 DONE:MOVSBUF, #00H; 发“正确”标志 RET; 返回主程序,9.4.3 串行口方式2和方式3的应用,串行接口工作于方式2和方式3时,可进行11位异步通信,除去2位起始位和停止位,有效的数据为9位。借助第9位数据和SM2的控制功能,可实现单片机的多机通信。 下面以单片机的主从式多机通信系统为例介绍串行口在方式2和方式3中的应用。,1硬件连接,主从式多机通信系统是指系统中有一台为主机,其余为从机,从机服从于主机的调度和支配。主机发送的信息可以传送到各个

42、从机或指定从机,从机发送的信息只能为主机所接收,各从机之间不能直接通信。主机和从机之间的硬件连接如图9-32所示。,图9-32 主从式多机通信系统的硬件连接,2通信协议,(1)用8位数据对从机进行编址,地址范围为00HFEH,系统最多允许255台从机。其中,FFH留作主机控制从机复位(使从机的SM2 = l)的命令。 (2)主机以发送数据第9位TB8作为发送地址或数据/命令的区分标志,TB8 = 1时表示该帧为地址帧;TB8 = 0时表示该帧为数据/命令帧。 (3)所有从机的SM2起始时均设为1,都处于接收地址帧状态,等待主机寻址。,2通信协议,(4)所有从机收到地址帧后,都将接收的地址与本机

43、的地址比较。地址相符的从机,将其SM2位置0,使之能接收主机随后发来的第9位为0的数据帧或命令,并把本站地址发回主机作为应答;地址不符的从机,则仍保持SM2 = 1,使之不能接收主机随后发来的信息(因为主机这时发送数据的第9位为0)。继续处于等待主机寻址的状态。 (5)主机核对从机地址无误后,开始进行主机和被寻址从机之间的数据通信,被寻址从机在通信完成后,重新将其SM2置为1,回到等待主机寻址状态,等候下次通信。,2通信协议,(6)主机使用如下两条命令指示数据传输方向。 00H:主机发送从机接收命令; 01H:从机发送主机接收命令。 这两条命令主机均以数据形式(即第9位TB8为0)发送,所以只

44、能被已寻址的从机接收,对未被寻址的从机无效。,2通信协议,(7)为了便于主机了解被寻址从机的状态,约定了一个从机状态字,其格式如图9-33所示。,图9-33 从机状态字格式,2通信协议,(8)主、从机双方采用串行口方式3进行通信,选定通信波特率为1 200。T1工作在定时器方式2,晶体振荡器频率选用11.0592MHz,PCON寄存器的SMOD位为0, 通过计算或查表9-3,可得定时器T1的初值为(TH1)=(TL1)=0E8H。,3主机程序,主机程序采用查询方式编程,由主机主程序和主机通信子程序组成。 程序中所用寄存器分配如下:,R0:存放主机发送数据块起始地址。 R1:存放主机接收数据块起

45、始地址。 R2:存放被寻址从机地址。 R3:存放主机发出的命令。 R4:存放发送数据块长度。 R5:存放接收数据块长度。,(1)主机程序流程图(主程序流程图 ),图9-34 主机主程序流程图,图9-35 主机通信子程序流程图,(1)主机程序流程图(通信子程序流程图 ),(2)主机主程序,程序中用SLAVE表示被寻址从机的地址,由实际地址代真。,ORG2000H START:MOVTMOD, #20H; 设置定时器T1为方式2 MOVTH1, #0E8H; 波特率为1 200bit/s MOVTL1, #0E8H SETBTR1; 启动T1工作 MOVSCON, #0D8H; 串口方式3, SM

46、2 = 0, 允许接收, TB8 = 1 MOVPCON, #00H; SMOD = 0 MOVR0, #40H; 发送数据块起始地址送R0 MOVR1, #20H; 接收数据块起始地址送R1 MOVR2, #SLAVE; 被寻址从机地址送R2 MOVR3, #00H/01H; 若为机接收命令, 则00H送R3 ; 若为机发送命令, 则01H送R3 MOVR4, #20D; 发送数据块长度送R4 MOVR5, #20D; 接收数据块长度送R5 ACALLMCOMMU; 调用主机通信子程序 SJMP$; 动态停机,(3)主机通信子程序,ORG2100H MCOMMU:MOV A, R2; 从机地

47、址送A MOVSBUF, A; 发送从机地址 JNBTI, $; 等待发送完毕 CLRTI; 发送完后清TI,为下次发送作准备 MOVA, SBUF; 从机应答地址送A XRLA, R2; 核对两个地址 JZMTXD2; 相符, 则转MTXD2 MTXD1:CLRTB8; 置TB8为数据/命令帧标志 MOVSBVF, #0FFH; 发送从机复位命令 JNBTI, $; 等待发完 CLRTI; 发完,清TI SETBTB8; 置TB8为地址帧标志 SJMPMCOMMU; 重发从机地址 MTXD2:CLRTB8; 置TB8为数据/命令帧标志,(3)主机通信子程序,MTXD2:CLRTB8; 置TB

48、8为数据/命令帧标志 MOVSBUF, R3; 发送数据传输方向命令 JNBTI, $; 等待发完 CLRTI; 发完,清TI JNBRI, $; 等待从机应答 CLRRI; 从机应答后清R1 MOVA, SBUF; 从机应答状态字送A JNBACC.7, MTXD3; 若应答无误, 则命令分类 SJMPMTXD1; 若应答有误, 则重新联络 MTXD3:CJNER3, #00H, MRXD1; 若为从机发送主机接收命令, 则转MRXD1 JNBACC.0, MTXD1; 若从机接收未就绪, 则重新联络 MTXD4:MOVSBUF, R0; 若从机接收就绪, 则开始发送数据,(3)主机通信子程

49、序,MTXD4:MOVSBUF, R0; 若从机接收就绪, 则开始发送数据 JNBTI, $; 等待发送一帧结束 CLRTI; 发送结束清TI, 允许再发送 INCR0; 指向发送数据的下一字节 DJNZR4, MTXD4; 若数据块未发完, 则继续 RET; 数据块发完, 返回主程序 MRXD1:JNBACC.1, MTXD1; 若从机发送未就绪, 则重新联络 MRXD2:JNBRI, $; 若从机发送就绪, 则等待接收完毕 CLRRI; 从机应答后清R1, 允许再接收 MOVA, SBUF; 收到的数据送A MOVR1, A; 保存接收数据 INCR1; 接收数据区指针加1 DJNZR5,

50、 MRXD2; 若数据块未接收完, 则继续 RET; 数据块接收完, 返回主程序 END,4从机程序,从机程序采用串口中断方式编程,由从机主程序和从机串口中断服务程序组成。程序中用SLAVE代表从机的本机地址,取值范围为00HFEH;将位寻址区的00H(即20H.0)用作本机发送就绪状态位:01H(即20H.1)用作本机接收就绪状态位,1表示就绪,0表示未准备好状态,由从机在主程序中依据发送或接收是否就绪对它们进行赋值;从机发送数据块的起始地址设为30H,从机接收数据块存放始址设为50H,发送或接收的数据块长度假设为20个字节,与主机相同。 程序中用到的寄存器分配如下:,R0:存放发送数据块起

51、始地址。 R1:存放接收数据块起始地址。 R2:存放发送数据块长度。 R3:存放接收数据块长度。,(1)从机程序流程图 从机主程序流程图,图9-36 从机主程序流程图,图9-37 从机串口中断服务程序流程图,(1)从机程序流程图 从机串口中断服务序流程图,(2)从机主程序,ORG1000H START:MOVTMOD, #20H; 定时器T1为方式2 MOVTH1, #0E8H; 波特串为1 200 MOVTL1, #0E8H; SETBTR1; 启动T1工作 MOVSCON, #0F8H; 串口方式3, SM2 = 1, 允许接收, TB8 = 1 MOVPCON, #00H; SMOD =

52、 0 MOVR0, #30H; 发送数据块始址送R0 MOVR1, #50H; 接收数据块始址送R1 MOVR2, #20D; 发送数据块长度送R4 MOVR3, #20D; 接收数据块长度送R5 SETBEA; 开CPU总中断 SETBES; 允许串行口中断 CLRRI; 清RI, 作好接收准备 SETB00H; 若发送就绪, 则置00H(即20H.0)为1 SETB01H; 若接收就绪, 则置01H(即20H.1)为1 SJMP$; 动态停机,(2)从机串口中断服务程序,ORG0023H SJMPSINT; 转入从机串口中断服务程序 ORG2000H SINT:CLRES; 关闭串口中断

53、CLRRI; 清RI PUSHACC; 保护现场 PUSHPSW MOVA, SBUF; 接收到的从机地址送A XRLA, #SLAVE; 与本机地址进行核对 JZSRXD1; 若是呼叫本机, 则转SRXD1 RETURN:POP PSW; 若不是呼叫本机, 则恢复现场 POPACC CLRTI; 清TI,防止错误进入串口中断 SETBES; 开放串口中断 RETI; 中断返回 SRXD1:CLRSM2; 准备接收数据/命令,(2)从机串口中断服务程序,SRXD1:CLRSM2; 准备接收数据/命令 MOV SBUF, #SLAVE; 发回本机地址,供主机核对 JNBRI, $; 等待接收主机

54、发来的数据/命令 CLRRI; 接收到后清RI,为后续接收作准备 CLRTI; 清TI,为后续发送作准备 MOVA, SBUF; 接收命令选A XRLA, #0FFH; 判断是否为复位命令 JNZSRXD2; 若是数据/命令,则转SRXD2 SETBSM2; 若是复位命令,则令SM2 = 1 SJMPRETURN; 返回主程序 SRXD2:MOVA, SBUF; 接收命令送A CJNEA, #02H, NEXT; 判断是否合法 NEXT:JCSRXD3; 若命令合法,则转SRXD3 MOV SBUF, #80H; 若命令不合法,发送ERR = 1的状态字 JNBTI, $; 等待发送完毕 SE

55、TBSM2; 令SM 2 = 1 SJMPRETURN; 返回主程序 SRXD3:JZSCHRX; 若为从机接收命令, 则转SCHRX,(2)从机串口中断服务程序,SRXD3:JZSCHRX; 若为从机接收命令, 则转SCHRX JB00H, STXD; 若本机发送就绪, 则转STXD MOVSBUF, #00H; 若本机发送未就绪, 则发TRDY = 0 SETBSM2; 令SM2 = 1 SJMPRETURN; 返回主程序 STXD:MOVSBUF, #02H; 发送TRDY = 1的状态字 JNBTI, $; 等待发送完毕 CLRTI; 发送完后清TI LOOP1:MOVSBUF, R0

56、; 发送数据块的一个字符 JNBTI, $; 等待发送完毕 CLRTI; 发送完后清TI INCR0; 发送数据块指针加1 DJNZR2, LOOP1; 数据块未发完, 则继续 SETBSM2; 发完, 令SM2 = 1 SJMPRETURN; 返回主程序 SCHRX:JB01H, SRXD; 若本机接收就绪, 则转SRXD,方式0扩展输入输出电路,解:数据的输入输出通过RXD接收和发送,移位时钟通过TXD送出,74HC164用于串/并转换,74HC165用于并/串转换。 C语言程序清单: #include sbit P1_0=P10; sbit P1_1=P11; unsigned char data1; void main() SCON=0 x10;/串行口方式0,允许接收 ES=1; EA

温馨提示

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

评论

0/150

提交评论