基于单片机音乐喷泉的设计软件文档.docx

上传人:b****5 文档编号:5935799 上传时间:2023-01-02 格式:DOCX 页数:28 大小:579.72KB
下载 相关 举报
基于单片机音乐喷泉的设计软件文档.docx_第1页
第1页 / 共28页
基于单片机音乐喷泉的设计软件文档.docx_第2页
第2页 / 共28页
基于单片机音乐喷泉的设计软件文档.docx_第3页
第3页 / 共28页
基于单片机音乐喷泉的设计软件文档.docx_第4页
第4页 / 共28页
基于单片机音乐喷泉的设计软件文档.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

基于单片机音乐喷泉的设计软件文档.docx

《基于单片机音乐喷泉的设计软件文档.docx》由会员分享,可在线阅读,更多相关《基于单片机音乐喷泉的设计软件文档.docx(28页珍藏版)》请在冰豆网上搜索。

基于单片机音乐喷泉的设计软件文档.docx

基于单片机音乐喷泉的设计软件文档

课程设计任务书

分院(系)

信息科学与工程

专业

自动化

学生姓名

学号

设计题目

基于单片机的音乐喷泉设计

——硬件设计部分

课程设计内容及要求:

内容:

设计一个基于MCS-51系列单片机的音乐喷泉,随着音乐音调节拍的变化,彩灯也随之变化。

要求:

1.电路有两种工作模式:

演奏音乐模式和花样灯模式。

演奏音乐模式:

演奏完整的一首歌曲,八路LED随着音乐变化。

花样模式:

八路LED变化出各种花样,蜂鸣器随着发出“滴滴”声。

2.按下按键1进入演奏音乐模式,再按切换LED花样,共两首歌曲。

3.按下按键2进入花样灯模式,再按切换LED花样,共四种花样。

进度安排:

(10天)

1.熟悉题目,查找资料。

(2天)

2.进行编程和设计接线。

(4天)

3.进行仿真。

(2天)

4.编写实验报告。

(2天)

指导教师(签字):

年月日

学院院长(签字):

年月日

摘要

本课题是设计一个基于MCS-51系列单片机的音乐喷泉,随着音乐音调节拍的变化,彩灯也随之变化。

先用Keil软件调试编写的程序再用Proteus软件仿真,在Proteus软件商是用两个软件,一个来切换演奏出不同的乐曲,利用定时器0发出不同频率的方波从P3.7输出,使蜂鸣器发出不同的音调,然后延时控制音调的节拍,与之相对应的LED灯亮起;另一个用来切换八路LED的变化的花样并且喇叭发出声音。

关键词:

AT89c0251单片机;音乐;LED灯

1.绪论3

2.设计内容3

3.软件设计3

3.1程序设计分析3

3.2歌曲简谱的编码规则3

3.3程序流程图3

3.4软件源程序3

4.硬件设计3

4.1AT89c2051单片机3

4.2电路原理3

5.仿真3

5.1ISIS介绍3

5.2Keil介绍3

5.3仿真结果图3

6.心得体会3

参考文献3

 

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歌曲简谱的编码规则

doremifasolasi分别编码为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

#defineucharunsignedchar

#defineuintunsignedint

sbitduan=P2^6;

sbitkey1=P3^2;//按key1可切换花样

sbitkey2=P3^3;//按key2可切换歌曲

sbitfm=P3^7;//蜂鸣器连续的IO口

sbitP34=P3^4;//矩阵键盘的一列

ucharcodehuayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,

0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1

ucharcodehuayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,

0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2

ucharcodehuayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,

0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

charcodehuayang4[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};

ucharcount1;//花样标志

ucharcount2;//歌曲标志

uchartimeh,timel,i;

//================简谱====================

//编程规则:

字节高位是简谱,低位是持续时间,

//代表多少个十六分音符

//1-7代表中央C调,8-E代表高八度,0代表停顿

//最后的0是结束标志

ucharcodeqnzl[]={//千年之恋

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,

//你留下的轮廓指引我

0x42,0x63,0x83,0x83,0x91,0x91,

//黑夜中不寂寞

0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,

//穿越千年的哀愁

0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,

//是你在尽头等我

0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,

//最美丽的感动会值得

0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志

//用一生守候

};

