实验1~9 实验指导最新版200910

更新时间:2024-04-12 22:28:01 阅读量: 综合文库 文档下载

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

《计算机硬件基础》实验指导

(供计算机专业使用)

医药信息工程学院 控制与仿真教研室 余华芳

2009年3月

《计算机硬件基础》实验总说明

1.注意黄色阴影部分是要抄写到报告上的。 2.注意每个实验后的提示和说明。

3.实验要提前预习,在宿舍先做完了可以到实验室给老师看结果,看完结果老师满意了可以立马走人,以资奖励。 4.下面是唐都实验箱的参考实验程序名称列表,供大家以后作实验时参考。

实验一汇编语言的工作环境与上机步骤(第2周作)

一、 实验目的

(1) 熟悉Windows 集成操作软件TdPitc 的操作环境和操作方法。 (2) 熟悉掌握Emulator-demo402软件使用方法。 (3) 熟悉汇编语言的编辑、汇编、连接、运行的全过程。 二、实验设备

PC 微机一台、TD-PITC 实验系统一套。 三、tdpitc软件实验内容及说明

一般来说,有很多程序需要显示输出提示运行的状况和结果,有的还需要将数据区中的内容显示在屏幕上。本实验要求将指定数据区的数据以十六进制数形式显示在屏幕上,并利用DOS功能调用完成一些提示信息的显示。通过本实验,初步掌握实验系统配套操作软件的使用。实验中所使用DOS 功能调用(INT 21H)说明如下。

(1) 显示单个字符输出 入口:AH=02H

调用参数:DL=输出字符 (2) 显示字符串 入口:AH=09H

调用参数:DS:DX=串地址,’$’为结束字符 (3) 键盘输入并回显 入口:AH=01H

返回参数:AL=输出字符 (4) 返回DOS 系统 入口:AH=4CH

调用参数:AL=返回码 四、tdpitc软件实验步骤

(1) 运行Tdpitc 集成操作软件,进入编辑调试集成环境。

(2) 根据程序设计使用语言不同,在“语言设置”菜单项中设置所使用的语言。如图1-1所示。该项一经设置,会再下次启动后仍保持不变。

图1-1 设置语言环境

(3) 开始新建文件进行编程。点击“文件”菜单项中的“新建”,可以新建一个

空白文档。默认名为Td-pit1。如图1-2 所示。

图1-2 新建空白文档

(4) 编写程序,如图1-3 所示,并保存,此时软件会提示输入新的文件名,输入文件名后点击保存。

图1-3 程序编辑界面

(5) 点击,编译文件,若程序编译无误,然后再点击,连接程序。编译连接成功会在输出信息栏显示输出信息,如图1-4 所示。

图1-4 编译连接输出信息

(6) 编译连接成功后可以点击,运行程序,查看运行结果。

(7) 可以点击,调试程序,进入调试界面,进行程序的调试。

五、tdpit软件实验参考(熟悉汇编语言完整程序及流程图的画法) (1) 参考实验程序流程图如1-5 所示。

图1-5 显示程序实验参考流程图

(2) 参考实验程序如下。 ;A1.asm

;显示程序实验

STACK1 SEGMENT STACK

DW 256 DUP(?) STACK1 ENDS

DATA SEGMENT USE16

MES DB 'Press any key to exit!',0AH,0DH,0AH,0DH,'$' MES1 DB 'Show a as hex:',0AH,0DH,'$' SD DB 'a' DATA ENDS

CODE SEGMENT USE16

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX

MOV DX,OFFSET MES ;显示退出提示 MOV AH,09H INT 21H

MOV DX,OFFSET MES1 ;显示字符串 MOV AH,09H INT 21H

MOV SI,OFFSET SD MOV AL,DS:[SI]

AND AL,0F0H ;取高4 位 SHR AL,4

CMP AL,0AH ;是否是A 以上的数 JB C2

ADD AL,07H C2: ADD AL,30H

MOV DL,AL ;显示字符 MOV AH,02H INT 21H

MOV AL,DS:[SI]

AND AL,0FH ;取低4 位 CMP AL,0AH JB C3

ADD AL,07H C3: ADD AL,30H

MOV DL,AL ;显示字符 MOV AH,02H INT 21H

KEY:MOV AH,1 ;判断是否有按键按下?

INT 16H ;(为观察运行结果,使程序有控制的退出) JZ KEY

MOV AX,4C00H ;结束程序退出 INT 21H CODE ENDS

END START

六、在Td-Pitc中仿真(验证性操作。因实验环境的限制,须在实验室做才行,但是大家应先研究一下程序,看不懂的需查书!)

本实验要求将数据段中的一个字符串传送到附加段中,并输出附加段中的目标字符串到屏 幕上。参考实验程序如下。

DDATA

SEGMENT

;定义源数据段

MSR DB \LEN EQU $- MSR

DDATA

ENDS

;定义附加数据段

EXDA SEGMENT

MSD DB LEN DUP(?) EXDA ENDS

MYSTACK SEGMENT STACK DW 20 DUP(?) MYSTACK ENDS

;定义堆栈段

CODE SEGMENT ;定义代码段

ASSUME CS:CODE,DS:DDATA,ES:EXDA START:MOV AX,DDATA

MOV DS,AX MOV AX,EXDA MOV ES,AX

MOV SI,OFFSET MSR MOV DI,OFFSET MSD MOV CX,LEN

NEXT: MOV AL,[SI]

MOV ES:[DI],AL INC SI INC DI DEC CX JNZ NEXT PUSH ES POP DS

MOV DX,OFFSET MSD MOV AH,9 INT 21H

KEY: MOV AH,1 INT 16H

JZ KEY MOV AX,4C00H INT 21H

CODE ENDS

END START

;结束程序退出

;判断是否有按键按下?

;(为观察运行结果,使程序有控制的退出) ;将附加段寄存器指向的段值赋给数据段寄存器 ;开始传输数据 ;装载附加数据段寄存器 ;设置 SI ;设置 DI ;装载数据段寄存器

将程序主体部分的寄存器间接寻址方式改为相对寻址方式,则如下所示。

MOV BX,0

MOV CX,LEN

NEXT: MOV AL,MSR[BX]

MOV

ES:MSD[BX],AL INC BX LOOP NEXT

实验步骤

(1) 运行 Tdpit 集成操作软件,编写实验程序。

(2) 编译连接无误后,点击,进入调试环境,进行程序的调试。如图 1-6 所示。

