基于单片机音乐喷泉的设计软件文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
摘要
本课题是设计一个基于MCS-51系列单片机的音乐喷泉,随着音乐音调节拍的变化,彩灯也随之变化。先用Keil软件调试编写的程序再用Proteus软件仿真,在Proteus软件商是用两个软件,一个来切换演奏出不同的乐曲,利用定时器0发出不同频率的方波从P3.7输出,使蜂鸣器发出不同的音调,然后延时控制音调的节拍,与之相对应的LED灯亮起;另一个用来切换八路LED的变化的花样并且喇叭发出声音。
关键词:AT89c0251单片机;音乐;LED灯
目录
1.绪论 (4)
2.设计内容 (4)
3.软件设计 (5)
3.1 程序设计分析 (5)
3.2 歌曲简谱的编码规则 (6)
3.3程序流程图 (7)
3.4 软件源程序 (9)
4.硬件设计 (16)
4.1 AT89c2051单片机 (16)
4.2电路原理 (18)
5.仿真 (19)
5.1 ISIS介绍 (19)
5.2 Keil介绍 (20)
5.3 仿真结果图 (21)
6.心得体会 (24)
参考文献 (24)
1.绪论
德国发明家奥图皮士特先生在1930年提出喷泉的相关理论,随后他在百货商店和餐馆前建造小型的喷泉。经过多年来的发展,音乐喷泉的设计变的多样化,构造变得复杂化。在1952年的夏天,在西柏林的工业展览中,一个美国人看到了奥图皮士特先生音乐喷泉的表演,并把它带回纽约。1953年1月15日音乐喷泉在美国首次表演,表演期间超过150万人观看。在音乐喷泉走向全世界的同时,各种新技术也不断地运用在音乐喷泉上,使其表演变得复杂和美丽,给人们带来无限的乐趣,提高了人们的生活质量。
为了使控制简单可靠,活用现代社会的市场需求,各种形式的喷泉层出不穷,并逐步转向小型和营业性较强的方向发展。其音乐喷泉的控制也变得灵活多样,如单片机、PLC、DSP等都在音乐喷泉中有所运用,当然也具有优缺点。本课题选用单片机作为此次音乐喷泉控制系统设计的控制核心,主要是为了实现单片机的放音,并控制多个彩灯随着音乐的音调节奏变化而随之变换。
2.设计内容
⑴电路有两种工作模式:演奏音乐模式和花样灯模式。
演奏音乐模式:演奏完整的一首的歌曲,八路LED随着音乐变化。
花样灯模式:八路LED变化出各种花样,蜂鸣器随着发出“嘀嘀”声。
⑵按下按键1进入演奏音乐模式,再按切换歌曲,共两首歌曲。
⑶按下按键2进入花样灯模式,再按切换LED花样,共四种花样。
3.软件设计
3.1 程序设计分析
程序利用了R6和R7两个寄存器分别作为花样和音乐的标志,都初始化为0.用到了两个外部中断和一个定时器,两个按键接两个外部中断,按键1使得
R7在1和2之间切换,当按下按键1时产生外部中断1,中断程序使得R7加1当R7为2时使之为0,用程序检测R7的值,R7等于1时播放第一首歌曲,等于2时播放第二首歌;按键2使得R6在0~4之间切换,当按下按键2时产生外部中断0,中断程序使得R6加1,当R6为4时使之为0,根据R6的值来切换LED的花样。R6和R7的值是互斥的,设置R7等于1、2时,R6同时设置为0;设置R6等于1~4时,R7也同时设置为0。
歌曲播放的设计:利用定时器0发出不同频率的方波从P3.7输出,使蜂鸣器发出不同的音调,然后延时控制音调的节拍。当程序检测到R7不为0时调用音乐子程序,先将歌曲的简谱进行编码,储存在一个编码表中。在子程序中从对应的编码表中取出一个数,然后分离出高4位得到音调,接着找出程序相应的值赋给定时器0,使之定时操作喇叭,得出相应的音调,同时从P1口输出相应的值使得八路LED灯随着音乐变化而发生相应的变化;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
花样灯的设计:一共设计了四种花样,即花样一是一半灯循环移动、花样二是八个灯循环闪烁,花样三是高低四位轮流亮,花样四是有八个灯循环被点亮和熄灭。R6的值为1~4一次对应花样的1~4,当程序检测到R6的值不为0时就调用与其值相对应的花样的子程序。
3.2 歌曲简谱的编码规则
do re mi fa so la si分别编码为1~7,重音do编为8,重音re编为9,停顿编为0.播放长度一十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其他的播放时间以此类推。音调作为编码的高4位,二播放时间作为低4位,如此音调和节拍就构成了一个编码。以ffH为曲谱的结束标志。举例1:音调do,发音长度为两拍,集二分音符,将其编码为18H。举例2:音调re,发音长度为半拍,集八分音符,将其编码为22H。
确定定时器0对应于音调的初值:假设要得到500HZ的声音。500HZ的声音信号每个周期为2ms,即2000us。假设单片机采用12MHZ的晶振,每个机器周期的时间为12/12M=1us。故单片机操作(对与蜂鸣器相连的I/O口取反)一次蜂鸣器的时间间隔为2000us/1us/2=1000个机器周期,故给工作在方式1的定时器0赋初值C=[t/MC]补=模-[t/MC],C=(3E8H)补=10000H-[3E8H]=FC18H,
TH0=#FCH,TL0=#18H。
下面给出定时器0工作在方式1对应各音调的初值,假定使用的晶振是
12MHZ:
3.3程序流程图
主程序流程图
播放音乐子程序流程图
3.4 软件源程序#include
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit key1=P3^2;//按key1可切换花样
sbit key2=P3^3;//按key2可切换歌曲
sbit fm=P3^7;//蜂鸣器连续的IO口
sbit P34=P3^4;//矩阵键盘的一列
uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1
uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,
0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2
uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
char code huayang4[]={ 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};
uchar count1;//花样标志
uchar count2;//歌曲标志
uchar timeh,timel,i;
//================简谱====================
//编程规则:字节高位是简谱,低位是持续时间,
//代表多少个十六分音符
//1-7代表中央C调,8-E代表高八度,0代表停顿
//最后的0是结束标志
uchar code qnzl[]={ //千年之恋
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94, 0xA8,0x08,
//前奏
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
//竹林的灯火到过的沙漠
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,
//七色的国度不断飘逸风中
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
//有一种神秘灰色的旋涡
0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,
//将我卷入了迷雾中
0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
//看不清的双手
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,
//一朵花传来谁经过的温柔
0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,
//穿越千年的伤痛
0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
//只为求一个结果
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,
//你留下的轮廓指引我