一. 课程设计目的
  1.通过D/A装换器产生模拟信号,使PC机作为简易音乐播放器。
  2.了解利用数模转换器产生音乐的基本方法。
二.课程设计任务
设计并实现一个键控音乐播放器。
要求:
(1)自己选用合适的芯片,不少于两种。
(2)自行设计电路并使用汇编语言编写程序完成键控音乐播放器功能。
(3)该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
三、总体设计方案
1、总体设计方案一
所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的。不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。而我们学过的有计数器可以产生各种频率,所以我们主要采用计数器8253产生各音符,用8255并行接口来控制扬声器的开关,达到播放音乐的功能。
2、总体设计方案二
可以使用0832(数模转换器)来产生频率,原理图:
   
    提出这个方案是因为我想产生模拟信号,来驱动扬声器,这样产生的声音更加圆润感觉更连续,效果更好点。
我们想把一个周期的波形分成32份,然后每份给8253一个值让他转换成模拟信号,不同的频率可以用8253计数器控制,比如要产生261Hz的频率,使用1MHz的话,周期就为1/261=3.83ms,分成32份,每份间隔时间就是3.83ms/32=0.12ms,换句话说就是送计数器0的初值为1M/261/32=120次。
3、各个音符的对应频率表:
音符  频率/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
四.部分电路设计及功能解说
1、频率发生电路
使用8253产生音符频率。8253采用方式3,产生方波信号,根据输入计数初值的不同产生不同频率的方波信号来驱动扬声器。
    设某音符频率为fHz,而CLK脉冲是1MHz,则计数初值N=1M/f。8253的控制端口为28BH,控制字为36H。
2、扬声器开关控制电路
使用8255并行接口芯片来控制扬声器的开和关,PC0始终接低电平,PA0和8253的OUT0接
在与门上,这样只有PA0=1时扬声器才有可能开通,否则不发声。关闭的方法是,从PC口读入数据再从PA口输出;而开扬声器时只要在输出PA口数据前对数据进行一个取反操作就可以了。
五.硬件接线图
六.软件设计流程图
1、总流程图
2、音乐播放子程序流程图
七.程序段功能汇总
1、MAIN程序
MAIN程序是总程序,输出说明,等待用户按键并读取键值。根据不同的按键选择调用播音子程序播放不同的歌曲。
2、PLAY子程序
PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。从SI的指向的音节表中取一个频率,只要不是-1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率。开启扬声器,根据所取的时间调用若干次延时子程序。这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。最后修改SI和BP,指向下一个频率,重复上面的工作。
3、DELAY子程序和DELAY_OFF子程序
两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms。
八.程序清单
SSEG SEGMENT PARA STACK 'stack'
    dw 100h dup(0) ;Resize the stack by changing the number '100'
SSEG ENDS
DSEG SEGMENT
  ;TO DO: Add your program's data here
INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'THERE ARE 3 SONGS:',0DH,0AH,0DH,0AH,'$'
INFO2 DB '1.HAPPY BIRTHDAY',0DH,0AH,'$'
INFO3 DB '2.SHEEP',0DH,0AH,'$'
INFO4 DB '3.RIVER',0DH,0AH,'$'
INFO5 DB '0.EXIT',0DH,0AH,'$'
INFO6 DB 'YOU HAVE CHOSEN :$'
INFO7 DB 'THANK YOU FOR YOUR USE',0DH,0AH,'$'
INFO8 DB '---------------------------',0DH,0AH,'PRESS THE KEY TO SELECT SONG!',0DH,0AH,'$'
INFO9 DB  0DH,0AH,'-------------------',0DH,0AH,'|INVALID SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$'
FREG1 DW  2 dup(262),294,262,349,262,262,294,262,392,249,262,262,523,440,349  ;曲1的频率
    DW  330,294,466,266,440,349,392,349,-1
TIME1 DW  1,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的时间
FREG2 DW  330,294,262,294,3 DUP(330)                                ;曲2的频率
    DW  3 DUP(294),330,392,392
    DW  330,294,262,294,4 DUP(330)
    DW  294,294,330,294,262, -1
TIME2 DW  6 DUP(1),2                                                ;曲2的时间
    DW  2 DUP(1,1,2)
    DW 12 DUP(1),4
FREG3 DW  330,392,330,294,330,392,330,294,330,330,392,330,294,262,294,330,392,294 ;曲3的频率
    DW  262,262,220,196,220,262,294,332,262, -1