Skip to content

[微机实验/TD-PITE] 8251 串行接口实验

Published: at 16:11

ToC

实验内容

通过 E 命令修改内存 3000H 的内容,发送到串口,然后自接受保存到 4000H 起始的内存单元中。

最后通过系统命令查看相应存储空间的数据,验证传输结果。

实验接线

通过 8254 控制波特率,将 TXDRXD 相连以自收发。

代码

1
DATA8251 EQU 0600H
2
CON8251 EQU 0602H
3
4
C028254 EQU 06C4H
5
CON8254 EQU 06C6H
6
7
SSTACK SEGMENT STACK
8
DW 64 DUP(?)
9
SSTACK ENDS
10
11
CODE SEGMENT
12
ASSUME CS:CODE
13
14
START PROC
15
;; INIT 8254
16
MOV DX, CON8254
17
MOV AL, 10110110B ;; MODE 3, SQUARE
18
OUT DX, AL
19
20
;; CLK2 CONNECTED TO 1.8432MHz
21
;; OUT2 CONNECTED TO 8251-TRCLK
22
;; 1.8432E6/0X000C/16 = 9600BPS
23
MOV DX, C028254
24
MOV AL, 0CH
25
OUT DX, AL
26
MOV AL, 00H
27
OUT DX, AL
28
29
;; INIT 8251
30
CALL INIT
31
MOV DX, CON8251
32
MOV AL, 01111110B ;; ASYNC METHOD CONTROL WORD
33
;; 01: ONE BYTE ESD/S1
34
;; 11: EVEN JUDGE
35
;; 11: 8 BYTES
36
;; 10: 16
37
OUT DX, AL
38
CALL DELAY
39
MOV AL, 00110100B ;; ASYNC COMMAND WORD
40
;; 0: DISALLOW SEARCH
41
;; 0: NO RESET
42
;; 1: REQUEST SEND
43
;; 1: RESET ERROR FLAG
44
;; 0: NORMAL WORK
45
;; 1: ALLOW RECEIVE
46
;; 0: DATA CONSOLE NOT PREPARED
47
;; 0: DISALLOW SEND
48
OUT DX, AL
49
CALL DELAY
50
51
MOV DI, 4000H
52
MOV SI, 3000H
53
MOV CX, 10
54
55
LO:
56
MOV AL, 00110111B ;; ASYNC COMMAND WORD
57
;; DIFFERENCE: ALLOW SEND
58
MOV DX, CON8251
59
OUT DX, AL ;; PREPARE 8251
60
MOV DX, DATA8251
61
MOV AL, [SI]
62
OUT DX, AL ;; SEND [SI] BYTE
63
64
MOV DX, CON8251
65
LO_SEND:
66
IN AL, DX ;; WAIT FOR SEND BUFFER TO BE EMPTY
67
AND AL, 1
68
JZ LO_SEND
69
70
LO_RECV:
71
IN AL, DX ;; WAIT FOR RECV BUFFER TO HAVE DATA
72
AND AL, 02H
73
JZ LO_RECV
74
75
MOV DX, DATA8251
76
IN AL, DX ;; RECEIVE FROM 8251
77
MOV [DI], AL ;; SAVE TO [DI]
78
INC DI
79
INC SI
80
LOOP LO
81
82
FIN:
83
JMP FIN
84
85
MOV AX, 4C00H
86
INT 21H
87
START ENDP
88
89
INIT PROC
90
PUSH AX
91
PUSH DX
92
MOV AL, 00H
93
MOV DX, CON8251
94
OUT DX, AL
95
CALL DELAY
96
OUT DX, AL
97
CALL DELAY
98
OUT DX, AL
99
CALL DELAY
100
MOV AL, 40H
101
OUT DX, AL
102
CALL DELAY
103
POP DX
104
POP AX
105
RET
106
INIT ENDP
107
108
DELAY PROC
109
PUSH CX
110
MOV CX, 0FFFFH
111
LOOP $
112
POP CX
113
RET
114
DELAY ENDP
115
116
CODE ENDS
117
END START

实验过程

设置内存

4000H

3000H

选做实验

说明

a-zASCII 码写入 3000H,然后通过 9600 的波特率传输到 4000H

