一.课程设计目的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、总流程图 输出说明是‘1’?开始读取按键是‘2’?是‘3’?是‘0’?结束NNNYY 选择无效播放曲3播放曲2播放曲1Y Y Y 程序总流程图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 ENDSDSEG SEGMENT;TO DO: Add your program's data hereINFO1 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,'|INVALIDSELECTION|',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,-1TIME1 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,392DW 330,294,262,294,4 DUP(330)DW 294,294,330,294,262, -1TIME2 DW 6 DUP(1),2 ;曲2的时间DW 2 DUP(1,1,2)DW 12 DUP(1),4FREG3 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, -1TIME3 DW 3 DUP(2),1,1,2,1,1,4 ;曲3的时间DW 2 DUP(2,2,1,1),4DW 3 DUP(2,1,1,1),4DSEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:DSEG, ss:SSEGINIT PROC ;Initialize proceduremov ax, dsegmov ds, axmov es, ax;TO DO: Add your initialize code here (as your requirement)ret ;return to the MAIN procedureINIT ENDPMAIN PROC ;Here is your program entry pointcall INIT ;call the INIT procedure to initialize the program ;**TO DO: Add your main code here**RE: MOV DX,28BH ;关闭扬声器MOV AL,89HOUT DX,ALMOV DX,28AHIN AL,DXMOV DX,288HOUT DX,ALLEA DX,INFO1 ;输出说明信息MOV AH,09HINT 21HLEA DX,INFO2INT 21HLEA DX,INFO3INT 21HLEA DX,INFO4INT 21HLEA DX,INFO5INT 21HLEA DX,INFO8INT 21HMOV AH,01H ;读取按键INT 21HCMP AL,'1' ;根据不同的按键播放不同的曲子JE MUSIC1CMP AL,'2'JE MUSIC2CMP AL,'3'JE MUSIC3CMP AL,'0'JE EXITLEA DX,INFO9 ;无效选择,输出错误提示MOV AH,09HINT 21HJMP REMUSIC1:MOV SI,OFFSET FREG1 ;指向曲1的表MOV BP,OFFSET TIME1CALL PLAYJMP REMUSIC2:MOV SI,OFFSET FREG2 ;指向曲2的表MOV BP,OFFSET TIME2CALL PLAYJMP REMUSIC3:MOV SI,OFFSET FREG3 ;指向曲3的表MOV BP,OFFSET TIME3CALL PLAYJMP REEXIT:MOV DX,28BH ;关闭扬声器MOV AL,89HOUT DX,ALMOV DX,28AHIN AL,DXMOV DX,288HOUT DX,ALLEA DX,INFO7 ;输出欢迎使用信息,增加界面友好度MOV AH,09HINT 21Hmov ax, 4c00h ;The end of the program, return to the systemint 21hMAIN ENDP;TO DO: Add other procedures(PROC) here (as your requirement);THE PROGRAMME OF PLAYING THE MUSICPLAY PROC ;PLAY子程序,功能上面介绍过L1: MOV BX,DS:[SI] ;取频率CMP BX,-1 ;看是否有效JE L0 ;无效就退出MOV CX,DS:[BP] ;读取时间MOV DL,CL ;保存时间ADD DL,30HMOV AH,02HINT 21HMOV DX,0FH ;计算计数初值,1M的十六进制为0F4240H MOV AX,4240HDIV BXMOV BX,AXMOV DX,283H ;设置计数器工作方式MOV AL,36HOUT DX,ALMOV DX,280H ;输入计数初值MOV AX,BXOUT DX,ALMOV AL,AHOUT DX,ALMOV DX,28BH ;开扬声器MOV AL,89HOUT DX,ALMOV DX,28AHIN AL,DXNOT ALMOV DX,288HOUT DX,ALROD:CALL DELAY ;延时LOOP RODMOV DX,28BH ;关扬声器MOV AL,89HOUT DX,ALMOV DX,28AHIN AL,DXMOV DX,288HOUT DX,ALCALL DELAY_OFF ;音节间延时ADD SI,2ADD BP,2JMP L1L0: RETPLAY ENDPDELAY PROC ;延时子程序PUSH AXPUSH BXPUSH CXPUSH DXMOV BX,09FHLL1:MOV CX,0FFFFH ;循环这么多次LOP: LOOP LOPDEC BXJNZ LL1POP DXPOP CXPOP BXPOP AXRETDELAY ENDPDELAY_OFF PROCPUSH AXPUSH BXPUSH CXPUSH DXMOV BX,0FHLL2:MOV CX,0CFFFHLOP2: LOOP LOP2DEC BXJNZ LL2POP DXPOP CXPOP BXPOP AXRETDELAY_OFF ENDPCSEG ENDS;TO DO: Add other segments here (as your requirement) END MAIN九.试验结果和分析1、试验结果:程序初始运行界面如果按错了键,会出现如下界面如果选择正确,将出现如下界面:2、分析这是按照方案一做的结果,按1~3分别播放“生日快乐”等歌,但由于本组人对音乐都是外行,各音阶频率的排序和延时时间搭配不好,导致音乐严重走调,但基本能听出不是噪音。