微机系统与接口实验报告56.docx
《微机系统与接口实验报告56.docx》由会员分享,可在线阅读,更多相关《微机系统与接口实验报告56.docx(40页珍藏版)》请在冰点文库上搜索。
微机系统与接口实验报告56
东南大学
《微机系统与接口》
实验报告
实验五8253计数器/定时器
实验六8255并行输入输出
姓名:
学号:
专业:
电强化实验室:
计算机硬件技术
实验时间:
2015年05月05日报告时间:
2015年05月12日
评定成绩:
审阅教师:
实验五 8253计数器/定时器
一.实验目的
1.掌握计数器/定时器8253的基本工作原理和编程应用方法;
2.了解掌握8253的计数器/定时器典型应用方法。
注:
实验四的中断实验上次已经完成
二.实验内容
(1)计次计数器:
将计数器0设置为方式2,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化。
(2)定时器与级联:
将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。
(3)选做:
使用PC微机内8253驱动声音接口
IBM-PC机扬声器发声驱动系统如图所示。
由机内的8255I/O接口的PB0控制8253通道2的定时计数;PB1来控制扬声器的接通和断开,以此来发声。
8255PB口地址为61H;8253通道2口地址为42H,控制口为43H。
编程使扬声器发出‘1·2·3·4·5·6·7·1’(对应的频率分别为262、294、330、347、392、440、494、523Hz)的数字乐声。
三.基本实验原理
(1)计次计数器:
实验接线图如下:
程序设计流程图:
参考程序:
ioportequ0B800H-0280H
io8253aequioport+283H
io8253bequioport+280H
stacks
segmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ss:
stacks
mainprocfar
start:
movax,stacks
movss,ax
moval,14h;设置8253通道0为工作方式0,二进制计数
movdx,io8253a
outdx,al
movdx,io8253b;送计数初值为0FH
moval,0fh
outdx,al
ZZZ:
inal,dx;读计数初值
calldisp;调显示子程序
pushdx
movah,06h
movdl,0ffh
int21h
popdx
jzZZZ
movah,4ch;退出
int21h
mainendp
dispprocnear;显示子程序
pushdx
andal,0fh;首先取低四位
movdl,al
cmpdl,9;判断是否<=9
jlenum;若是则为'0'-'9',ASCII码加30H
adddl,7;否则为'A'-'F',ASCII码加37H
num:
adddl,30h
movah,02h;显示
int21h
movdl,0dh;加回车符
int21h
movdl,0ah;加换行符
int21h
popdx
ret;子程序返回
dispendp
codeends
endstart
(2)定时器与级联:
实验接线图如下:
程序设计框图如下:
参考程序:
ioportequ0b800h-0280h
io8253aequioport+280h;0地址
io8253bequioport+281h;1地址
io8253cequioport+283h;控制
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ss:
stacks
mainprocfar
start:
movax,stacks
movss,ax
movdx,io8253c;向8253写控制字
moval,36h;使0通道为工作方式3,00110110
outdx,al
movax,1000;写入循环计数初值1000,注意是AX
movdx,io8253a
outdx,al;先写入低字节
moval,ah
outdx,al;后写入高字节
movdx,io8253c
moval,76h;设8253通道1工作方式3,01110110
outdx,al
movax,1000;写入循环计数初值1000
movdx,io8253b
outdx,al;先写低字节
moval,ah
outdx,al;后写高字节
movah,4ch;程序退出
int21h
mainendp
codeends
endstart
(3)选做:
IBMPC机内扬声器接线原理图如图所示:
参考程序:
dsegsegment
freqdw262,294,330,349,392,440,494,523;扬声器发声各频率值
timdw400
dsegends
ssegsegmentstack
dw256dup(?
)
ssegends
csegsegment
mainprocfar
assumecs:
cseg,ds:
dseg
start:
movax,dseg
movds,ax
movsi,0
again:
movdi,freq[si]
movbx,tim
callgen
addsi,2
cmpsi,16
jnzagain
movAX,4C00h
int21h
mainendp
genprocnear
moval,0b6h;设置8253通道2方式3二进制计数
out43h,al
movdx,12h
movax,12928;DXAX=896*533h=18*65536+12928=1.19M
divdi
out42h,al;8253通道2口设置初值
moval,ah
out42h,al
inal,61h;读8255PB口
movah,al
oral,3
out61h,al
wait1:
movcx,0h
delay:
movax,10;延时子程序
delay2:
nop
nop
decax
jnzdelay2
loopdelay
decbx
jnzwait1
moval,ah
out61h,al
ret
genendp
csegends
endstart
三.方案实现与测试
实验步骤:
1.正确接线后,先用I/O命令方式初始化,检查计数器状态是否正常,再调试程序,具体如下:
(1)运行TPC集成环境或portr程序,测试卡地址;运行点阵演示程序(正常后继续)。
系统如果不稳定,可用MS-DOS方式编程运行。
(2)8253计数器0方式0:
Gate0--+5V,TD/Debug下单步Oc40314(初始化方式字),OC40010;(初值),CLK--按键或连续脉冲输入后IC400,检查计数变化;编程运行;
(3)8253定时器0,1方式3,级联接线:
TD/Debug下单步Oc40336(CH0方式字),OC400E8;OC40003;(1000初值低/高8位),Oc40376(CH1方式字),OC401E8;OC40103;(1000初值),IC400,IC401观察计数变化。
2.计次计数器
实验现象:
手动逐个输入单脉冲之后,计数值从F减至1,然后在out0输出一个高电平,再输入单脉冲,out0保持高电平不变。
(不知道该怎么拍照片就没拍,只拍了实验连线图,望老师见谅)
连线图如下:
3.定时器与级联
实验现象:
给计数器0接入1MHZ的CLK信号,计数器0为方式2,在计满1000后在out0输出一个低电平给计数器1的CLK信号;计数器1为方式3,形成一个方波发生器,最终输出OUT1接至LED灯观察,频率在两次分频之后变成1HZ,将out1连至LED灯,可以发现LED灯亮灭的频率为1HZ。
连线图如下:
4.选做实验现象:
PC机内内部扬声器发出“1234567891”的乐音,十分正常
四.分析与总结
在实验之前,只是通过在理论课上的学习了解了8253计数器芯片的内部结构,工作原理和初始化编程等理论上的知识。
而通过本实验,我熟悉了8253的接口逻辑和内部结构、工作原理、了解8253的6种工作方式。
首先我们按照实验指导书上的教程完成了以工作方式0下的计数程序。
在此程序下,计数器不能够循环工作,out0输出一个高电平之后不能变回低电平,但如果更改程序代码将工作方式调整为工作方式1,计数器就可以循环工作,可以看到逻辑笔的逻辑电平可以循环点亮。
第二个实验定时器的级联让我理解了如何将一个固有的1MHZ的频率通过两次分频变成1HZ频率的信号,这需要选择正确的8253的工作方式才能完成。
最后,还编写了程序来使计数器产生一定频率的信号来使扬声器产生一定的频率的声音信号,产生1~7的声音。
这次实验进行的比较顺利。
实验六8255并行输入输出
一. 实验目的与内容
实验目的:
1)掌握8255 方式0 的工作原理及使用方法,利用直接输入输出进行控制显示;
2)掌握8 段数码管的动态刷新显示控制;
3)分析掌握8255 工作方式1时的使用及编程,进一步掌握中断处理程序的编写。
实验内容:
(1)8255 方式0:
简单输入输出
实验电路如图3.7-1,8255C口输入接逻辑电平开关K0~K7,编程A口输出接LED显示电路L0~L7;用指令从C口输入数据,再从A 口输出。
(2)编程将A口 L0-L7 控制成流水灯,流水间隔时间由软件产生;流水方向由K0键在线控制,随时可切换;流水间隔时间也可由K4~K7 键编码控制,如0000对应停止,0001对应1秒,1111对应15秒,大键盘输入ESC 键退出。
(3)8段数码管静态显示:
按图3.7-2 连接好电路,将8255 的A 口PA0~PA6 分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1 接+5V(选中),S0、dp 接地(关闭)。
编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
(4)8段数码管动态显示:
按图3.7-3连接好电路,七段数码管段码连接不变,位码驱动输入端S1、S0 接8255 C 口的PC1、PC0。
编程在两个数码管上显示“56”。
(注意字符变换之间应使段位全灭,避免显示“影子”)
二.基本实验原理
1.实验电路图如下:
程序设计流程框图:
参考程序:
ioportequ0b800h-0280h;tpc卡中设备的io地址
io8255aequioport+288h;8255A口地址
io8255bequioport+28bh;8255控制寄存器端口地址
io8255cequioport+28ah;8255C口地址
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ss:
stacks
mainprocfar
start:
movax,stacks
movss,ax
movdx,io8255b;设8255为C口输入,A口输出
moval,8bh
outdx,al
inout:
movdx,io8255c;从C口输入一数据
inal,dx
movdx,io8255a;从A口输出刚才自C口
outdx,al;所输入的数据
movdl,0ffh;判断是否有按键
movah,06h
int21h
jzinout;若无,则继续自C口输入,A口输出
movah,4ch;否则返回DOS
int21h
mainendp
codeends
endstart
2.电路连线图与1相同
参考程序:
datasegment
ioportequ0b800h-0280h
io8255aequioport+288h
io8255bequioport+28bh
io8255cequioport+28ah
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,stacks
movss,ax
movdx,io8255b;设8255为C口输入,A口输出
moval,8bh
outdx,al
inout:
movcl,01h
movdx,io8255c;从C口输入一数据
inal,dx
testal,01
jneright;k0为高电平时向右
jmpleft;k0为低电平时向左
right:
movdx,io8255c;从C口输入一数据
inal,dx
andal,11110000b;判断高四位
cmpal,00h;判断延时,ah=00时停止,ah=10时延时移动显示
jeright
moval,cl
calldelay1
rolcl,1
movdx,io8255c;从C口输入一数据
inal,dx
testal,01
jneright;k0为高电平时向右
jmpleft
left:
movdx,io8255c;从C口输入一数据
inal,dx
andal,11110000b;判断高四位
cmpal,00h;判断延时,ah=00时停止,ah=10时延时移动显示
jeleft
moval,cl
calldelay1
rorcl,1
movdx,io8255c;从C口输入一数据
inal,dx
testal,01
jneright;k0为高电平时向右
jmpleft
delay1procnear
movdx,io8255a;从A口输出刚才自C口
outdx,al;所输入的数据
calldelay
moval,0
outdx,al
calldelay
ret
delay1endp
DELAYPROCNEAR;延迟子程序
pushcx
pushbx
movbx,0fffh
cc:
movcx,0ffffh
ccc:
loopccc
decbx
jnzcc
popbx
popcx
ret
DELAYENDP
codeends
endstart
3.电路连线图如下:
参考程序:
datasegment
ioportequ0b800h-0280h
io8255aequioport+288h
io8255bequioport+28bh
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1db0dh,0ah,'Inputanum(0--9h):
',0dh,0ah,'$'
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,stacks
movss,ax
movax,data
movds,ax
movdx,io8255b;使8255的A口为输出方式
movax,80h
outdx,al
sss:
movdx,offsetmesg1;显示提示信息
movah,09h
int21h
movah,01;从键盘接收字符
int21h
cmpal,'0';是否小于0
jlexit;若是则退出
cmpal,'9';是否大于9
jgexit;若是则退出
subal,30h;将所得字符的ASCII码减30H
movbx,offsetled;bx为数码表的起始地址
xlat;求出相应的段码
movdx,io8255a;从8255的A口输出
outdx,al
jmpsss;转SSS
exit:
movah,4ch;返回DOS
int21h
codeends
endstart
4.电路连线图如下:
程序设计流程如下:
参考程序:
datasegment
ioportequ0b800h-0280h;tpc卡中设备的io地址
io8255aequioport+28ah;8255C口地址
io8255bequioport+28bh;8255控制寄存器端口地址
io8255cequioport+288h;8255A口地址
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db5,6;存放要显示的个位和十位
bzdw?
;位码
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,stacks
movss,ax
movax,data
movds,ax
movdx,io8255b;将8255设为A口输出
moval,80h
outdx,al
movdi,offsetbuffer1;设di为显示缓冲区
loop2:
movbh,02
lll:
movbyteptrbz,bh
pushdi
decdi
adddi,bz
movbl,[di];bl为要显示的数
popdi
moval,0
movdx,io8255a
outdx,al
movbh,0
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
movdx,io8255c;自8255A的口输出
outdx,al
moval,byteptrbz;使相应的数码管亮
movdx,io8255a
outdx,al
movcx,3000
delay:
loopdelay;延时
movbh,byteptrbz
shrbh,1
jnzlll
movdx,0ffh
movah,06
int21h
jeloop2;有键按下则退出
movdx,io8255a
moval,0;关掉数码管显示
outdx,al
movah,4ch;返回
int21h
codeends
endstart
三.方案实现与测试
1.实验现象:
按实验原理中的电路连接好电路,若打开开关K0,则L0亮;若打开开关K1,则L1亮;其余开关与LED灯的对应关系相同。
此简单输入输出程序就是将8255A口读入的数据原封不动的从C口输出。
2.实验现象:
开关K0可以控制流水灯的方向,K0为高电平是流水灯向右,反之向左。
K4-K7为0000时流水灯停止,否则流水灯运行。
3.实验现象:
运行程序后显示“Inputanum(0--9h):
”,键盘中输入一个数字后数码管显示该数字
实验现象及连线截图如下:
4.实验现象:
运行程序后数码管显示“56”
四.选做与探索
1.编程实现递增00-99计数器
程序如下:
datasegment
ioportequ0b800h-0280h
io8255aequioport+28ah
io8255bequioport+28bh
io8255cequioport+288h
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db0,0;存放要显示的十位和个位
bzdw?
;位码
dataends
stackssegmentstack
db100dup(?
)
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks
start:
movax,stacks
movss,ax
movax,data
movds,ax
movdx,io8255b;将8255设为A口输出
moval,80h
outdx,al
movdi,offsetbuffer1;设di为显示缓冲区
loop1:
movcx,0300h;循环次数
loop2:
movbh,02
lll:
movbyteptrbz,bh
pushdi
decdi
adddi,bz
movbl,[di];bl为要显示的数
popdi
movbh,0
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
movdx,io8255c;自8255A的口输出
outdx,al
moval,byteptrbz;使相应的数码管亮
movdx,io8255a
outdx,al
pushcx
movcx,0ffffh;如果显示过快,可更改cx值为最大0ffffh
delay:
loopdelay
movcx,0ffffh
xx:
loopxx
movcx,0ffffh
yx:
loopyx
movcx,0ffffh
y:
loopy
movcx,0ffffh
l:
loopl;延时
popcx
movbh,byteptrbz
shrbh,1
jnzlll
looploo