(仅供参考)微机原理实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三使用8251A的串行接口应用实验
一、实验目的
1) 掌握串行通信原理及半双工和全双工的编程方法。
2) 掌握用8251A 接口芯片实现微机间的同步和异步通信。
3) 掌握8251A 芯片与微机的接口技术和编程方法。
二、实验原理和内容
8251A 是一种可编程的同步/异步串行通信接口芯片,具有独立的接收器和发送器,能实现单工、半双工、双工通信。
1)8251A 内部结构
8251A 通过引脚D0~D7 和系统数据总线直接接口,用于和CPU 传递命令、数据、状态信息。读写控制逻辑用来接收CPU 的控制信号、控制数据传送方向。CPU 对8251A 的读写操作控制表如表3-4 所示。
方式控制字确定8251A 的通信方式(同步/异步)、校验方式(奇校/偶校/不校)、字符长度及波特率等,格式如图3-10 所示。
命令控制字使8251A 处于规定的状态以准备收发数据,格式如图3-11 所示。
方式控制字和命令控制字无独立的端口地址,8251A 根据写入的次序来区分。
CPU 对8251A 初始化时先写方式控制字,后写命令控制字
3)状态寄存器
8251 状态寄存器用于寄存8251A 的状态信息,供CPU 查询,定义如图3-12 所示。
TXRDY位:当数据缓冲器空时置位,而TXRDY引脚只有当条件( 数据缓冲器空•
/CTS•TXE)成立时才置位。
溢出错误:CPU 没读走前一个字符,下一个字符又接收到,称为溢出错误。
帧错误:在字符结尾没检测到停止位,称为帧错误。
4)PC 机寄存器的端口地址
其中:线路控制寄存器第七位:DLAB=0;线路控制寄存器第七位:DLAB=1。
5)波特率和除数因子对照表
232标准的机械、电气规范。
6)实验连接方法
按图连接好电路,其中8254 计数器用于产生8251 的发送和接收时钟,TXD 和RXD 连在一起。
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。
7)编程提示
8251 的控制口地址为2B9H,数据口地址为2B8H。
8254 计数器的计数初值=时钟频率/(波特率X 波特率因子),这里的时钟频率接
1MHz,波特率若选1200,波特率因子16,则计数器初值52。
基于8251 芯片实现异步串行通信一般有两种方式,一种是查询方式,另一种是中断方式,使用哪种方式取决于进行初始化时寄存器的设置。
8254 计数器的计数初值=时钟频率/(波特率×波特率因子),这里的时钟频率接
1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52。
本实验采用8251A 异步方式发送,利用8086 汇编语言实验计算机点到点的串口通信,设置:波特率为1200bps、数据位7 位、停止位1 位、偶校验方式,利用查询方式或中断方式实现双机通信,能够传输多个字符。
三、实验流程图
四、实验代码
(1)收发字符
data segment
io8254a equ 280h
io8254b equ 283h
io8251a equ 2b8h
io8251b equ 2b9h
mes1 db 'you can play a key on the keybord!',0dh,0ah,24h
mes2 dd mes1
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,io8254b ;设置8254计数器0工作方式
mov al,16h
out dx,al
mov dx,io8254a
mov al,52 ;给8254计数器0送初值
out dx,al
mov dx,io8251b ;初始化8251
xor al,al
mov cx,03 ;向8251控制端口送3个0
delay: call out1
loop delay
mov al,40h ;向8251控制端口送40H,使其复位
call out1
mov al,4eh ; 1个停止位,8个数据位,波特率因子为16
call out1
mov al,27h ;向8251送控制字允许其发送和接收
call out1
lds dx,mes2 ;显示提示信息
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 ;若为ESC,结束
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
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
(2)收发文件
DATA SEGMENT
FILE1 DB 'C:\1.txt',0
FCODE1 DW 0
BUF1 DB 2000H DUP(0)
FILE2 DB 'C:\2.txt',0
FCODE2 DW 0
BUF2 DB 2000H DUP(0)
IO8254A EQU280H
IO8254B EQU 283H
IO8251A EQU 2b8H
IO8251B EQU 2b9H
DATA ENDS
STACK SEGMENT PARA STACK
DB 256 DUP(0)