微机原理课程设计音乐播放器.docx
《微机原理课程设计音乐播放器.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计音乐播放器.docx(19页珍藏版)》请在冰豆网上搜索。
微机原理课程设计音乐播放器
一、课程设计的任务和目的
课程设计题目:
音乐播放器
课程设计的实现目的:
本课程设计主要是通过汇编语言用软件编程的方法实现简单的音乐播放功能。
通过在《微机原理与接口技术》课程上所学的汇编知识和8253/8254芯片相关知识,来完成本课程设计;用汇编程序完成键控音乐播放器的,用8253/8254定时器来产生声音。
该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
通过课程设计环节来加强对所学知识的理解和应用。
二、课程设计相关知识
定时/计数器8253/58254
在微机及控制系统中,经常要用到定时信号。
如系统的日历时钟,动态存储器刷新。
对外部执行机构控制时也需要定时中断、定时检测、定时查询等。
定时的方法主要是两种:
软件定时:
利用指令的执行时间设计循环程序,使CPU执行延迟子程序的时间就是定时时间。
缺点:
执行延迟时,CPU一直被占用,降低了CPU的效率。
硬件定时:
用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间延迟。
突出优点为计数时不占用CPU时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU效率。
作为定时器可用8253或者8254,二者功能基本相同,知识工作的最高频率不一样。
本实验就采用了8254,其主要功能为:
(1)每片上有3个独立的16位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进制或十进制来计数。
(3)每个通道都有6种工作方式,都可以通过程序设置或改变。
(4)每个计数器的速率可高达10MHz。
主要部分有:
数据总线缓冲器、读/写控制逻辑、控制字寄存器、计数通道0#、1#、2#:
内部结构如下图:
8254内部结构
8254外部引脚
8254芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。
8254芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:
8254的引脚
(1)D7~D0:
双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
(2)RD:
来自于CPU的读控制信号输入引脚,低电平有效。
(3)WR:
来自于CPU的写控制信号输入引脚,低电平有效。
(4)CS:
芯片选择信号输入引脚,低电平有效。
(5)A1、A0:
地址信号输入引脚,用以选择8254芯片的通道及控制字寄存器。
(6).VCC及GND:
+5V电源及接地引脚。
(7)CLKi:
i=0,1,2,第i个通道的计数脉冲输入引脚,8254规定,加在CLK引脚的输入时钟信号的频率不得高于,即时钟周期不能小于380ns。
(8)GATEi:
i=0,1,2,第i个通道的门控信号输入引脚,门控信号的作用与通道的工作方式有关。
(9)OUTi:
i=0,1,2,第i个通道的定时/计数到信号输出引脚,输出信号的形式由通道的工作方式确定,此输出信号可用于触发其它电路工作,或作为向CPU发出的中断请求信号。
8254端口地址
8254控制字
说明:
(1)8254每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
(2)8254编程时先写控制字,再写时间常数。
8254工作方式
(1)方式0:
计数结束产生中断方式
当写入控制字后,OUT变为低电平,当写入初值后立即开始计数,当计数结束时,变成高电平。
(2)方式1:
可编程单次脉冲方式
当初值装入后且GATE由低变高时,OUT变为低电平,计数结束变为高电平。
(3)方式2:
频率发生器方式
当初值装入时,OUT变为高;计数结束,OUT变为低。
该方式下如果计数未结束,但GATE为低时,立即停止计数,强制OUT变高,当GATE再变高时,便启动一次新的计数周期。
(4)方式3:
方波发生器
当装入初值后,在GATE上升沿启动计数,OUT输出高电平;当计数完成一半时,OUT输出低电平。
方式3与方式2的工作方式类似,也是在初始化完成后能重复循环计数,只是输出的波形不同。
(5)方式4:
软件出发选通方式
进入工作方式4,OUTi输出高电平。
装入计数值n后,如果GATE为高电平,则立即开始减“1”计数,直到计数值减到“0”为止,OUTi输出宽度为一个CLKi周期的负脉冲。
由软件装入的计数值只有一次有效,如果要继续操作,必须重新置入计数初值n。
如果在操作的过程中,GATE变为无效,则停止减“1”计数,到GATE再次有效时,重新从初值开始减“1”计数。
(6)方式5:
硬件触发方式计数
进入工作方式5,OUTi输出高电平,硬件触发信号由GATE端引入。
因此,开始时GATE应输入为0,装入计数初值n后,减“1”计数并不工作,一定要等到硬件触发信号由GATE端引入一个正阶跃信号,减“1”计数才会开始,待计数值计到“0”,OUTi将输出负脉冲,其宽度固定为一个CLKi周期,表示定时时间到或计数次数到。
三、程序设计思路
所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。
不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。
CPU通过对定时器的通道2(端口地址为42)进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低控制通道2门控的开断。
以产生特殊的音响。
当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可算出来:
533Hz×896÷频率=1234DC÷频率
在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。
其位组合的格式如下:
当通道2用于发声时,采用的是模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。
产生指定频率声音的程序段如下:
MOVAL,0B6H
OUT43H,AL;43H为8254的控制字端口
MOVDX,12H
MOVAX,34DCH
DIVDI;(DI)=频率
OUT42H,AL;42H为8254的通道2端口
MOVAL,AH
MOV42H,AL
从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。
送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号,端口61H的PA1位和定时器的输出信号同时作为与门的输入,PA0和PA1位可由程序决定为0还是为1。
显然只有PA0和PA1都是1时,才能使扬声器发出声音。
控制音长的时间可以简单地通过反复执行指令来得到。
我们知道执行2801次LOOP指令约需要10MS的时间。
因此用10MS的倍数值来控制扬声器开关的时间间隔,就可控制发声的音长了。
实现程序如下:
INAL,61H
MOVAH,AL
ORAL,3
OUT61H,AL;开扬声器
L:
MOVCX,2801
DY:
LOOPDY
DECBX
JNZL
MOVAL,AH
OUT61H,AL;关扬声器
四、功能流程图及子程序说明
1、总流程图
MAIN程序:
MAIN程序是总程序,输出说明,等待用户按键并读取键值。
根据不同的按键选择调用播音子程序播放不同的歌曲。
2、音乐播放子程序流程图
PLAY子程序:
PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。
从SI的指向的音节表中取一个频率,只要不是-1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率。
开启扬声器,根据所取的时间调用若干次延时子程序。
这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。
最后修改SI和BP,指向下一个频率,重复上面的工作
DELAY子程序和DELAY_OFF子程序:
两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms。
五、试验结果截屏:
初始界面:
如果按错了键,会出现如下界面:
如果选择正确,将出现如下界面:
六、参考文献
【1】李长青.微机原理与接口技术.徐州:
中国矿业大学出版社,2006
【2】沈美明.汇编语言程序设计实验教程.北京:
清华大学出版社,2002年
【3】周明德.微机原理与接口技术.北京:
人民邮电出版社,2002年
七、总结
在本次设计中,可以说是一次成功的经验。
在我们学完了《微型计算机原理与接口技术》这门课的基础上来做这个设计,通过设计后,使我们对这门课的理论知识的理解有很大程度上的加强。
微机原理这门课程本身是一门实验性和工程性很强的专业技术课,因此不仅要重视理论教学,更应注意实践技能的培养和训练。
课程设计是这门课程的一个重要环节,通过课程设计,巩固、加深和拓宽了学习的理解,本课程设计的重点目标是使用汇编语言,而不过多涉及硬件方面的太多知识。
在编程方面我通过本次课程设计学到了很多。
一开始面对很长的程序往往有畏难情绪,感觉无法下手,没办法只能硬着头皮啃下去,多看几个和音乐播放有关的汇编程序,然后我就能慢慢看懂了并理解了别的作者的设计思路。
然后再根据自己的思路,对照本人在图书馆借的汇编语言指导书慢慢编写符合自己思路的程序。
一次写出来的程序肯定不会是正确的,还需要进一步调试它。
检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。
编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。
调试程序中,学习了DEBUG的使用,DEBUG对检查程序的错误作用很大。
同时,也要灵活使用各种调试方法,来缩小寻找错误的范围。
书到用时方恨少。
在课程设计过程中,我才体会到这句话的深意。
课堂上学的8254的知识和汇编语言都太少,还不足以完成本次课设,为此我经常跑图书馆借了各种各样的工具书。
有的书用处较大,有的书仅能用到一小块知识,就是这样,一步步在知识的海洋里我寻觅着自己需要的东西,确实克服了不少困难,解决了不少问题。
或许坎坷才能更好的使人成长。
在这次的课程设计中,我的收获是不但做出了一个符合要求的音乐播放器,而且为自己积累了一些宝贵的经验。
同时我也对音乐方面的频率知识有了一些认识,我想如果不是本次课程设计中用到这方面知识,我这辈子可能没有机会去接触这方面的知识了。
这,或许也是我比别的同学多出的一点收获吧!
六、附录
1、源程序代码:
SSEGSEGMENTPARASTACK'stack'
dw100hdup(0);Resizethestackbychangingthenumber'100'
SSEGENDS
DSEGSEGMENT
INFO1DB0DH,0AH,'--------------------------',0DH,0AH,'THEREARE3SONGS:
',0DH,0AH,0DH,0AH,'$'
INFO2DB'BIRTHDAY',0DH,0AH,'$'
INFO3DB'',0DH,0AH,'$'
INFO4DB'',0DH,0AH,'$'
INFO5DB'',0DH,0AH,'$'
INFO6DB'YOUHAVECHOSEN:
$'
INFO7DB'THANKYOUFORYOURUSE',0DH,0AH,'$'
INFO8DB'---------------------------',0DH,0AH,'PRESSTHEKEYTOSELECTSONG!
',0DH,0AH,'$'
INFO9DB0DH,0AH,'-------------------',0DH,0AH,'|INVALIDSELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$'
FREG1DW2dup(262),294,262,349,262,262,294,262,392,249,262,262,523,440,349;曲1的频率
DW330,294,466,266,440,349,392,349,-1
TIME1DW1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,4,1,1,2,2,2,4;曲1的时间
FREG2DW330,294,262,294,3DUP(330);曲2的频率
DW3DUP(294),330,392,392
DW330,294,262,294,4DUP(330)
DW294,294,330,294,262,-1
TIME2DW6DUP
(1),2;曲2的时间
DW2DUP(1,1,2)
DW12DUP
(1),4
FREG3DW330,392,330,294,330,392,330,294,330,330,392,330,294,262,294,330,392,294;曲3的频率
DW262,262,220,196,220,262,294,332,262,-1
TIME3DW3DUP
(2),1,1,2,1,1,4;曲3的时间
DW2DUP(2,2,1,1),4
DW3DUP(2,1,1,1),4
DSEGENDS
CSEGSEGMENT
assumecs:
CSEG,ds:
DSEG,es:
DSEG,ss:
SSEG
INITPROC;初始化程序
movax,dseg
movds,ax
moves,ax
INITENDP
MAINPROC;程序入口
callINIT
RE:
MOVDX,28BH;关闭扬声器
MOVAL,89H
OUTDX,AL
MOVDX,28AH
INAL,DX
MOVDX,288H
OUTDX,AL
LEADX,INFO1;输出说明信息
MOVAH,09H
INT21H
LEADX,INFO2
INT21H
LEADX,INFO3
INT21H
LEADX,INFO4
INT21H
LEADX,INFO5
INT21H
LEADX,INFO8
INT21H
MOVAH,01H;读取按键
INT21H
CMPAL,'1';根据不同的按键播放不同的曲子
JEMUSIC1
CMPAL,'2'
JEMUSIC2
CMPAL,'3'
JEMUSIC3
CMPAL,'0'
JEEXIT
LEADX,INFO9;无效选择,输出错误提示
MOVAH,09H
INT21H
JMPRE
MUSIC1:
MOVSI,OFFSETFREG1;指向曲1的表
MOVBP,OFFSETTIME1
CALLPLAY
JMPRE
MUSIC2:
MOVSI,OFFSETFREG2;指向曲2的表
MOVBP,OFFSETTIME2
CALLPLAY
JMPRE
MUSIC3:
MOVSI,OFFSETFREG3;指向曲3的表
MOVBP,OFFSETTIME3
CALLPLAY
JMPRE
EXIT:
MOVDX,28BH;关闭扬声器
MOVAL,89H
OUTDX,AL
MOVDX,28AH
INAL,DX
MOVDX,288H
OUTDX,AL
LEADX,INFO7;输出欢迎使用信息,增加界面友好度
MOVAH,09H
INT21H
movax,4c00h;Theendoftheprogram,returntothesystem
int21h
MAINENDP
PLAYPROC;PLAY子程序,功能上面介绍过
L1:
MOVBX,DS:
[SI];取频率
CMPBX,-1;看是否有效
JEL0;无效就退出
MOVCX,DS:
[BP];读取时间
MOVDL,CL;保存时间
ADDDL,30H
MOVAH,02H
INT21H
MOVDX,0FH;计算计数初值,1M的十六进制为0F4240H
MOVAX,4240H
DIVBX
MOVBX,AX
MOVDX,283H;设置计数器工作方式
MOVAL,36H
OUTDX,AL
MOVDX,280H;输入计数初值
MOVAX,BX
OUTDX,AL
MOVAL,AH
OUTDX,AL
MOVDX,28BH;开扬声器
MOVAL,89H
OUTDX,AL
MOVDX,28AH
INAL,DX
NOTAL
MOVDX,288H
OUTDX,AL
ROD:
CALLDELAY;延时
LOOPROD
MOVDX,28BH;关扬声器
MOVAL,89H
OUTDX,AL
MOVDX,28AH
INAL,DX
MOVDX,288H
OUTDX,AL
CALLDELAY_OFF;音节间延时
ADDSI,2
ADDBP,2
JMPL1
L0:
RET
PLAYENDP
DELAYPROC;延时子程序
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVBX,09FH
LL1:
MOVCX,0FFFFH;循环这么多次
LOP:
LOOPLOP
DECBX
JNZLL1
POPDX
POPCX
POPBX
POPAX
RET
DELAYENDP
DELAY_OFFPROC
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVBX,0FH
LL2:
MOVCX,0CFFFH
LOP2:
LOOPLOP2
DECBX
JNZLL2
POPDX
POPCX
POPBX
POPAX
RET
DELAY_OFFENDP
CSEGENDS
ENDMAIN
2、各个音符的对应频率表:
音符 频率/HZ半周期/us 音符 频率/HZ 半周期/us
低1DO 262 1908 #4FA# 740 0676
#1DO# 277 1805 中5SO 784 0638
低2RE 294 1700 #5SO# 831 0602
#2RE# 311 1608 中6LA 880 0568
低3M 330 1516 #6LA# 932 0536
低4FA 349 1433 中7SI 988 0506
#4FA# 370 1350 高1DO 1046 0478
低5SO 392 1276 #DO# 1109 0451
#5SO# 415 1205 高2RE 1175 0426
低6LA 440 1136 #2RE# 1245 0402
#6LA# 466 1072 高3M 1318 0372
低7SI 494 1012 高4FA 1397 0358
中1DO 523 0956 #4FA# 1480 0338
#1DO# 554 0903 高5SO 1568 0319
中2RE 578 0842 #5S0# 1661 0292
#2RE# 622 0804 高6LA 1760 0284
中3M 659 0759 #6LA# 1865 0268
中4FA 698 0716 高7SI 1976 0253