图1-6 进入调试环境

(3) 按 F8 键单步运行程序,执行完 MOV DS,AX 语句后,观察 DS 寄存器中出现的段地址。 激活 Dump 数据显示区,用 Ctrl+G 命令,输入要查看的数据区地址-“0C69:0000”。

如图 1-7 所示。

图 1-7 根据 DS 值查看数据段

可以在 Dump 数据区看到 DS 数据段中 MSR 源数据串-\。如图1-8所示。

图 1-8 DS 源数据段数

(4) 继续单步运行程序,执行 MOV ES,AX 语句后,可以看到 ES 附加数据段出现的段地址, 用同样的方法可以查看 ES:0000 的数据。如图 1-9所示。

图1-9 根据 ES 值查看附加数据段

(5) 数据传输还没开始进行,此时 ES 段的数据为空。继续单步执行完程序,可以看到 ES 数据段逐渐被写入源数据段 DS 的数据。直到数据传输完毕,可以看到 ES 数据段中目的数据串 MSD 已经被写入了数据串-\。如图1-10 所示.

图1-10 根据 ES 值查看附加数据段 (6) 可以更改程序中声明的源数据区数据,考察程序的正确性。

阅读知识:一个简单的汇编源程序的编写过程(看看以下文字说明)

1. 先定义一个段

pig segment ;定义一个段,名字叫\,这个段从此开始。

pig ends ;\段到此结束。ends可以认为是end segment的

缩写。不要把ends和后面要出现的end搞混了。

2. 我们要让pig段成为代码段,用

assume cs:pig ;assume并不是一条非要深入理解的伪指令,以后

;我们记着用assume将有特定用途的段和相关的 ;段寄存器关联起来就可以了。

3. 指出程序在何处结束 assume cs:pig pig segment pig ends

end ;end伪指令告诉编译器,编译到此结束,end后面的东

;西,不要再编译了。大家看到汇编源程序必以end结 ;束。虽然end后面常跟有标号,但这个问题我们以后

;再说。

4. 可以开始写代码了!!?? assume cs:pig pig segment

XXXXXXXX ;这里的XXX表示你写的代码,也就是我们以后最

;关心的部分,不过现在我们不理它。

XXXXXXXX ;当然XXX部分最简单的当然就是什么都不写了! XXXXXXXX

mov ax,4c00h ;这两句话是让程序返回 int 21h pig ends end

5. 所以我们得到一个非常简单的汇编源代码 assume cs:pig pig segment

mov ax,4c00h int 21h pig ends end

这就是一个完整的汇编源程序,大家可以可以把它编译,链接,运行一下。虽然它什么都不做,但是它实在是小巧得可爱!

6. 下面我再加三行,让我们的程序可以打印出一个笑脸来! assume cs:pig pig segment mov dl,1 mov ah,2 int 21h

mov ax,4c00h int 21h pig ends end

大家在emu8086编写该简单程序的代码,然后调试运行看运行结果。

7.关于上面这个程序的说明

在这里,我们只用了一个代码段,并没有用数据段,堆栈段,也没有用到过程。所以我们的程序很“可爱”。就我们的学习过程里,我们写的程序都很小,这种方式已经足够了!即使要用到数据或者堆栈,我们用一个段也能应付的。

8.Emu8086软件的使用

1. 安装并打开emu8086软件,请先研究一下图1-11至1-13,然后运行下面的程序

;一个显示Hello World!程序┄┄┄┄┄┄┄┄ ┄┄┄ ;(1)

DATAS SEGMENT ┄┄┄┄┄┄┄┄ ┄┄┄┄ ;(2)

STRING DB 'Hello World!',13,10,'$' ┄┄┄┄ ;(3) DATAS ENDS ┄┄┄┄ ┄┄┄┄ ┄┄┄┄ ;(4)

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS ┄┄┄┄ ;(5) START: ┄┄┄┄ ┄┄┄┄ ┄┄┄┄┄┄┄┄ ;(6) MOV AX,DATAS ┄┄┄┄┄┄┄┄┄┄┄┄ ;(7) MOV DS,AX┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(8) LEA DX,STRING ┄┄┄┄┄┄┄┄┄┄┄┄ ;(9) MOV AH,9 ┄┄┄┄┄┄┄┄┄┄┄┄ ;(10) INT 21H ┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(11)

MOV AH,4CH ┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(12) INT 21H ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(13) CODES ENDS ┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(14) END START ┄┄┄┄┄┄┄┄┄┄┄┄┄ ;(15)

2. 在emu8086中调试运行该程序。请单步执行该程序,记录下每执行一句话后相应寄存器内容的变化情况

3. 该程序运行结果是什么?

图1-11 Emulator 窗口布局

Physical Address: 物理地址,表示程序代码指令或数据存放的物理单元地址;HEX: 十六进制,表示的是指令的机器码;

DECIMAL: 十进制,是16进制的等价值,也是指令的机器码;

ASCII: ASCII码字符,是16进制值所对应的ASCII码字符,对应的是操作指

令时,没有很大意义,对应的是数据时就表示的是数据的ASCII码字符。

The Memory List: 表示Physical Address、HEX、DECIMAL、ASCII这四列所

在的窗口是一个内存单元详情列表。

Disassembled Machine Code:表示右边那个窗口是源程序代码的反汇编代码窗

口,与左边的窗口是一一对应的。

图1-12 Emulator 窗口界面功能模块

图1-13 Emulator 内存单元查看方法图

9.验证性实验

请分别在

Emu8086 和TDPitc 中运行“案例12字符图形

程序阳泉学院”文件夹中的文件“yangquan.asm”,会看到显示“阳泉学院”,

实验一思考题:

(1) 分别在2个软件中运行所有的例程,看到的结果有什么不同? (2) 比较这2个软件,你认为哪个软件比较好,并说明原因。 (3) 请比较汇编语言与你以前所学的高级语言的区别。

实验二 汇编语言指令仿真(第5周作)

【实验目的】

1. 学会用实验的方式验证理论,用理论来指导实验,进一步熟悉汇编语

言开发环境。

2. 深刻理解寻址方式的意义以及80X86指令的各种寻址方式。 3. 深刻理解80X86各种指令的真正含义及功能。 4. 掌握与数据有关的不同寻址方式。

5. 继续熟悉实验操作软件的环境及使用方法。

【实验内容及要求】

一、在emu8086中仿真简单指令

