IN AL , DX ;读状态字
TEST AL , 00000001B ;测D0 JZ L ; D0=0,转L继续测 …….; D0=1,发送器准备好 例:在接收程序中检查出错信息。 L: MOV DX , 309H ; 指向状态口 IN AL , DX ;读状态字
TEST AL , 00111000B ;测D5 D4 D3
JNZ ERROR ; D5D4D3 ≠0,转出错处理 …….; D5 D4 D3 =0,无错 8251A初始化编程步骤:
1)向控制口写入40H,使芯片内部复位;
(2)向控制口写入方式命令字,设工作方式、波特因子和帧数据结构; (3)向控制口写入工作命令字。
(4)读取8251状态,与命令字结合控制数据收发。(查询方式
上图所示电路利用8251实现CPU与 I/O 的操作,下面程序完成的 功能是:连续地从RS-232C接口读取串行字符,将接收的字符取 反,然后将其送回RS-232C接口。接收和发送的每个字符的长度 为8位,使用2个停止位,无奇偶校验。
INT8251: MOV AL , 01000000 ;写工作命令字
MOV DX, 211H OUT DX , AL;复位
MOV AL , 11001110 ;写方式命令字
OUT DX, AL; 2个停止位,8数据,K=16 MOV AL,00010101 ;写工作命令字 OUT DX,AL;
CHRRX: IN AL , DX ;检查是否接收到一个字符 ROR AL , 1
ROR AL , 1;RXRDY→CF
JNC CHKRX; RXRDY=0 未收到,转CHKRX
MOV DX,210H ;RXRDY=1 已收到,数据口
IN AL , DX ;读接收的数据
NOT AL ;把接收到的字符求反 MOV BL , AL ;暂存 CHKTX: MOV DX,211H ;指向控制口
IN AL , DX ;检查是否能发送字符 ROR AL , 1 ; TXRDY→CF
JNC CHKTX ; TXRDY=0,不能发送返回 MOV AL , BL ; TXRDY=1发送已求反的字符 MOV DX,210H
OUT DX, AL ;发送的字符送数据口 JMP CHKRX 1)要求
甲发乙收,2DH个字节,异步方式,8位数据位,2位停止位,无校验,波特因子64,查询方式,零MODEM连接,甲机首址SRC,乙机首址DST,8251A地址308H、309H (2)硬件连接 (3)软件编程
甲、乙机方式命令:0CFH =11001111
2个停止位,不校验,8个数据位,K=64 甲机发送工作命令:23H=00100011
RTS=1(请求发送)DTR=1(DTE就绪)TXEN=1(发送允许) 乙机接收工作命令:16H=00010110
ER=1(复位出错标志)RXE=1(允许接收) DTR=1(DTE就绪) (甲机发送程序段) MOV DX,309H
MOV AL,01H ;空操作 OUT DX,AL
MOV AL,40H 内部复位 OUT DX,AL
MOV AL,0CFH ;方式命令 OUT DX,AL
MOV AL,23H 工作命令 OUT DX,AL
LEA SI,SRC ;指向发送缓冲区 MOV CX,2DH ;数据个数 L:MOV DX,309H ;指向控制口 IN AL,DX ;读状态字 AND AL,01H ;测TxRDY
JZ L ; TxRDY=0,返回等待 MOV DX,308H ;TxRDY=1,发送,指向数据口 MOV AL,[SI];取发送数据 OUT DX,AL;送数据口输出 INC SI ;指向下一单元 LOOP L ;循环
;发送完毕
;以下为乙机接收程序段
MOV DX,309H ;指向控制口 MOV AL,01H ;空操作 OUT DX,AL
MOV AL,40H ;内部复位 OUT DX,AL
MOV AL,0CFH ;写入方式命令 OUT DX,AL
MOV AL,16H;写入工作命令字 OUT DX,AL
LEA DI,DST ;指向接收缓冲区 MOV CX,2DH ;数据个数 L:MOV DX,309H ;控制口 IN AL,DX ;读状态字 TEST AL,38H;测出错标志
JNZ ERR ;出错,转错误处理 AND AL,02H ;测RxRDY
JNZ L ;RxRDY=0,未收到字符,等待 MOV DX,308H ; RxRDY=1指向数据口 IN AL,DX ;接收
MOV [DI],AL ;存入输入缓冲区 INC DI ;指向下一单元 LOOP L ;循环 ;接收完毕
START: MOV AX,DATA
MOV DS,AX
MOV DX,20BH ; MOV AL,96H
OUT DX,AL ( 设置8253计数器2工作方式,计 数器0工作在方式3, 只写计数 初始值低8位,二进制计数。 MOV DX , 20AH ;(
MOV AL , 52 ;
OUT DX , AL ; ) MOV DX ,211H XOR AL ,AL
MOV CX ,( 3 ) DELAY: CALL OUT1
LOOP DELAY
MOV AL ,( 40H ) ;内复位命令 CALL OUT1
MOV AL ,( 4EH ) ;方式命令字 CALL OUT1
MOV AL ,( 15H ) ;允许发送和接收 CALL OUT1 MOV AH , 9
MOV DX , OFFSET MES1 INT 21H WAIT: MOV DX , 211H
IN AL , DX
TEST AL , ( 01H );发送是否准备好? JZ WAIT MOV AH , 01H
INT 21H ;从键盘上读一字符 CMP AL ,( 1BH) ;若ESC,结束 JZ EXIT
MOV DX , 210H INC ( AL) OUT DX ,( AL ) ;发送 MOV CX , 400H
S51: LOOP S51 ;延时 NEXT: MOV DX , 211H
IN AL , DX TEST AL , ( 02H) JZ NEXT MOV DX , 210H
IN AL , DX MOV DL , AL
MOV AH , 02H ;将接收到的字符
INT 21H ;显示在屏幕上 JMP WAIT EXIT: MOV AH , 4CH INT 21H CODE ENDS
END START
相关推荐: