北理工微机原理实验三使用8251A的串行接口应用实验.docx
《北理工微机原理实验三使用8251A的串行接口应用实验.docx》由会员分享,可在线阅读,更多相关《北理工微机原理实验三使用8251A的串行接口应用实验.docx(13页珍藏版)》请在冰豆网上搜索。
北理工微机原理实验三使用8251A的串行接口应用实验
北理工微机原理实验三--使用8251A的串行接口应用实验
本科实验报告
实验名称:
实验三使用8251A的串行接口应用实验
课程名称:
计算机原理与应用实验
实验时间:
任课教师:
实验地点:
实验教师:
实验类型:
□原理验证
■综合设计
□自主创新
学生姓名:
学号/班级:
组号:
学院:
同组搭档:
专业:
成绩:
1.实验目的
1)掌握串行通信原理及半双工和全双工的编程方法;
2)掌握用8251A接口芯片实现微机间的同步和异步通信;
3)掌握8251A芯片与微机的接口技术和编程方法。
2.实验原理和内容
8251A是一种可编程的同步/异步串行通信接口芯片,具有独立的接收器和发送器,能实现单工、半双工、双工通信。
1)8251A内部结构
8251A通过引脚D0~D7和系统数据总线直接接口,用于和CPU传递命令、数据、状态信息。
读写控制逻辑用来接收CPU的控制信号、控制数据传送方向。
CPU对8251A的读写操作控制表如表3-4所示。
表3-4CPU对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.实验代码
发送端代码:
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK
START:
MOVDX,3FBH线路控制寄存器
MOVAX,80H10000000B,DLAB=1,数据位,停止位,校验位,波特率因子
OUTDX,AL
MOVDX,3F8H波特率寄存器(低)
MOVAX,60H查表
OUTDX,AL
MOVDX,3F9H波特率寄存器(高)
MOVAX,0查表
OUTDX,AL
MOVDX,3FBH线路控制寄存器
MOVAX,0AH00001010B,DLAB=0
OUTDX,AL
MOVDX,3FCH;调制解调器控制寄存器
MOVAX,03H00000011B,OUT1,2均输出1,请求发送,数据已就绪
OUTDX,AL
MOVDX,3F9H中断允许寄存器
MOVAX,0各种中断全部禁止
OUTDX,AL
FOREVER:
用死循环不断检测8251状态
MOVDX,3FDH;从线路状态寄存器读状态
INAL,DX
TESTAL,1EH死记
JNZERROR;传输线状态寄存器全部都是0
TESTAL,01H00000001B,检测接收缓存寄存器是否有数据
JNZRECEIVE可以收了
TESTAL,20H00100000B,检测发送保持寄存器是否为空
JNZSEND可以发了
JMPFOREVER
SEND:
MOVAH,1
INT16H
JZFOREVER可以发但是未接收到键盘字符
收到了
MOVAH,0
INT16H输入读入AL
MOVDX,3F8H扔进(对于发送端是)发送保持寄存器,发出
OUTDX,AL
CMPAL,03H
JEDONE
MOVDL,AL
MOVAH,02H
INT21H显示发送的字符
CMPAL,0DH00001101B
JNZFOREVER
MOVDL,0AH
MOVAH,02H
INT21H
JMPFOREVER
RECEIVE:
MOVDX,3F8H
INAL,DX
ANDAL,7FH
CMPAL,03H;
JZDONE
MOVDL,AL
MOVAH,02H
INT21H
CMPAL,0DH
JNZFOREVER
MOVDL,0AH
MOVAH,02H
INT21H
JMPFOREVER
ERROR:
MOVDX,3F8H
INAL,DX
MOVDL,0AH
MOVAH,02H
INT21H
JMPFOREVER
DONE:
MOVAH,4CH
INT21H
CODEENDS
ENDSTAR
接收端代码:
DATASEGMENT
IO8254AEQU280H
IO8251AEQU2B8H
IO8251BEQU2B9H
DATAENDS
STACKSEGMENTPARASTACK
DB256DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,IO8254A+3
MOVAL,00010110B;设置8254计数器0工作方式
OUTDX,AL
MOVDX,IO8254A
MOVAL,52;给8254计数器0送初值
OUTDX,AL
MOVDX,IO8251B;对8251进行初始化
MOVAX,0
MOVCX,3
reset8251:
OUTDX,AL
PUSHCX
MOVCX,40H;向8251控制端口送40H,使其复位
LOOP$
POPCX
LOOPreset8251
MOVAL,40H
OUTDX,AL
MOVCX,40H
LOOP$
MOVAL,5AH
OUTDX,AL
MOVAL,27H
OUTDX,AL
FOREVER:
MOVDX,IO8251B;从线路状态寄存器读状态
INAL,DX
TESTAL,38H;检测是否为00111000
JNZERROR;传输线状态寄存器全部都是0
TESTAL,02H;检测接受数据是否准备好了
JNZRECEIVE;等于0则表示数据没有准备好
TESTAL,01H;数据没有准备好
JNZsend;没有,则跳转等待
JMPFOREVER
send:
MOVAH,1;检测键盘按下
INT16H
JZFOREVER;有键盘按下
MOVAH,0;读键盘
INT16H
MOVDX,IO8251A;将键盘的数据输出发送到缓冲器
OUTDX,AL
CMPAL,03H
JZDONE
MOVAH,02H
INT21H
JMPFOREVER
CMPAL,0DH
JNZFOREVER
ERROR:
MOVDX,IO8251A
INAL,DX
MOVDL,'?
'
MOVAH,02H
INT21H
JMPFOREVER
DONE:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART