基于单片机的模拟电子琴发声控制系统 - 图文
更新时间:2024-04-24 13:38:01 阅读量: 综合文库 文档下载
- 单片机模拟电子琴的设计推荐度:
- 相关推荐
河南理工大学
《单片机应用与仿真训练》设计报告
基于单片机的模拟电子琴发声控制系统
姓 名: 学 号: 专业班级: 电气09-2班 指导老师: 张宏伟 所在学院: 万方科技学院学院
2012年06月 25 日
河南理工大学本科课程设计报告
摘要
本设计是用AT89S52单片机为核心控制元件,设计一个模拟电子琴发声控制系统。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块。在主控模块上设有10个按键,其中7个按键控制7个音符,1个作为功能转换键使用,具有手动随意弹奏和自动播放乐曲的功能,另外2个按键用来实现高、低音的音符发音。下面具体介绍一下单片机各端口的分配功能:单片机的P1.1-P1.7为输入端口,用来控制7个音符的选择弹奏;P2.0为功能转换键,它能切换手动随意弹奏和自动播放乐曲的功能;P2.1-P2.2为单片机控制电子琴实现弹奏高、低的功能切换键;P0端口通过上拉电阻接到+5V上;P3.6为单片机的输出端口,它通过三极管与蜂鸣器相连。
本设计通过控制单片机定时器的定时时间产生不同频率的音频脉冲,经三极管放大信号后驱动蜂鸣器发出不同音节的声音。要实现7个音符的各自的高、中、低音,需要建立三个表,分别存储高音、中音和低音的频率值;默认为中音输出,当二个按键开关中某一个按下,通过软件选择相应的音频。按下弹奏键就可弹奏出不同的声音。
另外用软件延时来控制发音时间的长短,来控制节拍。通过把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。由程序查表得到定时常数和延时常数,分别用来控制定时器产生的脉冲频率和发出该音频脉冲的持续时间,这样就可以实现乐曲的演奏。
本设计为实物电路板设计开发,报告中详细的阐述了电子琴设计的方法和过程。并经过软硬件的调试,该音乐发生器不但能通过键盘弹奏出很好的音调,而且还可以通过键盘选择播放不同的音乐。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
1
河南理工大学本科课程设计报告
目录
摘要································································································································ 1 1 概述···························································································································· 3
1.1 电子琴概述····································································································· 3 1.2 电子琴系统原理····························································································· 3 1.3 设计任务及要求····························································································· 3 2 系统总体方案及硬件设计 ······················································································· 4
2.1 硬件组成 ········································································································· 4 2.11 AT89S52简介··························································································· 4 2.12 音乐播放部分·························································································· 7 2.13 电子琴弹奏部分······················································································ 7 2.2 具体发音原理·································································································· 7 2.3 各部分电路···································································································· 10 2.31 晶振········································································································ 10 2.32 复位电路································································································ 10 2.33 按键········································································································ 11 2.34 发音 ········································································································ 11 3 软件设计·················································································································· 12
3.1 流程图············································································································ 12 3.2 主程序代码···································································································· 13 4 Proteus软件仿真 ·································································································· 13 5课程设计体会 ·········································································································· 13 参考文献······················································································································ 14 附录1 源程序代码 ·································································································· 15 附录2 仿真图···········································································错误!未定义书签。
2
河南理工大学本科课程设计报告
1 概述
1.1 电子琴概述
电子琴又称作电子键盘,属于电子乐器(区别于电声乐器),发音音量可以自由调节。音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。它还可模仿多种音色,甚至可以奏出常规乐器所无法发出的声音(如合唱声,风雨声,宇宙声等)。另外,电子琴在独奏时,还可随意配上类似打击乐音响的节拍伴奏,适合于演奏节奏性较强的现代音乐。
AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。本文利用AT89C51 单片机的强大功能,通过软件产生不同频率的声音信号,经相应的放大电路后,在扬声器中发出8个音节。可以弹奏出不同的曲子。
1.2 电子琴系统原理
由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。只要向若将不同的音节与一定的节拍组合在一起形成一定的曲调,因此只要一单片机I/0口,通过软件,控制其输出不同频率的信号,就可以产生8个基本音节。将音节以一定的节拍进行组合,便可以产生歌曲。乐曲中每一音符对应着确定的频率。如果单片机某个口线输出“高~低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音。
1.3 设计任务及要求
本系统分为两个部分,一个是音乐播放,另一个就是电子琴弹奏。通过开关控制播放音乐或者进行电子琴弹奏。本系统利用蜂鸣器作为发声部件,当播放音乐时,弹奏按键无效;当进行弹奏时,设置9个按键,实现高音、中音、低音的1、2、3、4、5、6、7的发音。
3
河南理工大学本科课程设计报告
2 系统总体方案及硬件设计
2.1硬件组成
2.11 AT89S52简介
AT89S52引脚图
AT89S52实物图
1.概述
AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和 在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。
2.主要性能
与MCS-51单片机产品兼容; 8K字节在系统可编程Flash存储器; 1000次擦写周期; 全静态操作:0Hz-33MHz; 三级加密程序存储器; 32个可编程I/O口线;
4
河南理工大学本科课程设计报告
三个16位定时器/计数器; 六个中断源;
全双工UART串行通道; 低功耗空闲和掉电模式; 掉电后中断可唤醒; 看门狗定时器; 双数据指针; 掉电标识符 。 3.管脚说明
P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下, P0不具有内部上拉电阻。 在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4 个 TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。 在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能:
P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用)
P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动 。4 个 TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取
5
河南理工大学本科课程设计报告
外部数据存储器时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。 在FLASH编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个 TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。 在FLASH编程和校验时,P3口也接收一些控制信号。
端口引脚 第二功能: P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 INTO(外中断0) P3.3 INT1(外中断1) P3.4 TO(定时/计数器0) P3.5 T1(定时/计数器1) P3.6 WR(外部数据存储器写选通) P3.7 RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。 RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
6
河南理工大学本科课程设计报告
EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接VCC端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源VPP,当然这必须是该器件是使用12V编程电压VPP。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。
2.12 音乐播放部分
音乐实际上是固定周期的信号。本系统是用AT89S52 的定时器控制,在P3.6脚上输出方波周期信号,产生音乐。乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。在输出中我们用蜂鸣器及其驱动电路实现发声。
2.13电子琴弹奏部分
本系统设置了10个按键,其中三个按键为高音、中音、低音的选择按键,其余为发音按键,按下不同的按键产生不同的音符,通过按键时间的长短控制发音的长短,这样弹奏人员可以随心所欲的弹奏自己所喜爱的乐曲。电子琴弹奏实际上就是把每个按键所对应的值经过处理后发给单片机,再在单片机内把数字当作指针指向所对应的音符。我们运用单片机的最小系统,用P2口的低三位作高音、中音、低音的选择按键的接口,用P1口的低七位作发音按键的接口。
2.2 具体发音原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把各个音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将蜂鸣器端口反相,然后重复计时再反相。就可在该引脚上得到此频率的脉冲实现发音。
7
河南理工大学本科课程设计报告
利用AT89S52的内部定时器使其工作计数器模式(MODE1)下,改变计数初值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式是: N=fi÷2÷fr
式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。
其计数初值T的求法如下: T=65536-N=65536-fi÷2÷fr
例如:设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-fi÷2÷fr
=65536-1000000÷2÷fr=65536-500000/fr 低音DO的T=65536-50000/262=63628 中音DO的T=65536-50000/523=64580 高音DO的T=65536-50000/1046=65058
因此,可以通过计算求得各音阶的简谱码T值如下: 1 Do的T=65536-50000/262.1=63628 2 Re的T=65536-50000/293.7=63836 3 Mi的T=65536-50000/329.6=64021 4 Fa的T=65536-50000/349.2=64104 5 So的T=65536-50000/392.0=64261 6 La的T=65536-50000/440.0=64400 7 Si的T=65536-50000/493.9=64524
相应求得在要发出不同音符时先给定时器T0装入的初值如下表:
音阶 频率(HZ) 初值 1 Do 2 Re 3 Mi 4 Fa 5 So 6 La 7 Si 261.1 63628 293.7 63836 329.6 64021 349.2 64104 392.0 64261 440.0 64400 493.9 64524
8
河南理工大学本科课程设计报告
因为不同的音符对应的频率是不同的,当按到不同的按键,发出的声音不一样,所以其产生的方波频率信号也会不一样,如下列7个小图①~⑦对应着7个不同音符的方波频率信号。
图① 1 Do 图② 2 Re
图③ 3 Mi 图④ 4 Fa
图⑤ 5 So 图⑥ 6 La
图⑦ 7 Si
当播放音乐时,除了考虑音频外,还要考虑到音乐的音拍。本系统中,用软件延时来控制发音时间的长短,控制节拍。下表是各调1/4节拍的时间表。
节拍表 曲调值 调4/4 调3/4 调2/4
DELAY 125ms 187ms 250ms
9
河南理工大学本科课程设计报告
2.3各部分电路
2.31晶振
2.32 复位电路
10
河南理工大学本科课程设计报告
2.33按键
2.34 发音
11
河南理工大学本科课程设计报告
3 软件设计
3.1流程图
12
河南理工大学本科课程设计报告
3.2 主程序代码
见附录一 源程序代码
4 Proteus软件仿真
见附录2 仿真图
5 课程设计体会
通过此次课程设计,使我更加扎实的掌握了有关单片机方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了PROTUES、Keil等软件,用Keil进行程序的编译,用PROTUES进行软硬件系统的仿真。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计
13
河南理工大学本科课程设计报告
使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
参考文献
[1] 余发山,王福忠.单片机原理及应用技术.徐州:中国矿业大学出版社,2008年 [2] 韩志军等.单片机应用系统设计.北京:机械工业出版社,2004.75-83
[3] 王为青,邱文勋.51单片机应用开发案例精选.北京:人民邮电出版社,2007.61-65 [4] 徐新艳.单片机原理、应用与实践[M].北京:高等教育出版社,2005年3月. [5] 吴金戌,沈庆阳,郭庭吉,8051单片机实践与应用[M].清华大学出版社,2001
14
河南理工大学本科课程设计报告
附录1 源程序代码
#include
//蜂鸣器控制端口P3^6! };
unsigned int code sy[21]={ 194,173,154,145,129,115,102,390,347,309,291,260,231,205,96, 86, 76, 72, 64, 56, 50 始频率表
unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置 unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末
尾:0,0 表示结束(Important) unsigned char code Music_Girl[]={
0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
15
12000000 //定义晶振频率12000000HZ
4/5 //定义普通音符演奏的长度分率,//每4分音符间隔
unsigned int code FreTab[12]= { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原
河南理工大学本科课程设计报告
0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 }; void delay_us(uint i);
//us级延时程序延时y(us) = 9.75*i + 17.44! //毫秒级延时函数!
void delay_ms(uint t);
void didi(uint k,uint t1,uint t2);//蜂鸣器进行响t1静t2的k次动作! void keyscan(void);//按键扫描动作! void yindiao(uint i);
//产生不同频率声音的函数! //按键音优化!
void music(uchar diao);
void InitialSound(void); //自动播放需要的定时器设置等!
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int
Speed);
void BeepTimer0(void); void main() { }
void delay_us(uint i) { }
void delay_ms(uint t) {
uint i,j;
//毫秒级延时函数!
while(i--);//us级延时程序延时y(us) = 9.75*i + 17.44! didi(2,100,40); keyscan();
//两声提示!
//音符发生中断
//自动播放函数!
16
河南理工大学本科课程设计报告
}
for(j=0;j void didi(uint k,uint t1,uint t2)//蜂鸣器进行响t1静t2的k次动作! { } void keyscan(void) //按键扫描动作! { uchar tiaozheng=0; while(1) { if((P2&0x01)==0x00) { } else if((P_key&0xff)!=0xff) { if((P2&0x04)==0) { tiaozheng=14; //进入高音区! if(P_key==0xfd){music(tiaozheng+0);} //1111 1101 if(P_key==0xfb){music(tiaozheng+1);} //1111 1011 if(P_key==0xf7){music(tiaozheng+2);} //1111 0111 if(P_key==0xef){music(tiaozheng+3);} //1110 1111 if(P_key==0xdf){music(tiaozheng+4);} //1101 1111 if(P_key==0xbf){music(tiaozheng+5);} //1011 1111 if(P_key==0x7f){music(tiaozheng+6);} //0111 1111 //0100 0000当前H也按下了! //此处内部括号不能少,否则不能进入下面。 InitialSound(); didi(2,80,40); InitialSound(); Play(Music_Girl,0,3,200);//Play(乐曲名,调号,升降八度,演奏速度); uint i; for(i=0;i beep=0; delay_ms(t1); beep=1; delay_ms(t2); 17 河南理工大学本科课程设计报告 } } { } } else if((P2&0x02)==0) //1000 0000当前L也按下了! { } tiaozheng=7; //进入低音区! if(P_key==0xfd){music(tiaozheng+0);} if(P_key==0xfb){music(tiaozheng+1);} if(P_key==0xf7){music(tiaozheng+2);} if(P_key==0xef){music(tiaozheng+3);} if(P_key==0xdf){music(tiaozheng+4);} if(P_key==0xbf){music(tiaozheng+5);} if(P_key==0x7f){music(tiaozheng+6);} else //是默认的中音! tiaozheng=0; if(P_key==0xfd){music(tiaozheng+0); } if(P_key==0xfb){music(tiaozheng+1);} if(P_key==0xf7){music(tiaozheng+2);} if(P_key==0xef){music(tiaozheng+3);} if(P_key==0xdf){music(tiaozheng+4);} if(P_key==0xbf){music(tiaozheng+5);} if(P_key==0x7f){music(tiaozheng+6);} void yindiao(uint i) { } beep=0; delay_us(i); beep=1; delay_us(i); //产生不同频率声音的函数 void music(uchar diao) { uint i=0,jizhun=20; switch(diao) { //按键音优化! 18 河南理工大学本科课程设计报告 } } case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 10: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 11: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 12: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 13: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 14: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 15: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 16: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 17: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 18: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 19: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; case 20: for(i=0;i<(jizhun+(5*diao));i++)yindiao(sy[diao]);break; default: break; //自动播放需要的定时器设置等! void InitialSound(void) { beep = 1; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; 初值 初值 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; (10ms的初装值) // 计算TL1应装入的 Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%6; // 计算TH1应装入的 TMOD |= 0x11;//定时器0和定时器1都是方式1 16位计数。 ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; 19 河南理工大学本科课程设计报告 IT0=0; EX0=1; EA = 1; }//曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important) void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) { unsigned int NewFreTab[12]; unsigned char i,j; unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) { } j = i + Signature; if(j > 11) { } else NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>>=2; else if(Octachord == 3) //需要升八度! NewFreTab[i]<<=2; //否则不用改! //需要降八度! j = j-12; NewFreTab[i] = FreTab[j]*2; //进入高音音域! // 根据调号及升降八度来生成新的频率表 //新的频率表 SoundLength = 0; while(Sound[SoundLength] != 0x00) //计算歌曲长度 { } Point = 0; Tone = Sound[Point]; LDiv0 = 12000/Speed; LDiv4 = LDiv0/4; //读出音调! // 读出第一个音符和它时时值! // 算出1分音符的长度(几个10ms) // 算出4分音符的长度 Length = Sound[Point+1]; SoundLength+=2; LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准 20 河南理工大学本科课程设计报告 TR0 = 0; TR1 = 1; while(Point < SoundLength) { SL=Tone; SH=Tone/100; if(SL!=0) { } //算出音符类型(0普通1连音2顿音) //算出连音音符演奏的长度(多少个10ms) //有浮点,加半个时值! if (SM==1) CurrentFre >>= 2; if (SM==3) CurrentFre <<= 2; 计数器初值 Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%6; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 //低音 //高音 //计算出音符 //计算出高低音 //计算出是否升半 SM=Tone/10; CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算 SLen=LengthTab[Length]; //算出是几分音符 XG=Length/10; FD=Length/100; LDiv=LDiv0/SLen; if (FD==1) if(XG!=1) //算出普通音符的演奏长度 LDiv=LDiv+LDiv/2; if(XG==0) if (SLen<=4) LDiv1=LDiv-LDiv4; else LDiv1=LDiv*SOUND_SPACE; else LDiv1=LDiv/2; else LDiv1=LDiv; if(SL==0) LDiv1=0; LDiv2=LDiv-LDiv1; if (SL!=0) //算出不发音的长度 //算出顿音的演奏长度 21 河南理工大学本科课程设计报告 } { } TR0=1; for(i=LDiv1;i>0;i--) //发规定长度的音 while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; { if(LDiv2!=0) { } } void BeepTimer0(void) interrupt 1 //音符发生中断 { } beep = !beep; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; if((P1&0xff)!=0xff) break; Point+=2; Tone=Sound[Point]; Length=Sound[Point+1]; } beep = 1; TR0=0; beep=1; for(i=LDiv2;i>0;i--) { } while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; //音符间的间隔 22 河南理工大学本科课程设计报告 附录2 仿真图 23
正在阅读:
“两新”组织专项组工作汇报07-23
基于单片机的家居空气质量监控系统05-17
光的传播教学反思02-21
2015-2016《房建》课程设计-教学楼【最终版】0318(1)资料03-08
正确使用熟语教案05-18
2022岁首年月中结业上什么技校好03-30
驻村指导员岗位考核工作意见05-09
主生产计划01-04
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 电子琴
- 发声
- 单片机
- 控制系统
- 基于
- 模拟
- 图文
- 以氮气、氢气混合取代氨分解气的应用与实践
- 塑料包装薄膜的性能与检测 - 图文
- 四年级下册句型练习
- 浅谈统计工作在企业生产经营管理中的重要性
- 成都地铁建设工程标准化管理手册 - 图文
- (通用版)2018版高三英语一轮复习 第1部分 基础知识解读 Unit 1
- 凤翔泥塑暑期调研实践报告
- ABAQUS常见问题汇总- 1.0版
- 十二五继教培训教案 - 教学的技能在于用心
- 最新AMI BIOS详解
- 2017半年度洗钱类型分析报告
- 体育中心综合体育馆、滑冰训练馆钢结构工程施工组织设计
- 0描写人物精神品质的成语
- 大学英语六级考试734条高频词组(精华版)
- 水稻高产创建技术规范模式图
- 1521例遗传咨询者外周血染色体核型分析 - 唐葵(精)
- 超市员工行为规范管理
- 岩土工程本科毕业设计(钻孔灌注桩)
- 2002年成人高考高起点语文试题
- 石家庄城市人口老龄化及老年消费市场现状分析