资源描述
武汉理工大学《微机原理与接口技术》课程设计说明书
目录
摘要 1
1 设计题目 2
2 基本原理 2
2.1 异步串口通讯原理 2
2.2 串行接口8251A芯片 3
2.2.1 8251A的基本性能 3
2.2.2 8251的内部结构及外部引脚 4
2.2.3 8251A的编程 7
3 程序设计 9
3.1 题目分析 9
3.2 流程图 11
3.3 源程序 13
4 硬件接线图 21
结束语 22
参考文献 23
摘要
计算机与外部信息交换的方式有两种,一种是并行通信,另一种是串行通信。串行通讯又有两种基本方式,异步通讯和同步通讯。异步通讯中CPU与外设之间必须有两项规定,即字符格式的规定和波特率的规定。
8251A芯片是Intel公司生产的大规模集成电路芯片,是与Intel系列CPU兼容的可编程的串行通讯接口。虽然8251A的芯片功能较强,但它仍需外部时钟电路,此时可采用8253可编程定时器/计数器。且8251A的发送或接收的方式有查询方式和中断方式。在此次课程设计中,双机的串行通讯中CPU与8251A就是以查询方式进行数据的交换。
本次课程设计需要利用汇编语言编程实现双机串口通信,采用异步方式传输,实时显示传送或者接受的数据,实现双机收发数据的功能。
关键词:汇编语言 双机异步串口通讯 8251A芯片 查询方式
23
双机串口通讯
1 设计题目
A,B两台主机间串口通讯,先由A发送,B接收,然后B将接受的数据回传给A。要求实时显示传送或者接收的数据。采用异步方式,CPU和8251之间采用查询方式交换数据。端口地址是:命令/状态口3F9数据口3F8 。
2 基本原理
2.1 异步串口通讯原理
串行通信指只需一条数据线便可进行数据传送,数据的各位是按规定顺序一位一位传送的通信方式。其特点传输线简单,可利用多种介质,适用于远距离通信,成本较低;但速度较慢。串行通信又分为两种方式,同步串行通信方式和异步串行通信方式。
图2-1 串口通信
所谓异步串行通信是指发送和接收两地不用同一时钟同步的数据传输方式。一般以若干位表示一个字符,收发以字符为独立的通信单位,每个字符出现的时间是任意的。
异步通讯不需要同步信号线,为了实现异步通讯的要求,CPU与外设之间有两项规定,即字符格式的规定和波特率的规定。 异步通信中,发送端和接收端各用一个时钟来确定发送和接收的速率,分别称为发送时钟和接收时钟。发送时在传送的字符后自动在奇偶校验位置上添加1或0,使得字符1的个数(包括校验位)为偶数(偶校验)或奇数(奇校验);而接收时,要检查所接收的字符及其校验位是否符合规定,若不符合规定就置出错标志,供CPU查询处理。一般情况,在异步通信中使用偶校验,而在同步通信中使用奇校验。
波特率:波特率是指单位时间内传输的位数,单位是bps。尽管波特率在理论上是可以随意的,但考虑到接口的标准性,国际上还是规定了一个标准的波特率系列。常用的波特率有110,300,600,1200,2400,4800,9600和19200(bps)。大多数接口的接受波特率和发送波特率是可以分别设置的,也就是说,它们可以分别由编程来设定。
字符格式:在异步通讯中,任何一组数剧总是以起始位(低电平)开头,停止位(高电平)结束。数剧采用的编码有ASCII码和EBCDIC(扩展BCD码),另外是否用奇偶校验,停止位选用宽度等,这些都必须有规定。例如,用ASCII编码,字符为7位,加一个偶校验位、一个起始位以及一个停止位,则一个字符由10位组成。从起始位开始到停止位结束构成一帧,字符可以一个挨着一个传送。
2.2 串行接口8251A芯片
2.2.1 8251A的基本性能
8251是可编程的串行通信接口,可以管理信号变化范围很大的串行数据通信。有下列基本性能:
(1)通过编程,可以工作在同步方式,也可以工作在异步方式;
(2)同步方式下,波特率为0~64K,异步方式下,波特率为0~19.2K;
(3)在同步方式时,可以用5~8位来代表字符,内部或外部同步,可自动插入同步字符;
(4)在异步方式时,也使用5~8位来代表字符,自动为每个数据增加1个启动位,并能够根据编程为每个数据增加1个、1.5个或2个停止位;
(5)具有奇偶、溢出和帧错误检测能力;
(6)全双工,双缓冲器发送和接收器。
注意:8251尽管通过了RS-232规定的基本控制信号,但并没有提供规定的全部信号。
2.2.2 8251的内部结构及外部引脚
8251A的内部结构如图2-2所示,由发送器,接收器,数据总线缓冲器,
读/写控制电路及调制解调控制电路等5部分组成。
图2-2 8251A内部结构框图
(1)发送器
发送器由发送缓冲器和发送控制电路两部分组成。
采用异步方式,则由发送控制电路在其首尾加上起始位和停止位,然后从起始位开始,经移位寄存器从数据输出线TXD逐位串行输出。
(2)接收器
接收器由接收缓冲器和接收控制电路两部分组成。
接收移位寄存器从RXD引腿上接收串行数据转换成并行数据后存入接收缓冲器。
异步方式:在RXD线上检测低电平,将检测到的低电平作为起始位, 8251A开始进行采样,完成字符装配,并进行奇偶校验和去掉停止位,变成了并行数据后,送到数据输入寄存器,同时发出RXRDY信号送CPU,表示已经收到一个可用的数据。
(3)数据总线缓冲器
数据总线缓冲器是CPU与8251A之间的数据接口。包含3个8位的缓冲寄存器:两个寄存器分别用来存放CPU向8251A读取的数据或状态信息。一个寄存器用来存放CPU向8251A写入的数据或控制。
(4)读/写控制电路
读/写控制电路用来配合数据总线缓冲器的工作。功能如下:
(5)调制解调控制电路
调制解调控制电路用来简化8251A和调制解调器的连接。
图2-3 8251A外部引脚图
8251A的外部引脚如图2-3所示,共28个引脚,每个引脚信号的输入输出方式如图中的箭头方向所示。
2.2.3 8251A的编程
编程的内容包括两大方面:
一是由CPU发出的控制字,即方式选择控制字和操作命令控制字;
二是由8251A向CPU送出的状态字。
(1)方式选择控制字
图2-4 8251A方式选择控制字格式
方式选择控制字的格式如图2-4所示。
(2)操作命令控制字(控制字)
操作命令字直接使8251A处于规定的工作状态。操作命令控制字的格式如图2-5所示。
图2-5 8351A操作命令控制字格式
图2-5 8351A操作命令控制字格式
(3)状态控制字
状态字的格式如下图2-6所示。
图2-6 8251A状态控制字格式
(4)8251A的初始化编程
图2-7 8251A初始化编程的流程图
因为8251A使用前必须进行初始化,以确定工作方式、传送速率、字符格式以及停止位长度等;改变8251A的工作方式时必须再次进行初始化编程。其流程图如图2-7所示。
3 程序设计
3.1 题目分析
根据题目要求,分析如下:
(1)为了使信息被可靠的写入8251A的控制端口或数据端口,在使用OUT指令向8251A写入信息时,要有一定的时间延迟。虽然在8251A上电时,RESET信号可以使8251A进入复位状态,但在实际使用时,为了使8251A可靠复位,我们常在初始化程序前用软件再次让8251A进行复位操作。具体实现过程是先向8251A的控制口连续写入3个0,然后再写入复位控制字40H。由于8251A内部操作需要一定的时间,所以写入操作后还要有一定的延迟。
(2)根据本题的采用异步方式的要求,8251A的方式选择控制字为01001110B(4EH),表示异步方式,D7=0,D6=1,1位停止位;D1=1,D0=0,波特率因子为16;D3=1,D2=1,字符长度为8位;D5=0,D4=0,不带奇偶校验。操作命令控制字用了两个,一是8251A复位,即控制字为0001000B(40H),使全部错误标志复位;二是启动8251A接收和发送,其控制字为00010101B(45H)。
(3)题目要求8251A的控制口地址为3F9H,数据口地址为3F8H。另外,使8253的CS#接I/O地址3F0H—3F6H,本题使用通道2,则通道2的地址为3F4H,控制口为3F6H。
分析8253通道2的工作方式。由于通道2的输出是时钟信号,要产生输出方波OUT2用作8251A的收/发时钟RXC/TXC,因此通道0应工作在方式3下,其功能就是对8253的输入时钟频率1MHz的信号进行分频。本题选择波特率为1200,波特率因子选择16,因此,OUT0输出的方波信号频率为f=1200×16=19.2(kHz)
所以计数常数为N=1000/19.2=52
(4)8253的控制字选择为10110110B,即是说,8253选择通道2,读写方式
为读写16位,选择工作方式3,二进制计数制。另外,还需给8253赋计数初值为52。
(5)题目要求主机发送和接收数据均采用查询方式,利用查询方式进行串口通讯的基本思路是:CPU循环从8251A的控制口读取状态字,根据状态字的相关位的值来判定是否接收或发送。
(6)程序中将会用到的DOS功能调用说明如下所示:
a.键盘输入并显示(1号功能调用)
格式:MOV AH,01H
INT 21H
功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。
b. 屏幕显示一个字符(2号功能调用)
格式: MOV DL, '字符'
MOV AH, 02H
INT 21H
功能:将置入DL寄存器中的字符在屏幕上显示输出。
c. 屏幕显示字符串(9号功能调用)
格式: MOV DX, 字符串的偏移地址
MOV AH, 09H
INT 21H
功能:在屏幕上显示字符串。
3.2 流程图
A机流程图
B机流程图
3.3 源程序
A机程序如下:
OS_PORT EQU 3F9H;命令/状态口3F9
DATA_PORT EQU 3F8H;数据口3F8
TIMER2 EQU 3F4H ;8253的2号计数器端口
TIMCTL EQU 3F6H ;8253命令口
DATA SEGMENT
BUFF1 DB 256 DUP(?)
BUFF2 DB 256 DUP(?)
COUNT EQU $-BUFF1
SSHOW1 DB 0AH,0DH,'SENDING:',0AH,0DH,'$'
SSHOW2 DB 0AH,0DH,'END SEND',0AH,0DH,'$'
RSHOW1 DB 0AH,0DH,'RECEIVING:',0AH,0DH,'$'
RSHOW2 DB 0AH,0DH,'END RECEIVE',0AH,0DH,'$'
SERROR DB 0AH,0DH,'SEND ERROR!CHECK IT -_-',0AH,0DH,'$'
CERROR DB 0AH,0DH,'RECEIVE ERROR!SO IT COMES =_=',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV DX,TIMCTL ;8253初始化
MOV AL,10110110B ;写入8253控制字
OUT DX,AL
MOV DX, TIMER2 ;写入计数常数
MOV AL,0
OUT DX,AL
MOV AL,52 ;给8253计数器送初值
OUT DX,AL
MOV DX,CTR151 ;8251A控制口
XOR AX,AX ;清零
MOV CX,3 ;8251的复位操作
MOV AL,0
INIT_LOOP: MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
LOOP INIT_LOOP
MOV AL,40H ;送复位控制字
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AL,4EH ;送方式控制字
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AL,45H ;启动接收和发送
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AH,9 ;显示“SENDING:”
LEA DX,SSHOW1
INT 21H
MOV BX,OFFSET BUFF1 ;BX为字符串首地址
MOV CX,COUNT
MOV AL,[BX] ;发送数据长度
MOV CL,AL
PUSH AX
MOV DX,OS_PORT
SEND_CHECK: IN AL,DX
TEST AL,01H
JZ SEND_CHECK
POP AX
MOV DX,DATA_PORT
OUT DX,AL
SEND_LOOP: INC BX ;发送循环
MOV DL,[BX];BX加一
MOV DX,OS_PORT
SEND_CHECK1:IN AL,DX
TEST AL,01H
JZ SEND_CHECK1
MOV AL,DL
MOV DX,DATA_PORT
OUT DX,AL
MOV AH,02H ;实时显示
INT 21H
LOOP SEND_LOOP
MOV DX,OS_PORT
IN AL,DX ;检查是否出错
AND AL,38H
JZ SEND_ERROR ;出错则转移
MOV AH,9 ;显示“END SEND”
LEA DX,SSHOW2
INT 21H
MOV AH,9 ;显示“RECEIVING:”
LEA DX,RSHOW1
INT 21H
MOV BX,OFFSET BUFF2
MOV DX,OS_PORT
REC_CHECK: IN AL,DX ;接收数据长度
TEST AL,02H
JZ REC_CHECK
MOV DX,DATA_PORT
IN AL,DX
MOV AH,0
MOV CX,AX
REC_LOOP: INC BX ;接收循环
MOV DX,OS_PORT
REC_CHECK1: IN AL,DX
TEST AL,02H
JZ REC_CHECK1
MOV DX,DATA_PORT
IN AL,DX
MOV [BX],AL
MOV DL,AL
MOV AH,02H ;实时显示
INT 21H
LOOP REC_LOOP
MOV DX,OS_PORT
IN AL,DX ;检查接收过程是否出错
AND AL,38H
JZ REC_ERROR ;出错则转移
MOV AH,9 ;显示“END RECEIVE”
LEA DX,RSHOW2
INT 21H
JMP EXIT ;结束程序
SEND_ERROR: MOV AH,09H;显示“SEND ERROR!CHECK IT -_-”
LEA DX,SERROR
INT 21H
JMP EXIT
REC_ERROR: MOV AH,09H;显示“RECEIVE ERROR!SO IT COMES =_=”
LEA DX,CERROR
INT 21H
JMP EXIT
EXIT: MOV AX,4C00H 结束程序
INT 21H
DELAY PROC
PUSHF
PUSH CX
MOV CX,100
NEXT: NOP
LOOP NEXT
POP CX
POPF
DELAY ENDP
CODE ENDS
END START
B机程序如下:
OS_PORT EQU 3F9H;命令/状态口3F9
DATA_PORT EQU 3F8H;数据口3F8
TIMER2 EQU 3F4H ;8253的2号计数器端口
TIMCTL EQU 3F6H ;8253命令口
DATA SEGMENT
BUFF1 DB 256 DUP(?)
BUFF2 DB 256 DUP(?)
COUNT EQU $-BUFF1
SSHOW1 DB 0AH,0DH,'SENDING:',0AH,0DH,'$'
SSHOW2 DB 0AH,0DH,'END SEND',0AH,0DH,'$'
RSHOW1 DB 0AH,0DH,'RECEIVING:',0AH,0DH,'$'
RSHOW2 DB 0AH,0DH,'END RECEIVE',0AH,0DH,'$'
SERROR DB 0AH,0DH,'SEND ERROR!CHECK IT -_-',0AH,0DH,'$'
CERROR DB 0AH,0DH,'RECEIVE ERROR!SO IT COMES =_=',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
MOV DX,TIMCTL ;8253初始化
MOV AL,10110110B ;写入8253控制字
OUT DX,AL
MOV DX, TIMER2 ;写入计数常数
MOV AL,0
OUT DX,AL
MOV AL,52 ;给8253计数器送初值
OUT DX,AL
MOV DX,CTR151 ;8251A控制口
XOR AX,AX ;清零
MOV CX,3 ;8251的复位操作
MOV AL,0
INIT_LOOP:MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
LOOP INIT_LOOP
MOV AL,40H;送复位控制字
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AL,4EH;送方式控制字
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AL,45H;启动接收和发送
MOV DX,OS_PORT
OUT DX,AL
CALL DELAY
MOV AH,9;显示“RECEIVING:”
LEA DX,RSHOW1
INT 21H
MOV BX,OFFSET BUFF2
MOV DX,OS_PORT
REC_CHECK:IN AL,DX;接收数据长度
TEST AL,02H
JZ REC_CHECK
MOV DX, DATA_PORT
IN AL,DX
MOV AX,0
MOV CX,AX
REC_LOOP:INC BX;接收循环
MOV DX,OS_PORT
REC_CHECK1:IN AL,DX
TEST AL,02H
JZ REC_CHECK1
MOV DX,DATA_PORT
IN AL,DX
MOV [BX],AL
MOV DL,AL
MOV AH,02H;实时显示
INT 21H
LOOP REC_LOOP
MOV DX,OS_PORT
IN AL,DX;检查接收过程是否出错
AND AL,38H
JZ REC_ERROR;出错则转移
MOV AH,9;显示“END RECEIVE”
LEA DX,RSHOW2
INT 21H
MOV AH,9;显示“SENDING:”
LEA DX,SSHOW1
INT 21H
MOV BX,OFFSET BUFF1;BX为字符串首地址
MOV CX,COUNT
MOV AL,[BX] ;发送数据长度
MOV CL,AL
PUSH AX
MOV DX,OS_PORT
SEND_CHECK:IN AL,DX
TEST AL,01H
JZ SEND_CHECK
POP AX
MOV DX,DATA_PORT
OUT DX,AL
SEND_LOOP:INC BX;发送循环
MOV DL,[BX];BX加一
MOV DX,OS_PORT
SEND_CHECK1:IN AL,DX
TEST AL,01H
JZ SEND_CHECK
MOV AL,DL
MOV DX,DATA_PORT
OUT DX,AL
MOV AH,02H;实时显示
INT 21H
LOOP SEND_LOOP
MOV DX,OS_PORT
IN AL,DX;检查是否出错
AND AL,38H
JZ SEND_ERROR;出错则转移
MOV AH,9;显示“END SEND”
LEA DX,SSHOW2
INT 21H
JMP EXIT;结束程序
SEND_ERROR: MOV AH,09H;显示“SEND ERROR!CHECK IT -_-”
LEA DX,SERROR
INT 21H
JMP EXIT
REC_ERROR: MOV AH,09H;显示“RECEIVE ERROR!SO IT COMES =_=”
LEA DX,CERROR
INT 21H
JMP EXIT
EXIT:MOV AX,4C00H;结束程序
INT 21H
DELAY PROC
PUSHF
PUSH CX
MOV CX,100
NEXT: NOP
LOOP NEXT
POP CX
POPF
DELAY ENDP
CODE ENDS
END START
4 硬件接线图
结束语
学生学习完理论后就要进行课程设计,因为理论课程学习是让学生学习基本理论知识,对课程内容和原理有比较深刻的理解,只要从理论上理解,不用考虑实际的可行性,而课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,不仅需要在理论上能实现而且还要考虑实际的可行性,不能纸上谈兵。随着科学技术发展的日新日异,微型计算机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握微型计算机的开发技术是十分重要的。尤其是在现在这个金融危机的时刻,找工作越来越难,只有加强自身的能力才能有一席立足之地。
回顾起此次微机原理课程设计,我感慨颇多,的确,从选题到定稿,从理论到实践,在整整一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说8251A芯片的使用,PRETOL软件的应用技巧,对汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
参考文献
[1]杨斌.微机系统及其接口设计原理.成都:西南交通大学出版社.2006年2月.
[2]王钰.微型计算机原理学习与实验指导.西安:西安电子科技大学出版社.2004年4月.
[3]温阳东.微机原理与接口实用教程.北京:清华大学出版社.2008年5月.
[4]黄海萍.汇编语言与微机接口技术实验教程.北京:国防工业出版社.2007年1月.
[5]周佩玲.微机原理与接口技术(基于16位机).北京:电子工业出版社2007年6月.
展开阅读全文