1、第9章 MCS-51系统串行通信接口,9.1 串行通信基础 9.2 MCS-51串行通信接口,9.1 串行通信基础,I/O数据的传送方式:主要指与CPU怎么交互 同步传送:CPU可在任意时刻读或写数据 查询方式:CPU通过查询外设状态口信息,决定读或写 中断方式:利用CPU本身的中断功能 DMA方式:不经过CPU,直接在外设和内存之间传送。,一、通信的基本方式: 根据数据的同一时刻传送的位数分为并行通信和串行通信。 1、并行通信数据的各位同时传送,并行通信的特点是:传送速度快、效率高。但有多少数据位就需多少根数据线,因此传送成本高。在集成电路芯片的内部、同一插件板上各部件之间、同一机箱内各插件
2、板之间等的数据传送都是并行的。并行通信的距离通常小于30米。,串行通信的特点是:数据传送按位顺序进行,最少只需一根传输线即可完成,成本低但速度慢,在图中可以看到,并行传送8位数只需串行发送一位的时间1T。计算机与远程终端或终端与终端之间的数据传送通常都是串行的。串行通信的距离可以从几米到几千公里。 而并行通信的距离30米,2、串行通信数据一位一位顺序传送,二、串行通信的方式,按照串行数据的同步方式,串行通信又分为两种方式:,在单片机中,主要使用异步通信方式.,异步通信,同步通信,在异步通信中,数据通常是以字符(字节)为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,通过传输线由接收设备一帧
3、一帧地接收。 发送端和接收端可以有各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。在异步通信中,发送端和接收端依靠字符帧格式和波特率来协调数据的发送和接收。字符帧格式和波特率是两个重要指标,由用户根据实际情况选定。,1 异步通信(Asynchronous Communication),字符帧也叫数据帧,起始位、数据位、奇偶校验位和停止位四部分组成。,字符帧格式,2)起始位:位于字符帧开头,占一位,使数据线处于“space”( 逻辑) 状态,用于向接收设备表示发送端开始发送一帧信息。3)数据位:紧跟起始位之后就传送数据位。在数据位中,低位在前(左),高位在后(右)。根据字符编码
4、方式的不同,数据位可取5位、6位、7位或8 位。若传送数据为ASCII码,则常取7位。4) 奇偶校验位:位于数据位之后,仅占一位,用于对字符传送作正确性检查。奇偶校验位有3种可能的选择:奇、偶或无校验,由用户根据需要选定。5)停止位:位于字符帧末尾,它对应于“mark”(逻辑1)状态,用于向接收端表示一帧字符信息已发送完毕。停止位可以是1、1.5或2位,在实际应用中由用户根据需要确定。,波特率(baud rate), 波特率的定义:是每秒钟传送二进制数码的位数( 亦称比特数),单位是bps(bit per second),即位/秒。 字符的实际传送速率:是指每秒钟内所传字符帧的帧数, 与字符帧
5、格式有关。 波特率是串行通信的重要指标,用于表征数据传送的速率。波特率越高,数据传输速度越快。,同步通信是以一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符,由同步字符、数据字符和校验字符三部分组成。同步字符: 位于帧结构的开头,用于确认数据字符的开始。由于接收端不断对传输线采样,并把采样到的字符与双方约定的同步字符比较,只有比较成功后才会把后面接收到的字符数据加以存储。,2、同步通信(Synchronous Communication),一、MCS-51串行口结构,9.2 MCS-51单片机串行口结构及控制,1、SBUF(发
6、送)和SBUF(接收) 8位缓冲寄存器共用一个端口地址99H SBUF(发送) 存放将要发送的字符数据 SBUF(接收) 存放串行口接收到的字符数据 MOV SBUF,A (发送) 产生写SBUF脉冲 MOV A, SBUF (接收) 产生读SBUF脉冲,2、在异步通信中,发送和接收都是在发送时钟和接收时钟控制下进行的,发送和接收时钟即可由主机频率经分频后提供,也可由内部定时器T1或T2的溢出率经过16分频后提供。,3、串行口的发送,MOV SBUF,A,自动在发送字符前后添加起始位、停止位和其它控制位,然后在移位脉冲控制下,一位一位地从TXD线上串行发送字符帧。,4、串行口的接收,接收电路连
7、续接收到一帧字符后就自动的去掉起始位并使RI=1,向CPU提出中断请求(设串行口中断是开放的)。 CPU响应中断 MOV A,SBUF,二、串行口工作方式,1、方式0该方式只能与串行口设备寄存器方式连接,不能实现双机之间通信,每次传送8位数据,其波特率固定为fosc/12,传输距离一般不超2米。,2、方式1 该方式是典型的双机异步通信方式,字符帧格式为10位(8位数据位、一位起始位和一位停止位),波特率由定时器T1的溢出率决定。,SMOD:波特率倍增选择,由PCON寄存器的最高位设置。SMOD的选择与波特率误差有关。,fosc:51单片机主时钟。一般选6MHz12MHz。K:定时器T1的计数器
8、长度,T1若选工作方式2,则K=8。N:定时器定时常数的初值。,三、串行口工作方式设置,串行口工作方式的设置和控制是通过SCON(98H)和PCON(87H) 实现。,SM0和SM1:串行口方式控制位,设定串行口的工作方式,SM2:多机通信控制位,方式2、3使用。方式0 、1不用,应设置为0状态。,REN:允许接收控制位。 REN=0,则禁止串行口接收 REN=1,则允许串行口接收,TB8:发送数据第9位,方式2、3时存放发送数据第9位。TB8由软件置位或复位。,RB8:接收数据第9位,方式2、3时存放接收数据第9 位。在方式1下,若SM2=0,RB8存放接收到的停止位。方式0下,不使用RB8
9、,TI:发送中断标志位,用于指示一帧数据是否发送完。 在方式0下,发送电路发送完第8位数据时,TI由硬件置位;在其它方式下,TI在发送电路开始发送停止位时置位。TI在发送前必须由软件复位,发送完一帧后由硬件置位的。TI位也可供CPU查询。,RI:为接收中断标志位,用于指示一帧信息是否接收完。在方式0下,RI在接收电路接收到第8位数据 时由硬件置位;在其它方式下,RI是在接收电路接收到停止位的中间位置时置位的。RI也可供CPU查询,以决定CPU是否需要从“SBUF(接收)”中提取接收到的字符或数据。RI也由软件复位。,9.2 串行口各种工作方式应用举例,一、 方式0SM2、TB8、RB8不起作用
10、,应设置“0”态,发送(TI=0), MOV SBUF,A, A 数据送入SBUF(发送),RxD线发出8位数据,TxD线发送同步脉冲。8位数据发送完后,TI由硬件置位,向CPU请求中断(若中断开放)。CPU响应中断后先用软件使TI清零,然后再给“SBUF(发送)”送下一个欲发送字符。,接收(RI=0和REN=1) 串行数据由RxD线输入,TxD线输出同步脉冲。 接收电路接收到8位数据后,RI自动置“1”并发出串行口中断请求。CPU查询到RI=1或响应中断后便可通过 MOV A,SBUF SBUF(接收)数据送入A。,例1 请编出发光二极管自左至右以一定速度显示的程序。设发光二极管为共阴极接法
11、。,主程序 ORG 2000H MOV SCON,#00H ;串行口初始化为方式0 MOV IE,90H ;开串口中断 CLR P1.0 ;禁止CD4094并行输出 MOV A,#80H ;起始显示码送A MOV SBUF,A ;8031串行输出 LOOP: SJMP LOOP ;等待串行口输出完,中断服务程序ORG 0023HLJMP SBV ;转SBVORG 0100H SBV: SETB P1.0 ;点亮发光二极管LCALL DELAY ;点亮一段时间CLR TI ;清发送中断标志RR A ;准备点亮下一位CLR P1.0 ;灭显示MOV SBUF,A ;串行口输出RETI ;中断返回
12、DELAY: ;延时程序END,二、方式1,串行口设定为10位异步通信方式。8位数据位,1位起始位,1位停止位。 发送(TI=0), MOV SBUF,A 发送电路自动在8位发送字符前后分别添加1位起始位和停止位,并在移位脉冲的作用下在TxD线上依次发送一帧信息,发送完后自动维持TxD线为高电平。 TI由硬件在发送停止位时置位,由软件将它复位。,接收(RI=0和REN=1) 在接收到有效停止位时,接收电路必须同时满足以下两个条件:RI=0和SM2=0,才能把接收到的8位字符存入“SBUF(接收)”中,把停止位送入RB8中,并使RI=1和发出串行口中断请求。,例2 请用中断法编出串行口方式1下的
13、发送程序。 设单片机主频为6MHz,定时器T1用作波特率发生器,波特率为2400bps,被发送字符块在内部RAM的地址为TBLOCK单元,字符块长度为LEN。要求奇校验位在数据第8位发送,字符块长度LEN率先发送。,波特率为2400bps,取SMOD=1,由表查得TH1和 TL1的时间常数初值为F4H。,主程序ORG 2100HTBLOCK DATA 20HLEN DATA 14H START: MOV TMOD, #20H ;定时器T1为方式2MOV TL1, #0F4H ;波特率为2400bpsMOV TH1, #0F4H ;给TH1送重装初值MOV PCON, #80H ;令SMOD=1
14、SETB TR1 ;启动T1MOV SCON, #40H ;串行口为方式1MOV R0, #TBLOCK ;字符块始址送R0MOV A, #LENMOV R2, A ;字符块长度字节送R2MOV SBUF, A ;发送LEN字节SETB EA ;开CPU中断 WAIT: SETB ES ;允许串行口中断SJMP WAIT ;等待中断,中断服务程序ORG 0023HLJMP TXSVE ;转发送服务程序ORG 2150H TXSVE: CLR TI ;清TIMOV A, R0 ;发送字符送AMOV C, PSW.0 ;奇偶校验位送CCPL C ;形成奇偶校验位送CMOV ACC.7, C ;使A
15、中成为奇数个1MOV SBUF, A ;启动发送DJNZ R2, NEXT ;若字符块未发完,则NEXTCLR ES ;关串行口中断SJMP STOP ;停止发送 NEXT: INC R0 ;字符块指针加1 STOP: RETI ;中断返回END,双机之间通信时,SM2=0、REN=1、TB8/RB8可做奇偶位,多机通信时,SM2=0、REN=1、TB8/RB8做多机通信控制位。,发送(TI=0)发送前要求把第9位数据位预先装入SCON的TB8,由用户安排,可以是奇偶校验位或其他控制位。SETB TB8 CLR TB8MOV SBUF,A TI由硬件在发送停止位时置位,由软件将它复位。,接收(
16、RI=0和REN=1)方式1 RB8存停止位方式2、3 RB8存放第9数据位,接收有效字符的条件:,RI=0SM2=0或RB8=1,同时满足两条件,执行 MOV A ,SBUF; 使 RI=1, 否则接收无效, RI=0。,RI=0,SBUF空,SM2或RB8 共同控制接收RB8 奇偶校验,SM2 =0SM2 =1, RB8=1,多机通信,例4请用查询法编出串行口在方式2下的发送程序。设单片机主频为6MHz,波特率为fosc/32,发送数据区始址为TBLOCK(内部RAM),接收数据块长度为LEN。要求采用累加和校验,以空出第9位它用。,累加和是指累加所有需要发送或接收的数据(字符)字节后得到
17、的低字节和(大于255部分舍去)。累加和校验要求发送端在发送完数据后把累加和也发送出去,接收端除要计算接收数据的累加和外,还必须接收发送端发来是累加和,并把它同求得的累加和比较。若比较相同,则数据传送正确;否则,数据传送有错。,主程序ORG 1000HTBLOCK DATA 20HLEN DATA 1EH START: MOV SCON, #80H ;方式2MOV PCON, #80H ;令SMOD=1MOV R0, #TBLOCK ;字符块始址送R0MOV R2, #LEN ;字符块长度字节送R2MOV R3, #LEN ;存入累加和寄存器R3ACALL TXSUB ;调用发送子程序SJMP
18、 $ ;停机,发送子程序,ORG 1100H TXSUB: PUSH ACC ;保护A中的内容PUSH PSWCLR TI ;清TITXLEN: MOV A , R2 ; 发送字符块长度MOV SBUF , AJNB TI,$ ;等待发完CLR TI ;发完后清TITXD:MOV A,R0 ;发送字符送AMOV SBUF,A ;启动发送JNB TI,$ ;等待发完,TXSUM: MOV A,R3 ;若已发完则发累加和MOV SBUF,AJNB TI,$ ;等待发完CLR TI ;发完后清TIMOV R3,#00H ;清累加和寄存器POP PSW ;恢复现场POP ACCRETEND,CLR T
19、I ;发完后清TIADD A,R3 ;求累加和MOV R3,A ;存入R3INC R0 ;字符块指针加1DJNZ R2,TXD ;若字符未全发完,则继续,例5请用查询法编出串行口在方式3下的接收程序。设单片机主频为6MHz,波特率为2400bps,接收数据区始址为RBLOCK(内部RAM),接收数据块长度字节由始发端发送来。要求采用累加和校验,若传输有错,转出错处理程序。,本程序有主程序、接收子程序和出错处理程序组成,主程序:ORG 1000HRBLOCK DATA 30H START: MOV TMOD, #20H ;T1工作于方式2MOV TH1, #OF4H ;设置时间常数初值MOV T
20、L1, #0F4HSETB TR1 ;启动T1MOV SCON, #0D0H ;串行口工作于方式3接收MOV PCON, #80H ;使SMOD=1MOV R0, #RBLOCK ;接收数据区始址送R0MOV R3, #00H ;累加和寄存器清零ACALL RXSUB ;转接收子程序 SJMP $ ;停机,接收子程序:RXSUB: CLR RI ;清RIRXLEN: JNB RI , $ ;等待接收数据块长度字节CLR RI ;接收完后清RIMOV A , SBUF ;数据块长度字节送AMOV R2 , A ;存入R2ADD A , R3 ;开始求累加和MOV R3, A ;累加和存入R3,RxD: JNB RI , $ ;等待接收字符CLR RI ;接收完后清RIMOV A , SBUFMOV R0 , A ;接收字符存入内存ADD A , R3 ;求累加和MOV R3 , A ;存入R3INC R0 ;接收数据区指针加1DJNZ R2 , RxD ;若数据块未收完,则继续RXSUM: JNB RI, $ ;等待接收累加和CLR RI ;接收完后清RIMOV A , SBUF ;接收到的累加和送AXRL A , R3 ;比较两个累加和JNZ ERROR ;若不等,则转出错处理RET ;若相等,则返回,