SET_BPS MAIN START: M0: M1: RECEIVE: NEXT: OVER:
OUT DX,AL
RET
ENDP PROC
FAR
CALL SET_BPS CALL INIT51 MOV AX,DATA MOV DS,AX LEA DX,MES1 MOV AH,09H INT 21H
MOV AH,01 INT 21H
MOV BL,AL MOV DX,CTRL51 IN AL,DX TEST AL,01 JZ M1 MOV DX,DATA51 MOV AL,BL OUT DX,AL CMP AL,‘!’ JZ RECEIVE JMP M0
MOV DX,OFFSET MOV AH,09H INT 21H
MOV DX,CTRL51 IN AL,DX TEST AL,02 JZ NEXT MOV DX,DATA51 IN AL,DX MOV DL,AL MOV AH,02 INT 21H CMP DL,‘!’ JNZ NEXT MOV AX,4C00H INT
21H
36
;初始化8253 ;初始化8251A ;设置段寄存器
;显示提示信息1 ;接收键入字符 ;保存在BL中 ;状态端口地址
;测试状态位TXRDY是否为1, 如不是则再测试
;从8251A串行口输出数据 ;判断是否是结束字符‘!’,是
则转RECEIVE继续
MES2 ;显示提示信息2 ;状态端口地址
;测试状态位RXRDY是否为1, 不是则再测试
;从8251A串行口接收来自终端 机的字符
;在主机屏幕上显示接收字符 ;不是结束字符‘!’转NEXT 继续
;结束
MAIN ENDP CODE ENDS END START
五、程序清单<二> (接收为中断方式): INITA00 INITA01 DATA51 CTRL51 TIMER2 TIMCTL CLK00 BPS00 FACTOR DATA MES1 MES2 DATA CODE ASSUME INIT51 LL0:
EQU 20H EQU 21H EQU 208H EQU 209H EQU 202H EQU 203H EQU 4700 EQU 1200 EQU 16 SEGMENT DB ‘NOW YOU CAN PLAY A KEY ON THE CPU KEYBORD’,0AH,0DH DB ‘IT WILL DISPLAY ON THE TERMINAL SCREEN!’, 0AH,0DH DB ‘END WITH !’,0AH,0DH, ‘$’ DB 0AH,0DH,‘NOW YOU CAN PLAY KEY ON THE TERMINAL’,0AH,0DH DB ‘IT WILL DISPLAY ON THE CPU SCREEN!’,0AH, 0DH
DB‘THROUGH IRQ,END WITH !’,0AH,0DH,0AH,0DH , ‘$’ENDS SEGMENT CS:CODE,DS:DATA PROC NEAR ;8251A初始化 MOV DX,CTRL51 ;8251A控制口地址 XOR AX,AX ;AX清0 MOV CX,03 CALL CHAROUT ;复位8251A LOOP LL0 MOV AL,40H CALL CHAROUT MOV AL,4EH ;设置模式字,使8251A工作于 CALL CHAROUT 异步方式,8个数据位,1个 停止位,波特率因子为16 MOV AL,27H ;设置控制字启动发送器和接收 CALL CHAROUT 器
37
RET CHAROUT: OUT
DX,AL ;子程序,从DX指定端口输出 GG: INIT51 SET_BPS SET_BPS MAIN START:
PUSH CX
MOV CX,02
LOOP GG POP CX
RET ENDP PROC NEAR MOV DX,0
MOV AX,CLK00 MOV BX,1000 MUL BX
MOV BX,BPS00 DIV BX
MOV DX,00 MOV BX,FACTOR DIV BX
MOV BX,AX
MOV DX,TIMCTL MOV
AL,0B6H OUT
DX,AL MOV DX,TIMER2 MOV AX,BX OUT
DX,AL MOV
AL,AH OUT DX,AL
RET
ENDP PROC FAR
CALL SET_BPS CALL INIT51 MOV AX,DATA MOV DS,AX LEA DX,MES1 MOV
AH,09H
38
AL内容
;延时以等待输出完成
;子程序,初始化8253计数器/ 定时器 ;8251A时钟频率 ;计算8253计数器通道2的计 数初值,结果送BX ;设置8253的控制字,使其工 作于模式3(方波发生器) ;设置通道2的计数初值,先送 低位,再送高位 ;初始化8253 ;初始化8251A ;设置段寄存器
;显示提示信息1
M0: M1: RECEIVE: 111: INT_PROC:
INT
21H
MOV AH,01 ;接收键入字符 INT 21H
MOV BL,AL; ;保存在BL中 MOV DX,CTRL51 ;状态端口地址 IN AL,DX TEST AL,01 ;测试状态位TXRDY是否为1, JZ M1 如不是则再测试 MOV DX,DATA51 MOV AL,BL ;从8251A串行口输出数据 OUT DX,AL CMP AL,‘!’’ ;判断是否是结束字符‘!’,是 JZ RECEIVE 则转RECEIVE继续 JMP M0
MOV DX,OFFSET MES2 MOV AH,09H ;显示提示信息2 INT 21H
MOV AX,CS ;DS指向代码段 MOV DS,AX
MOV DX,OFFSET INT_PROC MOV AX,250AH ; 设置0AH号中断向量 INT 21H CLI ;关中断 MOV DX,INTA01 IN AL,DX ;开放IRQ2对应的中断屏蔽位 AND AL,0FBH OUT DX,AL STI ;开中断 NOP ;等待硬中断 JMP 111
DX,DATA51 ;从8251A串行口接收来自终端 IN AL,DX 机的字符 PUSH AX ;入栈保护 MOV DL,AL MOV AH,02 ;在主机屏幕上显示接收字符 INT 21H
MOV DX,INTA00 MOV AL,20H ;发中断结束命令 OUT DX,AL POP
AX ;退栈
39
MOV CMP AL,‘!’ ;不是结束字符‘!’则转NEXT JNZ NEXT MOV DX,INTA01 IN AL,DX ;关闭IRQ2对应的中断屏蔽位 OR AL,04 OUT DX,AL STI ;开中断 MOV AX,4C00H ;返回DOS INT 21H NEXT: IRET ;中断返回 MAIN ENDP CODE ENDS END START 六、实验报告要求:
1.写出实验步骤。
2.分析传送结果是否正确。
3.总结8251接收、发送的工作原理,分析中断方式和查询方式的异同点。
40