1. 实验目的
- 了解串行通信的工作原理和通信协议。
- 掌握串行接口8251的硬件连接和编程方法。
2. 实验内容
- 题目:编写自收自发程序,将3000H其实的10个单元中的初始数据发送到串口,然后自接受并保存到4000H起始的内存单元中。
- 实验扩展:编写程序,将字符“a-z”的ASCII码写入3000H开始的存储单元中,然后通过串口以9600波特率传输到4000H开始的存储单元中。要求:当出现帧格式错,溢出错和奇偶校验错时,则停止传输,并将状态字显示在数据灯D7-D0上
3. 主实验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | M8251_DATA EQU 0600H ;8251数据端口地址 M8251_CON EQU 0602H ;8251控制端口地址 M8254_2 EQU 06C4H ;8254计数器2端口地址 M8254_CON EQU 06C6H ;8254控制寄存器端口地址 SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV AX, 0000H MOV DS, AX ;初始化 8254,得到收发时钟 MOV AL, 0B6H MOV DX, M8254_CON OUT DX, AL MOV AL, 0CH MOV DX, M8254_2 OUT DX, AL MOV AL, 00 OUT DX, AL MOV DX, M8251_CON MOV AL, 00H OUT DX, AL CALL DELAY ;复位 8251 MOV AL, 40H OUT DX, AL CALL DELAY MOV AL,7EH OUT DX, AL ;写入8251方式字7EH=01111110B,详见实验讲义P59 CALL DELAY MOV AL, 34H OUT DX, AL ;写入8251控制字34H=00110110B,详见实验讲义P60 CALL DELAY MOV DI, 4000H ;写入地址 MOV SI, 3000H ;读入地址 MOV CX, 000AH ;循环10次 A1: MOV AL, [SI] PUSH AX MOV AL, 37H MOV DX, M8251_CON OUT DX, AL POP AX MOV DX, M8251_DATA OUT DX, AL ;发送数据 MOV DX, M8251_CON A2: IN AL, DX ;判断发送缓冲是否为空 AND AL, 01H JZ A2 CALL DELAY A3: IN AL, DX ;判断是否接收到数据 AND AL, 02H JZ A3 MOV DX, M8251_DATA IN AL, DX ;读取接收到的数据 MOV [DI], AL INC DI INC SI LOOP A1 ;循环10次 MOV AH,4CH INT 21H ;程序终止 DELAY: ;延时子程序 PUSH CX MOV CX,3000H A5: PUSH AX POP AX LOOP A5 POP CX RET CODE ENDS END START |
4. 实验扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | M8251_DATA EQU 0600H ;8251数据端口地址 M8251_CON EQU 0602H ;8251控制端口地址 M8254_2 EQU 06C4H ;8254计数器2端口地址 M8254_CON EQU 06C6H ;8254控制寄存器端口地址 M8255_CON EQU 0646H ;8255控制寄存器端口地址 M8255_B EQU 0642H ;8255B口地址 SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE START: MOV AX, 0000H MOV DS, AX MOV DX, M8255_CON MOV AL, 90H OUT DX, AL MOV DX, M8255_B MOV AL, 0FFH OUT DX, AL ;初始化8255,B口输出 AA0: MOV SI, 3000H ;数据首写入首地址 MOV CX, 001AH MOV AX, 61H AA1: MOV [SI], AX INC AX INC SI LOOP AA1 ;初始化 8254,得到收发时钟 MOV AL, 0B6H MOV DX, M8254_CON OUT DX, AL MOV AL, 0CH MOV DX, M8254_2 OUT DX, AL MOV AL, 00 OUT DX, AL MOV DX, M8251_CON MOV AL, 00H OUT DX, AL CALL DELAY ;复位 8251 MOV AL, 40H OUT DX, AL CALL DELAY ;8251 方式字 MOV AL,7EH OUT DX, AL CALL DELAY ;8251 控制字 MOV AL, 34H OUT DX, AL CALL DELAY MOV DI, 4000H MOV SI, 3000H MOV CX, 001AH A1: MOV AL, [SI] PUSH AX MOV AL, 37H MOV DX, M8251_CON OUT DX, AL POP AX MOV DX, M8251_DATA OUT DX, AL ;发送数据 MOV DX, M8251_CON A2: IN AL, DX AND AL, 01H ;判断发送缓冲是否为空 JZ A2 CALL DELAY A3: IN AL, DX MOV DX, M8255_B OUT DX, AL TEST AL, 02H ;判断是否接收到数据 JZ A3 TEST AL, 38H ;判断是否有错误,如果出现错误则显示在D7-D0上 JZ CONTINUE MOV DX, M8255_B OUT DX, AL JMP EXIT CONTINUE: MOV DX, M8251_DATA IN AL, DX ;读取接收到的数据 MOV [DI], AL INC DI INC SI LOOP A1 EXIT: MOV AH,4CH INT 21H ;程序终止 DELAY: PUSH CX MOV CX,3000H A5: PUSH AX POP AX LOOP A5 POP CX RET CODE ENDS END START |
关于8251初始化,未初始化前,8251是什么状态,程序中往控制口写00H,是什么意思
po