【微机实验系列】基于微机的串行通信口扩展
引言
照例先借下关键字们:PKU 微机实验 实验报告 基于微机的串行通信口扩展 8251A
看了下可怜的浏览量们,或许确实是我用一己之力刷出了这个惨淡博客的所有浏览量…真是有些绝望啊QAQ总觉得自己之前的博客写出来排版奇丑无比,于是尝试了一下markdown编辑器,希望能够变得更加美美美一点啦~哎呀还是要敢于尝试试错的呀,毕竟我还是个好奇宝宝23333
顺便之前由于乱七八糟的期末&期末后的堕落,微机实验系列断更了一段时间【你个傻孩子其实并没有人在追啦…而现在我的微机实验结果已经出来了,所以就顺路写一些课程反馈吧。强烈安利杨延军老师,超级儒雅有风度,有一种神奇的老*的认真靠谱优雅绅士,同时又像清酒一样干净而美!从之前的各种总结可以想见,我经常出现各种bug改不出的悲剧情况,在濒临下课实验室基本走空的时候,老师就会听我讲下自己的思路,或者是亲身上阵帮我看代码。天惹真的是苏到爆炸!最后给分虽然确实挺惨淡的符合我的真实水平,但是还是十分痛并快乐着的疯狂的学习涨知识见男神的过程啦~
正文
终于啰啰嗦嗦进入正题了。基于微机的串行通信口扩展还是非常难的。基本套路可以参考课程计算机组成里讲的通讯的东西。
6.3.1 自发自收
用8251A 实现串行口异步通信,自发自收,波特率1200bps。采用查询方式发送与接收。从键盘输入发送字符。发送与接收的字符均在屏幕上显示。按ESC键返回DOS。
好处是指定了用查询方式,比起中断就会好些好多。大概的思路就是去初始化8253(前面的与时间有关的芯片),然后复杂的初始化8251。从键盘读入,如果是ESC键就直接跳到退出,否则就是要发送的了。一直等,等到能发送之后发送字符,然后一直等,等到能接收之后接收字符,同时显示。大概的套路就是这样啦,记着之前提到的程序查询的一些要点就好啦~
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,00010110B
MOV DX,0E483H
OUT DX,AL
MOV DX,0E480H
MOV AL,52
OUT DX,AL
MOV DX,0E4B9H
MOV AL,0
OUT DX,AL
OUT DX,AL
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,4EH
OUT DX,AL
MOV AL,27H
OUT DX,AL
STATE:
MOV AH,1H
INT 21H
MOV BL,AL
CMP BL,27
JZ END0
STATE1:
MOV DX,0E4B9H
IN AL,DX
TEST AL,01H
JZ STATE1
MOV AL,BL
MOV DX,0E4B8H
OUT DX,AL
STATE2:
MOV DX,0E4B9H
IN AL,DX
TEST AL,02H
JZ STATE2
MOV DX,0E4B8H
IN AL,DX
MOV AH,0EH
INT 10H
JMP STATE
END0:
MOV AH,4CH
INT 21H
CODE ENDS
END START
6.3.2 中断方式接收
用8251A 实现串行口异步通信,自发自收,波特率1200bps。采用查询方式发送、中断方式接收。从键盘输入字符串(字符个数<255) 存入发送缓冲区并显示,启动发送键由实验者自己定义,自收结果显示于屏幕。ESC键返回DOS。
这个中断方式确实难了好多。我虽然在课前用纸笔写了一下程序,然而实验的时候还是调试到泪崩。当时正好还有些不大顺利的事情,程序又一直弄不对,负面情绪一直积累,导致杨老师走到我旁边问我的进度的时候,我就真的对着古旧的电脑屏幕突然哭了出来,眼泪慢慢往下流但是停不下来的那种。我觉得善良的杨老师被我吓傻了,一个傻姑娘看着自己的室友和电脑屏幕,呜呜嘤嘤的就哭上了23333当时特别的伤心绝望,后来周四的时候再去蹭了一次实验,抖擞精神写好了。
现在想来无论是之前没过的那个程序,还是再之前遗憾的事情,都能够用一种“啊过去了那就过去吧”的想法去看了。事情过去了之后,好像也就能在心里过去了。这也算是挫折下的一种长大了吧~
闲扯一堆之后回到正题。既然要求了用中断去写,那就要在中断服务程序里好好做文章。很多套路是照搬6.3.1的,比如说初始化写控制字,IO接口上交互的小段代码等等。然而用了中断服务程序之后,进中断前的保存现场和出中断的恢复现场就是一个浩大的工程了。这部分可以参考前面写的与中断服务有关的程序,然而程序长而啰嗦所以要注意别漏写了什么。总之是一个很有挑战也挺好玩的实验啦。
DATA SEGMENT
OLDOFF DW ?
OLDSEG DW ?
MES DB 512 DUP(0)
STOP DB ' '
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,00010110B
MOV DX,0E483H
OUT DX,AL
MOV DX,0E480H
MOV AL,52
OUT DX,AL
MOV DX,0E4B9H
MOV AL,0
OUT DX,AL
OUT DX,AL
OUT DX,AL
MOV AL,40H
OUT DX,AL
MOV AL,4EH
OUT DX,AL
MOV AL,27H
OUT DX,AL
MOV AX,350EH
INT 21H
MOV OLDSEG,ES
MOV OLDOFF,BX
MOV AX,CODE
MOV DS,AX
MOV DX,OFFSET IRQ
MOV AX,250EH
INT 21H
CLI
MOV DX,0EC4CH
MOV AL,43H
OUT DX,AL
INC DX
MOV AL,1DH
OUT DX,AL
IN AL,21H
AND AL,10111111B
OUT 21H,AL
MOV AX,DATA
MOV DS,AX
STI
BEGIN:
MOV SI,0 ;SI=INPUT NUM
STATE:
MOV AH,1H
INT 21H
MOV BL,AL
CMP BL,27
JZ END0
CMP BL,STOP
JZ SENDOUT ;IF IN==STOPLETTER,SEND THE MESSAGE OUT
MOV DS:[MES+SI],AL
INC SI
;MOV DL,AL
;MOV AH,2
;INT 21H
JMP STATE
SENDOUT:
MOV CX,SI
MOV SI,0
STATE1:
MOV DX,0E4B9H
IN AL,DX
TEST AL,01H
JZ STATE1
MOV AL,DS:[MES+SI]
MOV DX,0E4B8H
OUT DX,AL
INC SI
LOOP STATE1
JMP BEGIN
END0:
CLI
IN AL,21H
OR AL,40H
OUT 21H,AL
MOV DX,0EC4CH
MOV AL,42H
OUT DX,AL
MOV DX,OLDOFF
MOV DS,OLDSEG
MOV AX,250EH
INT 21H
STI
MOV AH,4CH
INT 21H
IRQ PROC FAR
PUSH AX
PUSH DX
MOV DX,0E4B8H
IN AL,DX
MOV DL,AL
MOV AH,0EH
INT 10H
MOV AL,20H
OUT 20H,AL
MOV DX,0EC4DH
MOV AL,1DH
OUT DX,AL
POP DX
POP AX
IRET
IRQ ENDP
CODE ENDS
END START
推荐阅读