接口实验指导书

更新时间:2024-05-09 01:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

计算机原理及接口技术

实验指导书

计算机硬件实验室

1

前言

本教材是与“微机原理与接口技术”课程配套的实验教材,共安排了6个实验,覆盖了普通高等学校“微机原理与接口技术”实验的基本内容,具有基础性、实用性、趣味性和提高性,为学生提高分析问题和解决问题的能力提供了一种好的途径。

本书的特点是精明简要,在保证基本实验的基础上尽量缩小篇幅,主要涉及了最常用的接口芯片实验,如定时器/计数器电路8253、并行接口电路8255、串行接口电路8251、A/D转换电路ADC0809等。书中实验程序都经调试通过。只要读懂硬件电路与相应的汇编语言程序就能顺利做出实验。本书程序框图,与汇编语言程序均已给出,可读性强,避免了学生在实验上花费大量时间。

本书以充实、巩固课程学习、培养科学实验技能和严谨的工作作风为目的,可作为普通高校计算机专业相应课程的实验教材,也可供电子工程技术人员参考。

本书由刘肃、李琦、张军老师编写,耿恒山老师进行了编审。敬请读者提出宝贵意见。

编者 2001年2月

2

目录

1.前言

2.汇编语言程序的建立和执行???????????????????(3) 3.8253计数器/定时器实验???????????????????(7) 4.8255A并行口实验<一>???????????????????(9) 5.8255A并行口实验<二>????????????????????(13) 6 A/D 实验 ??????????????????????????(14) 7.LED显示实验?????????????????????????(23) 8.8251A串行口实验???????????????????????(30)

3

汇编语言程序的建立和执行

《TPC—1型十六位微机实验培训系统》要求用汇编语言来编写程序。现在,我们来说明汇编语言程序从建立到执行的过程。

要建立和运行汇编语言程序,系统盘上应该首先有如下文件: EDIT.COM 编辑程序 ASM.EXE 汇编程序 (或MASM.EXE) 宏汇编程序 LINK.EXE 连接程序 DEBUG.COM 调试程序

其中ASM.EXE是普通汇编程序,它不支持宏汇编,如果要用宏汇编,则必须用MASM.EXE。

下面,以建立和执行用户程序ABC.EXE为例来说明上机过程。

1.用EDIT命令建立汇编语言源程序(ASM文件)

源程序就是用汇编语言的语句编写的程序,它不能被机器识别.源程序必须以 ASM为附加文件名.

例如打入命令:

A>EDIT ABC.ASM (每个命令后面应输入回车,以下均如此) 此时用户可以通过编辑程序来输入用户程序ABC.ASM。至于EDIT.EXE编辑程序的使用方法,可以按F1键获取帮助。

2.用 ASM(或者MASM)命令产生目标文件[OBJ文件]

源程序建立以后,就可以用汇编程序ASM.EXE(或者MASM.EXE)进行汇编。所谓汇编,实际上就是把以 ASM为附加名的源文件转换成用二进制代码表示的目标文件,目标文件以 OBJ为附加名。汇编过程中,汇编程序对源文件进行二次扫描,如果源程序中有语法错误,则汇编过程结束后,汇编程序会指出源程序中的错误,这时,用户可以再用编辑程序来修改源程序中的错误。最后,得到没有语法错误的 OBJ文件。

例如,对 ABC.ASM的汇编过程如下: A >MASM ABC.ASM

此时,汇编程序给出如下回答:

Microsoft (R) Macro Assembler Version 5.00

