单片机音乐控制流水灯

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档