微机原理课程设计电子音乐播放器.docx
- 文档编号:7634846
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:17
- 大小:334.82KB
微机原理课程设计电子音乐播放器.docx
《微机原理课程设计电子音乐播放器.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计电子音乐播放器.docx(17页珍藏版)》请在冰豆网上搜索。
微机原理课程设计电子音乐播放器
一、课程设计任务及要求
1.1课程设计题目:
电子音乐播放器
1.2课程设计任务及要求:
设计一个音乐程序,演奏音乐按大写字母“A”,唱乐曲“玛丽有只小羔羊”;
按大写字母“B”,唱乐曲“太湖船”
按大写字母“C”,唱乐曲“祝福歌”
按"Q"鍵,退出
二、课程设计相关知识
2.1定时/计数器8253/58254
在微机及控制系统中,经常要用到定时信号。
如系统的日历时钟,动态存储器刷新。
对外部执行机构控制时也需要定时中断、定时检测、定时查询等。
定时的方法主要是两种:
软件定时:
利用指令的执行时间设计循环程序,使CPU执行延迟子程序的时间就是定时时间。
缺点:
执行延迟时,CPU一直被占用,降低了CPU的效率。
硬件定时:
用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间延迟。
突出优点为计数时不占用CPU时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU效率。
作为定时器可用8253或者8254,二者功能基本相同,知识工作的最高频率不一样。
本实验就采用了8254,其主要功能为:
(1)每片上有3个独立的16位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进制或十进制来计数。
(3)每个通道都有6种工作方式,都可以通过程序设置或改变。
(4)每个计数器的速率可高达10MHz。
主要部分有:
数据总线缓冲器、读/写控制逻辑、控制字寄存器、计数通道0#、1#、2#:
内部结构如下图:
8254内部结构
2.28254外部引脚
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引脚的输入时钟信号的频率不得高于2.6MHZ,即时钟周期不能小于380ns。
(8)GATEi:
i=0,1,2,第i个通道的门控信号输入引脚,门控信号的作用与通道的工作方式有关。
(9)OUTi:
i=0,1,2,第i个通道的定时/计数到信号输出引脚,输出信号的形式由通道的工作方式确定,此输出信号可用于触发其它电路工作,或作为向CPU发出的中断请求信号。
2.38254端口地址
8254控制字
说明:
(1)8254每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
(2)8254编程时先写控制字,再写时间常数。
2.48254工作方式
(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;关扬声器
四、功能流程图及子程序说明
4.1总流程图
MAIN程序:
MAIN程序是总程序,输出说明,等待用户按键并读取键值。
根据不同的按键选择调用播音子程序播放不同的歌曲。
4.2音乐播放子程序流程图
PLAY子程序:
PLAY子程序是播音子程序,SI指向音节表中的频率,BP指向音节表中的时间。
从SI的指向的音节表中取一个频率,只要不是-1,即有效就再读取时间,然后计算计数初值送入计数器,产生各种频率。
开启扬声器,根据所取的时间调用若干次延时子程序。
这段时间扬声器就发出该频率的声音,延时结束,就关闭扬声器,调用音节之间的小延时程序。
最后修改SI和BP,指向下一个频率,重复上面的工作
DELAY子程序和DELAY_OFF子程序:
两个都是子程序,采用空操作循环多次的方法,只是第二个延时时间较短,大概为5ms。
4.3部分源程序代码
五、调试结果截屏及结果分析
5.1调试结果截屏
初始界面:
如果按错了键,会出现如下界面:
如果选择正确,将出现如下界面:
5.2结果分析
根据输出结果显示,此次试验设计结果与预想设计方案想要达到的结果相一致,没有出现任何偏差,此次设计较为成功。
但在实验过程中对程序不断地进行了调试,将音频频率不断地进行了改变,由原来的低频通过同时扩大其倍数,最终使音频达到预期的效果。
六、参考文献
【1】李长青.微机原理与接口技术.徐州:
中国矿业大学出版社,2006
【2】沈美明.汇编语言程序设计实验教程.北京:
清华大学出版社,2002年
【3】周明德.微机原理与接口技术.北京:
人民邮电出版社,2002年
七、附录
7.1源程序代码:
DATASEGMENT
DATA1DB0AH,0DH,'HELLEL!
WELCOMEYOUTOCOMEHERE!
$'
DB0AH,0DH,'THISISAMUSICPROGRAM!
$'
DB0AH,0DH,'PLEASESELECLT!
$'
DATA4DB0AH,0DH,'inputERROR!
$'
DATA5DB0AH,0DH,'inputAGAIN!
$'
MUSLISTDB0AH,0DH,'PressAMaliyouzhixiaoyanggao'
DB0AH,0DH,'PressBTaihuchuan'
DB0AH,0DH,'PressCzhufuge'
DB0AH,0DH,'$'
MUSFRQADW330,294,262,294,3dup(330)
DW3dup(294),330,392,392
DW330,294,262,294,4dup(330)
DW294,294,330,294,262,-1
MUSTIMADW6dup(100),200
DW2dup(100,100,200)
DW12dup(100),400
MUSFRQBDW330,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
MUSTIMBDW3dup(200),100,100,200,100,100,400
DW2dup(200,200,100,100),400
DW3dup(200,100,100),400
MUSFRQCDW392,262,294,330,350,392,262,262
DW440,350,392,440,494,524,262,262
DW350,392,350,330,294,330
DW350,330,294,262,294,330,294,262,247,262,-1
MUSTIMCDW200,4DUP(100),200,200,200
DW200,4DUP(100),200,200,200
DW200,4DUP(100),200
DW4DUP(100),200,4DUP(100),400
DATAENDS
STACKSEGMENTPARASTACK'STACK'
STADB200DUP('STACK')
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE,ES:
DATA
START:
MOVAX,DATA;设置段寄存器
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
SHOWMACROB;显示以B开始的字符串宏定义
MOVDX,OFFSETB
MOVAH,09H
INT21H;宏结束
ENDM
SHOWDATA1;提示信息
L0:
SHOWMUSLIST
MOVAH,01H;输入并选择
INT21H
CMPAL,51H
JZRETURN
CMPAL,41H
JNZl1
CALLMUSICA
JMPEXIT1
l1:
CMPAL,42H
JNZl2
CALLMUSICB
JMPEXIT1
l2:
CMPAL,43H
JNZEXIT
CALLMUSICC
JMPEXIT1
EXIT1:
SHOWDATA5
JMPL0
EXIT:
SHOWDATA4
SHOWDATA5
JMPL0
RETURN:
MOVAX,4C00H;返回DOS
INT21H
;*******************************************************************
MUSICAPROC;音乐A
LEASI,MUSFRQA
LEABP,DS:
MUSTIMA
FREQA:
MOVDI,[SI]
CMPDI,-1
JEENDMUSA
MOVBX,DS:
[BP]
CALLSOUND
ADDSI,2
ADDBP,2
JMPFREQA
ENDMUSA:
RET
MUSICAENDP
;*******************************************************************
MUSICBPROC;音乐B
LEASI,MUSFRQB
LEABP,DS:
MUSTIMB
FREQB:
MOVDI,[SI]
CMPDI,-1
JEENDMUSB
MOVBX,DS:
[BP]
CALLSOUND
ADDSI,2
ADDBP,2
JMPFREQB
ENDMUSB:
RET
MUSICBENDP
;*******************************************************************
MUSICCPROC;音乐C
LEASI,MUSFRQC
LEABP,DS:
MUSTIMC
FREQC:
MOVDI,[SI]
CMPDI,-1
JEENDMUSC
MOVBX,DS:
[BP]
CALLSOUND
ADDSI,2
ADDBP,2
JMPFREQC
ENDMUSC:
RET
MUSICCENDP
;*******************************************************************
SOUNDPROC;发音程序
PUSHAX;保护寄存器
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H;写定时器模式
OUT43H,AL
MOVDX,12H;时间因子
MOVAX,348CH
DIVDI;频率
OUT42H,AL;写计数器2低八位
MOVAL,AH
OUT42H,AL;写计数器2高八位
INAL,61H;获取当前端口设置
MOVAH,AL;保存在AH中
ORAL,3;打开扬声器
OUT61H,AL
WAIT1:
MOVCX,2800;改变数值,用以设置播放速率
DELA1:
LOOPDELA1
DECBX
JNZWAIT1
MOVAL,AH;恢复端口信号
OUT61H,AL
POPDI;寄存器出栈
POPDX
POPCX
POPBX
POPAX
RET;返回
SOUNDENDP
;*******************************************************************
CODEENDS
ENDSTART
7.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
八、总结
在本次设计中,可以说是一次成功的经验。
在我们学完了《微型计算机原理与接口技术》这门课的基础上来做这个设计,通过设计后,使我们对这门课的理论知识的理解有很大程度上的加强。
微机原理这门课程本身是一门实验性和工程性很强的专业技术课,因此不仅要重视理论教学,更应注意实践技能的培养和训练。
课程设计是这门课程的一个重要环节,通过课程设计,巩固、加深和拓宽了学习的理解,本课程设计的重点目标是使用汇编语言,而不过多涉及硬件方面的太多知识。
在编程方面我通过本次课程设计学到了很多。
一开始面对很长的程序往往有畏难情绪,感觉无法下手,没办法只能硬着头皮啃下去,多看几个和音乐播放有关的汇编程序,然后我就能慢慢看懂了并理解了别的作者的设计思路。
然后再根据自己的思路,对照本人在图书馆借的汇编语言指导书慢慢编写符合自己思路的程序。
一次写出来的程序肯定不会是正确的,还需要进一步调试它。
检查程序过程中,在充分思考的基础上多次实验是检查改正程序的良方。
编写程序的过程中,体会最深的是子程序的调用和程序的条理问题,一个程序就算功能实现了,但是也要使主程序和子程序的条理分明,易读性高,才能算一个比较好的程序。
调试程序中,学习了emu8086的使用,emu8086对检查程序的错误作用很大。
同时,也要灵活使用各种调试方法,来缩小寻找错误的范围。
书到用时方恨少。
在课程设计过程中,我才体会到这句话的深意。
课堂上学的8254的知识和汇编语言都太少,还不足以完成本次课设,为此我经常跑图书馆借了各种各样的工具书。
有的书用处较大,有的书仅能用到一小块知识,就是这样,一步步在知识的海洋里我寻觅着自己需要的东西,确实克服了不少困难,解决了不少问题。
或许坎坷才能更好的使人成长。
在这次的课程设计中,我的收获是不但做出了一个符合要求的音乐播放器,而且为自己积累了一些宝贵的经验。
同时我也对音乐方面的频率知识有了一些认识,我想如果不是本次课程设计中用到这方面知识,我这辈子可能没有机会去接触这方面的知识了。
这,或许也是我比别的同学多出的一点收获吧!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 课程设计 电子音乐 播放