• 134.50 KB
  • 2022-04-22 11:39:36 发布

现代微型计算机与接口教程(杨文显)第五章课后答案.doc

  • 9页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'习题五1.8255A的方式选择控制字和C口按位控制字的端口地址是否一样,8255A怎样区分这两种控制字?写出A端口作为基本输入,B端口作为基本输出的初始化程序。解:(1)8255A的方式选择控制字和C口按位控制字的端口地址一样,它们之间的区别在控制字的D7位(特征位)的值不同,8255A的方式选择控制字D7=1,而C口按位置位/复位控制字D7=0。(2)初始化程序:(设端口地址为,A口:200H,B口:201H,控制口:203H)MOVAL,90HMOVDX,203HOUTDX,AL2.用8255A的A端口接8位二进制输入,B端口和C端口各接8只发光二极管显示二进制数。编写一段程序,把A端口读入的数据送B端口显示,而C端口的各位则采用置0/置1的方式显示A端口的值。解:(设端口地址为,A口:200H,B口:201H,C口:202H,控制口:203H)MOVAL,90H;8255A初始化:MOVDX,203H;8255A各组方式0,A口输入OUTDX,AL;B、C口输出MOVDX,200HINAL,DX;读A口输入值MOVDX,201HOUTDX,AL;送B口输出MOVAH,AL;A口输入值转存在AH中MOVDX,203HMOVCX,08;CX置循环次数初值MOVAL,00H;C端口置0/置1控制字初值LPA:ANDAL,0FEH;清除最低位SHRAH,1;A端口一位转入CFADCAL,0;A端口一位从CF转入命令字OUTDX,AL;A端口一位从送往C端口对应位ADDAL,02H;形成下一个命令字LOOPLPA;处理C端口下一位3.将8255A用作两台计算机并行通信的接口电路,请画出采用查询式输入/输出方式工作的接口电路,并写出采用查询式输入/输出方式的程序。解:用两片8255作两台计算机8088_A与8088_B之间并行通信的接口电路,两片8255之间的连接如下图所示。两片8255均在方式1、查询方式下工作。 (1)8088_A输出程序:(8255_A的A口作为数据输出口,C口的PC0作为“数据输出选通”信号,负脉冲输出。C口的PC6作为“应答”信号输入,负脉冲有效。端口地址:A口:200H,C口:202H,控制口:203H)DATASEGMENTBufferDB“Thisisaexample.”,0DH,0AH,-1DATAENDSCODESEGMENTSTART:MOVAX,DATAMOVDS,AXLEABX,Buffer;输出缓冲区指针送BXMOVDX,203HMOVAL,0A0H;8255_A的方式选择字,A口工作在方式1、输出,C口低四位输出OUTDX,ALMOVAL,1OUTDX,AL;将PC0置1CALLDELAY;延时等待对方完成初始化;A口查询方式输出NEXT:MOVDX,202HINAL,DLTESTAL,80H;判别是否有效JZNEXT;数据尚未取走,等待MOVDX,200HMOVAL,[BX]OUTDX,AL;输出一项数据INCBXMOVDX,203HMOVAL,0OUTDX,ALNOPNOPINCALOUTDX,AL;通过PC0向对方发选通信号(负脉冲)CMPBYTEPTR[BX-1],-1;判断输出是否完成 JNENEXT;未完成,继续MOVAX,4C00HINT21HCODEENDSENDSTART(2)8088_B输入程序:(8255_B的A口作为输入,方式1,PC4作为“数据输入选通”信号,输入,负脉冲有效。PC0为“应答”信号输出,负脉冲有效。端口地址:A口:210H,C口:212H,控制口:213H)DATASEGMENTBufferDB80DUP(?)DATAENDS;CODESEGMENTSTART:MOVAX,DATAMOVDS,AXLEABX,Buffer;输入缓冲区指针送BXMOVDX,213HMOVAL,0B0H;8255_B的方式选择字,A口工作在方式1,输入,C口低四位输出。OUTDX,ALMOVAL,01HOUTDX,AL;PC0置1,表示没有“应答”信号CALLDELAY;延时等待对方状态就绪;A口查询方式输入AGA:MOVDX,212HINAL,DXTESTAL,20HJZAGA;PC5(IBF)是否为1,不是,无数据输入,继续查询MOVDX,210HINAL,DXMOV[BX],ALMOVDX,212HMOVAL,0OUTDX,ALINCBXNOPNOPINCALOUTDX,AL;通过PC0向发送方发“应答”负脉冲CMPBYTEPTR[BX-1],-1;数据接收完了吗? JNEAGA;未完,继续MOVAX,4C00HINT21HCODEENDSENDSTART说明:这道题有多种可选的解法,上面的方法是程序比较简单的一种。这种方法实施时,应先启动8088B,使它首先“就绪”,然后开始通讯。由于双方都用负脉冲进行选通,联络过程比较简单,也比较可靠。可选的另一种方法是:在上述连接的基础上用中断方式进行数据传输,以提高CPU的工作效率。需要编制双方的中断服务程序,初始化时要设置中断向量,允许8255中断,开放中断等操作。当然也要连接相应的中断请求信号线。可选的第三种方法是:双方用一根状态线(C端口某一位)送往对方,用这两根线进行联络(“握手”)。这种方法看似简单,其实程序是比较复杂的。双方联络的过程如下图。8088B在初始化完成后,把它的状态线置为“高电平”,表示可以开始接受数据。而8088A在初始化完成后,把它的状态线置为“低电平”,表示数据传输尚未开始。①8088A查询8088B的状态,在发现8088B“就绪”(状态线为高电平)后,把数据发往8255的(A或B)端口。②8088A发出数据之后把本机状态置为“就绪”(高电平),表示数据已经送到端口的数据线上。③8088B查询8088A的状态,得知8088A的状态线“就绪”,知道8088A已经把数据送出,于是从8255接收数据,并把自身的状态线置为“未就绪”,表示已经把8088A发出的数据接收。④8088A查询到8088B的状态线变为低电平,知道对方已经把数据接收完成,于是把本机的状态线置为“低电平”,表示这个数据的发送已经完成,而下一个数据尚未发出。⑤8088B查询到8088A的状态线变为“低电平”,知道对方已经结束了第一个数据的传输,在本机做好下一个数据的接收准备之后(例如,把数据存入缓冲区,如果缓冲区满,则把缓冲区内容存入磁盘文件),把本机状态线置为“高电平”,表示已经做好了接收下一个数据的准备。⑥8088A得知8088B做好准备,发送下一个数据。于是,下一个数据的传输可以由此开始(转①)。这种方法实施时,应首先启动8088A。 1.设计一个用8255A作为8个七段显示器的接口电路,并设计一个把内存地址为ADDRA的8个数字在这8个七段显示器上显示的程序。解:设8个七段显示器采用共阳接法,A口控制段的显示,B口控制位的显示。端口地址A口:200H,B口:201H,控制口:203HDATASEGMENTADDRADB×,×,×,×,×,×,×,×TABLEDB40H,4FH,24H,30H,19HDB12H,02H,78H,00H,10HDISPBITDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,80H;对8255A初始化,方式0,输出MOVDX,203HOUTDX,ALLEABX,TABLE;BX置为七段码表首地址MOVDISPBIT,7FH;置位码初值为7FHLEASI,ADDRA;SI置为显示缓冲区首地址MOVCX,8;CX置为循环次数初值8AGA:MOVAL,0FFHMOVDX,201HOUTDX,AL;熄灭所有数码管MOVAL,[SI];取出一个待显示数XLAT;转换成七段码MOVDX,200HOUTDX,AL;送入段码端口MOVAL,DISPBIT;MOVDX,201HOUTDX,AL;送当前位码,点亮一个数码管RORDISPBIT,1;产生下一个位码INCSI;修改指针,指向下一个待显示数据CALLDELAY;延时LOOPAGA;处理下一个数码管的显示MOVAX,4C00HINT21HCODEENDSENDSTART2.8254定时/计数器的定时与计数方式有什么区别?8254在方式0工作时,各通道的CLK、GATE信号有什么作用?各通道的控制字地址都相同,8254是怎样区分的?解: (1)8254作为计数器使用时,对CLK端的输入脉冲进行单纯的减法计数,这时CLK端输入的脉冲不作为计时基准。此外,用作计数器时,计数完成后必须重新初始化,只能使用一次。8254作为定时器使用时,要求CLK端输入的脉冲必须作为时钟基准,通过对该基准时钟脉冲的计数来实现精确定时。用作定时器时,计数的过程周而往复,重复进行。(2)8254工作在方式0时,CLK端输入计数用的脉冲信号;GATE信号为高电平时,对CLK端输入的脉冲进行计数;GATE信号为低电平时,暂停计数;GATE信号重新为高电平后,恢复原先的计数。(3)由8254的方式控制字中的D7、D6两位来选择计数通道。2.设8254的端口地址为0240H~0243H,通道0输入的CLK频率为1MHz,为使通道0输出1KHz的方波,编写初始化程序。如果让通道0与通道1级联(即OUT0接CLK1)实现1秒钟定时,则初始化程序如何编制。解:(1)通道0输出1KHz的方波:计数初值为1MHz/1KHz=1000,等于十六进制数03E8H,控制字设定为先写低8位,后写高8位,方式3工作,二进制计数方式,所以控制字为36H。初始化程序如下:MOVAL,36H;MOVDX,243H;写入通道0的控制字OUTDX,AL;MOVDX,240H;MOVAL,0E8H;写入通道0的时间常数OUTDX,AL;MOVAL,03H;OUTDX,AL;(2)通道0与通道1级联实现1秒定时:要实现1秒定时,对1MHz输入脉冲进行分频的系数为1000000=5000×200。通道0工作在方式2,分频系数200,采用十进制计数,则通道0方式控制字为:25H。通道1工作在方式0,分频系数5000,也采用十进制计数,则通道1方式控制字为:61H。初始化程序如下:MOVAL,25H;通道0控制字:方式2,十进制计数,只写高8位MOVDX,243H;OUTDX,AL;MOVAL,61H;通道1控制字:方式0,十进制计数,只写高8位OUTDX,AL;MOVDX,0240H;MOVAL,02H;通道0时间常数(BCD数高8位)OUTDX,AL;MOVAL,50H;通道1时间常数(BCD数高8位)MOVDX,0241H;OUTDX,AL;如果要再次进行1秒钟定时,则需要对通道1重新初始化。如果需要连续的1 秒定时信号,则通道1应选用方式3。对总数为1000000的分频系数,可以有多种分解方法。1.编制一个使PC机的8254产生600Hz方波的程序,并使该方波送至扬声器发声。解:PC机中利用8254定时器的通道2来驱动扬声器。通道2的工作及其输出受到主板上8255A的PB口(口地址61H)控制:GATE2接PB0,即PB0=1时,定时器才可能工作;OUT2与PB1相与后输出到扬声器,即PB1=1时,定时器2的OUT2才能输出到扬声器。定时器的输出波形是对1.1931MHZ频率信号分频得到的,因此将定时器2工作在方式3,分频系数用下式计算:分频系数=1193100÷给定频率(1193100=12348CH)因此程序如下:MOVAL,0B6H;通道2控制字:方式3,16位常数OUT43H,AL;送入8254控制端口MOVDX,12H;MOVAX,348CH;DX,AX中置入常数12348CHMOVDI,600;DI为输出频率DIVDI;除法运算,计算分频系数OUT42H,AL;低8位送通道2MOVAL,AH;OUT42H,AL;高8位送通道2INAL,61H;ORAL,3;OUT61H,AL;将8255A的B端口低2位置“1”2.在RS-232C接口标准中,引脚TxD、RxD、、、、、的功能是什么?解:TxD:串行数据输出。RxD:串行数据输入。:数据终端准备好状态,低电平有效。用于向调制解调器或外设表示数据终端已准备好。:数据设备准备好状态,低电平有效。调制解调器或外设准备好时有效。:请求发送信号,低电平有效。表示数据终端设备已经做好发送数据的准备,请调制解调器/外设准备接收数据。:清除发送(允许传送)信号,低电平有效。调制解调器/外设作好传送准备,允许数据终端设备发送数据时有效。3.16550的通信控制寄存器中的寻址位有什么作用?在初始化编程时,应该怎样设置?解: 16550芯片内,接收缓冲寄存器/发送保持寄存器的地址与除数低字节寄存器的地址相同,中断允许寄存器的地址与除数高字节寄存器的地址相同。为了区分同一地址的不同用途,16550使用DLAB位来加以标识。DLAB位是通信线控制寄存器的最高位D7,该位设置为0,随后的相应操作对接收缓冲寄存器/发送保持寄存器或中断允许寄存器进行;该位设置为1,随后的相应操作对除数寄存器进行。在向除数寄存器写入初值之前,应将DLAB置为1。由于一般不需要重复访问除数寄存器,写完除数后应将DLAB置为0,以方便后续的操作。1.编写用PC机中16550查询方式输入50个字符的异步通信程序。设16550的端口地址为3F8H~3FFH,数据格式为:8位数据位、1位偶校验位、2位停止位,通信速率为19.2Kbps。解:接收子程序中,如果接收成功,清CF标志,否则,置位CF标志位。程序如下:;16550查询方式接收程序DATASEGMENTREC_DATADB50DUP(?);存放接收的数据TIMESDW50;要接收的数据个数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AX;初始化16550MOVDX,03FBH;16550控制寄存器地址送DXMOVAL,80H;置DLAB=1,设置除数寄存器OUTDX,ALMOVAX,003CH;波特率为19200bps时,除数为003CHMOVDX,03F8H;除数寄存器地址送DXOUTDX,ALMOVAL,AHINCDXOUTDX,ALMOVAL,1FH;8位数据位,偶校验,2位停止位MOVDX,03FBH;16550控制寄存器地址送DXOUTDX,AL;写入控制字……CALLRECEIVE……MOVAH,4CH;程序结束,返回操作系统INT21H;查询方式接收子程序RECEIVEPROCNEARLEABX,REC_DATA;接收缓冲区首地址送BX MOVCX,TIMES;要接收的数据个数送CXREPIN:MOVDX,03FDH;通信状态寄存器地址送DXINAL,DXTESTAL,1EH;检测接收过程有无错误JNZERRORTESTAL,01H;检测接收缓冲器中是否有数据JZREPIN;没有数据,继续检测MOVDX,03F8H;数据接收寄存器地址送DXINAL,DXMOV[BX],ALINCBXLOOPREPINCLC;接收成功,清CF标志位JMPDONEERROR:STC;接收不成功,置CF标志位DONE:RETRECEIVEENDPCODEENDSENDBEGIN'