音乐喷泉课设Word文件下载.docx
- 文档编号:21785068
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:11
- 大小:117.87KB
音乐喷泉课设Word文件下载.docx
《音乐喷泉课设Word文件下载.docx》由会员分享,可在线阅读,更多相关《音乐喷泉课设Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
它在计算机外部设备、通讯设备、自动化工业控制、宇航设备、仪器仪表和各消费类产品中都有着广泛的应用前景。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.系统工作原理
系统工作原理为从电脑声卡中采集出来的音乐信号一路由音响设备直接播放,一路经过信号采集电路被放大、整流、滤波后输出0-5V直流电,再将直流电送入变频器的控制端。
此时控制系统对音频信号进行处理,输出一个控制信号,来控制水泵的开关;
变频器接收到信号后开始快速起动、并带动电机的转速随音乐频率的改变而改变,喷泉水柱的高度亦随之改变。
系统实现了乐曲演奏、喷泉水柱控制、彩灯控制等功能。
众所周知,物体振动产生声音,而振动的频率决定音调高低,因此使用单片机控制输出不同频率的信号,就可以产生不同的音调;
利用单片机的计时系统可以控制各个音调的时间,即实现节拍的控制。
音调和节拍按照乐谱排列就实现了乐曲演奏的功能。
喷头及彩灯分别与相应输出点连接,通过程序实现每种音调都有对应的一组输出点开关状态组合,从而实现乐曲控制喷泉动作的功能。
由普通音箱等发出的音频信号经整流滤波放大及控制系统对其幅值调整后,得到的调幅电压信号送给变频器的速度控制端以控制喷泉水泵电机的转速变化,从而使喷泉水泵喷水的高低随音乐节律的变化而不断变化。
为实现多组喷泉和彩灯的交替运行的切换,系统可以按用户选择的程序模式输出时序开关信号去控制多路固体继电器,由固体继电器的接点控制水泵电机和彩灯的启动与停止。
图1系统框图
2.1单片机的特点
单片机,亦称单片微电脑或单片微型计算机。
它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/O)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
只需要外加电源和晶振就可实现对数字信息的处理和控制。
除了以上基本功能外,单片机还集成有A/D、D/A转换功能。
单片机具有体积小、功能强、应用面广、价格低廉等许多优点。
单片机的硬件特性:
1.单片机集成度高。
单片机包括CPU、4KB容量的ROM(8031无)、128B容量的RAM、2个16位定时/计数器、4个8位并行口、全双工串行口;
2.系统结构简单,使用方便,实现了模块化;
3.单片机可靠性高,可工作到106~107小时无故障;
4.处理功能强、速度快,即使执行最长指令,只需4µ
s(晶振12MHz);
5.可靠性较商用品高,价格较军用品便宜,属于工业品,温度范围为-40oC~+85oC。
3.设计思路
设计之前首先要对音乐知识有几本了解,其次要明白单片机是如何产生音乐脉冲和如何控制喷泉的,最后完成硬件原理图和相关程序设计。
在这里只进行分析程序设计部分。
3.1音乐基础
物体振动产生声波,作用于人耳,再由听觉系统传给大脑,进而产生听觉。
人耳能听到音频大约在11~20000Hz,而音乐中使用的音一般在27~4100Hz。
乐音体系中各音级的名称叫音名,就是我们认识的doremifasolasi,这是最基本的7个音,其它高、低音的音名都是在这个基础上变化出来的。
在乐谱上用来表示正在进行的音的长短的符号,叫音符。
不同音符代表不同的长度。
音符分为以下几种:
全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。
此外,还有附点音符,它就是指带附点的音符,也就是右边的小圆点,它表示增加前面音符时值的一半。
音符时值用节拍表示,休止符表示暂停发音。
音符长短时值一般用拍数表示,音符与节拍之间的对应关系如下表:
图2音符节拍对应表
3.2音频脉冲和音乐节拍的实现
音乐是由不同音乐脉冲和音乐节拍配合产生的,因此设计之前,首先要对他们进行了解。
3.2.1音乐脉冲的产生
音乐的产生需要不同频率的音频脉冲,在这里可以用单片机的定时/计数器产生这样的方波频率信号。
只要知道某一音频的频率就可以知道它的周期,由周期除以2,得到半个周期的时间,利用定时/计数器计时这半个周期,计时到后就将输出脉冲的I/O反向,就可以在I/O端口上得到此脉冲。
在本设计中,单片机工作在12MHz时钟频率下,其时钟周期为1us,因此可以利用89C51的内部定时/计时器T0,使其工作于方式1,工作在计数器状态下,改变计数初值TH0和TL0以产生不同频率的脉冲信号。
例如,低1DO的频率为262Hz,其周期为T=3517us,因此,只需要用计数器计时1908/1=1908,在计时满后采用一个中断指令将I/O反向,就可以得到低1DO。
C调各音符频率与计数值T的对应关系如下:
图3频率T值对应表
3.2.2音乐节拍的产生
节拍是音乐持续的长短,在单片机中可以通过延时来实现。
如果1/4节拍的延时为0.2秒,则1拍的时间为0.8秒,依次类推,可以求出其余节拍的值,
3.2.3喷泉的产生
在这里用一灯柱来代替喷泉,随着音乐节奏高低的变化灯柱也跟着高低变化,类似一个喷泉,而灯柱则由8个LED灯依次排列而成。
用I/O端口(这里取P0口)连接8个LED灯,而灯柱信号则通过I/O端口发送给8个LED灯。
例如,当输出DO时,点亮底端一个灯;
输出RE时点亮底端2个灯·
·
若输出音调高于SI,则所有灯全亮,若输出音调低于DO则所有灯全灭。
4.软件设计
软件设计是产生音乐和灯柱的重要部分,音乐各音符所对应的频率和音乐的节拍还有灯柱高低都是通过软件设计来实现的,软件设计的好坏直接决定了产生的音乐和喷泉是否正确。
软件设计主要由3部分组成,一部分是根据音乐乐谱利用定时/计数器0产生定时中断输出不同频率的音频脉冲,第二部分是根据音乐节拍对各音频脉冲进行延时设定,第三部分是根据音乐音调输出不同高度的灯柱。
在进行程序编写时,首先要根据音符的频率求出各自的16位计数值(TH0=T/256,TL0=T%256),再根据音乐节拍数得到每次计数所需延时时间,最后由音乐的音调对应出相应高度的灯柱(喷泉)。
简谱码和音符的计数值分别定义成一个数据列表,二者之间建立一一对应关系。
4.1程序流程
编写程序时首先要清晰编程思路,通过画出程序流程图有助于程序的编写。
程序流程图如下:
图4单片机实现音乐喷泉的程序流图
4.2软件编程程序
软件编程程序如下:
#include<
reg51.h>
sbitP23=P2^3;
sbitP10=P1^0;
unsignedcharBTH0,BTL0;
unsignedchartime;
unsignedcharkeytmp;
unsignedinti=0;
/*世上只有妈妈好数据表,每3个数的第一个是乐谱码,第三个数是节拍码*/
codeunsignedchartable[]={
6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,6,2,4,
3,2,2,5,2,1,6,2,1,5,2,1,3,2,1,2,2,2,1,2,1,6,1,1,5,2,1,3,2,1,2,2,4,
2,2,3,3,2,1,5,2,2,5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,
5,2,3,3,2,1,2,2,1,1,2,1,6,1,1,1,2,1,5,1,4,
5,2,3,3,2,1,2,2,1,1,2,1,6,1,1,1,2,1,5,1,4,0,0,0,
};
/*音符计数表(高八位)*/
codeunsignedcharTHo[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,
0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
/*音符计数表(低八位)*/
codeunsignedcharTLo[]={
0x42,0xC1,0x17,0x86,0xD0,0xD1,0xB6,
0x21,0xB1,0xBC,0xD8,0x68,0xE9,0x5B,
0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
/*键延时函数*/
voidkeydelay(void)
{
intj;
for(j=1000;
j>
0;
j--)
{}
}
/*延时函数*/
voiddelay(unsignedchartime)
unsignedchart1;
unsignedlongt2;
for(t1=0;
t1<
time;
t1++)
{
for(t2=0;
t2<
8000;
t2++)/*对于12MHz的时钟,延时为125ms(1/4节拍)*/
}
/*定时器0中断服务程序*/
voidtime0_int()interrupt1using0
TR0=0;
P23=~P23;
/*反向,产生脉冲*/
TH0=BTH0;
/*计数器赋值*/
TL0=BTL0;
TR0=1;
/*开始计数*/
/*喷泉输出函数*/
voidpenquan(a,b)
if(b==1||b==0)P0=0xff;
elseif(b==3)P0=0x00;
elseif(b==2)
if(a==1)P0=0x7f;
if(a==2)P0=0x3f;
if(a==3)P0=0x1f;
if(a==4)P0=0x0f;
if(a==5)P0=0x07;
if(a==6)P0=0x03;
if(a==7)P0=0x01;
elseP0=0xff;
}
/*赋T0计数初值,开始计数*/
voidsing()
delay(time);
/*主程序*/
voidmain(void)
unsignedchark;
P0=0xff;
TMOD=0x01;
/*置T0定时工作方式1*/
EA=1;
ET0=1;
IE0=0x82;
/*CPU开中断,T0开中断*/
while
(1)
{
unsignedintkeydata;
keytmp=P1&
0x01;
if(keytmp==0)keydata=1;
elseif(keytmp==1)keydata=0;
/*检查按键是否按下*/
if(keydata==0)
{P0=0xff;
elseif(keydata==1)
keydelay();
time=1;
while(time)
if(table[i]==0)/*是否取到结束码*/
i=0;
elseif(table[i]!
=0)
k=table[i]+7*table[i+1]-1;
BTH0=THo[k];
/*取计数值的高八位*/
BTL0=TLo[k];
/*取计数值的低八位*/
time=table[i+2];
/*取节拍数*/
i=i+3;
/*取下一个节拍*/
sing();
penquan(table[i],table[i+1]);
}
5.调试
音乐喷泉的程序设计过程中,遇到了很多问题,但是通过不断调试仿真,最终都得到解决。
问题是出在蜂鸣器与单片机的输出端口上,在这个环节消耗了很多时间。
之前这些程序通过星研软件编译没有错误,而且通过ptotues仿真成功,但在实验板上调试运行时却不行。
最终通过查阅资料发现问题的所在,由于我们在使用此端口时没有达到我们预想的效果,当我们把程序中单片机给蜂鸣器的信号输出端修改为由P2口输出信号,问题最终得到了解决。
6.心得体会
做单片机课程设计是十分有意义的,而且是十分必要的。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计就为我们提供了良好的实践平台。
通过这次单片机课程设计,我们不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,同时也使我们认识到自身存在的不足之处,无论是理论上还是遇到问题的处理能力上都还有待提高,而且这也激发了我们今后努力学习的兴趣。
此次课程设计结果能够符合要求,成功完成了此次课程设计任务。
但我们不只在乎这一结果,更加在乎的是这个过程。
这个过程中,我们花费了大量的时间和精力,更重要的是,我们在学会创新的基础上,同时还懂得合作精神的重要性,在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。
还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。
此次课程设计结束了,但是从中学到的知识会让我受益终身。
发现问题、提出问题、分析问题、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
参考文献
[1]龙脉工作室,刘坤.51单片机C语言应用开发技术大全.北京:
人民邮电出版社,2008.
[2]李群芳,黄建.单片微型计算机.北京:
电子工业出版社,2008
[3]《世上只有妈妈好》的简谱网络资源
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音乐喷泉