微机系统与接口实验报告56.docx

上传人:b****8 文档编号:9855488 上传时间:2023-05-21 格式:DOCX 页数:40 大小:1.20MB
下载 相关 举报
微机系统与接口实验报告56.docx_第1页
第1页 / 共40页
微机系统与接口实验报告56.docx_第2页
第2页 / 共40页
微机系统与接口实验报告56.docx_第3页
第3页 / 共40页
微机系统与接口实验报告56.docx_第4页
第4页 / 共40页
微机系统与接口实验报告56.docx_第5页
第5页 / 共40页
微机系统与接口实验报告56.docx_第6页
第6页 / 共40页
微机系统与接口实验报告56.docx_第7页
第7页 / 共40页
微机系统与接口实验报告56.docx_第8页
第8页 / 共40页
微机系统与接口实验报告56.docx_第9页
第9页 / 共40页
微机系统与接口实验报告56.docx_第10页
第10页 / 共40页
微机系统与接口实验报告56.docx_第11页
第11页 / 共40页
微机系统与接口实验报告56.docx_第12页
第12页 / 共40页
微机系统与接口实验报告56.docx_第13页
第13页 / 共40页
微机系统与接口实验报告56.docx_第14页
第14页 / 共40页
微机系统与接口实验报告56.docx_第15页
第15页 / 共40页
微机系统与接口实验报告56.docx_第16页
第16页 / 共40页
微机系统与接口实验报告56.docx_第17页
第17页 / 共40页
微机系统与接口实验报告56.docx_第18页
第18页 / 共40页
微机系统与接口实验报告56.docx_第19页
第19页 / 共40页
微机系统与接口实验报告56.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机系统与接口实验报告56.docx

《微机系统与接口实验报告56.docx》由会员分享,可在线阅读,更多相关《微机系统与接口实验报告56.docx(40页珍藏版)》请在冰点文库上搜索。

微机系统与接口实验报告56.docx

微机系统与接口实验报告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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2