汇编语言:使用8251A的串行接口应用实验

一、实验目的

  1. 掌握串行通信原理及半双工和全双工的编程方法
  2. 掌握用8251A接口芯片实现微机间的同步和异步通信
  3. 掌握8251A芯片与微机的接口技术和编程方法

二、实验原理和内容

    8251A是一种可编程的同步/异步串行通信接口芯片, 具有独立的接收器和发送器,能实现单工、半双工、双工通信。

1.8251A内部结构

8251A通过引脚D0-D7和系统数据总线直接接口,用于和CPU传递命令、数据、状态信息。读写控制逻辑用来接收CPU的控制信号、控制数据传送方向。CPU对8251A的读写操作控制表如表2-1所示。

/CS

C/D

/RD

/ WR

操作

1

任意

任意

任意

无操作, D0-D7呈高阻

0

1

1

0

写控制字

0

0

1

0

写数据

0

1

0

1

读状态

0

0

0

1

读数据

表2-1 CPU对8251A的读写操作控制表

2.8251A的方式控制字和命令控制字

    方式控制字确定8251A的通信方式(同步/异步)、校验方式(奇校/偶校/不校)、字符长度及波特率等,格式如图2-2所示。

    命令控制字使8251A处于规定的状态以准备收发数据,格式如图2-3所示。

    方式控制字和命令控制字无独立的端口地址,8251A 根据写入的次序来区分。

CPU对8251A初始化时先写方式控制字,后写命令控制字

图2-2 8251方式控制字

图2-3 8251命令控制字

3.状态寄存器

图2-4 状态寄存器

    8251状态寄存器用于寄存8251A的状态信息,供CPU查询,定义如图3-12所示。

    TXRDY位:当数据缓冲器空时置位,而TXRDY引脚只有当条件( 数据缓冲器空• /CTS•TXE)成立时才置位。

    溢出错误:CPU没读走前一个字符,下一个字符又接收到,称为溢出错误。

    帧错误:在字符结尾没检测到停止位,称为帧错误。

4.PC机寄存器的端口地址

表2-5 PC机寄存器的端口地址

    其中:线路控制寄存器第七位:DLAB=0;线路控制寄存器第七位:DLAB=1。

5.波特率和除数因子对照表

表2-6波特率和除数因子对照表

    实验硬件连接方法:通过计算机点到点三线制串口通信线,掌握接线的方法以及RS-232标准的机械、电气规范。

6.实验连接方法

       按图连接好电路,其中 8254计数器用于产生 8251的发送和接收时钟,TXD和 RXD连在一起。

图 2-7 实验箱连接原理图

       (1)8254/CLK0连接时钟/1MHz

       (2)8254/CS连接 I/O译码/Y0(280H---287H)

       (3)8254/OUT0连接8251/TX/RXCLK

       (4)8254/GATE0连接+5V

       (5)8251/TXD连接8251/RXD

       (6)8251/CS 连接I/O译码/Y7(2B8H---2BFH)

三、编程要求

       8251的控制口地址为  2B9H,数据口地址为 2B8H。

       8254计数器的计数初值=时钟频率/(波特率  X波特率因子),这里的时钟频率接   1MHz,波特率若选 1200,波特率因子 16,则计数器初值 52。

       1MHz = 1000000Hz,计算公式如下:

       基于8251芯片实现异步串行通信一般有两种方式,一种是查询方式,另一种是中断方式,使用哪种方式取决于进行初始化时寄存器的设置。

       8254 计数器的计数初值=时钟频率/(波特率×波特率因子),这里的时钟频率接1MHz,波特率若选 1200,波特率因子若选 16,则计数器初值为 52。

       本实验采用8251A异步方式发送,利用8086汇编语言实验计算机点到点的串口通信,设置:波特率为1200bps、数据位7位、停止位1位、偶校验方式,利用查询方式或中断方式实现双机通信,能够传输多个字符。

       程序具体设计如下:

          (1)基础型实验:从键盘输入一个文件或打开已有的文件发送出去,再接收 回来在屏幕上显示,实现自发自收。

          (2)提高型实验:设计发送方和接收方两个程序,要求将某汇编语言传送 到接收方,接收方收到后将源程序写入指定磁盘或屏幕显示。

图3-1 串行接口通信编程流程图

四、实验程序清单

data segment

    io8253a equ 280h
    io8253b equ 283h
    io8251a equ 2b8h
    io8251b equ 2b9h
    mes1 db 'you can play a key on the keybord!',0dh,0ah,24h

data ends

code segment
    assume cs:code,ds:data
    
start:

    mov ax,data
    mov ds,ax
    mov dx,io8253b 

    mov al,16h
    out dx,al
    
    mov dx,io8253a
    mov al,52 
    out dx,al
    
    mov dx,io8251b 
    xor al,al

    mov cx,03 
delay:
    call out1
    loop delay

    mov al,40h 
    call out1
    mov al,4eh 
    call out1
    mov al,27h 
    call out1
    
    push ax
    mov dx,io8251b
    in al,dx
    pop ax

    lea dx,mes1 
    mov ah,09
    int 21h

waiti:

    mov dx,io8251b
    in al,dx
    test al,01
    jz waiti

    mov ah,01
    int 21h
    cmp al,27 
    jz exit

    mov dx,io8251a
    out dx,al
    mov cx,40h
s51:
    loop s51

next:
    mov dx,io8251b
    in al,dx
    test al,02 
    jz next

    mov dx,io8251a
    in al,dx
    
    mov dl,al
    mov ah,02 
    int 21h

    mov dl, ' '
    mov ah, 02h
    int 21h 
    jmp waiti

exit:
    mov ah,4ch
    int 21h

out1 proc near 

    out dx,al
    push cx
    mov cx,40h
gg:
    loop gg
    pop cx
    ret
    out1 endp
    
code ends
end start

五、实验框图与流程图

图3-2 实验框图与流程图

六、实验结果与分析

1.代码分析

       首先,程序初始化数据段指针,然后配置8253定时器和8251串行设备。然后,它进入一个3次循环,每次循环都会调用out1过程向设备写入数据,然后延时。在这之后,程序会将字符串mes1打印到控制台上,然后进入一个等待键盘输入的循环。一旦接收到键盘输入,程序将检查输入的字符是否是ASCII字符27(Escape键)。如果是,程序将退出;如果不是,程序将字符写入8251 串行设备,然后再次进入延时循环。在发送完字符后,程序进入一个等待8251串行设备响应的循环。一旦接收到响应,程序将从8251串行设备读取响应,并将响应显示在控制台上。然后,程序打印一个空格,然后回到等待键盘输入的循环。out1过程是用来向设备写入数据的。它也有一个延时循环,以确保设备有足够的时间处理写入的数据。最后,如果程序接收到Escape键,它将退出。程序使用了DOS的INT 21H服务来完成退出操作。如果不是Escape键,程序将继续运行,等待新的键盘输入。

2.实验分析

       初始化8254,写入控制字,采用计数器0进行技术,只读写计数器的低八位,采用工作方式三进行工作。初始化8251,写入3个控制字0,接着写入复位控制字40H,延时一段时间,写入8251控制字,检测是否允许发送,若允许发送,则将AH置为1,进行DOS中断,获取输入的字符。判断输入的字符是否为ESC,若为ESC则退出程序,若不是则发送。读取8251控制字,检测有无数据读写,有则输出,再跳回发送部分。

  • 38
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值