北理工微机原理实验三 使用8251A的串行接口应用实验

  • 格式:docx
  • 大小:787.78 KB
  • 文档页数:12

本科实验报告

实验名称: 实验三 使用8251A的串行接口应用实验

课程名称: 计算机原理与应用实验 实验时间:

任课教师: 实验地点:

实验教师:

实验类型: □ 原理验证

■ 综合设计

□ 自主创新 学生姓名:

学号/班级: 组 号:

学 院: 同组搭档:

专 业: 成 绩:

1. 实验目的

1) 掌握串行通信原理及半双工和全双工的编程方法;

2) 掌握用8251A接口芯片实现微机间的同步和异步通信;

3) 掌握8251A芯片与微机的接口技术和编程方法。

2. 实验原理和内容

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

1) 8251A内部结构

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

表3-4 CPU对8251A的读写操作控制表

2) 8251A的方式控制字和命令控制字

方式控制字确定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) 波特率和除数因子对照表

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

3. 实验连接方法

按图连接好电路,其中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。

4. 编程提示

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

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

1MHz = 1000000Hz

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

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

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

程序具体设计如下:

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

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

5. 实验代码

发送端代码:

STACK SEGMENT PARA STACK

DB 256 DUP(0)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACK

START:

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

MOV AX,80H 10000000B,DLAB=1,数据位,停止位,校验位,波特率因子

OUT DX,AL

MOV DX,3F8H 波特率寄存器(低)

MOV AX,60H 查表 OUT DX,AL

MOV DX,3F9H 波特率寄存器(高)

MOV AX,0 查表

OUT DX,AL

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

MOV AX,0AH 00001010B,DLAB=0

OUT DX,AL

MOV DX,3FCH; 调制解调器控制寄存器

MOV AX,03H 00000011B,OUT1,2均输出1,请求发送,数据已就绪

OUT DX,AL

MOV DX,3F9H 中断允许寄存器

MOV AX,0 各种中断全部禁止

OUT DX,AL

FOREVER:用死循环不断检测8251状态

MOV DX,3FDH ;从线路状态寄存器读状态

IN AL,DX

TEST AL,1EH 死记

JNZ ERROR ;传输线状态寄存器全部都是0

TEST AL,01H 00000001B,检测接收缓存寄存器是否有数据

JNZ RECEIVE 可以收了

TEST AL,20H 00100000B,检测发送保持寄存器是否为空

JNZ SEND 可以发了

JMP FOREVER

SEND:

MOV AH,1

INT 16H

JZ FOREVER 可以发但是未接收到键盘字符

收到了

MOV AH,0

INT 16H 输入读入AL

MOV DX,3F8H 扔进(对于发送端是)发送保持寄存器,发出

OUT DX,AL

CMP AL,03H

JE DONE

MOV DL,AL

MOV AH,02H

INT 21H 显示发送的字符

CMP AL,0DH 00001101B

JNZ FOREVER

MOV DL,0AH

MOV AH,02H

INT 21H

JMP FOREVER

RECEIVE:

MOV DX,3F8H

IN AL,DX

AND AL,7FH

CMP AL,03H;

JZ DONE

MOV DL,AL

MOV AH,02H

INT 21H

CMP AL,0DH JNZ FOREVER

MOV DL,0AH

MOV AH,02H

INT 21H

JMP FOREVER

ERROR:

MOV DX,3F8H

IN AL,DX

MOV DL,0AH

MOV AH,02H

INT 21H

JMP FOREVER

DONE:

MOV AH,4CH

INT 21H

CODE ENDS

END STAR

接收端代码:

DATA SEGMENT

IO8254A EQU 280H

IO8251A EQU 2B8H

IO8251B EQU 2B9H

DATA ENDS

STACK SEGMENT PARA STACK

DB 256 DUP(0)

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:

MOV AX,DATA MOV DS,AX

MOV DX,IO8254A+3

MOV AL,00010110B ;设置8254计数器0工作方式

OUT DX,AL

MOV DX,IO8254A

MOV AL,52 ;给8254计数器0送初值

OUT DX,AL

MOV DX,IO8251B ;对8251进行初始化

MOV AX,0

MOV CX,3

reset8251:

OUT DX,AL

PUSH CX

MOV CX,40H ;向8251控制端口送40H,使其复位

LOOP $

POP CX

LOOP reset8251

MOV AL,40H

OUT DX,AL

MOV CX,40H

LOOP $

MOV AL,5AH

OUT DX,AL

MOV AL,27H

OUT DX,AL

FOREVER:

MOV DX,IO8251B ;从线路状态寄存器读状态

IN AL,DX

TEST AL,38H ;检测是否为00111000

JNZ ERROR ;传输线状态寄存器全部都是0

TEST AL,02H ;检测接受数据是否准备好了

JNZ RECEIVE ;等于0则表示数据没有准备好

TEST AL,01H ;数据没有准备好

JNZ send ;没有,则跳转等待

JMP FOREVER