ucharcodejmszl[]={//寂寞沙洲冷

0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,

//自你走后心憔悴

0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,

//白色油桐风中纷飞

0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,

//落花似人有情这个季节

0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52,

//河畔的风放肆拼命地吹

0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,

//不断拨弄离人的眼泪

0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,

//那样浓烈的爱再也无法给

0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,

//伤感一夜一夜

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,

//当记忆的线缠绕过往支离破碎

0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34,

//是慌乱占据了心扉

0x31,0x81,0x81,0x81,0x61,0x91,0x82,

//有花儿伴着蝴蝶

0x51,0x51,0x51,0x51,0x31,0x61,0x53,

//孤雁可以双飞

0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,

//夜深人静独徘徊

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,

//当幸福恋人寄来红色分享喜悦

0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,

//闭上双眼难过头也不敢回

0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,

//仍然捡尽寒枝不肯安歇微带着后悔

0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,

//寂寞沙洲我该思念谁

0xff};

//==============简谱音调对应的定时器初值=======

//适合11.0592M的晶振

ucharcodecuzhi[]={

0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7

0xFC,0xED,

0xFD,0x43,

0xFD,0x6A,

0xFD,0xB3,

0xFD,0xF3,

0xFE,0x2D,

0xFE,0x47,//高八度1-7

0xFE,0x76,

0xFE,0xA1,

0xFE,0xC7,

0xFE,0xD9,

0xFE,0xF9,

0xFF,0x16

};

ucharyinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};

//将音调转化为对应的LED样式

voiddelay1(uintz);//延时1MS

voiddelay(uintz);//延时165MS,即十六分音符

voidsong();

voidbeep();//蜂鸣器叫一声

main()

{ucharx;

count1=0;//流水灯无花样

count2=1;//唱第一首歌

P34=0;//选取矩阵键盘的一列

EA=1;//开总中断

EX0=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式

EX1=1;//开外部中断1

IT1=1;//外部中断1下降沿触发方式

TMOD=0x01;//定时器0工作在方式1

TH0=0;

TL0=0;

ET0=1;

while

(1)

{

if(count1!

=0)

{

switch(count1)

{

case1:

for(x=0;x<14;x++)

{

duan=1;

P1=huayang1[x];

beep();

delay1(300);

duan=0;

if(count1!

=1)

break;

}

break;

case2:

for(x=0;x<14;x++)

{

duan=1;

P1=huayang2[x];

beep();

delay1(300);

duan=0;

if(count1!

=2)

break;

}

break;

case3:

for(x=0;x<16;x++)

{

duan=1;

P1=huayang3[x];

beep();

delay1(300);

duan=0;

if(count1!

=3)

break;

}

break;

case4:

for(x=0;x<8;x++)

{

duan=1;

P1=huayang4[x];

beep();

delay1(300);

duan=0;

if(count1!

=4)

break;

}

break;

}

}

else

{

song();

delay1(1000);

}

}

}

voidint0()interrupt0

{

EA=0;//关总中断

delay1

(1);//去抖

if(key1==0)

{

count2=0;//不让蜂鸣器唱歌

TR0=0;

count1++;

if(count1==5)

count1=1;

}

EA=1;//开总中断

}

voidint1()interrupt2

{

EA=0;//关总中断

delay1

(1);//去抖

if(key2==0)

{

count1=0;//流水灯无花样

TR0=1;

i=0;//从头开始唱

count2++;

if(count2==3)

count2=1;

}

EA=1;//开总中断

}

voidtimer0()interrupt1//用于产生各种音调

{

TH0=timeh;

TL0=timel;

fm=~fm;

}

voidsong()

{

uinttemp;

ucharjp;//jp是简谱

i=0;

while

(1)

{if(count2==0)

{

break;

}

if(count2==1)//选曲

temp=qnzl[i];

if(count2==2)

temp=jmszl[i];

if(temp==0xff)

break;

jp=temp/16;//取数的高4位

duan=1;

P1=yinyue[jp];

duan=0;

if(jp!

=0)

{

timeh=cuzhi[jp*2];

timel=cuzhi[jp*2+1];

}

else

{

TR0=0;

fm=1;//关蜂鸣器

}

delay(temp%16);//取数的低4位

TR0=0;//唱完一个音停10MS

fm=1;

delay1(10);

TR0=1;

i++;

}

TR0=0;

fm=1;

}

