欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【微机实验系列】基于微机的串行通信口扩展

程序员文章站 2024-02-02 15:42:10
...

引言

照例先借下关键字们: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
相关标签: 微机实验 汇编