一、实验目的
- 掌握串行通信原理及半双工和全双工的编程方法
- 掌握用8251A接口芯片实现微机间的同步和异步通信
- 掌握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控制字,检测有无数据读写,有则输出,再跳回发送部分。