voiddelay(uintz)//延时165MS,即十六分音符

{uintx,y;

for(x=z;x>0;x--)

for(y=19000;y>0;y--);

}

voiddelay1(uintz)//延时1MS

{uintx,y;

for(x=z;x>0;x--)

for(y=112;y>0;y--);

}

voidbeep()//蜂鸣器叫一声

{uchari;

for(i=0;i<50;i++)

{fm=~fm;

delay1

(1);

}

fm=1;

}

4.硬件设计

4.1AT89c2051单片机

AT89c2051是美国ATMEL公司生产的低电平、高性能CMOS8位单片机,片内含2Kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C2051单片机在电子类产品中有广泛的应用。

1.VCC:

电源电压。

2.GND:

地。

3.P1口:

P1口是一个8位双向I/O口。

口引脚P1.2~P1.7提供内部上拉电阻,P1.0和P1.1要求外部上拉电阻。

P1.0和P1.1还分别作为片内精密模拟比较器的同相输入(ANI0)和反相输入(AIN1)。

P1口输出缓冲器可吸收20mA电流并能直接驱动LED显示。

当P1口引脚写入“1”时,其可用作输入端,当引脚P1.2~P1.7用作输入并被外部拉低时,它们将因内部的写入“1”时,其可用作输入端。

当引脚P1.2~P1.7用作输入并被外部拉低时,它们将因内部的上拉电阻而流出电流。

4.P3口:

P3口的P3.0~P3.5、P3.7是带有内部上拉电阻的七个双向I/O口引脚。

P3.6用于固定输入片内比较器的输出信号并且它作为一通用I/O引脚而不可访问。

P3口缓冲器可吸收20mA电流。

当P3口写入“1”时,它们被内部上拉电阻拉高并可用作输入端。

用作输入时,被外部拉低的P3口脚将用上拉电阻而流出电流。

P3口还用于实现AT89C2051的各种第二功能,如下表所列:

P3口还接收一些用于闪速存储器编程和程序校验的控制信号。

5.RST:

复位输入。

RST一旦变成高电平所有的I/O引脚就复位到“1”。

当振荡器正在运行时,持续给出RST引脚两个机器周期的高电平便可完成复位。

每一个机器周期需12个振荡器或时钟周期。

6.XTAL1:

作为振荡器反相器的输入和内部时钟发生器的输入。

7.XTAL2:

作为振荡器反相放大器的输出。

4.2电路原理

由于51单片机的电流驱动能力较弱,而蜂鸣器的工作电流为几十MA。

单片机给P3.7低电平,则蜂鸣器开;给高电平则喇叭关。

LED接到单片机的P1口,输出0时,可使LED亮起。

两个按键的一段接单片机的I/O口变成低电平,引发单片机中断。

5.仿真

5.1ISIS介绍

ProteusISIS是英国Labcenter公司开发的电路设计、分析与仿真软件,功能极其强大。

该软件的主要特点是:

①集原理图设计、仿真分析(ISIS)和印刷电路板设计(ARES)于一身。

可以完成从绘制原理图、仿真分析到生成印刷电路板图的整个硬件开发过程。

②提供几千种电子元件(分立元件和集成电路、模拟和数字电路)的电路符号、仿真模型和外形封装。

③支持大多数单片机系统以及各种外围芯片(RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真等)的仿真。

④提供各种虚拟仪器,如各种测量仪表、示波器、逻辑分析仪、信号发生器等。

过去需要昂贵的电子仪器设备、繁多的电子元件才能完成的电子电路、单片机等实验,现在只要一台电脑,都可在该软件环境下快速轻松地实现。

5.2Keil介绍

KeilμVision3

2006年1月30日ARM推出全新的针对各种嵌入式处理器的软件开发工具,集成KeilμVision3的RealViewMDK开发环境。

RealViewMDK开发工具KeilμVision3源自Keil公司。

RealViewMDK集成了业内领先的技术,包括KeilμVision3集成开发环境与RealVi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1