1. 仿真简单指令,请按要求写出程序代码及实验步骤。(在仿真之前请大家先用理论分析一下执行那些指令后,目操作数中的内容,然后上机验证你的推测。提示里有一个示例)

2. 将实验结果与理论结果进行比较,以便深入理解80X86指令的各种寻址方式。

3. 实验过程中碰到的问题及如何解决的? 4. 写出心得体会及还未理解的知识点。 【例题】

进入EMU8086之后,建立一个空白文档,将下面的程序段输入,按EMULATE按钮,进入EMULATE页面,按SINGLE STEP 按钮,观察每个寄存器以及存储单元的值。验证理论运算结果。

如,已知(DS)=2000H,(ES)=1000H,(SI)=0002H (BX)=100H,(20100H)=55H, (20101H)=42H, (20102H)=24H ,(20103H)=25H ,(20104H)=77H, (10100H)=22H (10101H)=33H, (10102H)=11H, (10103H)=44H, (10104H)=88H, (10105H)=99H,请写出下列指令执行后目操作数中的内容。 MOV AX, [BX] ADD AX, ES:[BX] MOV CX, [BX+SI] ADD AX, CX

MOV CX, ES:[BX+2*SI] ADD AX, CX

以下为仿真语句示例:

MOV AX,2000H

MOV DS,AX ;给数据段DS赋初值2000H MOV AX,1000H

MOV ES,AX ;给扩展段ES赋初值 1000H MOV SI,0002H ;给通用寄存器赋初值 MOV BX,100H

MOV [0100H],55H MOV [0101H],42H

DB 2ah,238,1,-1 DB 2ah,238,1,0 DB 2ah,238,1,-1 DB 2ah,238,1,0 DB 2ah,238,1,-1 DB 2ah,238,-4,0 DB 2ah,238,1,0 DB 2ah,238,1,1 DB 2ah,238,1,0

DB 2 DUP(2ah,238,1,1) DB 2ah,238,-9,7 ;络 DB 2 DUP(2ah,238,1,0) DB 2 DUP(2ah,238,1,-1) DB 2ah,238,1,0

DB 2 DUP(2ah,238,0,1) DB 2ah,238,-2,2 DB 2ah,238,1,0

DB 4 DUP(2ah,238,1,-1) DB 2ah,238,1,1 DB 2ah,238,-1,0

DB 2 DUP(2ah,238,0,1) DB 2ah,238,3,-3 DB 2ah,238,1,1 DB 2ah,238,-1,0 DB 2ah,238,0,1 DB 2ah,238,-1,1 DB 2ah,238,0,1

DB 2ah,238,-10,3 DB 3 DUP(2ah,238,1,0) DB 2ah,238,0,-1 DB 2ah,238,1,0 DB 2ah,238,1,-1 DB 2ah,238,-3,3

DB 4 DUP(2ah,238,0,1) DB 6 DUP(2ah,238,1,-1) DB 2ah,238,0,-1 DB 2ah,238,-4,3

DB 4 DUP(2ah,238,1,1) DB 2ah,238,0,1 DB 2ah,238,1,-7

DB 4 DUP(2ah,238,1,0) DB 2ah,238,-5,1

DB 4 DUP(2ah,238,0,1) DB 5 DUP(2ah,238,1,0) DB 2ah,238,-1,-4

DB 3 DUP(2ah,238,0,1) DB 2ah,238,-11,7 ;工 DB 10 DUP(2ah,238,0,1) DB 2ah,238,1,-5

DB 9 DUP(2ah,238,1,0) DB 2ah,238,1,-6

DB 12 DUP(2ah,238,0,1) DB 2ah,238,-12,8 ;程 DB 2ah,238,1,-1

DB 3 DUP(2ah,238,0,-1) DB 2ah,238,3,-1

DB 5 DUP(2ah,238,0,1)

DB 2ah,238,-2,-2 DB 2ah,238,1,0 DB 2ah,238,2,0

DB 8 DUP(2ah,238,1,0) DB 2ah,238,-7,-1 DB 2ah,238,1,0 DB 2ah,238,1,-1 DB 2ah,238,1,0 DB 2ah,238,1,-1 DB 2ah,238,-3,4 DB 2ah,238,1,1 DB 2ah,238,-7,3

DB 4 DUP(2ah,238,1,0) DB 2ah,238,-4,1

DB 4 DUP(2ah,238,0,1) DB 4 DUP(2ah,238,1,0) DB 2ah,238,-1,-4

DB 3 DUP(2ah,238,0,1) DB 2ah,238,3,-5

DB 7 DUP(2ah,238,0,1) DB 2ah,238,3,-7

DB 6 DUP(2ah,238,0,1) DB 2ah,238,-2,-3 DB 2ah,238,1,0 DB 2ah,238,2,0 DB 2ah,238,1,0 DB 2ah,238,1,-4

DB 8 DUP(2ah,238,0,1) char_cnt dw ? pointer dw ? line_on db ? col_on db ? data ends stack segment

db 2000 dup (0) stack ends code segment

assume cs:code,ds:data main proc far push ds sub ax,ax push ax

mov ax,data ;初始化DS mov ds,ax

mov ah,0 ;设置300*200彩色图形方式 mov al,3 int 10h

mov ah,0bh ;设置背景颜色 mov bh,0 mov bl,2 int 10h

mov ah,0bh ;设置彩色调板 mov bh,01 mov bl,00 int 10h

call clear_screen ;清屏

lea di,car ;di指向字符图形表

mov dh,5 ;从第5行第5列位置开始 mov dl,5 ;显示汽车 call move_shape

mov ah,01h ;从键盘输入字符 int 21h cmp al,0dh je exit exit:mov ah,4ch int 21h ret main endp

clear_screen proc near ;清屏子程序 push ax ;保护寄存器 push bx push cx push dx

mov ah,6 ;屏幕上卷功能 mov al,6

mov ch,0 ;左上角行号 mov cl,0 ;左上角列号 mov dh,250 ;右下角行号 mov dl,200 ;右下角列号 mov bh,7 ;卷入行属性 int 10h ;调用显示功能 pop dx ;恢复寄存器 pop cx pop bx pop ax

ret ;返回主程序 clear_screen endp move_shape proc near push ax push bx push cx push dx push di

mov ah,0fh ;取当前显示方式 int 10h

sub ch,ch ;清除寄存器CX的高字节 mov cl,[di] ;CL放循环次数

