资源描述
学号0000000
《微型计算机原理与接口技术》
课 程 设 计
( 2008级本科)
题 目:音乐播放器课程设计
系(部)院: XXXXXX学院
专 业: 电气工程及其自动化
作者姓名: X X X
指导教师: XX 职称: 教授
完成日期: 20XX 年 X 月 XX 日
微机原理与接口技术课程设计成绩评定表
姓 名
XXX
学 号
0000000
专业班级
电气工程及其自动化
课程设计题目:音乐播放器课程设计
课程设计答辩或质疑记录:
成绩评定依据:
评 定 项 目
评 分 成 绩
1.选题合理、目的明确(10分)
2.设计方案可行性、创新性(20分)
3.设计结果(系统原理图、源程序、调试运行结果)(30分)
4.平时成绩(态度认真、遵守纪律)(10分)
5.设计报告的规范性、参考文献充分(不少于5篇)(10分)
6.答辩(20分)
总 分
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年 月 日
课程设计任务书
学生姓名
XXX
学号
0000000
专业方向
电气工程及其自动化
班级
08(X)班
题目名称
音乐播放器设计
一、 设计内容及技术要求:
1、 将各音乐音阶和其延续时间存在数据段中,然后根据不同按键值选择不同的音阶和时间表,再使用计数器产生该音阶频率。
2、 CPU通过对定时器的通道进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值。
3、 当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可算出来。
4、 在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。
5、 从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号。
6、 控制扬声器开关的时间间隔,来控制发声的音长了。
二、课程设计总结报告要求:
1、选用8086/8088CPU和适当的吃存储器芯片、接口芯片完成相应的功能。
2、设计键盘和LED完成输入和显示功能。
3、画出详细的硬件连接图。
4、给出程序设计思路、画出各程序适当的流程图。
5、给出RAM地址分配图。
6、给出所有程序清单并加上必要注释。
7、完成设计说明书(包括封面、目录、设计任务书、硬件设计思路、硬件原理图、软件设计思路、程序流程框图、程序清单、所用器件型号、总结体会、参考文献等)。
三、设计进度:
第一周
星期一上午 讨论论文题目
星期一下午 查资料
星期二至星期五 完成硬件电路的基本设计
第二周
星期一至星期二 完成软件流程图及软件设计
星期三至星期四 软硬件统调,写说明书,画图
星期五 答辩
目 录
第一章 课程设计的任务和目的 4
1.1 课程设计任务 4
1.2 课程设计目的 4
第二章 课程设计基础知识 5
2.1 定时/计数器8253A 5
2.2 8253A内部结构 5
2.3 8253A外部引脚 6
2.4 计数器内部结构 7
2.5 8253A端口地址 7
2.6 8253A功能 8
2.7 8253A控制字 9
2.8 8253A工作方式 9
第三章 详细设计 11
3.1 硬件设计 11
3.2 软件设计 13
第四章 程序调试 14
第五章 试验结果截屏 14
第六章 总结 15
第七章 参考文献 16
第八章 附录 17
8.1 源代码 17
8.2 各个音符的对应频率 26
27
第一章 课程设计的任务和目的
1.1 课程设计任务
本课程设计题目是:设计并实现一个音乐播放器。
1. 自己选用芯片和其它的硬件。
2. 自行设计电路并使用汇编语言编写程序完成音乐播放器功能。
3. 利用8253作为音阶频率发生器,对一段音乐进行编码后存入音符表,程序中可调用音符表自动播放音乐,从中了解音乐播放的原理。
4. 利用8253A和PC机,设计并实现简易音乐播放器
5. 使用汇编语言编写音乐播放程序。
6. 上机调试程序并联机,利用试验箱提供的扬声器发声。
7. 完成实验报告。
1.2课程设计目的
本课程设计注重提高学生应用能力、创新能力。在掌握了基本的实验方法和实验技能且理论教学完成的基础上,要求学生通过两周的集中工作,初步锻炼综合运用所学知识的能力,通过讨论与合作,完成一项完整的设计工作。更深入的了解微机芯片的用法和程序的完成过程,调试方法及技巧。通过这个环节来加深对《微机原理与接口技术》所学内容的理解和融会贯通。
设计音乐播放器主要目的:
通过D/A装换器产生模拟信号,在实验平台上实现简易音乐播放器。
了解利用数模转换器产生音乐的基本方法。
掌握定时/计数器8253A 的使用。
第二章 课程设计基础知识
2.1 定时/计数器8253A
在微机及控制系统中,经常要用到定时信号。如系统的日历时钟,动态存储器刷新。对外部执行机构控制时也需要定时中断、定时检测、定时查询等。定时的方法主要是两种:
软件定时:利用指令的执行时间设计循环程序,使CPU 执行延迟子程 序的时间就是定时时间。缺点:执行延迟时,CPU 一直被占用,降低了CPU 的效率。
硬件定时:用计数器/定时器作为主要硬件,在软件简单指令的控制下产生精确的时间
延迟。突出优点为计数时不占用CPU 时间,如利用定时器/计数器产生中断信号,可建立多作业环境,提高了CPU 效率。
主要功能:
(1)每片上有3 个独立的16 位的减计数器通道。
(2)对于每个计数器,都可以单独作为定时器或计数器使用,并且都可以按照二进
制或十进制来计数。
(3)每个通道都有6 种工作方式,都可以通过程序设置或改变。
(4)每个计数器的速率可高达2MHz。最高的计数时钟频率为2.6MHz。
2.2 8253A内部结构
8253的内部结构如图所示,它主要包括以下几个主要部分:
图2-1 8253的内部结构
(1).数据总线缓冲器
实现8253与CPU数据总线连接的8位双向三态缓冲器,用以传送CPU向8253的控制信息、数据信息以及CPU从8253读取的状态信息,包括某时刻的实时计数值。
(2).读/写控制逻辑
控制8253的片选及对内部相关寄存器的读/写操作,它接收CPU发来的地址信号以实现片选、内部通道选择以及对读/写操作进行控制。
(3).控制字寄存器
在8253的初始化编程时,由CPU写入控制字,以决定通道的工作方式,此寄存器只能写入,不能读出。
(4).计数通道0#、1#、2#:
这是三个独立的,结构相同的计数器/定时器通道,每一个通道包含一个16位的计数寄存器,用以存放计数初始值,一个16位的减法计数器和一个16位的锁存器,锁存器在计数器工作的过程中,跟随计数值的变化,在接收到CPU发来的读计数值命令时,用以锁存计数值,供CPU读取,读取完毕之后,输出锁存器又跟随减1计数器变化。
2.3 8253A外部引脚
8253芯片是具有24个引脚的双列直插式集成电路芯片,其引脚分布如图所示。8253芯片的24个引脚分为两组,一组面向CPU,另一组面向外部设备,各个引脚及其所传送信号的情况,介绍如下:
(1).D7~D0:双向、三态数据线引脚,与系统的数据线连接,传送控制、数据及状态信息。
(2).:来自于CPU的读控制信号输入引脚,低电平有效。
(3).:来自于CPU的写控制信号输入引脚,低电平有效。
(4).:芯片选择信号输入引脚,低电平有效。
图2-1 8253的引脚
(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 计数器内部结构
2.5 8253A端口地址
图2-3 8253A端口地址
2.6 8253A功能
8253 A既可作定时器又可作计数器:
(1) 计数: 计数器装入初值后,当GATE为高电平时,可用外部事件作为CLK 脉冲对计数值进行减1 计数,每来一个脉冲减1,当计数值减至0时,由OUT 端输出一个标志信号。
(2) 定时: 计数器装入初值后,当GATE为高电平时,由CLK 脉冲触发开始自动计数,当计数到零时,发计数结束定时信号。
除上述典型应用外,8253A还可作频率发生器、分频器、实时钟、单脉冲发生器等。
2.7 8253A控制字
图2-4 8253A控制字
说明 :
(1) 8253 A每个通道对输入CLK按二进制或二十进制从预置值开始减1计数,减到0时从OUT输出一个信号。
(2) 8253 A编程时先写控制字,再写时间常数。
2.8 8253A工作方式
(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硬件设计
音乐播放器用到相关硬件:
1. 定时/计数器8253A
2. 模块扬声器和喇叭驱动
3. 频率发生芯片74LS393
硬件连接:
① 定时/计数器8253A芯片模块的CLK2接时钟频率选择模块74LS393的T7端口,分频器的频率源为5000HZ。
② 定时/计数器8253A芯片模块的GATE2接+5V,提供高电平。
③ 定时/计数器8253A芯片模块的OUT2 接喇叭驱动驱动模块的SIN 端口。
④ 喇叭驱动驱动模块的J5插座接扬声器的J5插座。8253A的CLK2接分频器74LS393(右上方)的T7插孔,分频器的频率源为5000。
图3-1 硬件连接框架图
图3-2 扬声器电路
图3-3 扬声器J5插口
如图3-2为音响电路的控制输入插口SIN,控制输入信号经放大后接喇叭。
图3-4 74LS393引脚图
3.2 软件设计
图3-7 软件流程图
music子程序是音乐子程序,SI指向曲中的频率,BP指向曲中的时间节拍。从SI的指向的音节表中取一个频率,只要不是0,即有效就再读取时间,然后调用speaker子程序,计算计数初值送入计数器,产生各种频率信号,再送至扬声器,根据所取的时间调用若干次延时子程序。这段时间扬声器就发出该频率的声音,延时结束,再修改SI和BP,指向下一个频率,重复上面的工作。播放两首音乐后自动停止。
第四章 程序调试
把程序输入PC机后,保存为.asm文件。启用DVCC系统:
① 建立汇编源程序.
② 建立连接。
③ 编译为目标文件
④ 调试。
⑤ 不通过,重新修改(语句错误、音调频率不准、音调节拍不符合)
⑥ 重新修改、调试。
⑦ 正确运行。
第5章 试验结果截屏:
第六章 总结
经过这次的课程设计,再一次的印证了理论来源于实践,而实践又能升华理论这一个观点。
首先,要实现题目要求的功能并有所创新,我们必须全心地投入其中,养成一种敢于钻研敢于创新的习惯。在把课程要求实现到实际中来的过程中,参考了一些程序,在研究参考程序的编写思路的同时也从中获得不少的启发。为了把使得程序更加完整,在了解其他人在相同课题上的思路后,更加加入自己的一些思路,进行创一定的创新。
其次,通过课程设计,让我在掌握课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。尤其是对各种芯片在硬件与软件相互作用下工作的状况有了更深入的认识。
总之,在这次的课程设计在很大程度上提升了我的动手能力了,培养了自己独立编写汇编语言程序的能力,加深了我对理论知识的理解。
虽然这两个星期的课程设计中,完成任务的效果和预期有的出入,虽然中间遇到了一些问题,但经过我们的努力,还是把问题给解决了。
这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较全面。
第七章 参考文献
1.《微机原理与接口技术》(第二版) 人民邮电出版社 周明德主编
2.《汇编语言程序设计》 中国水利水电出版社 相伟主编
3.《DVCC系列单片机微机仿真实验指导书 启东计算机厂有限公司著
4.《单片机接口技术》 复旦大学出版社 王修才编著
5.《单片机原理及其接口技术》(第二版) 清华大学出版社 胡汉才编著
6.《单片微机原理及应用》 机械工业出版社 丁元杰主编
7.《单片机原理及接口技术》(修订版) 北京航空航天大学出版社 李朝青编著
8.《单片机原理及应用》 北京希望电子出版社 成都木马科技编著
9.《单片机原理及接口技术学习辅导》 电子工业出版社 朱定华编著
10.《单片微机接口与系统设计》 哈工大出版社 高明编著
11.《微型计算机原理及应用学习知道》 化学工业出版社 赵邦信编著
11.网上资料
第八章 附录
8.1 源代码
data segment
assume ds:data
msg_1 db <<---Welcome you to this OS.--->> $,0dh,0ah
msg_2 db 0dh,0ah,In this OS. you can press below keys to enjoy:$
msg_3 db 0dh,0ah,Super Low: q-w-e-r-t-y-u$
msg_4 db 0dh,0ah, Low: a-s-d-f-g-h-j$
msg_5 db 0dh,0ah, Mid: z-x-c-v-b-n-m$
msg_6 db 0dh,0ah, Hig: 1-2-3-4-5-6-7$
msg_7 db 0dh,0ah,Anytime you can press Esc or Enter to exit.$
msg_8 db 0dh,0ah,Whats more, you can press p to play music!$
msg_9 db 0dh,0ah,Please select the music(press q to exit the main menu):$
msg_10 db 0dh,0ah,1. Huaxin$
msg_11 db 0dh,0ah,2. Jingle bells$
msg_12 db 0dh,0ah,3. Happy birthday to you$
msg_13 db 0dh,0ah,4. Happy new year$
msg_21 db 0dh,0ah, $
note_t dw 131,147,165,175,196,220,247 ;重低音
dw 262,294,330,349,392,440,494 ;低音
dw 523,587,659,698,784,880,988 ;中音
dw 1046,1175,1318,1397,1568,1760,1975 ;高音
dw 0 ;休止符0
; 1,2,3,4,5,6,7 ;从低到高
key_t db q,w,e,r,t,y,u ;重低音
db a,s,d,f,g,h,j ;低音
db z,x,c,v,b,n,m ;中音
db 1,2,3,4,5,6,7 ;高音
db 0 ;休止符0
;玛丽有只小羊羔
music_n1 db c,x,z,x,c,c,c
db x,x,x,c,c,c
db c,x,z,x,c,c,z
db x,x,c,x,z,0
music_d1 db 4, 4, 4, 4, 4, 4, 8
db 4, 4, 8, 4, 4, 8
db 16, 8, 4, 4, 8, 4, 4, 8, 4, 4
db 4, 4, 4, 4, 4, 4, 4, 2
db 4, 4, 4, 4, 16
;铃儿响叮当+生日快乐+新年好
music_n2 db g,c,x,z,g,0,g,h,g,c,x,z ;铃儿响叮当
db h,0,h,a,h,v,c,x,j,g,b,b,v,x,c,z
db g,c,x,z,g,0,g,h,g,c,x,z,h,v,c,x
db b,b,b,b,n,b,v,x,z
db c,c,c,c,c,c,c,b,z,x,c
db v,v,v,v,c,c,c,x,x,z,x,b
db c,c,c,c,c,c,c,b,z,x,c
db v,v,v,v,c,c,b,b,v,x,z,0
db g,g,h,g,z,j ;生日快乐
db g,g,h,g,x,z
db g,g,b,c,z,j,h
db v,v,c,z,x,z,0
db z,z,z,g,c,c,c,z,z,c,b,b,v,c,x,x,c ;新年好
db v,v,c,x,c,z,z,c,x,g,j,x,z,0
music_d2 db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4
db 8, 4, 2, 2, 4, 4, 4, 4, 8, 8, 4, 4, 4, 4, 8, 4
db 4, 4, 4, 4, 8, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4
db 4, 4, 4, 4, 4, 4, 4, 4, 16
db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16
db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 8, 8
db 4, 4, 8, 4, 4, 8, 4, 4, 4, 2, 16
db 4, 4, 8, 4, 4, 8, 4, 4, 4, 4, 16,32
db 4, 4, 8, 8, 8, 16
db 4, 4, 8, 8, 8, 16
db 4, 4, 8, 8, 8, 8, 8
db 4, 4, 8, 8, 8, 16, 32
db 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 16, 4, 4
db 8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 32
jiepai db ? ;节拍变量定义
speed db 2 ;播放速度控制
jiange db 1 ;音符间隔停顿时间
data ends ;数据定义段结束
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;代码段定义
code segment ;代码定义段
assume cs:code ;建立代码段寄存器寻址
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;字符显示
show macro str ;宏定义,输入参数:字符串str
lea dx,str ;装入str的有效地址
mov ah,09h ;调用中断21,09h显示字符串
int 21h
endm ;宏定义结束
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;主函数
main proc far ;主函数过程定义
mov ax,data ;取数据段地址
mov ds,ax ;装载数据段寄存器ds,使之指向当前数据段
show msg_21
show msg_1 ;调用宏,显示字符串
show msg_2
show msg_3
show msg_4
show msg_5
show msg_6
show msg_7
show msg_8
show msg_21
mov bx,0 ;设定查表数组下标初值
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;按键扫描
key_scan:
mov al,6
mov jiepai,al ;初始化节拍
mov bx,0000h ;初始化指针
mov ah, 00h ;利用bios的16号中断,扫描键盘按键
int 16h ;AL中返回按键的ASCII码
cmp al, 0dh ;判断是否为Enter键
jz exit ;是回车键就退出
cmp al, 1bh ;判断是否为Esc键
jz exit ;是退出键就退出
cmp al, p ;判断是否为p键
jz play ;是p键就play music
lookup:
cmp key_t[bx],al ;取出对应频率值
je next
inc bx ;指针+1
jmp lookup
next:
shl bx,1 ;指针2,计算频率表指针
mov cx,note_t[bx];取得对应数组下标值的频率值
call beep ;调用固定频率子程序
jmp key_scan ;否则继续扫描
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
exit: ;退出
mov ah,4ch ;调用中断21,4ch退出系统
int 21h
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音乐播放菜单
play:
show msg_9
show msg_10
show msg_11
show msg_12
show msg_13
show msg_21
input: mov ah, 00h ;利用bios的16号中断,扫描键盘按键
int 16h ;AL中返回按键的ASCII码
cmp al, q ;判断是否为Enter键
jz start ;是q键就退到主菜单
cmp al, 1 ;判断是否为数字1
jz next6 ;是1键就播放相对应的歌曲
cmp al, 2 ;判断是否为数字2
jz next7 ;是2键就播放相对应的歌曲
jmp input ;否则继续扫描按键
next6: call play_m1
next7: call play_m2
start: call main
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音乐播放程序1
play_m1 proc near
next5: mov bx,0
next3: mov al,music_n1[bx] ;取出music频率值
push ax
mov al,music_d1[bx] ;取出music节拍
mov jiepai,al
pop ax
cmp al, 0 ;是否为音乐结束标志符
je input ;是则退出play
push bx ;保存bx,bx为music频率指针
mov bx,0
look1: cmp key_t[bx],al ;查表取出对应频率值的指针bx
je next1 ;找到就beep
inc bx ;指针+1
and bx,0ffh
jmp look1 ;未找到则继续查找
next1:
shl bx,1 ;指针2,计算频率表指针
mov cx,note_t[bx];取得对应数组下标值的频率值
cmp cx,0
je next4
call beep ;调用固定频率子程序
call pause ;调用停顿时间
pop bx ;获得music指针
inc bx ;继续取得下一个音符
jmp next3
next4: call nobeep
call pause ;调用停顿时间
pop bx ;获得music指针
inc bx ;继续取得下一个音符
jmp next3
play_m1 endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音乐播放程序2
play_m2 proc near
nex5: mov bx,0
nex3: mov al,music_n2[bx] ;取出music频率值
push ax
mov al,music_d2[bx] ;取出music节拍
mov jiepai,al
pop ax
cmp al, 0 ;是否为音乐结束标志符
je input ;是则退出play
push bx ;保存bx,bx为music频率指针
mov bx,0
loo1: cmp key_t[bx],al ;查表取出对应频率值的指针bx
je nex1 ;找到就beep
inc bx ;指针+1
and bx,0ffh
jmp loo1 ;未找到则继续查找
nex1:
shl bx,1 ;指针2,计算频率表指针
mov cx,note_t[bx];取得对应数组下标值的频率值
cmp cx,0
je nex4
call beep ;调用固定频率子程序
call pause ;调用停顿时间
pop bx ;获得music指针
inc bx ;继续取得下一个音符
jmp nex3
nex4: call nobeep
call pause ;调用停顿时间
pop bx ;获得music指针
inc bx ;继续取得下一个音符
jmp nex3
play_m2 endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
main endp ;主函数过程结束
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;固定频率响
beep proc near
mov dx,0012h
mov ax,34dch
div cx ;ax为所得分频值
out 42h,al ;输出频率值,低8位
mov al,ah
out 42h,al ;输出频率值,高8位
call spk_on ;开启蜂鸣器
mov ah,00h ;取时钟计数值
int 1ah
mov al,jiepai ;18.2次为1000ms, 2次约为100ms
add al,speed
cbw ;al值转为16位ax
add ax,dx ;加上当前时钟计数值,得到计数终值
mov bx,ax ;计数终值置入bx
delay1: mov ah,00h
int 1ah ;取时钟计数值
cmp bx,dx ;到终值吗?
jnz delay1 ;未到,继续延时
call spk_off ;关闭蜂鸣器
ret
beep endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;休止符延迟时间
nobeep proc near
call spk_off ;关闭蜂鸣器
mov ah,00h ;取时钟计数值
int 1ah
mov al,jiepai ;18.2次为1000ms, 2次约为100ms
add al,speed
cbw ;al值转为16位ax
add ax,dx ;加上当前时钟计数值,得到计数终值
mov bx,ax ;计数终值置入bx
delay2: mov ah,00h
int 1ah ;取时钟计数值
cmp bx,dx ;到终值吗?
jnz delay2 ;未到,继续延时
ret
nobeep endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;音符间隔停顿时间
pause proc near
call spk_off ;关闭蜂鸣器
mov ah,00h ;取时钟计数值
int 1ah
mov al,jiange ;18.2次为1000ms, 2次约为100ms
cbw ;al值转为16位ax
add ax,dx ;加上当前时钟计数值,得到计数终值
mov bx,ax ;计数终值置入bx
delay3: mov ah,00h
int 1ah ;取时钟计数值
cmp bx,dx ;到终值吗?
jnz delay3 ;未到,继续延时
ret
pause endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;开启蜂鸣器
spk_on proc near
push ax ;保存ax的值
in al,61h ;获取61h端口的当前值
or al,03h ;把61h端口低二位置1,即打开蜂鸣器
out 61h,al ;输出数据到61h端口
pop ax ;恢复ax的值
ret
spk_on endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
;关闭蜂鸣器
spk_off proc near
push ax ;保存ax的值
in al,61h ;获取61h端口的当前值
and al,0fch ;把61h端口低二位置0,即关闭蜂鸣器
out 61h,al ;输出数据到61h端口
pop ax ;恢复ax的值
ret
spk_off endp
;/*-------------------------------------------------------------------------------------------*/
;/*-------------------------------------------------------------------------------------------*/
code ends ;代码段结束
end main ;主程序结束
;/*-------------------------------------------------------------------------------------------*/
8.2 各个音符的对应频率
音符 频率/HZ 半周期/us 音符 频率/HZ 半周期/us
低1DO2621908 #4FA# 7400676
#1DO#2771805中5SO7840638
低2RE2941700#5SO#8310602
#2RE#3111608中6LA8800568
低3M3301516#6LA#9320536
低4FA3491433中7SI9880506
#4FA#3701350高1DO10460478
低5SO3921276#DO#11090451
#5SO#4151205高2RE11750426
低6LA4401136#2RE#12450402
#6LA#4661072高3M13180372
低7SI4941012高4FA13970358
中1DO5230956#4FA#14800338
#1DO#5540903高5SO15680319
中2RE5780842#5S0#16610292
#2RE#6220804高6LA17600284
中3M6590759#6LA#18650268
中4FA6980716高7SI19760253
ut2ApOdfXXc02GyBK
展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
相关搜索