Copyright (C) Microsoft Corp1981—1985,1987,all rights reserved, Object filename [EX MOVS.OBJ]: Source listing [NUL.LIST]:ABC Cross reference[NUL.CRFI:ABC 如果被汇编的程序没有语法错误,则屏幕上还给出如下信息: Warning Severs Errors Errors

4

0 0

从上面的操作过程中可以看到,汇编程序的输入文件就是用户编写的汇编语言源程序,它必须以 ASM为文件扩展名。汇编程序的输出文件有三个:

第一个是目标文件,它以 OBJ为扩展名,产生 OBJ文件是我们进行汇编操作的主要目的,所以这个文件是一定要产生,也一定会产生的,操作时,这一步只要打人回车就行了;

第二个是列表文件,它以 LST为扩展名,列表文件同时给出源程序和机器语言程序,从而,可以使调试变得方便,列表文件是可有可无的,如果不需要,则在屏幕上出现提示信息[NUL.LIST]:时,打入回车即可,如果需要,则打入文件名和回车;

第三个是交叉符号表,此表给出了用户定义的所有符号,对每个符号都列出了将其定义的所在行号和引用的行号,并在定义行号上加上“#”号,同列表文件一样,交叉符号表也是为了便于调试而设置的,对于一些规模较大的程序,交叉符号表为调试工作带来很大方便。当然,交叉符号表也是可有可无的,如不需要,那么,在屏幕上出现提示信息[NUL.CRF]:时,打入回车即可。

汇编过程结束时,会给出源程序中的警告性错误[Warning Errors]和严重错误[Severs Errors],前者指一般性错误,后者指语法性错误,当存在这两类错误时,屏幕上除指出错误个数外,还给出错误信息代号,程序员可以通过查找手册弄清错误的性质。

如果汇编过程中,发现有错误,则程序员应该重新用编辑命令修改错误,再进行汇编,最终直到汇编正确通过。要指出的是汇编过程只能指出源程序中的语法错误,并不能指出算法错误和其他错误。

3.用 LINK命令产生执行文件(EXE文件)

汇编过程根据源程序产生出二进制的目标文件(OBJ文件),但 OBJ文件用的是浮动地址,它不能直接上机执行。所以还必须使用链接程序(LINK)将OBJ文件转换成可执行的 EXE文件。 LINK命令还可以将某一个目标文件和其他多个模块(这些模块可以是由用户编写的,也可以是某个程序库中存在的)链接起来。

具体操作如下(以对ABC.OBJ进行链接为例): A> LINK ABC 此时,在屏幕上见到如下回答信息:

IBM 5552 Multistation Linker 2.00(C) Copyright IBM Corp.1985 Run File[ABC.EX E]: List File[ NUL.MAP]: Libraries[.LIB]:

Warning: NO STACK Segment

LINK命令有一个输入文件,即 OBJ文件。

LINK过程产生两个输出文件,一个是扩展名为 EXE的执行文件,产生此文件当然是LINK过程的主要目的。另一个是扩展名为MAP的列表分配文件,有人也称它为映象文件,它给出每个段在内存中的分配情况。比如某一个列表分配文件为如下内容:

5

Warning:NO STACK Segment Start Stop Length Name Class 0000H 0015H 0016H CODE, 0020H 0045H 0026H DATA 0050H 0061H 0012H EXTRA Origin Group

Program entry Point at 0000:0000 MAP文件也是可有可无的。

有时,用户程序用到库函数,此时,对于提示信息LIBRARIES[.LIB],要输入库名。

从 LINK过程的提示信息中,可看到最后给出了一个“无堆栈段”的警告性错误,这并不影响程序的执行。当然,如果源程序中设置了堆栈段,则无此提示信息。

4.程序的执行

有了.EXE文件后,就可以执行程序了,此时,只要打入文件名即可。仍以ABC为例:

A> ABC A>

实际上,大部分程序必须经过调试阶段才能纠正程序设计中的错误,从而得到正确的结果。所谓调试阶段,就是用调试程序(DEBUG程序)发现错误,再经过编辑,汇编、链接纠正错误。关于DEBUG程序中的各种命令,可参阅 DOS手册,下面给出最常用的几个命令。

先进入DEBUG程序并装入要调试的程序ABC.EXE,操作命令如下: A> DEBUG ABC.EXE ;进入 DEBUG,并装配ABC.EXE —

此时,屏幕上出现一个短划线。为了察看程序运行情况,常常要分段运行程序,为此,要设立”断点”,即让程序运行到某处自动停下,并把所有寄存器的内容显示出来。为了确定我们所要设定的断点地址,常常用到反汇编命令,反汇编命令格式如下:

一U ;从当前地址开始反汇编 也可以从某个地址处开始反汇编,如下所示。 一U200 ;从 CS:200处开始反汇编

程序员心中确定了断点地址后,就可以用G命令来设置断点。比如,想把断点设置在0120H处,则如下打入命令:

—G0120

此时,程序在0120H处停下,并显示所有寄存器以及各标志位的当前值,在最后一行还给出下一条将要执行的指令的地址、机器语言和汇编语言。程序员可以从显示的寄存器的内容来了解程序运行是否正确。

对于某些程序段,单从寄存器的内容看不到程序运行的结果,而需要观察数据段的内容,此时可以用d命令,使用格式如下:

6

—d DS:0000 ;从数据段的零单元开始显示128个字节

在有些情况下,为了确定错误到底由哪条指令的执行所引起,要用到跟踪命令。跟踪命令也叫单步执行命令,此命令使程序每执行一条指令,便给出所有寄存器的内容。

比如: —T3 ;从当前地址往下执行三条指令

此命令使得从当前地址往下执行三条指令,每执行一条,便给出各寄存器内容。最后,给出下一条要执行的指令地址、机器语言和汇编语言。

从DEBUG退出时,使用如下命令: —Q

每一个有经验的程序员都必定熟练掌握调试程序的各主要命令。为此,初学者要花一定功夫查阅、掌握DOS手册中有关DEBUG程序的说明。

7

实验一 8253计数器/定时器实验

一、实验目的:

1.学会通过62芯总线、驱动器、译码器等,在PC/XT机外扩展新的芯片。 2.掌握8253定时器编程原理,用示波器观察不同模式下的波形。 二、实验内容:

用8253构成一个方波发生器或分频器。 1.按下图连接硬件线路:

2.编程将定时器0设为模式3(方波),定时器1设为模式2(分频),定时器0的输出脉冲作为定时器1的时钟输入。在示波器中,观察定时器0和1的输出波形及其关系。

三、程序框图:

8253控制端口地址为203H 定时器0地址为200H 定时器1地址为201H

开始 在定时器控制端口写入控制字36H 即设置定时器0为模式3 往定时器0中送初值,先送低字节F4H, 再送高字节01H,即初值01F4H 在控制端口写入控制字74H, 即设置定时器1为模式2 往定时器1中送初值,先送低字节0AH,再送高字节00,即定时器1为10分频 结束

8

注:CLK0连接由8MHZ时钟分频得到的250KHZ,则定时器 l输出 OUT1约为50HZ。

四、 实验报告要求:

1.编写实验程序。

2.画出OUT0、 OUT1的输出波形。

3.改变定时器0计数值为奇数(01F5)时,画出其输出波形。 4.总结模式2、模式3的工作特点。

9

实验二 8255A并行口实验<一>

一、实验目的:

1.掌握8255A编程原理。 2.了解键盘结构,学会读取按键的方法。 二、实验内容:

用8255来控制一个小键盘的识别。 1.线路图如下:

注:在实验台上8255A的CS端接218—21F插孔,PA0一 PA7,PB0一PB2与其旁边的插孔短接。

8255A的端口 A地址为 218H 端口 B地址为 219H 端口 C地址为 21AH 控制口地址为 21BH

2.编写程序,使得在小键盘按键后,微机屏幕上有相应字符显示出来. 三、编程指南:

10

1.通过采用行扫描法或行反转法,识别键盘上的闭合键。

行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如果列值中有某位为低电平,则表明行列交点处的键被按下;否则扫描下一行,直到扫完全部的行线为止.

行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式。程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线值,如果此时有某一键被按下,则必定会使某一列线值为0。然后,程序再对两个并行端口进行方式设置,使行线上工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读行线上的输入值,那么,在闭合键所在的行线上的值必定为0。这样,当一个键被按下时,必定可以读得一对唯一的行值和列值,在我们提供的程序中就采用行反转法来识别键盘按键。

2.在程序设计时,将各个键对应的代码(列值,行值)放在一个表中。程序通过查表来确定具体按下的为哪一个键。 四、程序清单 PA55 EQU 218H ;8255A的A口地址 PB55 EQU 219H ;8255A的B口地址 P55CTL EQU 21BH ;8255A的控制口地址 DATA SEGMENT TABIE DW 0101H,0102H,0104H,0108H,0110H,0120H,0140H,0180H

DW 0201H,0202H,0204H,0208H,0210H,0220H,0240H,0280H DW 0401H,0402H,0404H,0408H,0410H,0420H,0440H,0480H

CHAR DB ‘CDEFBA9845673210 RPMG’ ;字符码表 MES DB ‘PLAY ANY KEY IN THE SMALL KEYBOARD!’, 0AH,0DH

DB ‘IT WILL BE ON THE SCREEN! END WITH R’,

0AH,0DH,’$’

DATA ENDS

CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX ;DS指向数据段

MOV DX,OFFSET MES MOV AH,09 ;显示提示信息 INT 21 H KY: CALL KEY ;调键盘扫描子程序,健入 字符的ASCII码在DL中 CMP DL,‘R’ ;键入的字符不是结束字符

11

MAIN KEY KST: WAIT1: DLY: TT:

JNZ KY MOV AX,4C00H INT 21 H

RET ENDP PROC NEAR

MOV AL,82H MOV DX,P55CTL OUT DX,AL MOV AL,00

MOV DX,PA55 OUT DX,AL

MOV DX,PB55 IN AL,DX

CMP AL,0FFH JZ WAIT1 PUSH AX

PUSH AX

MOV CX,1000H LOOP DLY MOV DX,P55CTL MOV AL,90H OUT DX,AL

MOV DX,PB55 POP AX OUT DX,AL

MOV DX,PA55 IN AL,DX POP BX MOV AH,BL NOT AX MOV SI,OFFSET TABLE MOV DI,OFFSET CHAR MOV CX,24 CMP AX,[SI] JZ NN

DEC

CX

12

‘R’, 则转 KY继续 ;返回 DOS

;键盘扫描子程序,键人字 符的ASCII码送 DL中 ;设置8255A的控制字,均 工作于方式0,端口A为 输出,B为输入 ;端口 A输出全0 ;从端口B读入列值 ;若为0FFH,则说明无键 按下,转 WAIT1 ;入栈保存列值

;延时去抖动

;设置8255A的控制字,均 工作于方式0,端口A为 输入,B为输出 ;从端口B输出列值 ;从端口A读进行值 ;列值送 AH中 ;行、列值取反 ;扫描码表首址 ;字符码表首址

;小键盘共3×8=24健 ;扫描码相符则转 NN ;计数值减1

JZ KST ADD SI,2 INC DI JMP TT NN: MOV DL,[DI] MOV AH,02 INT 21 H PUSH DX MOV AL,82H MOV DX,P55CTL OUT DX,AL WAIT2: MOV AL,00 MOV DX,PA55 OUT DX,AL MOV DX,PB55 IN AL,DX CMP AL,0FFH JNZ WAIT2 POP DX

RET KEY ENDP CODE ENDS END START 五、 实验报告要求:

1.参考实验程序画出流程图。

2.用行扫描法编写实验程序,并进行调试。 3.写出实验心得体会。

13

;已全部比较完,仍不相符 则转 KST ;修改指针 ;继续比较

;显示该扫描 码对应字符 ;字符 ASCII码入栈保存 ;设置8255A控制字,均工 作于方式0,端口A为输 出,B为输人 ;端口A输出全0 ;从端口 B读进列值 ;有键按下则转WAIT2等 待释放

;退栈

实验三 8255A 并行口实验< 二 >

一、实验目的:

掌握通过8255并行口传输数据的方法,读取开关的数据,控制LED发光二极管的亮灭。

二、实验内容:

编写一个开关量控制程序。

1.输入开关状态全为0时,PA口上发光二极管循环轮流点亮。

2.当开关处于非全0时,则直接把开关状态在发光二极管上显示出来。 三、实验步骤:

1.将8255的PA0~PA7与LED1~LED8,PC4~PC7与LED9~LED12相连。 将8255的PB0~PB7与KEY1~KEY8,PC0~PC3与KEY9~KEY12相连。 2.编写程序,为8255初始化,使三个端口均工作在方式0,设A组为输出状态,B组为输入状态,根据实验内容调试程序,完成实验要求。

四、编程提示:

各LED为共阳极发光二极管,使其点亮应使8255相应端口的相应位清0。 五、实验报告要求:

1.画出实验线路图。

2.编写程序并绘制流程图。

3.通过实验总结8255的三种工作方式。

14

实验四 A/D 实验

一、实验目的:

了解模/数转换的基本原理,掌握ADC0809的使用方法。 二、实验内容:

将一个由电位器供给的电压模拟量转换为数字量,存入PC机内存。 1.硬件线路图如下:

2.编制程序,按中断方式采样A/D转换数据,结果送内存6000H段。采样点取300个。

3.编制程序,按中断方式采样 A/D转换数据,并将结果在PC机上动态显示出来。设置 PC机的显示方式为640×200图形方式。 三、编程提示:

1.ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和IOW,故启动A/D转换只须如下两条指令:

MOV DX,PORTADC ;ADC0809的端口地址送DX OUT DX,AL ;发CS及IOW信号 至于AL中具体为什么内容是不重要的,这是一次虚拟写。 2.在中断方式下,当A/D转换结束后就会自动产生EOC信号,此信号接IRQ2从而引起一次硬中断,在中断处理程序中,使用如下指令即可读取A/D转换的结果。

MOV DX,PORTADC IN AL,DX

3.PC机系统中IRQ2硬中断是为用户保留的。编程时首先应将IRQ2对应的中断向量(中断号为0AH)保存起来,然后设置新的中断向量以指向中断处理程序。另外,还要将中断屏蔽寄存器的相应位开放。典型的程序段如下:

15

MOV AH,35H MOV A L,0AH ;取0AH号中断向量送 ES:BX INT 21 H PUSH ES ;保存原中断向量 PUSH BX PUSH DS MOV DX,SEG ADINT MOV DS,DX MOV DX,OFFSET ADINT ;设置新的中断向量 MOV AH,25H MOV AL,0AH INT 21H POP DS IN AL,21H ;取中断屏蔽寄存器的内容 PUSH AX ;保存 AND AL,11111011B ;允许IRQ2的中断 OUT 21H,AL

4.PC机系统中的8259A工作在完全嵌套方式下,在中断处理程序结束时,需要发中断结束名命令。

MOV AL,20H OUT 20H,AL 5.编程2的内容具有一定难度,仅为选作内容。 四、程序框图:

1.中断处理程序:

保存使用的寄存器的内容 从0809的端口读取A/D转换的数据 发中断结束的命令 中断返回

16

2.主程序:

用INT21H的35H子功能取类型0AH的中断向量,并入栈保存 用INT21H的25H子功能设置类型0AH的中断向量,指向A/D转换的中断处理子程序 取中断屏蔽寄存器的内容保存在BP寄存器中 开放0AH号中断 300→CX 开中断 启动0809进行本次A/D转换 等待硬中断 关中断 A/D转换结果送内存6000H段 N CX减1为0? Y 用INT21H的25H子功能恢复原中断向量 恢复中断屏蔽寄存器内容 结束

17

五、程序清单(一):

CRLF MACRO

MOV DL,0DH MOV AH,02H INT 21H ;中断方式采样 A/ D转换数 MOV DL,0AH 据,送内存的6000H段处。 MOV AH,02H INT 21H ENDM

DATA SEGMENT INR DB ? RESULT DB ? DATA ENDS

STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START:MOV AX,DATA MOV DS,AX MOV AX,STACK ;初始化 MOV SS,AX MOV AX,TOP MOV SP,AX MOV AL,0AH MOV AH,35H ;取 IRQ2对应的中断向量 INT 21 H PUSH ES PUSH BX ;保存 PUSH DS MOV AX,SEG ADINT ;取中断处理程序的段址送 DS MOV DS,AX MOV DX,OFFSET ADINT ;偏移量送DX

MOV AL,0AH

MOV AH,25H ;设置 IRQ2中断向量指向中断 INT 21H 处理程序 POP DS ;恢复 DS IN AL,21H ;取中断屏蔽寄存器的内容送 MOV BP,AX BP保存

18

AND AL,11111011B ;允许 IRQ2中断 OUT MOV CCC: STI MOV OUT HLT CLI MOV PUSH MOV MOV MOV DEC MOV POP

LOOP

POP POP MOV MOV INT MOV OUT MOV

INT

ADINT PROC PUSH

PUSH

MOV IN MOV MOV OUT POP POP IRET ADINT ENDP CODE ENDS END START

21 H,AL CX,300 DX,220H DX,AL AX,SI DS

BX,6000H DS,BX

BX,CX BX [BX],AL DS CCC DX DS AL,0AH AH,25H 21 H

AX,BP 21H,AL AX,4C00H 21 H

NEAR AX DX

DX,220H AL,DX

SI,AX AL,20H 20H,AL DX AX

;采样300个点 ;开中断

;启动一次A/D采样 ;等待 IRQ2硬中断 ;关中断

;取A/D转换的结果

;送至内存6000:0—2FF区域

;恢复 IRQ2中断向量

;恢复原中断屏蔽寄存器的内容 ;结束

;中断处理子程序 ;保存

;读取A/D转换后的数据 ;数据送SI寄存器中 ;发中断结束命令

;恢复

19

六、程序清单(二):

以中断方式采样A/D转换数据,并将结果在PC机上显示出来。

说明:该程序使用两个缓冲区,其中,BUFFER1用于存放A/D采样转换的数值,BUFFER2用于存放显示的数对应的行值。P1是BUFFER1的地址指针,用于指示要读出的数的地址.

程序采用中断方式进行采样,将采样值存人BUFFER1中。每当640个点采样完后,则将采样值变成显示所对应的行值,以顺序号作为列值,按高分辨率图形方式显示出来。每次显示,都首先抹除旧的显示亮点,然后显示新的显示亮点。如此循环,则在屏幕上将看到一条动态显示曲线。当任意健按下时,程序运行结束。 DATA SEGMENT BUFFER l DB 640 DUP (0) BUFFER2 DB 640 DUP (0) Pl DW 8FH P2 DB 0FFH FLAG DB 0 DATA ENDS STACK SEGMENT DW 32 DUP (7) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX ;初始化 MOV AX,STACK MOV SS,AX MOV AL,0AH MOV AH,35H ;取0AH的中断向量送ES:BX INT 21H PUSH ES PUSH BX ;入栈保存 PUSH DS MOV AX,SEG ADINT MOV DS,AX MOV DX,OFFSET ADINT MOV AL,0AH ;设置新的中断向量,以指向中 MOV AH,25H 断 处理程序 INT 21H POP DS IN AL,21H ;取中断屏蔽寄存器内容送 BP MOV BP,AX

20

AND OUT CLD MOV MOV MOV MOV INT S14: MOV XOR LEA S12: STI MOV OUT HLT CLI MOV

STOSB LOOP

MOV XOR LEA MOV MOV MOV S13: PUSH LODSB XOR MOV MOV MOV MOV INT PUSH MOV MOV INC POP MOV MUL

AL,11111011B

21H,AL AX,DATA

ES,AX AH,0 AL,6 10H CX,640 BX,BX

DI,BUFFER1 DX,220H DX,AL AX,SI

S12 CX,640 BX,BX

DI,BUFFER2 SI,DI

AX,OFFSET BUFFERl P l,AX CX AH,AH DX,AX CX,BX AH,0CH AL,0 10H SI

SI,P1 AL,[SI] P1

SI

DL,199 DL

21

;开放 IRQ2中断

;ES指向数据段

;设置640x200的分辨率图形方 式

;采样640个点 ;存采样点缓冲区首址 ;开中断

;启动A/D转换 ;等待硬中断 ;关中断 ;存采样值 ;循环采样 ;显示的点数 ;均指向行值缓冲区

;初始化读指针P1

;行值送DX ;列值送 CX

;画点调用,抹除前1次的采样 点

;读出本次的采样值 ;读指针指向下一个采样值

MOV DIV MOV MOV SUB STOSB XOR MOV MOV MOV MOV

INT INC

POP LOOP STI MOV MOV INT JZ POP POP MOV MOV INT MOV OUT MOV MOV

INT

MOV INT ADINT PROC PUSH PUSH MOV IN MOV MOV OUT

DL,255

DL DL,AL AL,199 AL,DL AH,AH DX,AX

CX,BX AH,0CH AL,1 10H

BX CX S13 DL,0FFH AH,06 21H S14 DX DS

AL,0AH AH,25H 21H

AX,BP 21H,AL AL,2 AH, 0 10H

AX,4C00H 21H

NEAR AX DX

DX,220H AL,DX SI,AX

AL,20H 20H,AL

;计算显示行值,公式为 199—采样值*199/255

;显示行值送行值缓冲区对应单 元

;显示本次采样点

;偏移地址加1

;循环显示64O个点 ;开中断

;读键盘功能调用,若没有任何

键按下则转S14重复

;恢复原 IRQ2的中断向量

;恢复中断屏蔽寄存器的内容

;恢复正常的文本显示方式

;结束

;中断处理子程序

;读采样转换数据→SI

;发中断结束命令

22

POP DX POP AX IRET ADINT ENDP CODE ENDS END START 七、试验报告要求: 1. 写出实验步骤。 2. 根据程序一和程序二的要求分析实验结果。 3. 总结ADC0809的工作原理。

23

实验五 LED显示实验

一、实验目的:

1、了解七段数码管显示数字的原理.

2、掌握只用一个段锁存器和一个位锁存器来同时显示多位数字的技术. 二、实验内容:

编制程序实现LED显示。

1.线路图如下页:

选段锁存器(PORTSEG)地址为211H。 选位锁存器(PORTBIT)地址为210H。

2.编写程序,用七段数码管显示分、秒值。程序开始运行,时间值为00一00,每隔 1秒,时间值改变一次,从键盘上敲任意键,程序退出。 三、编程指南:

1.通过选位锁存器选择某一位数码管,显示其数字(对应段值为1),然后关闭此数码管,再选择下一位数码管进行显示;如果在1秒钟内,每位数码管都能显示30次以上,则人眼看到的是几位数码管同时在显示。

2.主程序中等待输入任意键以结束程序。

3.定时由8253完成,8253通过 PC/XT62芯总线中IRQ2线,向CPU发中断。每隔25ms一次,即每秒40次。每次进入中断,中断服务子程序将六个数码管都显示1次,则每秒内六个数码管都被显示40次。在中断服务子程序中,还须对中断次数进行计数,每够40次中断,时间增加1秒。因此在执行下面所例举的程序时,需首先做实验1—8253计数器/定时器实验,使8253每秒40次中断。

24

25

四、程序框图

主程序:

开始 重新设置堆栈区地址 用INT21H的25H功能设置0AH外中断(IRQ2)的中断向量 重新设置数据段并显示提示信息 关中断 清除IRQ2的中断屏蔽位 开中断(STI) 主程序等待输入任意键 设置IRQ2中断屏蔽位 用INT21H的4CH功能返回DOS

26

开始 中断计数值COUNT加1 保存寄存器 COUNT=40?用XLAT指令获得显示数字所对应的七段数码管段值 往段锁存器中输入段值 往位锁存器中送入位值Y (CL);(延时CL)中某位为 1,则对应的数码管被选中 (CL)=20H即显示完第六个数码管 N 位值(CL)左移1位即将选下一位数码管显示 COUNT=0,秒的低位值SEC2加1 SEC2=10? SEC2=0,秒的高位值SEC1加1 SEC1=6? SEC1=0,分的低位值MIN2加1 MIN2=10 MIN2=0,分的高位值MIN1加1 MIN1=6? MIN1=0? 熄灭所有的数码管,清除ISR中的标志,并恢复寄存器 IRET 五、程序清单:

INTA00 EQU 20H INTA01 EQU 21H

PORTSEG EQU 211H PORTBIT EQU 210H

STACK SEGMENT

STA DW 512 DUP (?)

TOP EQU LENGTH STA STACK ENDS DATA SEGMENT

27

;PC/XT系统中8259A端口偶

地址

;PC/XT系统中8259A端口奇 地址

;段锁存器端口地址 ;位锁存器端口地址 ;堆栈定义

MIN1 MIN2 GAP1 GAP2 SEC1 SEC2 COUNT LED MES DATA CODE ASSUME START: MOV MOV MOV MOV MOV MOV MOV INT MOV MOV MOV MOV INT CLI MOV IN AND OUT STI

AGAIN:MOV TT: LOOP MOV INT JZ CLI

MOV

DB 0 DB 0

DB 10 DB 10 ;对应6个 LED数码管的显示 DB 0 值 DB 0

DB 0 ;中断次数的计数单元 DB 3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH, 6FH,40H ;LED段码表 DB ‘DISPLAY THE LEDS,PRESS ANY KEY RETURN DOS!’,0AH,0DH,‘$’ ENDS SEGMENT CS:CODE,DS:DATA,SS:STACK

AX,STACK SS,AX ;设置堆栈段及栈指针 ,TOP ,CS ;DS 指向代码段 ,AX

,OFFSET INT_PROC AX,250AH ;设置 OAH号中断向量 21H AX,DATA ;DS指向数据段 DS,AX DX,OFFSET MES AH,09 ;显示提示信息 21 H

;关中断

DX,INTA01 AL,DX ;开放 IRQ2中断的对应的屏蔽 AL,0FBH 位 DX,AL CX,5000 ;延时等待硬件中断 TT AH,01 16H ;BIOS键盘功能判别有否键被 AGAIN 按下 DX, INTA01

28

SP AX DS DX IN OR OUT STI

MOV INT INT_ PROC: PUSH PUSH MOV MOV RIS1: MOV MOV XLAT MOV OUT MOV MOV OUT PUSH MOV DELAY:LOOP POP CMP JZ INC SHL JMP CHG: INC CMP JL MOV 1NC CMP JL MOV INC CMP JL MOV

AL,DX AL,04 DX,AL

AX,4C00H 21H

AX CX

BX,OFFSET MIN1 CL,01 AL,[DI] BX,OFFSET LED

DX,PORTSEG DX,AL AL,CL

DX,PORTBIT DX,AL

CX CX,350H DELAY CX CL,20H CHG DI CL,1 DIS1 COUNT COUNT,40 QUIT

COUNT,0 SEC2 SEC2,10 QUIT SEC2,0 SEC1 SEC1,6 QUIT SEC1,0 29

;关闭IRQ2中断对应的屏蔽位

;返回DOS

;保存寄存器 ;指向数码管显示数据区首址 ;指向第一个数码管

;得到该显示数字对应的段码 ;输出段码 ;输出位码 ;人栈 ;等待一段时间 ;退栈 ;已显示完6个数码管则转 CHG ;显示数据指针加1 ;位码左移 1次 ;对下一位作显示 ;中断次数的计数器加 l ;不足40次转 QUIT ;计数器清0 ;秒值加1 ;秒的低位值不足10,则不产生 进位转 QIJIT ;秒的低位值清0 ;秒的高位值加1 ;秒的高位值不足6,则不产生 ;进位转 QUIT ;清0秒的高位值

INC MIN2 CMP MIN2,10 JL QUIT MOV MIN2,0 INC MIN1 CMP MIN1,6 JL QUIT MOV MIN1,0 QUIT: MOV DX,PORTBIT MOV AL,00 OUT DX,AL MOV DX,INTA00 MOV AL,20H OUT DX,A L POP CX POP AX IRET CODE ENDS END START

六、实验报告要求:

1.总结控制LED显示的方法。 2.说明本实验中74LS273的作用。 3.说明8253在本实验中的功能。

30

;分值加1 ;分的低位值不足10,则不产生

进位转QUIT ;分的低位值清0 ;分的高位值加1 ;分的高位值不足6则不产生 进位转QUIT ;清0分的高位值 ;熄灭所有的数码管 ;发中断结束命令 ;寄存器出栈 ;中断返回

实验六 8251A串行口实验

一、实验目的:

1.了解串行通信的一般原理和8251A的工作原理。

2.初步了解RS-232串行接口标准及与TTL电路的连接方法。 3.掌握8251A编程方法。 二、实验内容:

通过8251串行口实现双机通信。 1.实验线路如下:

电路图说明:

·TXC和RXC分别为8251A的发送时钟和接收时钟,由片外8253的OUT2提供。

·CS端接208H-20FH。

·RXRDY端接IRQ2端,由此端向PC/XT主机发送中断请求。

·CTS端必须接低电平,8251A才可向外发送数据,其它回答信号RTS、DTR、DSR可不用。

2.编写程序,使得在主机键盘敲入的字符显示在终端机屏幕上;在终端机键盘上敲入字符显示在主机屏幕上。串行通讯波特率可选1200BPS、4800BPS;主机发送数据用查询方式;主机接收数据用查询方式或中断方式。 三、程序框图

1. 主机发送接、收字节均采用查询方式。 定时器初值计算公式: FDK2 定时器2初值= BPS*波特率因子

31

FDK2 8253定时器2的时钟频率。 BPS 8251A和终端机之间数据传送的波特率。 波特率因子 在8251A初始化时编程设定。

2.在主机发送数据采用查询方式,接受数据采用中断方式时,与1的区别在于: ·需要8251A的RXRDY管脚接PC/XT总线的IRQ2端,且要在主机接受数据前,设置0AH中断的向量地址,并清除IRQ2的中断屏蔽位,而在程序退出时,要设置IRQ2的中断屏蔽位为1。

·接收字节时,主程序处于死循环状态;而由中断处理子程序完成接收字节和判断是否返回DOS的工作。详细框图如下:

32

开始 调过程SET-BPS,将8253定时器2设置为模式3,并通过计算,给定时器2赋以正确的初始值 调过程INIT51,初始化8251A为8个数据位,1个停止位,波特率因子为16,无奇偶校验。并使8251A处于允许接收和发送状态。 提示用户:“在主机键盘上输入字符,将显示在终端机屏幕上;键入‘!’,则结束发送过程。” 主机从键盘读入一个字符存入(BL)中 从8251A命令端口取出状态字节装入(AL)中 N 状态字节最低位(TXRDY)为1吗? Y 通过8251A数据端口,主机把(BL)中的字节送出 N 该字节为“!”吗? Y 显示提示信息:“用户在终端机键盘上输入字符,将显示在主机显示器上,用“!”结束程序。” 从8251A控制端口读入状态字节 N 状态字节中RXRDY位为“1”吗? Y 从8251A数据端口读入一个字节 主机将这个字符显示在屏幕上 N 这个字符为“!”吗? 返回到DOS

33

中断处理子程序:

开始 从8251A的数据端口取入一个字节 将此字节显示在微机屏幕上 开中断STI 清除8259A中ISR的标志 接收的字节为“!”吗? N 中断结束IRET 3.可修改程序中BPS00的值,如改为:BPS00 EQU 4800,即可得到在4800BPS下传输数据的程序。

四、程序清单<一> (接收为查询方式): DATA51 EQU 208H ;8251A数据端口地址 CTRL51 EQU 209H ;8251A控制端口地址 TIMER2 EQU 202H ;8253计数器通道2端口地址 TIMCTL EQU 203H ;8253计数器控制端口地址 CLK00 EQU 4770 ;8251A时钟频率为4.77MHZ BPS00 EQU 1200 ;波特率1200 FACTOR EQU 16 ;波特率因子为16 DATA SEGMENT MES1 DB NOW YOU CAN PLAY A KEY ON THE CPU KEYBORD‘,0AH,0DH DB ‘IT WILL DISPLAY ON THE TERMINAL SCREEN!’ 0AH,0DH DB ‘END WITH !’,0AH,0DH, ‘$’ MES2 DB 0AH,0DH,‘NOW YOU CAN PLAY KEY ON THE TERMINAL’,0AH,0DH DB ‘IT WILL DISPLAY ON THE CPU SCREEN!’,0AH, 0DH DB ‘END WITH !’,0AH,0DH,’$’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA INIT51 PROC NEAR ;8251A初始化 MOV DX,CTRL51 ;8251A控制口地址

34

置IRQ2的中断屏蔽位为1,即禁止IRQ2中断 Y 用INT 21H的4CH功能调用返回DOS LL: CHAROUT: GG: INIT51 SET_BPS

XOR

AX,AX MOV CX,03 CALL CHAROUT

LOOP LL

MOV AL,40H CALL CHAROUT MOV AL,4EH CALL CHAROUT MOV AL,27H CALL CHAROUT RET DX,AL PUSH CX

MOV CX,02

LOOP GG POP

CX

RET ENDP PROC NEAR

MOV DX,0

MOV AX,CLK00

MOV BX,1000 MUL BX

MOV BX,BPS00 DIV BX MOV

DX,00 MOV BX,FACTOR DIV BX

MOV BX,AX

MOV DX,TIMCTL MOV

AL,0B6H OUT

DX,AL MOV DX,TIMER2 MOV AX,BX OUT

DX,AL MOV

AL,AH

35

;AX清0 ;复位8251A

;设置模式字,使8251A工作于 异步方式,8个数据位,1个 停止位,波特率因子为16 ;设置控制字启动发送器和接收 器

;子程序,从DX指定端口输出 AL内容

;延时以等待输出完成

;子程序,初始化8253计数器/ 定时器 ;8251A时钟频率

;计算8253计数器通道2的计 数初值,结果送BX

;设置8253的控制字,使其工 作于模式3(方波发生器)

;设置通道2的计数初值,先送 低位,再送高位

OUT

SET_BPS MAIN START: M0: M1: RECEIVE: NEXT: OVER:

OUT DX,AL

RET

ENDP PROC

FAR

CALL SET_BPS CALL INIT51 MOV AX,DATA MOV DS,AX LEA DX,MES1 MOV AH,09H INT 21H

MOV AH,01 INT 21H

MOV BL,AL MOV DX,CTRL51 IN AL,DX TEST AL,01 JZ M1 MOV DX,DATA51 MOV AL,BL OUT DX,AL CMP AL,‘!’ JZ RECEIVE JMP M0

MOV DX,OFFSET MOV AH,09H INT 21H

MOV DX,CTRL51 IN AL,DX TEST AL,02 JZ NEXT MOV DX,DATA51 IN AL,DX MOV DL,AL MOV AH,02 INT 21H CMP DL,‘!’ JNZ NEXT MOV AX,4C00H INT

21H

36

;初始化8253 ;初始化8251A ;设置段寄存器

;显示提示信息1 ;接收键入字符 ;保存在BL中 ;状态端口地址

;测试状态位TXRDY是否为1, 如不是则再测试

;从8251A串行口输出数据 ;判断是否是结束字符‘!’,是

则转RECEIVE继续

MES2 ;显示提示信息2 ;状态端口地址

;测试状态位RXRDY是否为1, 不是则再测试

;从8251A串行口接收来自终端 机的字符

;在主机屏幕上显示接收字符 ;不是结束字符‘!’转NEXT 继续

;结束

MAIN ENDP CODE ENDS END START

五、程序清单<二> (接收为中断方式): INITA00 INITA01 DATA51 CTRL51 TIMER2 TIMCTL CLK00 BPS00 FACTOR DATA MES1 MES2 DATA CODE ASSUME INIT51 LL0:

EQU 20H EQU 21H EQU 208H EQU 209H EQU 202H EQU 203H EQU 4700 EQU 1200 EQU 16 SEGMENT DB ‘NOW YOU CAN PLAY A KEY ON THE CPU KEYBORD’,0AH,0DH DB ‘IT WILL DISPLAY ON THE TERMINAL SCREEN!’, 0AH,0DH DB ‘END WITH !’,0AH,0DH, ‘$’ DB 0AH,0DH,‘NOW YOU CAN PLAY KEY ON THE TERMINAL’,0AH,0DH DB ‘IT WILL DISPLAY ON THE CPU SCREEN!’,0AH, 0DH

DB‘THROUGH IRQ,END WITH !’,0AH,0DH,0AH,0DH , ‘$’ENDS SEGMENT CS:CODE,DS:DATA PROC NEAR ;8251A初始化 MOV DX,CTRL51 ;8251A控制口地址 XOR AX,AX ;AX清0 MOV CX,03 CALL CHAROUT ;复位8251A LOOP LL0 MOV AL,40H CALL CHAROUT MOV AL,4EH ;设置模式字,使8251A工作于 CALL CHAROUT 异步方式,8个数据位,1个 停止位,波特率因子为16 MOV AL,27H ;设置控制字启动发送器和接收 CALL CHAROUT 器

37

RET CHAROUT: OUT

DX,AL ;子程序,从DX指定端口输出 GG: INIT51 SET_BPS SET_BPS MAIN START:

PUSH CX

MOV CX,02

LOOP GG POP CX

RET ENDP PROC NEAR MOV DX,0

MOV AX,CLK00 MOV BX,1000 MUL BX

MOV BX,BPS00 DIV BX

MOV DX,00 MOV BX,FACTOR DIV BX

MOV BX,AX

MOV DX,TIMCTL MOV

AL,0B6H OUT

DX,AL MOV DX,TIMER2 MOV AX,BX OUT

DX,AL MOV

AL,AH OUT DX,AL

RET

ENDP PROC FAR

CALL SET_BPS CALL INIT51 MOV AX,DATA MOV DS,AX LEA DX,MES1 MOV

AH,09H

38

AL内容

;延时以等待输出完成

;子程序,初始化8253计数器/ 定时器 ;8251A时钟频率 ;计算8253计数器通道2的计 数初值,结果送BX ;设置8253的控制字,使其工 作于模式3(方波发生器) ;设置通道2的计数初值,先送 低位,再送高位 ;初始化8253 ;初始化8251A ;设置段寄存器

;显示提示信息1

M0: M1: RECEIVE: 111: INT_PROC:

INT

21H

MOV AH,01 ;接收键入字符 INT 21H

MOV BL,AL; ;保存在BL中 MOV DX,CTRL51 ;状态端口地址 IN AL,DX TEST AL,01 ;测试状态位TXRDY是否为1, JZ M1 如不是则再测试 MOV DX,DATA51 MOV AL,BL ;从8251A串行口输出数据 OUT DX,AL CMP AL,‘!’’ ;判断是否是结束字符‘!’,是 JZ RECEIVE 则转RECEIVE继续 JMP M0

MOV DX,OFFSET MES2 MOV AH,09H ;显示提示信息2 INT 21H

MOV AX,CS ;DS指向代码段 MOV DS,AX

MOV DX,OFFSET INT_PROC MOV AX,250AH ; 设置0AH号中断向量 INT 21H CLI ;关中断 MOV DX,INTA01 IN AL,DX ;开放IRQ2对应的中断屏蔽位 AND AL,0FBH OUT DX,AL STI ;开中断 NOP ;等待硬中断 JMP 111

DX,DATA51 ;从8251A串行口接收来自终端 IN AL,DX 机的字符 PUSH AX ;入栈保护 MOV DL,AL MOV AH,02 ;在主机屏幕上显示接收字符 INT 21H

MOV DX,INTA00 MOV AL,20H ;发中断结束命令 OUT DX,AL POP

AX ;退栈

39

MOV CMP AL,‘!’ ;不是结束字符‘!’则转NEXT JNZ NEXT MOV DX,INTA01 IN AL,DX ;关闭IRQ2对应的中断屏蔽位 OR AL,04 OUT DX,AL STI ;开中断 MOV AX,4C00H ;返回DOS INT 21H NEXT: IRET ;中断返回 MAIN ENDP CODE ENDS END START 六、实验报告要求:

1.写出实验步骤。

2.分析传送结果是否正确。

3.总结8251接收、发送的工作原理,分析中断方式和查询方式的异同点。

40

本文来源:https://www.bwwdw.com/article/4abg.html

Top