inc di ;di指向字符表的第一个字符 mov char_cnt,cx ;保存循环次数 mov pointer,di mov line_on,dh mov col_on,dl plot_next:

add dh,[di+2] ;改变行列指针 add dl,[di+3]

cmp dl,150 ;出屏否?

jb mov_crsr call erase pop di pop dx pop cx

pop bx pop ax ret mov_crsr:

mov ah,2 ;移动光标位置 int 10h mov al,[di]

mov bl,[di+1] ;取字符值及属性 push cx mov cx,1

mov ah,09 ;显示字符 int 10h pop cx

add di,4 ;di指向下一个字符 loop plot_next

call dly_qrtr ;调用延时子程序 call erase ;调用擦除子程序 jmp short plot_next move_shape endp

erase proc near ;擦除子程序 mov cx,char_cnt mov di,pointer mov dh,line_on mov dl,col_on erase_next:

add dh,[di+2] add dl,[di+3] mov ah,2 int 10h mov al,[di] mov bl,0 push cx mov cx,1 mov ah,9 int 10h pop cx add di,4

loop erase_next mov cx,char_cnt mov di,pointer mov dh,line_on inc col_on mov dl,col_on ret erase endp

dly_qrtr proc near ;延时子程序 push cx push dx

mov dx,50000 d11:mov cx,8000 d12:loop d12 dec dx jnz d11 pop dx pop cx ret

dly_qrtr endp code ends end main

①请对该程序进行详细的(尽量具体到每一句)注释,主要注释其在程序中的功能、作用。

(注意解释的时候只解释程序部分,不用抄字符代码) ②请画出该程序的流程图。

希望大家通过修改程序,使显示器显示自己的名字。(交报告时只用打印出自己名字的效果图就行了,不用再抄一次整个程序) 提示:要造自己的名字需要用到“字模提取软件”。

4、(选作)试编写程序,要求从键盘输入3个16进制数,并根据对3个数的比较显示如

下信息(这个程序需要熟悉使用Dos系统功能调用或BIOS中断调用): (1)如果3个数都不相等则显示0; (2)如果3个数中有2个数相等则显示2; (3)如果3个数都相等则显示3。

实验要求:

1. 请写出程序清单,并进行详尽的注释

2. 程序编写过程遇到那些困难?你是如何解决的?

从实验四开始做的是硬件接口实验,请注意以下连接事项: 1. 系统总线单元的“SW_CPU”应打向PCI,而非386,切记! 2. 数据线连接一定要一一对应,千万不要连反或错位了。如D0~ D7一定要对应XD0~~~~ XD7,要注意线的颜色,不要错位。 3. 当别人的实验能够成功而自己的没成功时,首先要仔细检查自己的线路连接有没有出问题,再分析其他原因。 4. 实验内容主要以这本指导书为主,实验室箱里面的教材为辅。

实验四 8/16位存储器扩展实验(第9周作)

一、实验目的

(1) 学习静态存储器操作原理。

(2) 学习8/16 位存储器接口电路设计。

(3) 掌握不同总线宽度访问存储器的编程方法。 二、实验设备

PC 微机一台、TD-PITC 实验系统一套。 三、实验内容

在系统总线上分别进行16 位存储器扩展和8 位存储器扩展连接。编写程序,将PC 机内存中的一段数据传送至扩展的存储器中。并进行规则和不规则字读写操作以及不同的总线字节访问宽度指令操作,调试程序并分析总线时序的区别。

四、实验原理

1、SRAM 62256 介绍

存储器是用来存储信息的部件,是计算机的重要组成部分,静态RAM 是由MOS 管组成的触发器电路,每个触发器可以存放1 位信息。只要不掉电,所储存的信息就不会丢失。因此,静态RAM 工作稳定,不要外加刷新电路,使用方便。但一般SRAM 的每一个触发器是由6 个晶体管组成,SRAM 芯片的集成度不会太高,目前较常用的有6116(2K×8bits),6264(8K×8bits)和62256(32K×8 bits)。62256 SRAM 有32768 个存储单元,每个单元为8 位字长。62256的引脚如图4-1 所示。

图4-1 62256 引脚图

2、16 位存储器操作

系统总线为准32 位数据总线,具有16 位外部数据线,即D0、D1、?、D15,地址总线为BHE#(#表示该信号低电平有效)、BLE#、A1、A2、?、A20。存储器分为奇体和偶体,分别由字节允许线BHE#和BLE#选通。

存储器中,从偶地址开始存放的字称为规则字,从奇地址开始存放的字称为非规则字。处理器访问规则字只需要一个时钟周期,BHE#和BLE#同时有效,从而同时选通存储器奇体和偶体。处理器访问非规则字却需要两个时钟周期,第一个时钟周期BHE#有效,访问奇字节;第二个时钟周期BLE#有效,访问偶字节。处理器访问字节只需要一个时钟周期,视其存放单元为奇或偶,而BHE#或BLE#有效,从而选通奇体或偶体。写规则字和非规则字的简单时序图如图4-2 所示。

图4-2 写规则字(左)和非规则字(右)简单时序图

3、8 位存储器操作

在16 位数据总线上可以进行8 位存储器的操作,允许CPU 用字节指令进行访问。这样的操作相当于16 位总线上高位字节不访问。奇体存储器的数据线不用连接,字节使能始终是BLE#有效,2 字节空间只访问最低的1 个字节。

4、实验说明及步骤

实验系统的存储器空间共有2MB(①为什么?),偏移为000000H~1FFFFFH(②为什么?)。起始地址由PC 机系统分配(如D9000000H~D91FFFFFH),可以通过运行CHECK 程序查看到。分配的存储器寻址空间远超出1MB,在实地址模式下无法操作,需要在CPU 的保护模式下操作(为什么?)。所以实验程序要按照保护模式程序结构编写,在保护模式调试集成软件Tddebug 上运行。程序流程如图4-3 所示(a图表示16 位存储器操作,b 图表示8 位存储器操作)。实验接线如图4-4 所示。 五、实验步骤如下:

(1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。 (2) 启动纯DOS 环境,进入Tddebug 软件所在的安装目录。在该目录下输入CHECK

指令,执行CHECK程序,查看存储器空间始地址并记录。

(3) 运行Tddebug 集成操作软件。操作Alt+E 进入程序编辑环境。也可以操作

Alt+R→Run→Check查看存储器空间始地址。利用查出的地址编写16位及8 位存储器操作的程序(附录中已经给出部分程序,完成程序填空即可,16位的参考8位修改DSEG1段和CSEG段),然后编译链接。

(4) 参考图4-4 所示连接实验线路,8 位操作时不用连接XD8~XD15。

(5) 操作Alt+P 进入保护模式调试环境,根据程序中的设计用D 命令分别查看

源数据区和实验单元存储器中的数据。 (6) 按F9 运行程序或按F7 单步执行到结束,再用D 命令查看存储器单元中的数

据,观察数据写入是否正确。(③请说明如何才知道写入的数据是正确的?) (7) 将程序改为非规则字写入操作,再调试程序,观察存储器中数据的变化,分

析写入字的排列规则以及总线操作时序的原理(④请分析)。 六、实验要求

1、请回答①~④所提的问题。

2、请将附录F中程序填写完整,并回答问题。

3、写出实验过程中所有的心得体会(包括你的各种尝试)。

图4-3 存储器扩展实验参考程序流程图

图4-4 16 位存储器扩展实验参考接线图

;8位存储器扩展实验(8位宽度访问) .386P

;***************根据CHECK配置信息修改下列符号值******************* MY0_H EQU 0E1H ;片选MY0起始地址的最高位字节 MY0_M EQU 00H ;片选MY0起始地址的次高位字节 MY0_L EQU 0000H ;片选MY0起始地址的低两位字节 ;***************************************************************** ATDW EQU 92h ;存在的可读写数据段属性值 ATCE EQU 98h ;存在的只执行代码段属性值

Desc STRUC

LimitL DW 0000H ;段界限(BIT0-15) BaseL DW 0000H ;段基地址(BIT0-15) BaseM DB 00H ;段基地址(BIT16-23) Attributes DB 00H ;段属性

LimitH DB 00H ;段界限(BIT16-19)(含段属性的高4位) BaseH DB 00H ;段基地址(BIT24-31) Desc ENDS

SEGMENT USE16 LABEL BYTE

DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH>

DESC <0FFFFH,CSEG,,ATCE,,>

DESC ;源数据段描述符

DSEG GDT ID1 SCODE DATAS

DATAD DESC <2000H,MY0_L,MY0_M,ATDW,,MY0_H> ;目的数据段描述符 GDTLEN = $-GDT SCODE_SEL DATAS_SEL DATAD_SEL ID2 ID3 DSEG DSEG1

= SCODE-GDT = DATAS-GDT = DATAD-GDT

DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH > DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH >

ENDS

SEGMENT USE16

;(上面的内容是本系统固定的,关键要看懂以下程序)

TDATA DB 00H,11H, 22H, 33H, 44H, 55H, 66H, 77H ;定义源数据段数据 DB 88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH

DB 00H,11H, 22H, 33H, 44H, 55H, 66H, 77H ;定义源数据段数据 DB 88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH

DB 00H,11H, 22H, 33H, 44H, 55H, 66H, 77H ;定义源数据段数据 DB 88H,99H,0AAH,0BBH,0CCH,0DDH,0EEH,0FFH D1LEN =$-1 DSEG1 CSEG

SEGMENT USE16

ENDS

ASSUME CS:CSEG

PROC

START

MOV AX,DATAS_SEL ;装入数据段,数据段为源数据区 MOV DS,AX

MOV AX,DATAD_SEL ;ES扩展段为目的数据区 MOV ES,AX

XOR SI,SI ;源地址指针清零 XOR DI,DI ;目的地址指针清零 MOV CX,30H ;传送的数据数量

(1) ;请补充程序: 将源数据段数据传输到目的数据段,

要求:实现按字节的传送,或者一个字的传送(可以吗?原因是什么?);或者将源数据区的低字节传到目的字节区的高字节,或者相反的要求

(2) (3) (4)

(5)

INT 0FFH START CLEN CSEG

;16位存储器扩展实验(16位宽度访问) .386P

;***************根据CHECK配置信息修改下列符号值******************* MY0_H EQU 0E1H ;片选MY0起始地址的最高位字节 MY0_M EQU 00H ;片选MY0起始地址的次高位字节 MY0_L EQU 0000H ;片选MY0起始地址的低两位字节 ;***************************************************************** ATDW EQU 92h ;存在的可读写数据段属性值 ATCE EQU 98h ;存在的只执行代码段属性值

Desc STRUC

LimitL DW 0000H ;段界限(BIT0-15) BaseL DW 0000H ;段基地址(BIT0-15) BaseM DB 00H ;段基地址(BIT16-23) Attributes DB 00H ;段属性

LimitH DB 00H ;段界限(BIT16-19)(含段属性的高4位) BaseH DB 00H ;段基地址(BIT24-31)

ENDP =$-1

ENDS

END START

Desc ENDS

SEGMENT USE16 LABEL BYTE

DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH>

DESC <0FFFFH,CSEG,,ATCE,,>

DESC ;源数据段描述符

DSEG GDT ID1 SCODE DATAS

DATAD DESC <2000H,MY0_L,MY0_M,ATDW,,MY0_H> ;目的数据段描述符 GDTLEN = $-GDT SCODE_SEL DATAS_SEL DATAD_SEL ID2 ID3 DSEG

SEGMENT USE16 ENDS

DSEG1 DSEG1 CSEG

CSEG

SEGMENT USE16 。。。。。。。。 ENDS

= SCODE-GDT = DATAS-GDT = DATAD-GDT

DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH > DESC <0FFFFH,0FFFFH,0FFH,0FFH,0FFH,0FFH >

ENDS

。。。。。。。

END START

实验五 8255基本输入输出实验(第13周作)

一、实验目的

(1) 掌握8255 的工作方式及应用编程。 (2) 掌握8255 的典型应用电路接法。 二、实验设备

PC 微机一台、TD-PITC 实验系统一套。 三、实验内容

1、基本输入输出实验。编写程序,使8255 的A 口为输出,B 口为输入,完

成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就改变。(提示:请参考熟读8255-1.asm)

2、流水灯显示实验。编写程序,使8255的A口和B口均为输出,实现16 位数

据灯的相对循环显示。(提示:请参考熟读8255-2.asm)

四、实验原理

(请详见“PITC实验教程”书第97~99面的内容。)

并行接口是以数据的字节为单位与I/O 设备或被控制对象之间传递信息。CPU 和接口之间的数据传送总是并行的,即可以同时传递8 位、16 位、32 位等。8255 可编程外围接口芯片是Intel 公司生产的通用并行I/O 接口芯片,它具有

A、B、C 三个并行接口,用+5V 单电源供电,能在以下三种方式下工作:方式0--基本输入/出方式、方式1--选通输入/出方式、方式2--双向选通工作方式。8255 的内部结构及引脚如图1 所示,8255 工作方式控制字和C 口按位置位/ 复位控制字格式如图2 所示。

图1 8255 的内部结构及引脚

五、 实验说明及步骤 1.基本输入输出实验

本实验使8255 端口A 工作在方式0 并作为输出口,端口B 工作在方式0 并作为输入口。用一组开关信号接入端口B,端口A 输出线接至一组数据灯上,然后通过对8255 芯片编程来实现输入输出功能。参考程序流程如图3 所示。

(a)工作方式控制字 (b)C口按位置位/复位控制字

图2 8255 控制字格式

图3 8255 并口应用实验(1)参考程序流程图

实验步骤(请详见“PITC实验教程”书第97~99面的内容。) (1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。 (2) 运行Tdpit 集成操作软件,查看端口资源分配情况。记录与所使用片选信号对应的I/O端口始地址。

(3) 利用查出的地址编写程序,然后编译链接。 (4) 根据实验要求,完成实验所需硬件连接线路图4。 (5) 运行程序,拨动开关,看数据灯显示是否正确。

图4 实验连线图

;T8255-1.asm

;8255基本输入输出实验

;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 9800H ;片选IOY0对应的端口始地址 ;***************************************************************** MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址

STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,82H ;工作方式0,A口输出,B口输入 OUT DX,AL

LOOP1: MOV DX,MY8255_B ;读B口 IN AL,DX

MOV DX,MY8255_A ;写A口 OUT DX,AL

MOV AH,1 ;判断是否有按键按下 INT 16H

JZ LOOP1 ;无按键则跳回继续循环,有则退出

QUIT: MOV AX,4C00H ;结束程序退出 INT 21H CODE ENDS

END START

2.流水灯显示实验

首先分别向A 口和B 口写入80H 和01H(为什么要写入这两个数,其他的数字可以吗?),然后分别将该数右移和左移一位,再送到端口上,这样循环下去。从而实现流水灯的显示。参考实验程序流程如图6所示。

(a)工作方式控制字 (b)C口按位置位/复位控制字

图5 8255 控制字格式

实验步骤如下。

(1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。 (2) 运行Tdpit 集成操作软件,查看端口资源分配情况。记录与所使用片选信号对应的I/O。

(3) 利用查出的地址编写程序,然后编译链接。

(4) 根据实验要求,完成实验所需硬件连接线路,如图7。 (5) 运行程序,看数据灯显示是否正确。

图6 8255 并口应用实验(2)参考程序流程图

图7 实验连线图

;T8255-2.asm ;8255流水灯显示实验

;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 9800H ;片选IOY0对应的端口始地址 ;***************************************************************** MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址

STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

DATA SEGMENT

LA DB ? ;定义数据变量 LB DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA MOV DS,AX

MOV DX,MY8255_MODE ;定义8255工作方式 MOV AL,80H ;工作方式0,A口和B口为输出 OUT DX,AL

MOV DX,MY8255_A ;写A口发出的起始数据 MOV AL,80H OUT DX,AL MOV LA,AL

MOV DX,MY8255_B ;写B口发出的起始数据 MOV AL,01H OUT DX,AL MOV LB,AL

LOOP1: CALL DALLY

MOV AL,LA ROR AL,1 MOV LA,AL MOV DX,MY8255_A OUT DX,AL

MOV AL,LB ROL AL,1 MOV LB,AL MOV DX,MY8255_B OUT DX,AL

MOV AH,1 INT 16H

JZ LOOP1

QUIT: MOV AX,4C00H INT 21H

DALLY PROC NEAR PUSH CX PUSH AX MOV CX,0FFFH D1: MOV AX,0FFFFH D2: DEC AX JNZ D2 LOOP D1 POP AX POP CX RET DALLY ENDP

;将A口起始数据右移再写入A口 ;将B口起始数据左移再写入B口 ;判断是否有按键按下 ;无按键则跳回继续循环,有则退出 ;结束程序退出 ;软件延时子程序 CODE ENDS END START

六、实验要求

实验内容1的要求:

1、请分析本实验电路的工作原理,看懂并理解8255-1.asm程序。

2、为什么在8255-1.asm文件里要定义PB口为输入口,PA口为输出口?(请

从硬件电路及工作原理上解释)

3、本实验箱中的8个LED灯是共阴极还是共阳极的?为什么?

4、如果以8255的PC口作为输出口,PB作为输入口,应该怎样修改电路和程序? 5、如果要让16个开关控制16个LED灯的亮灭,应该怎么连线和编程? 6、如何修改程序,使得显示灯不需要拨动,也能自动亮灭?

7、怎样可以只使用8255的一个端口,或者说完成同样的功能的同时又节约

的I/O引脚?

8、原程序中的INT 16H是干什么用的?

实验内容2的要求:

1、如何判断数据灯显示是否正确?

2、要使流水灯作多样性变化,原程序应如何修改才更通用?可以修改哪些地方?如一次4个灯亮,或间隔跳亮,或从中间往两边亮。

3、这里的流水灯与上一个实验的灯是同一个灯,为什么这里不再受开关的

控制而上一个实验会受开关的控制?

4、写出整个实验过程中所有的心得体会(包括你的各种尝试)。

实验六 键盘扫描与显示设计实验(第14周作)

一、实验目的

(1) 学习按键扫描的原理及电路接法。 (2) 掌握利用8255 完成按键扫描及显示。 二、实验设备

PC 微机一台、TD-PITC 实验系统一套。 三、实验内容

连接8255 与键盘扫描单元,编写程序完成按键扫描功能,并将读到的 按键值依次显示在数码管上。

四、实验说明及步骤请详见“PITC实验教程”书第119~121面的内容。

实验系统中的键盘及数码管显示单元提供了4 行×4 列共16 个按键,6 位7 段数码管也接成扫描电路方式。共用段位控制信号A~Dp,各自独立的公共端X1~X6,其中X1~X4 是与列扫描信号复用,行扫描信号为Y1~Y4。电路原理如图 1 所示。

图 1 键盘及数码管显示单元电路结构图

X1~X6 控制6 位数码管的公共端,其中X1~X4 连接到按键的一端,作为列选,确定是哪一列的按键按下。Y1~Y4 连接到按键的另一端,作为行选,用于检测哪一行的按键按下。结合行选和列选即可得出是哪一个按键按下。在软件设计上要注意消除按键抖动的处理以及数码管显示的刷新。参考程序流程如图 2 所示,参考实验接线如图 3 所示。

图 2 键盘扫描及显示实验参考程序流程图

图 3 键盘扫描及显示实验参考接线图

实验步骤如下:

(1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。 (2) 运行Tdpit 集成操作软件,查看端口资源分配情况。记录与所使用片选信号

对应的I/O端口始地址。

(3) 利用查出的地址,参考图8-2 所示流程图编写程序,然后编译链接。 (4) 参考图8-3 所示连接实验线路。

(5) 运行程序,按动键盘矩阵上的按键,观察数码管显示是否正确。

五、实验要求

1、按实验内容的要求编写程序。

2、实验内容中,键盘是如何与LED数码管一一对应? 3、在本实验做完的前提下大家可以尝试作“点阵LED显示设计实验”和“图形LCD显示设计实验” (“PITC实验教程”书第122和124面的实验内容)。 六、思考题

1.一开机让所有的LED熄灭,该如何处理?

2.按一个键后,每按一个按键的键值固定在最左端或最右端显示

3.每按一个键依次从LED最左端的灯上显示,当6个LED显示满了,下次再按

按键时先清掉所有LED,从左端重新开始显示

4、写出实验过程中所有的心得体会(包括你的各种尝试)。

;Keyscan.asm

;键盘扫描及数码管显示实验

;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 9800H ;片选IOY0对应的端口始地址

;***************************************************************** MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址 MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址

STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

DATA SEGMENT

DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H DATA ENDS ;键值表,0~F对应的7段数码管的段位值

CODE SEGMENT

START: MOV AX,DATA

MOV DX,MY8255_MODE ;初始化8255工作方式

MOV AL,81H ;方式0,A口、B口输出,C口低4位输入

BEGIN: CALL DIS ;显示刷新

MOV AH,1 ;判断PC键盘是否有按键按下 INT 16H

JZ BEGIN ;无按键则跳回继续循环,有则退出 QUIT: MOV AX,4C00H ;返回到DOS INT 21H

CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键

JNZ GETKEY1 ;有键按下则跳置GETKEY1 OUT DX,AL

MOV SI,3000H ;建立缓冲区,存放要显示的键值 MOV AL,00H ;先初始化键值为0 MOV [SI],AL MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,3005H MOV DS,AX

ASSUME CS:CODE,DS:DATA

GETKEY1:CALL DIS ;显示刷新 CALL DALLY CALL DALLY

CALL CLEAR ;清屏 CALL CCSCAN ;再次扫描按键

JNZ GETKEY2 ;有键按下则跳置GETKEY2 JMP BEGIN ;否则跳回开始继续循环

GETKEY2:MOV CH,0FEH

MOV CL,00H COLUM: MOV AL,CH MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX

L1: TEST AL,01H JNZ L2 MOV AL,00H JMP KCODE

L2: TEST AL,02H JNZ L3 MOV AL,04H JMP KCODE

L3: TEST AL,04H JNZ L4 MOV AL,08H JMP KCODE

L4: TEST AL,08H JNZ NEXT MOV AL,0CH

KCODE: ADD AL,CL CALL PUTBUF PUSH AX

KON: CALL DIS CALL CLEAR CALL CCSCAN

JNZ KON ;设置当前检测的是第几列

;选取一列,将X1~X4中一个置0 ;读Y1~Y4,用于判断是哪一行按键闭合;是否为第1行 ;不是则继续判断

;设置第1行第1列的对应的键值 ;是否为第2行 ;不是则继续判断

;设置第2行第1列的对应的键值 ;是否为第3行 ;不是则继续判断

;设置第3行第1列的对应的键值 ;是否为第4行 ;不是则继续判断

;设置第4行第1列的对应的键值 ;将第1列的值加上当前列数,确定按键值 ;保存按键值 ;显示刷新

;清屏

;扫描按键,判断按键是否弹起 ;未弹起则继续循环等待弹起

POP AX

NEXT: INC CL ;当前检测的列数递增 MOV AL,CH

TEST AL,08H ;检测是否扫描到第4列 JZ KERR ;是则跳回到开始处

ROL AL,1 ;没检测到第4列则准备检测下一列

MOV CH,AL JMP COLUM

KERR: JMP BEGIN

CCSCAN PROC NEAR MOV AL,00H MOV DX,MY8255_A

OUT DX,AL MOV DX,MY8255_C

IN AL,DX NOT AL AND AL,0FH RET

CCSCAN ENDP

CLEAR PROC NEAR MOV DX,MY8255_B MOV AL,00H OUT DX,AL RET CLEAR ENDP

DIS PROC NEAR PUSH AX MOV SI,3000H MOV DL,0DFH

MOV AL,DL AGAIN: PUSH DX

MOV DX,MY8255_A

OUT DX,AL MOV AL,[SI] MOV BX,OFFSET DTABLE AND AX,00FFH

ADD BX,AX

MOV AL,[BX] ;扫描是否有按键闭合子程序

;将4列全选通,X1~X4置0 ;读Y1~Y4 ;取出Y1~Y4的反值 ;清除数码管显示子程序

;段位置0即可清除数码管显示 ;显示键值子程序

;以缓冲区存放的键值为键值表偏移找到键值并显示 ;设置X1~X4,选通一个数码管 ;取出缓冲区中存放键值

;将键值作为偏移和键值基地址相加得到相应的键值

MOV DX,MY8255_B

OUT DX,AL ;写入数码管A~Dp CALL DALLY

INC SI ;取下一个键值

POP DX MOV AL,DL TEST AL,01H ;判断是否显示完? JZ OUT1 ;显示完,返回

ROR AL,1 MOV DL,AL

JMP AGAIN OUT1: POP AX RET

DIS ENDP

PUTBUF PROC NEAR MOV SI,DI MOV [SI],AL DEC DI CMP DI,2FFFH JNZ GOBACK

MOV DI,3005H

GOBACK: RET PUTBUF ENDP

DALLY PROC NEAR PUSH CX MOV CX,00FFH D1: MOV AX,00FFH D2: DEC AX JNZ D2 LOOP D1 POP CX RET

DALLY ENDP

CODE ENDS

END START

;未显示完,跳回继续 ;保存键值子程序 ;软件延时子程序

实验七 8254 定时/计数器定时应用实验(第15周作)

一、实验目的

(1) 掌握8254 的工作方式及应用编程。 (2) 掌握8254 的典型应用电路接法。 二、实验设备

PC 微机一台、TD-PITC 实验系统一套。 三、实验内容

1、定时应用实验。编写程序,应用8254 的定时功能,实现一个1Hz 的输

出。(提示:请参考熟读T8254-1.asm)

2、计数应用实验。编写程序,应用8254 的计数功能,用开关模拟计数,使每当按动KK1-五次后,产生一次计数中断,并在屏幕上显示一个字符‘5’。

(提示:请参考熟读T8254-2.asm) 四、实验原理

8254 是Intel 公司生产的可编程定时器。是8253 的改进型,比8253 具有更优良的性能。8254具有以下基本功能:

(1) 有3 个独立的16 位计数器;

(2) 每个计数器可按二进制或十进制(BCD)计数; (3) 每个计数器可编程工作于6 种不同工作方式;

(4) 8254 每个计数器允许的最高计数频率为10MHz(8253 为2MHz); (5) 8254 有读回命令(8253 没有),除了可以读出当前计数单元的内容外,还可以读出状态寄存器的内容。

(6) 计数脉冲可以是有规律的时钟信号,也可以是随机信号。计数初值公式为n=fCLKi÷fOUTi其中fCLKi 是输入时钟脉冲的频率,fOUTi 是输出波形的频率。

图1 是8254 的内部结构框图和引脚图,它是由与CPU 的接口、内部控制电路和三个计数器组成。8254 的工作方式如下述:

(1) 方式0:计数到0 结束输出正跃变信号方式。 (2) 方式1:硬件可重触发单稳方式。 (3) 方式2:频率发生器方式。 (4) 方式3:方波发生器。

(5) 方式4:软件触发选通方式。 (6) 方式5:硬件触发选通方式。 8254 的控制字有两个:一个用来设置计数器的工作方式,称为方式控制字;另一个用来设置读回命令,称为读回控制字。这两个控制字共用一个地址,由标识位来区分。控制字格式如表1 所示。读回控制字格式如表2 所示。当读回控制字的D4 位为0 时,由该读回控制字D1~D2 位指定的计数器的状态寄存器内容将被锁存到状态寄存器中。状态字格式如表3所示。

图1 8254 的内部接口和引脚

表1 8254 的方式控制字格式

表2 8254 读出控制字格式

表3 8254 状态字格式

五、实验说明及步骤

1.定时应用实验

编写程序,将8254 的计数器0 设置为方式3,用18.432KHz 作为CLK0 时钟。计数初值为18432,相当对CLK0 进行18432 分频。则在OUT0 得到1Hz 的输出。

实验步骤如下:

(1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。

(2) 运行Tdpit 集成操作软件,查看端口资源分配情况。记录与所使用片选信号对应的I/O端口始地址。

(3) 利用查出的地址,根据实验要求编写程序,然后编译链接。

(4) 参考图2 所示连接实验线路,单元中GATE0 已经连接了一个上拉电阻,所以GATE0不用连接(为什么?)。

(5) 运行程序,观察输出1Hz 是否正确(用示波器观察一下,画出输入输出波形图,暂时不做)。

图2 8254 定时实验参考接线图

参考程序:

;T8254-1.asm

;8254定时应用实验 输入18.432KHz,输出1Hz

;****************根据查看端口资源修改下列符号值******************* IOY0 EQU 9800H

;***************************************************************** MY8254_COUNT0 EQU IOY0+00H*2 ;8254计数器0端口地址 MY8254_COUNT1 EQU IOY0+01H*2 ;8254计数器1端口地址 MY8254_COUNT2 EQU IOY0+02H*2 ;8254计数器2端口地址 MY8254_MODE EQU IOY0+03H*2 ;8254控制寄存器端口地址 STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;计数器0,方式3 OUT DX,AL

MOV DX,MY8254_COUNT0 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,48H OUT DX,AL

QUIT: MOV AX,4C00H ;结束程序退出

INT 21H CODE ENDS

END START

8254/8253 控制字的含义 程序中:

START: MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;计数器0,方式3 OUT DX,AL-------这三句话的作用

MOV DX,MY8254_COUNT0 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,48H

OUT DX,AL------这几句指令的作用,装入的初始值是多少,初始值是怎样得到的?

实验结果是什么?思考题(1)如何完成?

2.计数应用实验

(注意,本实验成功与否与中断端口地址有很大关系,因为每一台计算机给它们分配的地址会不一样,所以大家要注意查一下端口地址,并记录下来)

编写程序,将8254 的计数器0 设置为方式3,计数值为5,用微动开关KK1+作为CLK0时钟,OUT0 连接PCI_INTR,每当KK1+按动5 次后产生中断请求,在屏幕上显示字符“5”,参考程序流程如图3 所示。

实验步骤如下:

(1) 确认从PC 机引出的两根扁平电缆已经连接在实验平台上。

(2) 启动纯DOS 环境,进入Tddebug 软件所在的安装目录。执行CHECK 程序,查看实验系统资源分配信息。

(3) 运行Tddebug 集成操作软件。操作Alt+E 进入程序编辑环境。利用查出资源分配信息,按实验要求参考实验流程图3-6-3 所示编写程序,然后编译链接。

(4) 参考图4 所示连接实验线路。

(5) 操作Alt+R 进入RmRun 菜单项,通过Run 命令运行程序。按动KK1+微动开关,观察是否5 次后屏幕显示字符“5”。

(6) 可以改变计数初值,从而实现不同要求的计数。

六、实验要求:

1、请尝试将这里的延时时间作为控制流水灯的显示,该如何连线和设计程

序?

2、计数器是如何记录按动开关的次数的?记录它主要起什么作用? 3、请回答本实验说明中的问题?

2、写出实验过程中所有的心得体会(包括你的各种尝试)。 七、思考题

1、在做完定时实验时.将CLK.在3个是钟上插一下.观察一下灯泡的显示有

何不同?为何插在1.8342MHZ上时灯泡不闪了

2、请大家想办法将8254的定时功能用于控制LED灯的显示.此时系统应该如

何连接? 3、计数方式能否改成按\几次\键就显示几,请修改电路(如果需要的话)和程序,

使满足条件。

(a)主程序 (b)中断处理程序

图3 8254 计数实验参考程序流程图

图4 8254 计数实验参考接线图

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

Top