当出现错误时停止传输,并将状态字显示在数据灯 D7-D0 上。

接线

接线有点混沌,反正能用就行(

由于数据线低位不够用了,所以我把 8255 接到了数据线高位(D8-D15),对应的 OUT 也就需要输出 AX 而非 AL 了。

总之就是下面这个样子:

代码

1
DATA8251 EQU 0600H
2
CON8251 EQU 0602H
3
4
C028254 EQU 06C4H
5
CON8254 EQU 06C6H
6
7
B8255 EQU 0642H
8
CON8255 EQU 0646H
9
10
SSTACK SEGMENT STACK
11
DW 64 DUP(?)
12
SSTACK ENDS
13
14
CODE SEGMENT
15
ASSUME CS:CODE
16
17
START PROC
18
;; INIT 8254
19
MOV DX, CON8254
20
MOV AL, 10110110B
21
OUT DX, AL
22
23
MOV DX, C028254
24
MOV AL, 0CH
25
OUT DX, AL
26
MOV AL, 00H
27
OUT DX, AL
28
29
;; INIT 8251
30
CALL INIT
31
MOV DX, CON8251
32
MOV AL, 01111110B
33
OUT DX, AL
34
CALL DELAY
35
MOV AL, 00110100B
36
OUT DX, AL
37
CALL DELAY
38
39
;; INIT 8255
40
MOV AL, 10010000B
41
MOV DX, CON8255
42
OUT DX, AL
43
44
;; INIT [3000]
45
MOV SI, 3000H
46
MOV AL, 61H ;; a
47
MOV CX, 26
48
INIT_CHAR:
49
MOV [SI], AL ;; SAVE TO [SI]
50
INC AL
51
INC SI
52
LOOP INIT_CHAR
53
54
MOV SI, 3000H
55
MOV DI, 4000H
56
MOV CX, 26
57
58
LO:
59
MOV AL, 00110111B ;; ASYNC COMMAND WORD
60
;; DIFFERENCE: ALLOW SEND
61
MOV DX, CON8251
62
OUT DX, AL ;; PREPARE 8251
63
MOV DX, DATA8251
64
MOV AL, [SI]
65
OUT DX, AL ;; SEND [SI] BYTE
66
67
MOV DX, CON8251
68
LO_SEND:
69
IN AL, DX ;; WAIT FOR SEND BUFFER TO BE EMPTY
70
AND AL, 1
71
JZ LO_SEND
72
73
LO_RECV:
74
IN AL, DX ;; WAIT FOR RECV BUFFER TO HAVE DATA
75
TEST AL, 02H
76
JZ LO_RECV
77
78
TEST AL, 00111000B
79
JNZ ERR_FIN
80
81
MOV DX, DATA8251
82
IN AL, DX ;; RECEIVE FROM 8251
83
MOV [DI], AL ;; SAVE TO [DI]
84
INC DI
85
INC SI
86
LOOP LO
87
88
FIN:
89
JMP FIN
90
91
ERR_FIN:
92
;; OUTPUT TO 8255
93
MOV DX, B8255
94
MOV AH, AL
95
OUT DX, AX
96
97
MOV AX, 4C00H
98
INT 21H
99
START ENDP
100
101
INIT PROC
102
PUSH AX
103
PUSH DX
104
MOV AL, 00H
105
MOV DX, CON8251
106
OUT DX, AL
107
CALL DELAY
108
OUT DX, AL
109
CALL DELAY
110
OUT DX, AL
111
CALL DELAY
112
MOV AL, 40H
113
OUT DX, AL
114
CALL DELAY
115
POP DX
116
POP AX
117
RET
118
INIT ENDP
119
120
DELAY PROC
121
PUSH CX
122
MOV CX, 0FFFFH
123
LOOP $
124
POP CX
125
RET
126
DELAY ENDP
127
128
CODE ENDS
129
END START

结果

3000H

4000H

演示:数据灯

由于传输过程中没有出现问题,因此没法检测 8255 的部分是否正确。因此这里强行测试了一下(

修改上述代码的 79 行,把 JNZ 修改为 JZ。这样就能输出正确情况下的状态字了。实际的 LED 输出如下图所示:

通过 LED 我们可以读出当前的状态字:10000111