微机原理音乐播放器文档格式.docx
《微机原理音乐播放器文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理音乐播放器文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
设计并实现一个键控音乐播放器。
(1)自己选用合适的芯片,不少于两种。
和其他硬件。
(2)自行设计电路并使用汇编语言编写程序完成键控音乐播放器功能。
(3)该播放器有若干首歌曲可以选择,开始时输出说明,要用户选择要播放的歌曲,然后根据用户按键进行播放、退出或出错提示。
(4)利用8253作为音阶频率发生器,对一段音乐进行编码后存入音符表,程序中可调用音符表自动播放音乐,从中了解音乐播放的原理。
(5)利用8253A和PC机,设计并实现简易音乐播放器
(6)使用汇编语言编写音乐播放程序。
(7)上机调试程序并联机,利用试验箱提供的扬声器发声.
(8)完成实验报告。
二、课程设计相关知识
2。
1定时/计数器8253A
在微机及控制系统中,经常要用到定时信号。
如系统的日历时钟,动态存储器刷新。
对外部执行机构控制时也需要定时中断、定时检测、定时查询等。
定时的方法主要是两种:
软件定时:
利用指令的执行时间设计循环程序,使CPU执行延迟子程序的时间就是定时时间.缺点:
执行延迟时,CPU一直被占用,降低了CPU的效率。
硬件定时:
用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间
延迟。
突出优点为计数时不占用CPU时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU效率.
主要功能:
(1)每片上有3个独立的16位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进
制或十进制来计数。
(3)每个通道都有6种工作方式,都可以通过程序设置或改变。
(4)每个计数器的速率可高达2MHz。
最高的计数时钟频率为2.6MHz.
28253A内部结构
8253的内部结构如图所示,它主要包括以下几个主要部分:
图2-18253的内部结构
(1).数据总线缓冲器
实现8253与CPU数据总线连接的8位双向三态缓冲器,用以传送CPU向8253的控制信息、数据信息以及CPU从8253读取的状态信息,包括某时刻的实时计数值。
(2).读/写控制逻辑
控制8253的片选及对内部相关寄存器的读/写操作,它接收CPU发来的地址信号以实现片选、内部通道选择以及对读/写操作进行控制。
(3).控制字寄存器
在8253的初始化编程时,由CPU写入控制字,以决定通道的工作方式,此寄存器只能写入,不能读出。
(4).计数通道0#、1#、2#:
这是三个独立的,结构相同的计数器/定时器通道,每一个通道包含一个16位的计数寄存器,用以存放计数初始值,一个16位的减法计数器和一个16位的锁存器,锁存器在计数器工作的过程中,跟随计数值的变化,在接收到CPU发来的读计数值命令时,用以锁存计数值,供CPU读取,读取完毕之后,输出锁存器又跟随减1计数器变化。
38253A外部引脚
8253芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。
8253芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:
(1).D7~D0:
双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
(2).
:
来自于CPU的读控制信号输入引脚,低电平有效。
(3).
:
来自于CPU的写控制信号输入引脚,低电平有效。
(4).
芯片选择信号输入引脚,低电平有效.
图2-18253的引脚
(5).A1、A0:
地址信号输入引脚,用以选择8253芯片的通道及控制字寄存器。
(6).VCC及GND:
+5V电源及接地引脚
(7).CLKi:
i=0,1,2,第i个通道的计数脉冲输入引脚,8253规定,加在CLK引脚的输入时钟信号的频率不得高于2。
6MHZ,即时钟周期不能小于380ns。
(8).GATEi:
i=0,1,2,第i个通道的门控信号输入引脚,门控信号的作用与通道的工作方式有关.
(9).OUTi:
i=0,1,2,第i个通道的定时/计数到信号输出引脚,输出信号的形式由通道的工作方式确定,此输出信号可用于触发其它电路工作,或作为向CPU发出的中断请求信号.2。
4计数器内部结构
每个计数器由一个16位可预置的减1计数器组成,计数初值可保存在16位的锁存器中,该锁存器只写不能读。
在计数器工作时,初值不受影响,以便进行重复计数。
图中每个计数器有一个时钟输入端CLK作为计数脉冲源,计数方式可以是二进制,计数范围1~10000H,也可以是十进制,计数范围1~65536。
门控端GATE用于控制计数开始和停止.输出OUT端当计数器计数值减到零时,该端输出标志信号。
图2-2计数器内部结构
58253A端口地址
图2-38253A端口地址
2.68253A功能
8253A既可作定时器又可作计数器:
(1)计数:
计数器装入初值后,当GATE为高电平时,可用外部事件作为CLK脉冲对计数值进行减1计数,每来一个脉冲减1,当计数值减至0时,由OUT端输出一个标志信号。
(2)定时:
计数器装入初值后,当GATE为高电平时,由CLK脉冲触发开始自动计数,当计数到零时,发计数结束定时信号。
除上述典型应用外,8253A还可作频率发生器、分频器、实时钟、单脉冲发生器等。
78253A控制字
图2-48253A控制字
说明:
(1)8253A每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
(2)8253A编程时先写控制字,再写时间常数.
88253A工作方式
(1)方式0:
计数结束产生中断方式
当写入控制字后,OUT变为低电平,当写入初值后立即开始计数,当计数结束时,变成高电平。
(2)方式1:
可编程单次脉冲方式
当初值装入后且GATE由低变高时,OUT变为低电平,计数结束变为高电平。
(3)方式2:
频率发生器方式
当初值装入时,OUT变为高;
计数结束,OUT变为低.该方式下如果计数未结束,但GATE为低时,立即停止计数,强制OUT变高,当GATE再变高时,便启动一次新的计数周期。
(4)方式3:
方波发生器
当装入初值后,在GATE上升沿启动计数,OUT输出高电平;
当计数完成一半时,OUT输出低电平。
图2-5方波图
方式3与方式2的工作方式类似,也是在初始化完成后能重复循环计数,只是输出的波形不同。
〈1〉计数过程
当把方式3的控制字写入控制字寄存器后,输出端OUT变成高电平,作为初始电平。
再将计数初值写入计数初值寄存器CR中,再经过一个时钟周期,计数初值被移入计数执行单元CE中,从下一个时钟脉冲开始作减1计数,方式3的计数过程分为两种情况:
第一种情况:
计数初值为偶数,当作减1计数减到N/2时,输出端OUT端变成低电平,减到0时,输出端OUT变成高电平,并重新从初值开始新的计数过程。
若GATE为高电平,则一直重复同样的计数过程.可见,输出端OUT输出连续的方波,故称方波发生器。
第二种情况:
计数初值为奇数,当作减1计数减到(N+1)/2以后,输出端OUT变成低电平,减到0时,输出端OUT又变成高电平。
并重新从初值开始新的计数过程。
这时输出端的波形为连续的近似方波。
〈2〉门控信号的影响
工作在方式3时,门控信号GATE的功能与工作方式2一样,即GATE为高电平时,允许计数;
GATE为低电平时停止计数。
GATE引脚上的信号从低电平跳到高电平时,将会重新把计数初值寄存器CR中的内容移入计数执行单元CE中,并以新装入的值重新开始计数.
〈3〉新的计数初值对计数过程的影响
如果在计数过程中写入新的初值,而GATE信号一直维持高电平,则新的初值不会影响当前的计数过程,只有在计数结束后的下一个计数周期,才按新的初值计数.若写入新的初值后,遇到门控信号的上升沿,则结束现行的计数过程,从下一个时钟脉冲下降沿开始按新的计数初值进行计数。
可见,工作在方式3时,当计数初值为偶数,OUT端输出连续的标准方波;
当计数初值为奇数,在每个计数周期内,有(N+1)/2个周期输出高电平,(N—1)/2个时钟周期输出低电平,OUT端输出连续的近似的方波。
三、总体设计方案
3.1总体设计方案一
所有音乐都是由各个不同频率的音阶和其延续时间的长短来实现的.不同的音乐是由各个音阶按某种排列各自播放一定时间形成的,将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。
而我们学过的有计数器可以产生各种频率,所以我们主要采用计数器8253产生各音符,用8255并行接口来控制扬声器的开关,达到播放音乐的功能。
3.2总体设计方案二
可以使用0832(数模转换器)来产生频率,原理图:
提出这个方案是因为我想产生模拟信号,来驱动扬声器,这样产生的声音更加圆润感觉更连续,效果更好点.
我们想把一个周期的波形分成32份,然后每份给8253一个值让他转换成模拟信号,不同的频率可以用8253计数器控制,比如要产生261Hz的频率,使用1MHz的话,周期就为1/261=3.83ms,分成32份,每份间隔时间就是3。
83ms/32=0。
12ms,换句话说就是送计数器0的初值为1M/261/32=120次。
3.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
622
0804
高6LA
1760
0284
中3M
659
0759
1865
0268
中4FA
698
0716
高7SI
1976
0253本文为互联网收集,请勿用作商业用途
四.部分电路设计及功能解说
4.1频率发生电路
使用8253产生音符频率。
8253采用方式3,产生方波信号,根据输入计数初值的不同产生不同频率的方波信号来驱动扬声器。
设某音符频率为fHz,而CLK脉冲是1MHz,则计数初值N=1M/f.8253的控制端口为28BH,控制字为36H。
4。
2扬声器开关控制电路
使用8255并行接口芯片来控制扬声器的开和关,PC0始终接低电平,PA0和8253的OUT0接在与门上,这样只有PA0=1时扬声器才有可能开通,否则不发声.关闭的方法是,从PC口读入数据再从PA口输出;
而开扬声器时只要在输出PA口数据前对数据进行一个取反操作就可以了.
五.硬件接线图
六。
软件设计流程图
6.1总流程图
6。
2音乐播放子程序流程图
七。
程序段功能汇总
7.1MAIN程序
MAIN程序是总程序,输出说明,等待用户按键并读取键值。
根据不同的按键选择调用播音子程序播放不同的歌曲。
7.2PLAY子程序
PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。
从SI的指向的音节表中取一个频率,只要不是—1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率.开启扬声器,根据所取的时间调用若干次延时子程序。
这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。
最后修改SI和BP,指向下一个频率,重复上面的工作.
7.3DELAY子程序和DELAY_OFF子程序
两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms.
八。
程序清单
SSEGSEGMENTPARASTACK'
stack’
dw100hdup(0);
Resizethestackbychangingthenumber'
100'
SSEGENDS
DSEGSEGMENT
;
TODO:
Addyourprogram'
sdatahere
INFO1DB0DH,0AH,'
——-—-—-—--————-——-———-—--—’,0DH,0AH,’THEREARE3SONGS:
’,0DH,0AH,0DH,0AH,'
$’
INFO2DB'
1.HAPPYBIRTHDAY’,0DH,0AH,'
$'
INFO3DB’2.SHEEP’,0DH,0AH,'
$'
INFO4DB’3。
RIVER'
0DH,0AH,’$’
INFO5DB’0.EXIT’,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;
Initializeprocedure
movax,dseg
movds,ax
moves,ax
;
Addyourinitializecodehere(asyourrequirement)
ret;
returntotheMAINprocedure
INITENDP
MAINPROC;
Hereisyourprogramentrypoint
callINIT;
calltheINITproceduretoinitializetheprogram
;
**TODO:
Addyourmaincodehere**
RE:
MOVDX,28BH;
关闭扬声器
MOVAL,89H
OUTDX,AL
MOVDX,28AH
INAL,DX
MOVDX,288H
OUTDX,AL
LEADX,INFO1;
输出说明信息
MOVAH,09H
INT21H
LEADX,INFO2
LEADX,INFO3
LEADX,INFO4
LEADX,INFO5
LEADX,INFO8
MOVAH,01H;
读取按键
CMPAL,'
1'
根据不同的按键播放不同的曲子
JEMUSIC1
CMPAL,’2’
JEMUSIC2
3’
JEMUSIC3
CMPAL,’0'
JEEXIT
LEADX,INFO9;
无效选择,输出错误提示
MOVAH,09H
JMPRE
MUSIC1:
MOVSI,OFFSETFREG1;
指向曲1的表
MOVBP,OFFSETTIME1
CALLPLAY
MUSIC2:
MOVSI,OFFSETFREG2;
指向曲2的表
MOVBP,OFFSETTIME2
MUSIC3:
MOVSI,OFFSETFREG3;
指向曲3的表
MOVBP,OFFSETTIME3
EXIT:
MOVDX,288H
OUTDX,AL
LEADX,INFO7;
输出欢迎使用信息,增加界面友好度
movax,4c00h;
Theendoftheprogram,returntothesystem
int21h
MAINENDP
TODO:
Addotherprocedures(PROC)here(asyourrequirement)
THEPROGRAMMEOFPLAYINGTHEMUSIC
PLAYPROC;
PLAY子程序,功能上面介绍过
L1:
MOVBX,DS:
[SI];
取频率
CMPBX,-1;
看是否有效
JEL0;
无效就退出
MOVCX,DS:
[BP];
读取时间
MOVDL,CL;
保存时间
ADDDL,30H
MOVAH,02H
MOVDX,0FH;
计算计数初值,1M的十六进制为0F4240H
MOVAX,4240H
DIVBX
MOVBX,AX
MOVDX,283H;
设置计数器工作方式
MOVAL,36H
MOVDX,280H;
输入计数初值
MOVAX,BX
MOVAL,AH
MOVDX,28BH;
开扬声器
MOVDX,28AH
INAL,DX
NOTAL
ROD:
CALLDELAY;
延时
LOOPROD
MOVDX,28BH;
关扬声器
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
P