资源描述
第9章 思考题和习题解答
9.1 异步通信和同步通信的主要区别是什么?MCS-51串行口有没有同步通信功能?
答:所谓同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相信始终保持一致(同步),保证了通信双方在发送和接收数据时具有完全一致的定时关系。
异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。
MCS-51串行口使用的都是异步通信,没有同步通信功能。
9.2 串行通信有按照数据传送方向可分为哪几种方式,各自有什么特点?
答:按照数据传送方向和UART的工作方式,串行通信可分为单工方式、半双工和全双工三种方式。
1)单工方式:在单工方式下,通讯线的一端连接发送器,另一端连接接收器,只允许数据按照一个固定的方向传送,即一方只能发送,而另一方只能接收,这种方式现在较少使用。
2)半双工方式:在半双工方式下,系统中的每个通讯设备都由一个发送器和一个接收器组成,通过开关接到通讯线路上,双方(A,B)之间只有一个通信回路,数据要么由A发送到B,要么由B发送到A,不能同时在两个方向上传送。半双工方式比单工方式灵活,但是它的效率依然不高。
3)全双工方式:在全双工方式下,A、B两站间有两个独立的通信回路,两站都可以同时发送和接收数据。一回路用于发送,另一回路用于接收,因此,全双工方式通信效率较高。
9.3 通信波特率的定义是什么?它和字符的传送率之间有何区别?
答:波特率的定义为每秒钟传送二进制数码的位数(也称比特数),单位通常为bps(bit per second),即位/秒。波特率是串行通信的重要指标,用于表征数据传输的速度。波特率越高,数据传输速度越快,与字符的传输速率不同。字符的传输速率是指每秒钟内所传字符帧的帧数,它与字符帧格式有关。而波特率则与字符帧格式无关
9.4 串行通信中为什么要用modem?按数字信号的调制技术,modem可分为哪三类?
答:计算机通信要传送的是数字信号,而在远程数据通信时,通信线路往往是借用现成的电话网,但是,电话网是为300~3400Hz间的音频模拟信号设计的,不合适对二进制数据的传输。二进制数据信号在电话网上远距离传输必然会导致信号衰减和畸变,以致传送到接收端后无法辨认。为了使数据能在远程通信中,使用电话网进行传输,必须利用调制的手段,将数字信号变换成能在通讯线上传输而不受影响的模拟信号,在发送时需要采用调制器(Modulator)把数字信号转换成模拟信号,送到通信链路上去,而在接收时,需要用解调器(Demodulator)再把从通信链路上收到的模拟信号还原成数字信号。
按对数字信号的调制技术,MODEM可分为频移键控(FSK)、相移键控(PSK)和相幅调制(PAM)三种类型。
9.5简述MCS-51串行口在四种工作方式下的字符格式。
答:MCS-51串行口口可设置4种工作方式,可有8位、10位或11位帧格式。
方式0以8位数据为一帧,不设起始位和停止位,先发送或接收最低位。其帧格式如下:
…
D0
D1
D2
D3
D4
D5
D6
D7
…
方式1以10位为一帧传输,设有1个起始位(0),8个数据位和1个停止位(1)。其帧格式为:
…
起始
D0
D1
D2
D3
D4
D5
D6
D7
停止
…
方式2和方式3以11位为1帧传输,设有1个起始位(0),8个数据位,1个附加第9位和1个停止位(1)。其帧格式为:
…
起始
D0
D1
D2
D3
D4
D5
D6
D7
D8
停止
…
附加第9位(D8)由软件置1或清0。发送时在TB8中,接收时送RB8中。
9.6 MCS-51串行口控制寄存器SCON中的SM2的含义是什么?主要在什么方式下使用?
答:在方式2 和3 中,若SM2=1 且接收到的第九位数据(RB8)为1,才将接收到的前8 位数据送入接收SBUF中,并置位RI产生中断请求;否则丢弃前8 位数据。若SM2=0,则不论第九位数据(RB8)为1 还是为0,都将前8 位送入接收SBUF中,并产生中断请求。方式1 时,SM2必须置0。SM2主要在多机通信时使用。
9.7 简述MCS-51串行口在4种工作方式下的字符格式。
9.8 简述MCS-5l串行口在4种工作方式下波特率的产生方法。
答:串行口方式0波特率的产生如下图所示。
方式0波特率 = fosc / 12
串行口方式2波特率的产生如下图所示。
方式2波特率=2SMOD/64×fosc
方式1和方式3的波特率的产生如下图所示。
方式1、方式3
9.9 简述MCS-5l串行口发送和接收数据的过程。
答:MCS-51串行口的发送过程由指令MOV SBUF,A启动,即CPU由一条写发送缓冲器的指令把数据(字符)写入串行口的发送缓冲器SBUF(发)中,再由硬件电路自动在字符的始、末加上起始位(低电平)、停止位(高电平)及其它控制位(如奇偶位等),然后在移位脉冲的控制下,低位在前,高位在后,从TXD端(方式0除外)一位一位地向外发送。
串行口的接收与否受制于允许接收位REN的状态,当REN被软件置“1”后,允许接收器接收。接收端RXD一位位地接收数据,直到收到一个完整的字符数据后,控制电路进行最后一次移位,自动去掉启始位,使接收中断标志RI置“1”,并向CPU申请中断。CPU响应中断,用一条指令(MOV A,SBUF)把接收缓冲器SBUF(收)的内容读入累加器。
TI和RI是由硬件置位的,但需要用软件复位。
9.10试比较和分析MCS-5串行口在4种工作方式下发送和接收数据的基本条件。
答:1. 方式0(SM1=SM0=0)
方式0发送是以写SBUF寄存器的指令开始,8位数据输出结束时TI 被置位。
方式0接收是在REN=1和RI=0同时满足时开始,接收的8位数据装入SBUF中时结束,RI被置位。
2. 方式1(SM0=0,SM1=1)
方式1发送以执行一条写SBUF的指令启动一次串行口发送过程,发送电路就自动在8位发送字符前后分别添加1位起始位和停止位,发送完一帧信息后,发送中断标志TI由硬件在发送停止位时置位,应由软件将它复位。
方式l接收的前提条件是REN=l,同时满足两个条件(1)RI=0;(2)SM2=0或接收到的停止位为1,本次接收有效,将其装入SBUF和RB8位。否则放弃接收结果。
3.方式2和方式3
方式2和方式3的发送起始于执行一条写SBUF的指令当第9位数据(TB8)输出之后,置位TI。
方式2和方式3的接收前提条件也是REN=1.在第9位数据接收到后,如果下列条件同时满足 (1)RI=0;(2)SM2=0或接收到的第9位为1, 本次接收有效,将已接收的数据装入SBUF和RB8,并置位RI。如果条件不满足,则接收无效。
9.11请用中断法编出串行口方式1下的发送程序。设8031单片机主频为11.0592MHz,波特率为 9600bps,发送数据缓冲区在外部 RAM,起始地址为 TBLOCK,数据均为7位的ASCII字符,数据块长度为30,采用偶校验,放在发送数据第8位,数据块长度首先发送。
解:参考程序如下:
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP TXSVE
TBUFF EQU TBLOCK
LEN EQU 30
;主程序
MAIN: MOV TMOD,#20H ;设置T1为定时器工作方式2
MOV TH1,#0FDH ;波特率9600bps
MOV TL1,#0FDH
MOV PCON,#00H ;SMOD=0
SETB TR1 ;启动T1
MOV SCON,#40H ;串行口为方式1
SETB EA ;开CPU中断
SETB ES ;开串行口中断
MOV DPTR,#TBUFF ;DPTR指向数据块首址
MOV A,#LEN ;数据块长度送A
CLR ACC.7
CPL P ;偶校验
MOV C,P
MOV ACC.7,C ;设置偶校验位
MOV SBUF,A ;发送长度数据
MOV R2,A
WAIT: CJNE R2,#00H,WAIT ;未发送完循环等待中断发送
CLR EA ;关CPU中断
SJMP $ ;暂停
;中断服务程序
TXSVE: CLR ES ;关串行口中断
CLR TI ;清串行口发送中断请求标志
MOVX A,@DPTR ;数据送A
INC DPTR ;调整数据指针
CLR ACC.7
CPL P ;偶校验
MOV C,P
MOV ACC.7,C ;设置偶校验位
MOV SBUF,A ;发送字符数据
DEC R2 ;数据长度减1
SETB ES ;开串行口中断
RETI ;中断返回
END
9.12请用中断法编写出串行口在方式1下的接收程序。设单片机主频为11.0592MHz,波特率为19200bps,接收数据缓冲区在外部RAM,起始地址为BLOCK,接收数据区长度为100,采用奇校验,假设数据块长度要发送。
解:参考程序如下:
ORG 0000H
LJMP Main
ORG 0023H
LJMP RXSVE
TBUFF EQU BLOCK
MAXLEN EQU 100
;主程序
MAIN: MOV TMOD,#20H ;设置T1为定时器工作方式2
MOV TH1,#0FDH ;波特率19200bps
MOV TL1,#0FDH
MOV PCON,#10H ;SMOD=1
SETB TR1 ;启动T1
MOV SCON,#80H ;串行口为方式1
SETB EA ;开CPU中断
CLR F0 ;设置出错标志,F0=1接收出错
SETB REN ;允许接收
JNB RI,$ ;等待接收数据长度
MOV A,SBUF ;接收数据长度
ACALL VERIFY ;奇校验
CJNE A,#0FFH, CHKLEN ;奇校验正确转REV
SETB F0
SJMP ERRO ;奇校验出错
CHKLEN: MOV R2,A
CLR C
MOV A,#MAXLEN
SUBB A,R2 ;检查数据长度
JC ERRO ;数据长度大于数据缓冲区长度出错
MOV DPTR,#TBUFF ;DPTR指向字符块首址
SETB ES ;开串行口中断
RECEIVE: JB F0,ERRO ;接收校验错转ERRO
CJNE R2,#00H, RECEIVE ;未接收完循环等待中断接收
CLR EA ;接收完成,关CPU中断
SJMP $ ;暂停
ERRO: SJMP ERRO ;数据块长度送A
;中断服务程序
RXSVE: CLR ES ;关串行口中断
CLR RI ;清串行口接收中断请求标志
MOV A,SBUF ;数据送A
ACALL VERIFY ;奇校验
CJNE A,#0FFH,SAVE ;奇校验正确转SAVE
SETB F0
SJMP INTRET ;奇校验出错
SAVE: MOVX @DPTR,A ;保存数据
INC DPTR ;调整数据指针
DEC R2
INTRET: SETB ES ;开串行口中断
RETI ;中断返回
;奇校验子程序
;入口参数:A=收到数据,ACC.7奇校验
;出口参数:校验正确A=校验数据,ACC.7=0去除校验位。校验错误A=0FFH
;占用寄存器:R7
VERIFY: MOV R7,A ;保存数据到R7
CLR ACC.7 ;清原校验位
MOV C,P ;取奇校验位
MOV ACC.7,C ;加上新校验位
XRL A,R7 ;校验
CJNE A,#00H,VERRO ;校验错转VERRO
MOV A,R7 ;校验正确,取回原数据
CLR ACC.7 ;清校验位
SJMP EXIT
VERRO: MOV A,#0FFH ;设置校验错
EXIT: RET
END
9.13 请用查询法编出 8031串行口在方式 2下的接收程序。设:波特率为 fosc/32,接收数据块在外部RAM,起始地址为RBLOCK,数据块长度为50,采用奇校验,放在接收数据的第9位上,接收数据块长度首先被发送。
解:参考程序如下:
ORG 0000H
TBUFF EQU BLOCK
MAXLEN EQU 50
;主程序
MAIN: MOV PCON,#10H ;SMOD=1
MOV SCON,#40H ;串行口为方式2
CLR ES ;关串行口中断
CLR F0 ;设置出错标志,F0=1接收出错
SETB REN ;允许接收
JNB RI,$ ;等待接收数据长度
MOV A,SBUF ;接收数据长度
ACALL VERIFY ;奇校验
JNB F0, CHKLEN ;奇校验正确转REV
SJMP ERRO ;奇校验出错
CHKLEN: MOV R2,A
MOV A, #MAXLEN
CLR C
SUBB A, R2 ;检查数据长度
JC ERRO ;数据长度大于数据缓冲区长度出错
MOV DPTR,#TBUFF ;DPTR指向字符块首址
RECEIVE: JNB RI, RECEIVE ;查询等待接收一个数据结束
CLR RI
MOV A,SBUF ;读接收数据
ACALL VERIFY ;奇校验
JNB F0,SAVE ;奇校验正确转SAVE
SJMP ERRO ;奇校验出错
SAVE: MOVX @DPTR,A ;保存数据
INC DPTR ;调整数据指针
DJNZ R2, RECEIVE
SJMP $ ;接收完成暂停
ERRO: SJMP ERRO ;校验出错暂停
;奇校验子程序
;入口参数:P=接到数据奇校验位,RB8=收到奇校验位
;出口参数:校验正确F0=0,校验错误F0=1
VERIFY: JB RB8, VERIFY1
JNB P,VERRO
SJMP RIGHT
VERIFY1: JB P, VERRO
RIGHT: CLR F0
SJMP EXIT
VERRO: SETB F0 ;设置校验错
EXIT: RET
END
9.14 设8031单片机的发送缓冲区和接收缓冲区皆在内部RAM,起始地址分别为TBLOCK和RBLOCK,数据块长度皆为20。试编写主机既能发送又能接收的全双工通信程序。
解:无校验,使用方式1。假设8031单片机主频为11.0592MHz,波特率选 9600bps。采用中断编程。参考程序如下:
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP RTXSVE
TBUFF EQU TBLOCK
RBUFF EQU RBLOCK
LEN EQU 20
;主程序
MAIN: MOV TMOD,#20H ;设置T1为定时器工作方式2
MOV TH1,#0FDH ;波特率9600bps
MOV TL1,#0FDH
MOV PCON,#00H ;SMOD=0
SETB TR1 ;启动T1
MOV SCON,#40H ;串行口为方式1
SETB EA ;开CPU中断
SETB ES ;开串行口中断
MOV R0,#TBUFF ;DPTR指向发送数据块首址
MOV R1,#TBUFF ;DPTR指向接收数据块首址
MOV R2,#LEN ;发送数据长度送R2
MOV R3,#LEN ;接收数据长度送R3
CLR TI
CLR RI
MOV A,@R0
MOV SBUF,A ;启动发送过程
WAIT: MOV A,R2
OR A,R3
JNZ WAIT ;等待发送和接收完成
CLR ES ;关串行口中断
SJMP $ ;暂停
;中断服务程序
RTXSVE: CLR ES ;关串行口中断
JNB TI,RX ;不是发送中断,转接收中断处理
CLR TI ;清发送中断请求标志
MOV A,R2
JZ INTRET ;已发送完转中断返回
DEC R2
TX: INC R0 ;调整接收数据指针
MOV A,@R0 ;数据送A
MOV SBUF,A ;发送数据
SJMP INTRET
RX: CLR RI ;清接收中断请求标志
MOV A,R3
JZ INTRET ;已接收完转中断返回
MOV A,SBUF
MOV @R1,A ;保存接收数据
INC R1 ;调整接收数据指针
DEC R3
INTRET: SETB ES ;开串行口中断
RETI ;中断返回
END
9-8
展开阅读全文