11.若8251A的收、发时钟(RxC、TxC)频率为38.4KHz,它的RTS和CTS引脚相连,试完成以下要求的初始化程序设计:
(1)半双工异步传送,每个字符的数据位数为7,停止位数为1,偶校验,波持率为600位/秒,处于发送状态。
(2)半双工同步通信,每个字符的数据位数为8,无校验位,双同步字符,内同步方式,同步字符采用ASCII码的同步控制符SYN(16H),处于接收状态(同时使DTR有效).8251A的口地址为02C0H和02C1H。
12.若两台计算机利用8251A进行串行通信,半双工方式,如图8.78所示。通信规程如下:异步传送,波特率为600,每个字符的数据位数为7,1位停止位,偶校验。试完成以下程序设计:
(1)发送程序:将数据段中以TBUF为起站地址的一组ASCII字符码发送给对方,字符串的长度存在字节变量TLEN中。发送时,先发一个起始符SOH(01H),发送完全部数据字符之后,再发送两个结束符EOT(04H)作为发送结束标志。
(2)接收程序:将接收到的一组ASCII字符存放于从RBUF开始的接收缓冲区中,所收到的字符长度存在于字节变量RLEN中,只统计数据字符数。若接收正确,将字节变量ERROR置为00H,否则置为FFH。
解:查询方式传送
图8.78
(1)发送程序:控制口地址:TCONT;数据口地址:TDATA
STT: MOV DX,TCONT ;方式选择控制字:将825lA定义为异步方式,8位数据, MOV AL,7AH ;l位停止位,偶校验,波特率系数16 OUT DX,AL
MOV AL,0lH ;操作命令控制字:允许发送 OUT DX,AL ; 传送起始符
NEXT1: MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否?
JZ NEXT1 ;无效,继续等待
MOV DX,TDATA ;有效,向8251A输出起始符SOH(01H) MOV AL,01H
41
OUT DX,AL
; 传送数据
MOV DI,TBUF ;发送数据块首地址送DI MOV CH,0
MOV CL,TLEN ;计数器赋初值
NEXT2:MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否?
JZ NEXT ;无效,继续等待 MOV DX,TDATA ;有效,向8251A输出一字节数据 MOV AL,[DI] OUT DX,AL
INC DI ;修改指针 LOOP NEXT2
; 传送两个结束符
MOV CX,2 ;计数器赋初值
NEXT3:MOV DX,TCONT ;状态字:读取状态字 IN AL,DX
AND AL,0lH ;TxRDY有效否? JZ NEXT ;无效,继续等待
MOV DX,TDATA ;有效,向8251A输出结束符EOT(04H) MOV AL, 04H OUT DX,AL LOOP NEXT3
HLT
(2)接收程序:控制口地址:RCONT;数据口地址:RDATA;不检测结束符
SRR: MOV DX,RCONT ;方式选择控制字:送方式选择控制字 MOV AL,7AH OUT DX,AL
MOV AL,14H ;操作命令控制字:清除错误标志,允许接收
OUT DX,AL ;接收起始符
COMT:MOV DX,RCONT ;状态字:读取状态字 IN AL,DX
TEST AL,02H ;RxRDY有效否? JZ COMT ;无效,继续等待
MOV DX,RDATA ;无错,输入一字节数据
IN AL, DX
MOV DI,RBUF ;接收数据缓冲区首地址送DI MOV CX,TLEN ;计数器赋初值:发送数据个数
MOV RLEN,0 ;正确接收数据个数 ;接收数据
COMT:MOV DX,RCONT ;状态字:读取状态字 IN AL,DX
TEST AL,02H ;RxRDY有效否? JZ COMT ;无效,继续等待
42
AND AL,38H ;有效,查询接收过程有无错误?
JNZ ERR ;有错,转出错处理程序 ADD RLEN,1 ;无错,接收正确个数加1
ERR:MOV DX,RDATA ;无错,输入一字节数据 IN AL, DX MOV [DI],AL
INC DI ;修改指针
LOOP COMT
CMP RLEN,TLEN JZ OK
MOV ERROR,0FFH JMP EXIT
OK:MOV ERROR,0 EXIT:HLT
13.利用单缓冲接法的DAC0832产生正向三角波,设三角波的频率为10Hz,一个周期由200个点组成,试编程。(延时可调用延时子程序)
解:
SUB3: MOV MOV LOP1: OUT CALL
LOP2:
DX,PORTA;
AL,00H; DX,AL;
DELAY;延时0.1/200=0.0005s
INC AL; CMP AL,100; JE LOP2; JMP LOP1; OUT DX,AL; CALL DEC
DELAY; AL;
CMP AL,00H; JE LOP1; JMP LOP2; RET;
43
14.用8255作为A/D并行接口。如图8.79所示。8255A的A组工作于方式1,为输入口,端口C的PC7位设定为输出端,与A/D变换器的变换启动信号相连,由PC7端产生正脉冲信号以启动A/D变换。A/D的忙端经反向后作为采样保持器的控制信号,并且忙端经下降沿触发单稳电路,再经反向输出一个负方波的波形到PC4端,作为A的数据输入锁存信号,将A/D转换结果存入A口的数据输入寄存器。假设8255A的A,B,C和控制寄存器的I/O地址分别为300H,301H,302H,303H。写出8255A的初始化程序及启动A/D变换的程序片段。
图8.79
15.从DATA开始的数据区中有一组数据需要用示波器显示出来。数据长度为LENGTH。利用两片DAC0832作为输出接口,一片输出数据,送示波器的Y轴;另一片输出锯齿波,同时送示波器的X轴。试画出DAC0832和系统总线及示波器的连接图,编写显示数据曲线的程序。
16. . ADC0809和系统总线连接如图8.80所示。用中断方式从IN5读入一个模拟量,放到BUF单元,试编程。设8259的地址为020H、021H,IRQ2中断类型号为0AH,8259已初始化。
解:
;设置中断向量表
PUSH DS
MOV AX,SEG ADINT
44
图8.80
MOV DS,AX
MOV DX,OFFSET ADINT MOV AL,0AH MOV AH,25H INT 21H POP DS
;主程序,开放IRQ2中断 MOV DX,021H IN AL,DX
AND AL,1111 1011B OUT DX,AL STI ;开中断 MOV DX,84H
MOV AL,05H
OUT DX,AL;启动0809 HLT;等待中断 ;中断服务程序
ADINT PROC NEAR IN AL,DX MOV BUF,AL PUSH DX
MOV DX,20H MOV AL,20H
OUT DX,AL POP DX IRET
ADINT ENDP
45