• 【微机接口】可编程串行异步通信芯片8250


    8250能实现数据串并变换,实现全双工异步通信。

    支持异步通信协议,数据格式、通信速率由初始化编程设定。

    内部有中断机制,CPU可用查询中断方式与之交换信息。

     

    8250内部寄存器:

     发送保持寄存器:保存CPU传送来的并行数据,并转移至发送移位寄存器

    只有在发送保持寄存器空闲时,CPU才能写入写一个数据。

    接受缓冲寄存器:

    接受移位寄存器,去掉起始位,检验位和停止位,转换成并行数据,转换后的并行数据存入接受缓冲寄存器,等待CPU接受。

    只有当一帧数据收完后,CPU才能用IN指令读接受缓冲寄存器

    通信线状态寄存器:寄存通信线状态

    D0:D0=1表示接收器已接收到一帧完整的数据,并已转换成并行数据,存入接受缓冲寄存器。

    D5:  D5=1表示发送保持寄存器空闲,CPU可以写入新数据。

        D0位和D5位是串行接口最基本的标志位,它们决定了CPU能不能向8250进行读写操作,只有当D0=1时,CPU才能读数;只有当D5=1时,CPU才能写数据。

       D1D2D3D4位如果为1,说明出错。

    例:利用主串口查询方式发送一个‘A’

    (在此之前,8250通信线寄存器最高位设置为0)

    SCANT :MOV DX,3FDH    ;3FDH为通信线状态寄存器

                  ;SCANT写在MOV DX,3FDH这个地方

                  IN   AL,DX         ;读取通信线状态寄存器到AL

                  TEST  AL,00100000B/20H ;检查发送保持寄存器是否空闲

                  JZ  SCANT        ;一直等到D5为1时,才继续进行下一步

                   MOV DX,3F8H    ;发送保持寄存器

                   MOV  AL,'A'         

                   OUT DX,AL          ;向发送保持寄存器发送一个字符‘A’

    例:利用辅串口查询方式接受一个字符

    (在此之前,8250通信线寄存器最高位设置为0)

    SACNT:MOV DX,3FDH   ;3FDH为通信线状态寄存器

                       IN   AL,DX        ;读取通信线状态寄存器到AL

                    TEST AL,01H      ;检查接受缓冲器是否有数据

                       JZ   SACNT      ;一直等到D0为1时,才继续进行下一步

                     MOV DX,2F8H   

                      IN     AL,DX       ;从辅串口接受缓冲寄存器读取一个字符到AL 

    发送保持寄存器和接受缓冲寄存器口地址相同,当使用OUT指令时,默认访问发送保持缓冲器;

    当使用IN指令时,默认访问接受缓冲寄存器。

    中断允许寄存器:

    D7~D4位恒为0,D3~D0位表示8250的4级中断是否被允许。

    D0:允许接受到一帧数据后,内部提出接受中断请求

    D1:允许接受到一帧数据后,内部提出发送中断请求

    D2D3

    当8250工作在查询方式,中断允许寄存器全部置0。

    中断识别寄存器?没用到

    MODEM控制寄存器:

    000_ _ 000(只需要考虑D3,D4位)

    D3=1:8250用中断方式与CPU交换信息;D3=0:8250用查询方式与CPU交换信息

    D4=0:8250工作在正常收发方式;D4=1:8250工作在内部自环方式

    除数寄存器(高8位,低8位)

     通信线控制寄存器:指定串行异步通信数据格式

    D7=1表明后继写入合用端口的数据写入除数寄存器

    D7=0表明后继写入何用端口的数据写入非除数寄存器

     MOV  DX,3FBH; 3FBH控制线寄存器 

     MOV   AL,80H   ;   10000000B (访问除数寄存器)

     OUT   DX,AL     ;    访问除数寄存器

     MOV   DX,3F9H;    除数寄存器高8位

     MOV    AL,   N      ;  

    OUT     DX,AL     ;   N写入除数寄存器高8位        

    MOV DX,3FBH       ;3FBH控制线寄存器

    MOV AL,01111111B(写最高位,后面不管);访问非除数寄存器

    OUT DX,AL  

    MOV DX,3F8H

    MOV AL,N

    OUT DX,AL              ;N写入发送保持寄存器

    8250的初始化编程:

    直接对8250端口进行初始化编程

    (1)确定波特率:          设置除数寄存器

    (2)确定数据格式:      设置通信线路控制寄存器

    (3)若使用中断方式:   设置中断允许寄存器的相应位(置“1”)

    (4)设置MODEM控制寄存器

    例:编写子程序,对PC系列机主串口进行初始化,要求:

    (1)通信速率=1200波特,一帧数据包括:8个数据位,1个停止位,无校验

    (2)查询方式,完成内环自检

    查表:除数寄存器0060H

    一帧数据结构命令字:00000011B(3FBH,第一位为0是因为之后用不到除数寄存器)

    中断允许命令字:0

    MODEM控制字00010000B=10H

    注意D3在右面,D4在左面

    I8250 PROC

          MOV  DX,3FBH

          MOV AL,80H

          OUT  DX,AL     ;这三行固定,表示访问除数寄存器

          MOV  DX,3F9H 

          MOV  AL,0      ;00H写入除数寄存器高8位

          OUT  DX,AL    ;

          MOV DX,3F8H

          MOV  AL,60H

          OUT  DX,AL    ;60H写入除数寄存器低9位

          MOV  DX,3FBH

          MOV  AL,03H

          OUT   DX,AL    ;定义一帧数据格式

          MOV AL,0

          OUT  DX,AL

          MOV DX,3FCH  ;置MODEM控制器

          MOV AL,10H

          OUT DX,AL

           RET    

    I8250 ENDP

    例:要求以9600bps进行异步串行通信,每个字符7位,2个停止位,奇校验,允许所有中断。

    假设端口地址的高位0011,1111,1A2A1A0

    除数寄存器000CH        (3FBH)

    数据格式:00001110B (3FBH)

    允许所有中断:中断允许寄存器0FH

    MODEM控制器:000010(11)?(考试不考)

    MOV DX,3FBH

    MOV AL,80H

    OUT DX,AL ;访问除数寄存器

    MOV DX,3F9H

    MOV AL,0

    OUT DX,AL;除数寄存器高8位

    MOV DX,3F8H

    MOV AL,0CH

    OUT DX,AL;除数寄存器低8位

    MOV DX,3FBH

    MOV AL,00001110B

    OUT DX,AL;设置数据帧格式

    MOV DX,3F9H

    MOV AL,0FH

    OUT DX,AL;设置中断允许寄存器

    MOV DX,3FCH

    MOV AL,0BH

    OUT DX,AL   ;置MODEM控制器

    例:A、B两机利用主串口,查询方式,进行单工通信,A机发送电文“hello”至B机。试为A机编写发送程序。要求:波特率为2400,奇校验,停止位1位,数据位7位,采用查询方式。

    除数寄存器:0030H

    A机:

    DATA SEGMENT USE16

    BUF DB 'HELLO'

    LEN EQU  $-BUF

    DATA ENDS

    CODE SEGMENT USE16

               ASSUME CS:CODE,DS:DATA

    BEG:  MOV AX,DATA

              MOV DS,AX

              CALL I8250 ;完成8250初始化编程

              ;在完成8250的初始化编程后默认访问的是非除数寄存器

              LEA  BX,BUF   

              MOV CX,LENS

    SCAN:  MOV DX,3FDH

                 IN   AL,DX   ;忘记写

                 TEST AL,20H;检测D5是否为1,如果为1说明可以发送数据

                 JZ SCAN

                 MOV DX,3F8H

                 MOV AL,[BX];使用LOOP循环遍历字符串

                 OUT DX,AL

                  INC BX

                 LOOP SCAN

    NEXT:  MOV AH,4CH

                INT 21H

    I8250 PROC

            MOV DX,3FBH

            MOV AL,80H

            OUT DX,AL       ;访问除数寄存器

            MOV DX,3F9H

            MOV AL,0  

            OUT DX,AL       ;除数寄存器高8位00H

            MOV DX,3F8H

            MOV AL,30H   

            OUT DX,AL       ;除数寄存器低9位30H

            MOV DX,3FBH

            MOV AL,00001010B

            OUT DX,AL       ;设置一帧数据格式

            MOV  DX,3FCH

             MOV AL, 0 

             OUT DX,AL

             RET

    I8250 ENDP

    CODE ENDS

        END BEG

    B机:

    CODE SEGMENT USE16

            ASSUME CS:CODE,DS:DATA 

    BEG: CALL I8250 ;同上(和A一样)

               MOV CX,5

    SCAN:MOV DX,3FDH

               IN AL,DX

               TEST AL ,01H  ;D0位是1说明可以接受数据

               JZ  SCAN 

               IN AL,3F8H ;出错

             正确写法 

             MOV DX,3F8H

              IN AL,DX ;使用AL接受读取缓冲区的数据

               LOOP SCAN

               MOV AH,4CH

               INT 21H

  • 相关阅读:
    mybatis—plus
    会计学原理名词解释和简答
    第 2 章 线性表 (设立尾指针的单循环链表(链式存储结构)实现)
    【SQL】一篇带你掌握SQL数据库的查询与修改相关操作
    【期末考试复习】概率论与数理统计(知识点模式 - 复习题1)(内容1)
    ConcurrentHashMap put和扩容的源码深度解析(内含JDK8中3个bug以及修复的版本)
    Java的final修饰符
    P1123 取数游戏
    WZOI-584矩阵快速幂
    苍穹外卖(一)
  • 原文地址:https://blog.csdn.net/m0_52043808/article/details/127983526