单片机音乐控制流水灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
本设计是一种基于AT89C51单片机音乐控制彩灯的方案,实现单片机演奏
音乐,并且对LED彩灯随音符频率的不同而闪烁发光。本方案以AT89C51单片机作为主控核心,利用三极管和蜂鸣器,通过三极管放大电流使用蜂鸣器播放音乐,利用编程实现亮灯循环模式,在有8个LED彩灯,根据用户需求可以编写若干种亮灯模式.例如左右闪烁,隔几个亮灭,蜂鸣器可以根据用户需求改写编程播放各种音乐。本方案具有设计简单、体积小、元器件少、电路结构简单等优点。该设计方案设计及其简单,典型的89c52单片机,亮灯模式多,播放各种类型的音乐,具有体积小、价格低、低能耗等优点。在美丽的都市夜晚,彩灯的循环亮灭,播放动人的音乐,衬托出美丽的氛围,音乐彩灯具有更广阔
的发展天地。
1、设计要求
(1)、用8个发光二极管作为显示电路。
(2)、蜂鸣器播放音乐。
(3)、能够循环的显示灯的亮灭。
2、基本原理
通过控制单片机的内部定时器的定时时间来产生不同的脉冲频率,以驱动蜂鸣器发出不同音节的声音,利用延时子程序来控制音调的节拍。
为了编程方便,通常是将简单的音符和相应的节拍转换成为定时常数和延时常数,利用查表法得到定时常数,分别控制定时器产生相应的脉冲频率和脉冲频率的持续时间,当持续时间到时,程序自动查找下一个音符的定时常数和延时常数,这样就可以听到悦耳动听的歌声。
音调是由不同的频率产生的,而每一个音调都是有一个音符和一个节拍组成,音符决定该音调的高低,节拍决定了该音调是多少拍。因此,一个音调是由两个字节组成的。根据音符字节产生该大小次数的延时,声音输出口取反,就可以得到该音调的高低音。根据设置单位的延时大熊啊,可以控制音乐演唱速度。
因此算法很简单:定义单片机的一个I/O端脚为声音输出口,在规定的节拍内,根据音符字节的大小产生延时,将声音输出口不断的至置高置低(即取反),就可以得到该音调。只要选取合适的单位节拍延时,就可以输出动听的音乐。用内部定时器T0方式产生简谱中各音符飞对应脉冲频率,同时通过延时常数来控制脉冲频率的持续时间。
为了加强观赏和实用性在上面P1脚接了LED灯,这样在音乐播放的同时也有灯的闪烁对音符有直观的感觉。
3、设计过程
(1)元器件选取
单片机stc89c52 三极管8550 电阻1K 电容30pf
发光二极管晶振11.0592 按键开关蜂鸣器
(2)方案框图
(3)原理图
从下面的电路原理图中可以看出,如果要让接在P0口的LED1亮起来,那
么只要把P1.0的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接 P1.1~P1.7口的其他7个LED 的点亮和熄灭的方法同LED1。因此, 实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。在此,我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了
P2^7输出的电流很小,P2^7接了一个三极管,放大电流以使蜂鸣器能够正
常的工作,播放出音乐。
(4)设计程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit sound=P2^7;
uint counter=0;
uchar code array[]=
{
0x18,0x30,0x1c,0x10,0x20,0x40,0x1c,0x10,
0x18,0x10,0x20,0x10,0x1c,0x10,0x18,0x40,
0x1c,0x20,0x20,0x20,0x1c,0x20,0x18,0x20,
0x20,0x80,0xff,0x20,0x30,0x1c,0x10,0x18,
0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xff,0x20,0x20,0x1c,0x10,
0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,
0x15,0x40,0x13,0x40,0x18,0x80,0x00,0x00,
};
void init_com()/ 设置定时器
{
TMOD=0x01;
TH0=0xff;
TL0=0xff;
EA=1;
ET0=1;
}
void timer0(void) interrupt 1 using 3 / 设置中断 3 {
counter=counter+1;/不断加1
TH0=0xd8;
TL0=0xef;
}
void delay(uchar n) /延时子程序
{
uchar i;
while(n--)
for (i=0;i<125;i++);
}
void sound_delay(uchar n)/声音延时子程序
{
uchar i;
while (n--)
{
for (i=0;i<2;i++);
}
}
void main()
{
uint i;
uchar sound_signal; /引入子程序
uchar sound_pace; /引入子程序
init_com();/引入子程序
while (1)
{
i=0;
while(array[i]!=0x00)
{
if (array[i]==0xff)
{
TR0=0;
i++;
delay(100);
continue;
}
sound_signal=array[i];
P0=array[i];
i=i+1;
sound_pace=array[i];
TR0=1;
while(counter!=sound_pace)
{
sound=~sound;不断的取反
sound_delay(sound_signal);/音乐的时间的延时
}
i++;
counter=0;
}
delay(10);
}
}
参考文献
[1]刘守义.单片机应用技术.西安电子科技大学出版社.2002
[2]王福瑞.单片微机测控系统设计大全.北京航空航天大学出版社.1998
[3]马忠梅.张凯.单片机的c语言应用程序设计.北京航空航天大学出版社. 2007
[4]刘迎春.MCS-51单片机原理及应用教程.清华大学出版社.2009