8255与8253的综合应用实例发声及音乐.docx
《8255与8253的综合应用实例发声及音乐.docx》由会员分享,可在线阅读,更多相关《8255与8253的综合应用实例发声及音乐.docx(18页珍藏版)》请在冰豆网上搜索。
8255与8253的综合应用实例发声及音乐
实验一8255与8253的综合应用实例:
发声及音乐
一、实验要求
利用定时/计数器8253和并行接口8255控制扬声器发声。
8253的输入时钟CLK的频率1.19318MHz。
二、实验设计
(1)硬件设计(如下图)
(2)软件设计:
音乐程序如下:
stacksegmentparastack'stack'
db64dup('stack...')
stackends
dsegsegmentpara'data'
mus_fredw330,392,330,294,330,392,330,294,330
dw330,392,330,294,262,294,330,392,294
dw262,262,220,196,196,220,262,294,330,262
dw-1
mus_timdw3dup(100),50,50,100,50,50,200
dw2dup(100,100,50,50),200
dw3dup(100,50,50),200
dsegends
csegsegmentpara'code'
assumecs:
cseg,ss:
stack,ds:
dseg
musicprocfar
movax,dseg
movds,ax
freq1:
leasi,mus_fre
leabp,ds:
mus_tim
freq:
movdi,[si]
cmpdi,-1
jeend_mus
movbx,ds:
[bp]
callsoundf
addsi,2
addbp,2
jmpfreq
end_mus:
jmpfreq1
movah,4ch
int21h
soundfprocnear
pushax
pushbx
pushcx
pushdx
pushdi
moval,0b6h;B
out43h,al;送控制字
movdx,12h;12348C为1.1931M
movax,348ch
divdi;除以频率为延时
out42h,al;送延时常数
moval,ah
out42h,al
inal,61h;保护并口状态,开并口
movah,al
oral,3
out61h,al
wait1:
movcx,600;发声延时
pushax
waitf1:
inal,61h
andal,10h;10h
cmpal,ah
jewaitf1
movah,al
loopwaitf1
popax
delay:
loopdelay
decbx
jnzwait1
moval,ah
out61h,al;还原并口
popdi
popdx
popcx
popbx
popax
ret
soundfendp
musicendp
csegends
end
三、实验步骤
1、打开“MasmForWindows集成实验环境”,新建一个文件。
2、将发声程序代码复制粘贴到文件中并保存
3、编译成目标文件
4、生成可执行文件
5、运行
四、实验结果
可以听到电脑扬声器发出《太湖船》的曲调
五、实验总结分析
我了解了怎样利用定时/计数器8253和并行接口8255控制扬声器发声,并且我把程序改成了一个死循环,可以让扬声器不停地发声。
在实验中我发现把每个数据后面添一个0,可以使声音变大,如果再添一个0就不会有声音了。
这是一个很有趣味的实验。
实验二微机键盘、8259与8255综合实验
一、实验目的
1、理解键盘的基本工作原理和过程。
2、掌握8259中断控制器的工作原理、编程方法。
3、掌握中断服务程序的设计方法。
4、熟悉8255作为数据接口和控制端信号引脚的作用。
二、实验内容
1、编写一键盘中断处理程序:
计算键盘中断次数,并用该程序替换系统键盘中断处理程序,使当按键8次(键盘中断产生16次)后,显示中断次数并结束应用。
2、置换系统的09H型中断服务程序,完成对键盘中断次数的统计。
在该中断服务程序中,必须对键盘控制器(口地址61H)复位。
复位键盘控制器只需读出端口61H的内容,并将最高位置1,再写入该端口。
此外,按键按下和抬起均会引起中断,所以实际中断次数等于按键次数乘2。
3、将按键的扫描码输出到屏幕上,并统计中断次数。
三、实验步骤
1、打开“MasmForWindows集成实验环境”,新建一个asm文件。
2、将发声程序代码复制粘贴到新建的asm文件中并保存
3、编译成目标文件
4、生成可执行文件
5、运行
四、实验结果
当按下基本键区的“”时出现的结果如下图:
当按下副键盘区的“1234”再按基本键区的“5678”时,出现的结果:
当按下光标移动键或者专用键时只要两次就会出现下面结果:
五、实验总结分析
通过这次实验我基本理解了键盘的基本工作原理和过程;掌握了8259中断控制器的工作原理、编程方法;掌握了中断服务程序的设计方法;熟悉了8255作为数据接口和控制端信号引脚的作用。
六、附录程序代码
DATASEGMENT
OLD_OFFDW?
OLD_SEGDW?
MKBAKDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
STARTPROCFAR
MOVAX,DATA
MOVDS,AX
INAL,21H;保留8259初始屏蔽字的状态
MOVMKBAK,AL
CLI;关中断
ANDAL,B;打开键盘屏蔽
OUT21h,AL
;中断向量修改程序
MOVAH,35H;取原中断向量
MOVAL,9H;9为键盘的中断类型号
INT21H
MOVOLD_OFF,BX;保存原中断向量到字变量中
MOVBX,ES
MOVOLD_SEG,BX
MOVAH,25H;设置新的中断向量
MOVAL,9H
MOVDX,SEGMYINT
MOVDS,DX
MOVDX,OFFSETMYINT
INT21H
XORDX,DX;清计数器
A1:
STI;开中断
CMPDX,10H;是否按了8次键
JZA2;是则结束程序运行
JMPA1;否则继续等待键盘中断
A2:
PUSHDX;保存计数值
CLI;关中断
;恢复原中断向量
MOVAH,25H
MOVAL,9H
MOVDX,OLD_SEG
MOVDS,DX
MOVDX,OLD_OFF
INT21H
MOVAL,MKBAK;恢复系统8259屏蔽字
OUT21h,AL
STI;开中断
POPDX;显示计数值
CALLSHWORD
MOVAX,4C00H
INT21H
RET
STARTENDP
MYINTPROCFAR;自定义键盘中断处理程序
STI;开中断
INCDX;计数加一
INAL,60H;读入扫描码(用户可对此键值进行处理)
PUSHDX
MOVDL,AL
CALLSHWORD
POPDX
INAL,61H;读入控制字节
MOVAH,AL
ORAL,80H
OUT61H,AL;复位键盘
CLI;关中断
MOVAL,61H;中断结束命令送中断控制器
OUT20H,AL
IRET;中断返回
MYINTENDP
SHWORDPROCNEAR;2→16进制显示
MOVCL,4
AGA:
ROLDX,CL
MOVAL,DL
ANDAL,0FH
CMPAL,10
JCNEXT2
ADDAL,7
NEXT2:
ADDAL,30H
MOVAH,0EH
INT10H
LOOPAGA
MOVDL,0AH
MOVAH,02H
INT21H
MOVDL,0DH
MOVAH,02H
INT21H
RET
SHWORDENDP
CODEENDS
ENDSTART
实验三8253与键盘综合实验模拟钢琴
一、实验目的:
1、了解键盘作为人机交互设备的基本功能;
2、熟悉键盘操作的常用系统功能函数;
3、键盘与8253的交互。
二、实验内容:
通过键盘模拟钢琴琴键控制8253发声实现钢琴的模拟弹奏
三、实验原理
通过给8253定时器装入不同的计数值,可以使其输出不同频率的波形。
当与门打开后,经过放大器放大的作用,便可驱动扬声器发出不同频率的音调,要使该音调的声音持续一段时间,只要插入一段延时程序,之后再将扬声器切断(关闭与门)即可。
另外,若要使计算机成为可直接演奏的钢琴,则需要使用系统调用的01H功能以接收键入字符,并且要建立一张表,使表上字符与频率值构成一个对应关系。
表上字符:
12345678
音符:
1234567i
频率值5245886606987848809881048
四、实验步骤
1、打开“MasmForWindows集成实验环境”,新建一个文件。
2、将发声程序代码复制粘贴到文件中并保存
3、编译成目标文件
4、生成可执行文件
5、运行
五、实验结果
按下数字键“1、2、3、4、5、6、7、8”,相对应发出的声音就是“多、来、米、发、梭、拉、西、多(高音)”,按“CTRL+C”则会退出“钢琴”状态。
按照五线谱弹奏就可以弹出乐曲了,只是要控制好节奏才弹得出美妙的音乐。
六、实验总结分析
这是一个趣味性实验,很有意思,既能满足娱乐的心,又能学到知识。
此次实验重点要掌握发音对应的频率值,还要知道发音的原理(要插入一段延时程序),有个缺点就是觉得声音有点小。
七、附录程序代码
datasegment
f1dw524,588,660,698,784,880,988,1048
dataends
codesegment
assumecs:
code,ds:
data
hhhprocnear
movdx,08ffh
movcx,0ffffh
yyy:
loopyyy
decdx
jnzyyy
ret
hhhendp
start:
movax,data
movds,ax
xxx:
movah,1h
int21h
cmpal,'1';判断是否为数字1~8
jbover
cmpal,'8'
jaover
subal,31h
movbl,2
mulbl
movah,0;ax高8位为0
movsi,ax;保护AL于SI中,以待后用,作为参数传递
movbx,f1[si]
movax,0000h
movdx,0012h
divbx
movbx,ax
movdx,43h;控制字
moval,0b6h
outdx,al;写入控制端口
moval,bl
out42h,al;先写低8位
moval,bh
out42h,al;后写高8位
inal,61h;读PB口当前状态
movah,al
oral,03h;使PB0、PB1均为1,打开与门
out61h,al;接通扬声器
callhhh;调用hhh
moval,ah
andal,0fch;使PB0、PB1均为0,关闭与门
out61h,al
jmpxxx
over:
movah,4ch
int21h
codeends
endstart