北京邮电大学微机原理硬件实验报告.docx
- 文档编号:26710364
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:23
- 大小:260.08KB
北京邮电大学微机原理硬件实验报告.docx
《北京邮电大学微机原理硬件实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学微机原理硬件实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
北京邮电大学微机原理硬件实验报告
北京邮电大学
微机原理硬件实验报告
实验一 基础的I/O实验
一、实验目的
1.通过实验了解和熟悉实验台的结构,功能及使用方法。
2.通过实验掌握直接使用Debug的I、O命令来读写IO端口。
3.学会Debug的使用及编写汇编程序
二、实验要求
1、学习使用Debug命令,并用I、O命令直接对端口进行读写操作,
2、用汇编语言编写跑马灯程序。
(使用EDIT编辑工具)实现功能
A通过读入端口状态(ON为低电平),选择工作模式(灯的闪烁方式、速度等)。
B通过输出端口控制灯的工作状态(低电平灯亮)
三、实验原理
1、I/O端口的读写
I是读命令(即读输入端口的状态;-拨码开关的状态),O是写命令(即向端口输出数据;-通过发光管来查看)。
对于读端口来说,输入I端口地址回车,屏幕显示xx表示从端口读出的内容,即八位开关的状态ON是0,OFF是1。
对于写端口来说,输入O端口地址xx(xx表示要向端口输出的内容)回车,查看实验台上的发光二极管状态,0是灯亮,1是灯灭。
2、延时的实现
由于系统的时钟频率很高,如果直接使用这个时钟控制走马灯的话,将会造成灯闪烁过快,无法看到走马灯的形式。
所以,必须在程序中加入软件延时。
软件延时实现的方法有很多,基本的软件延时通常是由循环体来实现。
3、本次实验平台示意图
我们使用DOS主机控制这款PCI实验平台,读I/O即为读左下角8个开关的状态,写I/O即为写左下角八个LED的电平,控制其亮灭。
四、软件程序流程图
五、源程序
datasegment
timesdw0fffh ;控制延时的内存变量
dataends
stacksegment
db100dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
begin:
movax,data
movds,ax
movbl,0feh ;控制亮一个灯
abc:
movdx,0eee0h ;I/O地址
pushax
moval,bl
outdx,al ;将BL输出到I/O
calldelay ;延时
popax
lok:
pushax
inal,dx
movch,al ;如果暂停键被按下
andch,04h
cmpch,04h
popax
jzlok ;暂停
pushax
inal,dx
movbh,al ;比较反向键
andbh,01h
cmpbh,01h
popax
jzleft ;向左移动
jmpright ;向右移动
left:
pushax
inal,dx ;比较灯型键
andal,08h
cmpal,08h
jzleft1
rolbl,1 ;移动一格
left1:
rolbl,1 ;若灯型有效
popax ;再移动一格
jmpspeed
right:
pushax
inal,dx
andal,08h ;比较灯型键
cmpal,08h
jzright1 ;右移一格
rorbl,1
right1:
rorbl,1 ;灯型有效再右移一格
popax
jmpspeed
speed:
pushax
inal,dx
movbh,al
popax ;比较加速键
andbh,02h
cmpbh,02h
jzspeed1 ;高速模式
jmpspeed2 ;低速模式
speed1:
pushax
movax,06ffh
movtimes,ax ;延时变量修改
popax ;延时变短
jmpjian
speed2:
pushax
movax,0fffh
movtimes,ax ;延时变量修改
popax ;延时变长
jmpjian
jian:
movah,0bh ;判断键盘
int21h
oral,al
jzabc ;无按键按下,循环
movax,4c00h–按键按下,停止
int21h
delayproc ;延时子函数
pushcx
movcx,times ;延时时长由
dl1:
pushax ;times确定
popax
pushcx
dl2:
pushax
popax
loopdl2
popcx
loopdl1
popcx
ret
delayendp
codeends
endbegin
六、实验结果
经过测试,我们的实验板可以完成如下功能:
1、跑马灯具备两档速度控制
2、跑马灯可以切换方向(左右)
3、当按下暂停按键时,跑马灯暂停,拨起后继续工作
4、灯型按钮可以实现一格移位与两格移位的切换
5、程序运行中,按下键盘任意按键可以退出程序
七、实验中遇到的问题
1、软件延时的设计
由于主板主频为1.7GHZ,所以必须实现软件延时,才可以保证灯的点亮时间。
经过设计与计算,我们使用循环的总线操作来做这个软件延时。
具体是使用循环的PUSH和POP操作来占用总线时间。
2、实验操作问题
我们一到机房,就想当然的先把电脑打开。
但是电脑打开的过程中出现了问题。
我们询问老师后才得知,必须先给实验板上电,再打开电脑才可以。
否则电脑的配置将会出现错误。
八、思考题
1、在debug的a命令中,有些语句可以不写h字符的原因
在debug的a命令中,所有的输入数据都默认为16进制,这与在edit中编写asm文件是不一样的。
由于默认是16进制数字,所以省略掉h完全可以的。
九、实验感想
这是微原硬件实验的第一次实验,我通过这个小实验熟悉了我所使用的DOS系统和硬件环境,基本掌握了硬件测试方法,对接口地址和LED灯有了基本了解,为后续实验打下了基础。
实验三 8253计数器/定时器的应用
一、实验目的
1、学习掌握8253用作定时器的编程原理。
二、实验要求
完成一个音乐发生器,通过蜂鸣器放出音乐,并在数码管上显示乐谱。
音符频率对照表
音符
1(do)
2(re)
3(mi)
4(fa)
5(so)
6(la)
7(si)
i(do)
频率(Hz)
256
288
320
341
384
426.6
480
512
扩展功能:
利用小键盘实现弹琴功能,并显示弹奏的乐谱。
三、实验原理
1、定时器/计数器简介
I8253和I8254都是可编程计数器,它们的引脚兼容,功能与使用方法相同。
I8254是I8253的改进型。
微机系统使用的8254,其3个通道均有固定的用途:
0号计数器为系统时钟源,每隔55ms向系统主8259IR0提一次中断请求;1号计数器用于动态存储器的定时刷新控制;2号计数器为系统的发声源。
用户在使用微机系统的时候,可以使用0号和2号计数器,但不能改变对1号计数器的初始化。
2、初始化
使用8253前,要进行初始化编程。
初始化编程的步骤是:
1向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。
2向使用的计数器端口写入计数初值
3、控制字
D7D6=00:
使用0号计数器,D7D6=01:
使用1号计数器
D7D6=10:
使用2号计数器,D7D6=11:
无效
D5D4=00:
锁存当前计数值
D5D4=01:
只写低8位(高8位为0),读出时只读低8位
D5D4=10:
只写高8位(低8位为0),读出时只读高8位
D5D4=11:
先读/写低8位,后读/写高8位计数值
D3D2D1=000:
选择方式0,D3D2D1=001:
选择方式1
D3D2D1=X10:
选择方式2,D3D2D1=X11:
选择方式3
D3D2D1=100:
选择方式4,D3D2D1=101:
选择方式5
D0=0:
计数初值为二进制,D0=1:
计数初值为BCD码数
四、软件程序流程图
1、程序框图
这次实验中,我们用到的程序模块较复杂,所以先拿程序框图来说明各个子程序之间的关系,这样更加一目了然。
主程序中有两个主要的模块,一个是工作方式的选择模块,用来确定当前程序运行在什么状态(播放音乐或者弹琴),另一个模块是显示模块,用来在数码管显示当前播放器所播放的是哪一个音。
工作模块选择模块下有两个个子模块,分别是播放音乐模块和电子琴模块。
播放音乐模块是用来播放音乐,它在适当的时候从内存中取预置的音乐的一个音,把这个音有关的信息放到内存中特定的位置,并设定这个音的持续时间。
电子琴模块用来检测是否有键盘输入,一旦检测到有键盘输入,则把对应的音的有有关信息放到内存中特定的位置。
流程是先扫描键盘,把对应于八个音的八个键的工作状态读入PC中;再对检测输入模块读入的信息进行响应,通过这些信息判断哪些键被按下,把音符存入内存特定位置。
蜂鸣器播音模块从内存中特定位置中取出要播放的音的有关信息,并通过设置8253达到播放不同频率的音的效果。
三个模块彼此独立又彼此相联系,从而使得程序工作有条不紊。
2、程序流程图
本次实验的程序流程图如上图所示,在初始化完成后,我们先驱动数码管显示当前内存中即将播放的音符,再判断工作模式。
如果是电子琴模式,就扫描键盘,由键盘控制播放的音符。
如果是自动音乐模式,就从内存中读出乐谱开始播放。
最后判断乐曲有无播放完毕,播放完毕则重新开始。
接收到键盘的输入后,退出程序。
五、源程序
delaymacro;定义一个用于延时的宏
locallp1,lp2
pushcx
movcx,time
lp1:
pushcx
movcx,time
lp2:
looplp2
popcx
looplp1
popcx
over ;调用结束程序的宏
endm
;------------------------------
over macro;用于判断是否结束程序的宏
localll
pushax
movah,0bh
int21h
oral,al
jzll
jmpexit
ll:
popax
endm
;------------------------------
dis macro ;让数码管显示的宏
pushax
pushdx
movdx,pa
leadi,num0
moval,show
movah,0
adddi,ax
moval,[di]
outdx,al
popdx
popax
endm
;------------------------------------
data segment
time dw100h ;数码管延时
time2 dw500h ;播音延时计数
time3 dw20h ;空音延时计数
count dw0;用来计算播放到哪一个音
;------------------------------------
pa dw0ee00h ;8255的四个端口
pb dw0ee01h
pc dw0ee02h
ctrl dw0ee03h
;-----------------------------------
c0 dw0ee20h ;计数器的四个端口
c1 dw0ee21h
c2 dw0ee22h
ctrlc dw0ee23h
cnum db00110110b;播音时的控制字
cnum0 db00110010b;播空(不出声)时的控制字
;--------------------------------------
num0 db 00000000b;空音对应的显示
num1 db 00100001b;以下是8个音对应
num2 db 11110100b;的数码管显示
num3 db 11110001b
num4 db 00111001b
num5 db 11011001b
num6 db 11011101b
num7 db 01100001b
num8 db 11111101b
;----------------------------------------
sou dw10d ;空音的分频比
sou1 dw125d ;8个音的分频比
sou2 dw111d
sou3 dw100d
sou4 dw94d
sou5 dw83d
sou6 dw75d
sou7 dw67d
sou8 dw63d
play_ dw0;存放正要播放的音的分频比
play db0;正在播放的音
show db0;正在显示的音
pplay db0;前一个播放的间
pfun db0;前一次所使用的功能
gate db0;
;-----------------------------------------
;乐谱《菊花台》
music db3h,3h,0h,3h,2h,3h,3h,0h
db3h,5h,3h,2h,3h,3h,3h,0h
db1h,1h,1h,2h,3h,5h,3h,0h
db2h,2h,2h,1h,2h,2h,2h,0h
db3h,3h,5h,3h,6h,5h,5h,0h
db6h,5h,5h,3h,5h,5h,0h,5h
db3h,3h,2h,3h,5h,3h,2h,0h
db2h,2h,2h,1h,2h,2h,2h,0h
number dw$-music
;---------------------------------------
data ends
;--------------------------------------
sta segmentstack'stack'
db100dup(?
)
sta ends
;--------------------------------------
code segment
assumess:
sta,ds:
data,cs:
code
start:
movax,data
movds,ax
moves,ax
;----------------------------------------
;初始化8255芯片
mov al, 10000001b ;
mov dx,ctrl
out dx,al
;固定使用一个数码管
movdx,pb
moval,01h
outdx,al
;开始时显示为空
mov show, 0
;下面是主程序
lp:
dis
delay
call mode
jmp lp
;----------程序结束--------------------
exit:
movax,4c00h
int 21h
;---------------------------------------
mode procnear;模式选择函数
mov dx,0eee0h;读入端口,确定工作状态
inal,dx
testal,01h
jzmus
;---------------------------------------
movpfun,1h;1指的是是弹琴状态
callinput
movbl,gate
cmpbl,0
jznosou ;GATE为零是,表示没有按键输入
movbh,cnum;预定控制字
jmpsetc;
nosou:
movax,0
movplay,al;设定下一个播放的音
movshow,al;设置数码管的显示
movax,10d
movplay_,ax;设定下一整体上播放的音的分频比
movbh,cnum0 ;设定控制字
;--------------下面是播放的有关代码-----
setc:
movah,pplay;如所播放的音和前一个
moval,play
;一样,则跳过设置8253的代码
cmpah,al
jznoset
callcset
noset:
jmpmodex
;-------------------------------------
Mus:
moval,pfun
cmpal,0
jzjump
;检查上次所使用的功能,如果不同则重新调制
movpfun,0
movcount,0h
movcx,0
;CX为延时计数器
jump:
cmpcx,0
jnzcon;延时示结果,跳过根据count的户数,确定下一个播放的音
leasi,music
movbx,count
moval,[si+bx]
cmpal,0
jzstop
;根据播放的是不是空音,设置不同的延时
movcx,time2
movbh,cnum
jmpnext4
stop:
movcx,time3
movbh,cnum0
next4:
movshow,al;设置数码管
movplay,al
leasi,sou
movah,0
addsi,ax
addsi,ax
movdx,[si];取出对应音的分频比
movplay_,dx ;设置分频比
callcset
;COUNT计数自增
movbx,count
incbx
cmpbx,number
jzback
movcount,bx
jmpcon
back:
movcount, 0h
con:
deccx;延时计数减1
modex:
ret
mode endp
;----------------------------------------
cset procnear
movdx,ctrlc
moval,bh;使用之前设置好的控制字
outdx,al
movdx,c0;设置分频比
movax,play_
outdx,al;
moval,ah
outdx,al
moval,play;
movpplay,al
ret
cset endp
;----------------------------------------
input proc near
push cx
;----------------------------------------
movdx,pc
moval,0efh;扫描第一行
out dx,al
in al,dx
notal
andal, 0fh
movbl, al
movcl, 4h ;移至高4位
sal bl,cl
mov al,0dfh ;扫描第二行
outdx,al
in al,dx
notal
andal, 0fh
or bl, al;8个键的状态放在BL里
call chg
;------------------------------------------
next1:
pop cx
ret
input endp
;----------------------------------------
chg proc near
movcx,8h ;从BL最低位检测起
movbh,1h
lpchg:
test bh, bl
jznext2 ;若无则检测下一位
movplay,cl ;设置释放
movshow,cl ;设置数码管显示
leasi,sou
addsi,cx
addsi,cx
movax,[si]
movplay_,ax ;设置分频比
movgate,1
jmpchgex ;检测到一个按下则结束
next2:
salbh,1
looplpchg
movgate,0 ;没有按键输入
chgex:
ret
chg endp
;---------------------------------------
code ends
end start
六、电路连接图
实验中的电路图的连线方法为:
8253的CS接译码器输出Y1;8253的OUT端接蜂鸣器的BELL端;8253的门控信号GATE接+5V;8253的CLK端接Q7,清零复位电路的T/C端接地。
具体的电路图如下所示:
七、实验结果
经过测试,我们的实验板可以完成如下功能:
1、在DOS运行程序后,可以自动播放《菊花台》歌曲,播放完后自动从头再次播放。
在播放的同时,数码管的最低位显示当前正在播放的音符。
2、将最低位拨码开关推上去,进入电子琴模式。
在电子琴模式下,按下小键盘的八个按键,可以弹奏对应的音符。
数码管的最低位显示当前正在播放的音符。
3、程序运行中,按下键盘任意按键可以退出程序
八、实验中遇到的问题
1、多个程序同时进行的问题
在实验中,由于数码管显示、按键检测,蜂鸣器播放是同时进行的,所以在三个子程序的连接方面比较麻烦。
汇编语言是一个顺序执行的语言,这种并行的思想让我们很是头疼。
最后,我们在参考了一些代码实例后,灵活的使用内存保存阶段性数据,实现的三个功能程序的紧密相连。
2、键盘防抖问题
虽然上一个实验中,我们已经做过了按键防抖,但是在这个实验中,我们在设计防抖功能时还是遇到了一些问题。
由于这个按键的防抖不仅要检测上升沿,当输出为高电平时,需要持续输出同一个音符,这对于我们也是一个挑战。
最后,我们上网学习了类似的代码,很好的解决了这个问题。
九、思考题
写出计数初值、输入频率和输出频率的关系。
设计数初值为
,输入频率和
,输出频率为
,则有以下关系
则音符频率对照如下:
音符
1(do)
2(re)
3(mi)
4(fa)
5(so)
6(la)
7(si)
i(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京邮电 大学 微机 原理 硬件 实验 报告