东南大学
《微机实验及课程设计》
实验报告
实验三TPC 装置系统,I/O 与存储器
实验四(1)简单输入输出
姓名:学号:08011
专业:自动化实验室:计算机硬件技术
实验时间:2013 年04月9日报告时间:2013 年04月21 日评定成绩:审阅教师:
一. 实验目的与内容
实验三:
(1)实验目的:
1)了解掌握TPC 实验系统的基本原理和组成结构,学会测试检查TPC-PCI 总线转接卡地址;
2)正确掌握I/O 地址译码电路的工作原理,学会动态调试程序DEBUG/TD 的直接I/O 操作方法;
3)学会利用I/O 指令单步调试检查硬件接口功能,学会利用示波器检测I/O 指令执行时总线情况;
4)进一步熟悉8086/8088 及PC 机的分段存储特性,了解存储器扩展原理,完成编程及测试。(2)实验内容:
1)观察了解TPC-2003A 实验系统的基本原理和组成结构,测试基本单元电路功能,熟悉各部分辅助
电路的使用;
2)通过Win/XP 控制台硬件信息或测试程序检查TPC-PCI 总线转接卡地址,并记录;
3)按图3.3-5 的I/O 地址译码测试参考电路连线,分析电路原理,分别利用动态调试程序直接I/O
操作功能和单步功能测试;
4)编程利用片选负脉冲控制指示灯(如L7)闪烁发光(亮、灭、亮、灭、……),时间间隔通过软
件延时实现;
5)修改延时参数,使亮(约1秒)与灭的时间间隔分别为1 秒、5 秒和8 秒,记录延时程序对应参数
BX,CX。
实验四:
(1)实验目的
6)进一步掌握TPC实验装置的基本原理和组成结构
7)掌握利用I/O指令单步调试检查硬件接口功能,学会用示波器检测I/O指令执行时总线情况
8)掌握简单并行输入输出接口的工作原理和使用方法,进一步熟悉掌握输入输出单元的功能和使用
(2)实验内容
9)连接简单并行输出接口电路,编程从键盘输入一个字符或数字,将其ASCII码通过这个输出接口
电路输出,根据8个放光二极管发光情况验证正确性
10)连接简单并行输入接口电路,用逻辑电平开关K0~K7预置一字母的ASCII码,编程输入这个ASCII
码,并将其对应字母在屏幕上显示出来
二. 基本实验原理
实验三:
实验电路图见3.3-5,实验电路中D 触发器CLK 端输入脉冲时,上升沿使Q 端锁存输出高电平L7
发光,CD 端为低电平时L7 灭:
参考程序:程序名:decode.asm
ioportequ 0c800h-0280h ;tpc卡中设备的IO 地址
outport1 equ ioport+2a0h ;CLK 端译码输出端选为地址Y4 outport2 equ ioport+2a8h ;CD 端对应译码输出选为地址Y5 stacks segment stack
db 100 dup (?)
stacks ends
code segment
assumecs:code,ss:stacks
mainproc far
start: movax,stacks
movss,ax
mov dx,outport1 ;Y4,置位,CLK 端写
outdx,al
call delay ;调延时子程序
mov dx,outport2 ;Y5,清空CD 端写
outdx,al
call delay ;调延时子程序
mov ah,1
int 16h
je start ;ZF=1,无键输入
mov ah,4ch
int 21h ;返回DOS 操作系统
mainendp
delay proc near ;延时子程序
mov bx,2000
ZZZ: mov cx,0
ZZ: loop ZZ
decbx
jne ZZZ
ret
delayendp
code ends
end start
实验四:
(1)简单并行输入输出接口电路连线图
输出接口电路输入接口电路
(2)简单并行输入输出电路原理
数据D0~D7先预存入273中,当输出端口2A8H和写信号同时低电平时,发生时钟触发,此时将数据运送到输出端Q1~Q8。开关电平预先将所输入信号存入244中,同样当端口2A0H和读信号同时低电平时,使244使能端工作,数据通过244的输出端存入到D0~D7
三. 方案实现与测试
实验三:
(1)查看并替换TPC 扩展卡 I/O 和存储基地址
1)参照实验指导书安装接口卡及其驱动程序;
2)启动微机并打开“控制面板”-〉“系统”-〉“设备管理器”,找到“微机原理教学实验系统”,
打开“TPC”,点击“资源”看到占用的存储和中断资源,找到两个输入/输出范围,其中一个范围大小是 0ffH 的是 PCI 接口芯片上的设置寄存器组占用的 I/O 地址空间,另一个范围大小是7fH 的是 TPC 设备的 I/O 地址
由上图可知,实验中TPC 设备的 I/O 地址空间起始地址为0EC00H。
3)用记录下的实际基址值替换每个汇编程序头中的定义行中的值,并重新编译链接
代码为:
ioportequ 0EC00h-0280h
outport1equ ioport+2a0h
outport2 equ ioport+2a8h
(2)I/0译码测试实验电路
1)将试验箱安装好,并按原理图搭接译码电路。
2)执行下面两条指令:
MOV DX,0EC20H
OUT DX,AL
Y4输出一个负脉冲,灯亮
执行下面两条指令:MOV DX,0EC28H
OUT DX,AL
Y5输出一个负脉冲,灯灭
3)动态调试程序DEBUG/TD的直接I/O操作方法(OUTPUT):
?命令行方式比较简单,启动debug,在命令符-后键入O EC20 20回车,其中20H为输出量,
EC20H为端口地址。执行完第一句灯亮,执行第二句灯灭
?TD模式下,启动TD,将光标置于代码区右击可得到代码区的局部菜单,选中I/O选项将出现
菜单,选择Out byte,在编辑菜单中输入要输出的地址以及输出内容,格式为:输出地址,内容。例如要使译码电路Y5输出一个负脉冲,可键入相应内容如下图所示:
?通过让Y4,Y5交替输出负脉冲,观察L7的亮灭变化,总结I/O地址译码电路原理,尝试编写
程序利用这个负脉冲控制L7闪烁发光,时间间隔通过软件延时实现。
程序主要算法:
利用delay子程序进行延时操作,控制LED的亮灭。
delay proc near ;延时子程序
mov bx,2000
ZZZ: mov cx,0
ZZ: loop ZZ
decbx
jne ZZZ
ret
delay endp
将程序保存为.asm格式,使用tasm进行汇编,再使用tlink进行链接,得到.exe可执行文
件,使用TD进行调试,全屏下F9运行,观察实验箱。实验箱的LED灯进行周期性的亮灭。
修改延时长度,即bx中保存的数值,再进行汇编调试,观察LED的亮灭周期,随数值的增
大而延长或数值的减小而缩短。
实验四:
(1)按照图搭接好电路,编程从键盘输入字符或数字,将其ASCII码通过输出接口输出,根据点阵某一列
的发光情况验证正确性。
1)实验电路中并行输出接口的地址为2A8H,输出数据需要三条指令:
MOV AL,8
MOV DX,EC28
OUT DX,AL
DEBUG中运行如下图所示,则点阵的某一列灯点亮表示的二进制值为00001000,即为8。
2)编写程序如下:
ioport equ 0ec00h-0280h ;tpc卡中设备的io地址
ls273 equ ioport+2a8h ;译码输出端地址Y5片选ls273
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ss:stacks
main proc far
start:mov ax,stacks
movss,ax
mov ah,2 ;回车符
mov dl,0dh
int 21h
mov ah,1 ;等待键盘输入
int 21h
cmp al,27 ;判断是否为ESC键
je exit ;若是则退出
mov dx,ls273 ;若不是,从2A8H输出其ASCII码
out dx,al
jmp start ;转start
exit: mov ah,4ch ;返回DOS
int 21h
main endp
code ends
end start
若输入字符为a,则点阵的某一列灯点亮表示的二进制值为01100001,即为61,是a所对应的
ASCII码。
(2)用逻辑电平开关K0-K7预置一字母的ASCII码,编程输入这个ASCII码,并将其对应字母在屏幕上显
示出来。(标准ASCII码的范围为20H-FFH)
1)判断输入动态调试程序DEBUG/TD 的直接I/O 操作方法(Input)。
?TD 模式下,启动TD(全屏模式),将光标置于代码区右击后可得到代码区局部菜单,选中I/O 选
项出现菜单;
?选择in byte,在编辑菜单中输入所要读入数据的地址,确认后即可得到该地址的数据内容,要
读74ls244 的当前输出端的数据,可在编辑菜单中输入:
0EC00-280+2A0H 或 0EC20H
?确认后即可得到74LS244 输入端的数据,结果如下图所示
2)实验电路中并行输入接口的地址是2A0H,通过上述并行接口输入数据需要2条指令:
MOV DX,EC20
IN AL,DX
DEBUG中运行如下图所示,执行完这两条语句过后开关代表的数字08被存入AL。
3)编写程序让其显示开关电平所输入的ASCII码对应的数据值编写程序如下:
ioport equ 0EC00h-0280h ;tpc卡中设备的io地址
ls244 equ ioport+2a0h ;译码地址Y4片选ls244
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assume cs:code,ss:stacks
main proc far
start: movax,stacks
movss,ax
mov dx,ls244 ;从2A0输入一数据
in al,dx
movdl,al ;将所读数据保存在DL中
mov ah,02
int 21h
mov dl,0dh ;显示回车符
int 21h
mov dl,0ah ;显示换行符
int 21h
mov ah,06 ;是否有键按下
mov dl,0ffh
int 21h
jnz exit
je start ;若无,则转start
exit: mov ah,4ch ;返回DOS
int 21h
code ends
end start
如图所示,开关对应的二进制输入信号为01001000,即为48,此时屏幕显示字符H。符合程序设计要求。
四.选做实验内容:
实验三:
(1)如果用只访问一个I/O 地址(而不是二个I/O 地址)的方法来实现发光二极管闪烁发光,电路应怎样
连接?画出电路图。(提示:将D 触发器连接成1 位的计数器)。编写相应的程序使发光二极管闪烁发光,并上机验证。
答:电路修改:将D触发器的Q非段与D端相连接,CD端接+5V。
程序:
ioportequ 0ec00h-0280h ;tpc卡中设备的io地址
outport1 equ ioport+2a0h ;译码输出端地址Y4
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assumecs:code,ss:stacks
mainproc far
start: movax,stacks
movss,ax
mov dx,outport1
outdx,al
call delay ;调延时子程序
int 16h
je start
mov ah,4ch
int 21h
mainendp
delay proc near ;延时子程序
mov bx,2000
ZZZ: mov cx,0
ZZ: loop ZZ
decbx
jne ZZZ
ret
delayendp
code ends
end start
实验四:
(1)利用基本实验(1)中输出锁存电路将L0~L7制成流水灯,流水方向由键盘控制,可随时切换,流水
间隔时间也由键盘控制
设计思路:选择两个按键如“1”“2”分别控制流水灯的方向,至于控制流水间隔,我的想法是通过按一次键灯移位一次,这样由两个键控制了流水灯的方向和间隔,具体程序在之前的输出地程序中进行改动编写程序:
ioport equ 0b800h-0280h ;tpc卡中设备的io地址
ls273 equ ioport+2a8h ;译码输出端地址Y5片选ls273
stacks segment stack
db 100 dup (?)
stacks ends
code segment
assumecs:code,ss:stacks
mainproc far
start:mov ax,stacks
movss,ax
mov ah,2 ;回车符
mov dl,0dh
int 21h
mov ah,1 ;等待键盘输入
int 21h
cmp al,27 ;判断是否为ESC键
je exit ;若是则退出
mov dx,ls273 ;若不是,从2A8H输出其ASCII码
outdx,al
jmp start ;转start
exit: mov ah,4ch ;返回DOS
int 21h
mainendp
code ends
end start
四.分析与总结
实验三:
通过本实验,我们进一步掌握掌握了I/O地址译码电路的工作原理,通过对I/O口的输出进行控制,从而使得D触发器的状态改变,小灯开始闪烁。这是第一次做硬件实验,要连的线不多,但是由于一开始对实验箱还是不够熟悉,有时候找不到线应该接到哪里,但是仔细研究过实验箱的结构以后,我对它的各部分组成和使用时的注意事项都有了一定的了解。另外,实验前我还对TPC设备的I/O基址和TPC卡中的PCI接口芯片的I/O地址的概念和区分一头雾水,经过实验,我对于他们分别代表什么,和在程序中如何使用有了一定的认识。
总之,这次实验跟硬件打交道让人觉得很新鲜,也很有收获,对于课本上讲授的I/O地址译码电路的工作原理有了更加深刻的认识和比较直观的感受。
实验四:
本次实验熟悉了并行输入输出电路,学会了用TD和DEBUG对I/O进行直接操作的方法,也通过编程实现实验要求加深了对于I/O操作的理解。做输出实验时,按ESC键不退出,我们把CMP AL,27改为了CMP AL,32。希望程序在按下数字键2的时候退出,结果按了2还是不退出,在老师的指导下,通过单步调试发现,按下2键,AL变为32,但是比较的那一行代码不是CMP AL,32了,而是CMP AL,20 经过研究,在debug下和TD中直接输入代码
mov al,32
cmp al,32
运行以后ZF等于1,即此时默认32都是十六进制数,但是假如像下图一样在记事本中写好这样的代码,通过编译链接,在TD打开可以看到代码的第二行变成了CMP AL,20,也就是说明这时候的32被当成10进制数来处理了。因此我们在源代码中改写成32H,这样按下数字键2就可以退出程序了。
输入实验完成比较顺利。
总之,通过这部分的实践操作,我进一步掌握了TPC实验装置的基本原理和组成结构, 熟悉测试检查TPC-PCI总线转接卡地址、I/O地址译码电路的工作原理、动态调试程序直接I/O操作方法;掌握利用I/O 指令单步调试检查硬件接口功能,学会利用示波器检测I/O指令执行时总线情况;掌握简单并行输入输出接口的工作原理及使用方法, 进一步熟悉掌握输入输出单元的功能和使用,同时也熟悉了对于软件的编写以及配合硬件的使用。