ToC
实验内容
通过 E
命令修改内存 3000H
的内容,发送到串口,然后自接受保存到 4000H
起始的内存单元中。
最后通过系统命令查看相应存储空间的数据,验证传输结果。
实验接线
通过 8254
控制波特率,将 TXD
和 RXD
相连以自收发。
代码
1DATA8251 EQU 0600H2CON8251 EQU 0602H3
4C028254 EQU 06C4H5CON8254 EQU 06C6H6
7SSTACK SEGMENT STACK8 DW 64 DUP(?)9SSTACK ENDS10
11CODE SEGMENT12ASSUME CS:CODE13
14START PROC15 ;; INIT 825416 MOV DX, CON825417 MOV AL, 10110110B ;; MODE 3, SQUARE18 OUT DX, AL19
20 ;; CLK2 CONNECTED TO 1.8432MHz21 ;; OUT2 CONNECTED TO 8251-TRCLK22 ;; 1.8432E6/0X000C/16 = 9600BPS23 MOV DX, C02825424 MOV AL, 0CH25 OUT DX, AL26 MOV AL, 00H27 OUT DX, AL28
29 ;; INIT 825130 CALL INIT31 MOV DX, CON825132 MOV AL, 01111110B ;; ASYNC METHOD CONTROL WORD33 ;; 01: ONE BYTE ESD/S134 ;; 11: EVEN JUDGE35 ;; 11: 8 BYTES36 ;; 10: 1637 OUT DX, AL38 CALL DELAY39 MOV AL, 00110100B ;; ASYNC COMMAND WORD40 ;; 0: DISALLOW SEARCH41 ;; 0: NO RESET42 ;; 1: REQUEST SEND43 ;; 1: RESET ERROR FLAG44 ;; 0: NORMAL WORK45 ;; 1: ALLOW RECEIVE46 ;; 0: DATA CONSOLE NOT PREPARED47 ;; 0: DISALLOW SEND48 OUT DX, AL49 CALL DELAY50
51 MOV DI, 4000H52 MOV SI, 3000H53 MOV CX, 1054
55LO:56 MOV AL, 00110111B ;; ASYNC COMMAND WORD57 ;; DIFFERENCE: ALLOW SEND58 MOV DX, CON825159 OUT DX, AL ;; PREPARE 825160 MOV DX, DATA825161 MOV AL, [SI]62 OUT DX, AL ;; SEND [SI] BYTE63
64 MOV DX, CON825165LO_SEND:66 IN AL, DX ;; WAIT FOR SEND BUFFER TO BE EMPTY67 AND AL, 168 JZ LO_SEND69
70LO_RECV:71 IN AL, DX ;; WAIT FOR RECV BUFFER TO HAVE DATA72 AND AL, 02H73 JZ LO_RECV74
75 MOV DX, DATA825176 IN AL, DX ;; RECEIVE FROM 825177 MOV [DI], AL ;; SAVE TO [DI]78 INC DI79 INC SI80 LOOP LO81
82FIN:83 JMP FIN84
85 MOV AX, 4C00H86 INT 21H87START ENDP88
89INIT PROC90 PUSH AX91 PUSH DX92 MOV AL, 00H93 MOV DX, CON825194 OUT DX, AL95 CALL DELAY96 OUT DX, AL97 CALL DELAY98 OUT DX, AL99 CALL DELAY100 MOV AL, 40H101 OUT DX, AL102 CALL DELAY103 POP DX104 POP AX105 RET106INIT ENDP107
108DELAY PROC109 PUSH CX110 MOV CX, 0FFFFH111 LOOP $112 POP CX113 RET114DELAY ENDP115
116CODE ENDS117END START
实验过程
设置内存
4000H
3000H
选做实验
说明
将 a-z
的 ASCII
码写入 3000H
,然后通过 9600
的波特率传输到 4000H
。
当出现错误时停止传输,并将状态字显示在数据灯 D7-D0
上。
接线
接线有点混沌,反正能用就行(
由于数据线低位不够用了,所以我把 8255
接到了数据线高位(D8-D15
),对应的 OUT
也就需要输出 AX
而非 AL
了。
总之就是下面这个样子:
代码
1DATA8251 EQU 0600H2CON8251 EQU 0602H3
4C028254 EQU 06C4H5CON8254 EQU 06C6H6
7B8255 EQU 0642H8CON8255 EQU 0646H9
10SSTACK SEGMENT STACK11 DW 64 DUP(?)12SSTACK ENDS13
14CODE SEGMENT15ASSUME CS:CODE16
17START PROC18 ;; INIT 825419 MOV DX, CON825420 MOV AL, 10110110B21 OUT DX, AL22
23 MOV DX, C02825424 MOV AL, 0CH25 OUT DX, AL26 MOV AL, 00H27 OUT DX, AL28
29 ;; INIT 825130 CALL INIT31 MOV DX, CON825132 MOV AL, 01111110B33 OUT DX, AL34 CALL DELAY35 MOV AL, 00110100B36 OUT DX, AL37 CALL DELAY38
39 ;; INIT 825540 MOV AL, 10010000B41 MOV DX, CON825542 OUT DX, AL43
44 ;; INIT [3000]45 MOV SI, 3000H46 MOV AL, 61H ;; a47 MOV CX, 2648INIT_CHAR:49 MOV [SI], AL ;; SAVE TO [SI]50 INC AL51 INC SI52 LOOP INIT_CHAR53
54 MOV SI, 3000H55 MOV DI, 4000H56 MOV CX, 2657
58LO:59 MOV AL, 00110111B ;; ASYNC COMMAND WORD60 ;; DIFFERENCE: ALLOW SEND61 MOV DX, CON825162 OUT DX, AL ;; PREPARE 825163 MOV DX, DATA825164 MOV AL, [SI]65 OUT DX, AL ;; SEND [SI] BYTE66
67 MOV DX, CON825168LO_SEND:69 IN AL, DX ;; WAIT FOR SEND BUFFER TO BE EMPTY70 AND AL, 171 JZ LO_SEND72
73LO_RECV:74 IN AL, DX ;; WAIT FOR RECV BUFFER TO HAVE DATA75 TEST AL, 02H76 JZ LO_RECV77
78 TEST AL, 00111000B79 JNZ ERR_FIN80
81 MOV DX, DATA825182 IN AL, DX ;; RECEIVE FROM 825183 MOV [DI], AL ;; SAVE TO [DI]84 INC DI85 INC SI86 LOOP LO87
88FIN:89 JMP FIN90
91ERR_FIN:92 ;; OUTPUT TO 825593 MOV DX, B825594 MOV AH, AL95 OUT DX, AX96
97 MOV AX, 4C00H98 INT 21H99START ENDP100
101INIT PROC102 PUSH AX103 PUSH DX104 MOV AL, 00H105 MOV DX, CON8251106 OUT DX, AL107 CALL DELAY108 OUT DX, AL109 CALL DELAY110 OUT DX, AL111 CALL DELAY112 MOV AL, 40H113 OUT DX, AL114 CALL DELAY115 POP DX116 POP AX117 RET118INIT ENDP119
120DELAY PROC121 PUSH CX122 MOV CX, 0FFFFH123 LOOP $124 POP CX125 RET126DELAY ENDP127
128CODE ENDS129END START
结果
3000H
4000H
演示:数据灯
由于传输过程中没有出现问题,因此没法检测 8255
的部分是否正确。因此这里强行测试了一下(
修改上述代码的 79
行,把 JNZ
修改为 JZ
。这样就能输出正确情况下的状态字了。实际的 LED
输出如下图所示:
通过 LED
我们可以读出当前的状态字:10000111
。