基于AT89C51单片机的带彩灯外观音乐盒设计.docx

上传人:b****4 文档编号:26924816 上传时间:2023-06-24 格式:DOCX 页数:21 大小:141.59KB
下载 相关 举报
基于AT89C51单片机的带彩灯外观音乐盒设计.docx_第1页
第1页 / 共21页
基于AT89C51单片机的带彩灯外观音乐盒设计.docx_第2页
第2页 / 共21页
基于AT89C51单片机的带彩灯外观音乐盒设计.docx_第3页
第3页 / 共21页
基于AT89C51单片机的带彩灯外观音乐盒设计.docx_第4页
第4页 / 共21页
基于AT89C51单片机的带彩灯外观音乐盒设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于AT89C51单片机的带彩灯外观音乐盒设计.docx

《基于AT89C51单片机的带彩灯外观音乐盒设计.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机的带彩灯外观音乐盒设计.docx(21页珍藏版)》请在冰豆网上搜索。

基于AT89C51单片机的带彩灯外观音乐盒设计.docx

基于AT89C51单片机的带彩灯外观音乐盒设计

基于AT89C51单片机的带彩灯外观音乐盒设计

基于AT89C51单片机的带彩灯外观音乐盒设计

摘要

随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。

小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。

传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。

本文设计的音乐盒是以AT89C51单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏音乐,功能多,外观效果多彩,配有彩灯,使用方便,本音乐盒有三个按键,key1控制彩灯,key2控制音乐,key3为总开关,可同时关闭音乐与彩灯。

具有一定的商业价值。

关键字:

AT89C51;音乐盒;按键;彩灯

Abstract

Alongwiththedevelopmentofhumansociety,peopleofvision,hearingthingsputforwardhigherrequest.Smallmusicboxcanbringgoodmemoriesandimprovepeople'sspiritualculture.Traditionalmusicboxisheavymechanicaltype,size,pronunciationanddrab,cannotachievebatchproduction.MusicboxdesignedinthispaperbasedonAT89C51microcontrollerasthecoreelementofelectronicmusicbox,smallsize,lightweight,canplaymusic,multi-function,appearanceandcolorful,withalantern,easytouse.Themusicboxwiththreebuttons,Thekey1controlLantern,key2controlmusic,key3totalswitchcanturnoffthemusicandlanterns.Havesomecommercialvalue.

Keywords:

AT89C51,musicboxes,buttons,Lantern

1引言

1.1设计目的

随着电子技术及计算机技术的发展,单片机在日常生活中的应用越来越广泛,同时也显现出了它的重要性,尤其在一些特殊的场合更是不可代替。

为熟悉单片机的应用。

要求设计一个基于AT89C51单片机的带彩灯外观的音乐盒。

1.2设计要求

音乐盒有三个按键key1,key2,key3,其中key1控制彩灯的样式,本设计有六种彩灯花样,每按一次变换一种样式。

Key2控制音乐播放,本设计有五首音乐,每按一次变换到下一首,同时八路LED灯随音调不同而闪烁。

Key3为总开关用于关闭音乐跟彩灯。

2设计方案及原理

2.1设计原理

音调之所以不同是因为频率的不同。

根据每个音调的频率单片机内部的定时计数器来产生相应的音乐脉冲。

只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。

利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。

利用AT89C51的内部定时计数器工作在方式1下,改变初值TH0及TL0以产生不同频率。

此外结束符和休止符可以分别用代码0xff和0x00来表示,若查表结果为0xff,则表示曲子终了;若查表结果为0x00,则产生相应的停顿效果。

例如频率为523Hz,其周期T=1/523=1912us,定时时间为1912/2=956us因此只要令计数器计时956us/1us=956次(若晶振频率为6MHZ),在每次计数956次时将I/O反相,就可得到中音DO(523Hz)。

根据计数次数就可算出计数初值。

要产生音乐光有音调是不行的,每个音调还有持续一定的时间。

这可以用延时程序delay()来实现。

因此每个音乐代码有八位数字组成,高四位控制音调,低四位通过延时程序对该音调进行延时。

通过子函数连续不断的调用音乐代码就产生了动听的音乐。

音调的频率与时间都不同,让DO、RE、MI、FA、SO、LA、SI分别对应八路LED灯中的一个,这样播放音乐的同时就有LED灯对应闪烁。

2.2总体设计思想

图1思路图

如图1所示按键部分有三个键,分别结于外部中断P3.2/INT0,P3.3/INT1,及串行口P3.1/TXD上,P3.2每产生一次中断count1加一,根据count1的值来决定花样灯的种类。

P3.3每产生一次中断count2加一,根据count2的数值来决定播放哪一首歌曲。

P3.1接总开关的。

播放音乐,及花样灯均通过调用子程序来实现。

八路LED灯灯接到P1口。

扬声器接到P3.7上。

总体设计电路,如图2。

图2设计图

3硬件设计

电路由AT89C51,八路LED灯,排阻,三个开关,扬声器及晶振组成,搭建如图3。

图3硬件图

4软件设计

根据设计要求及其原理绘制程序流程图,如图4,,根据流程图,在Keil中编写程序,并不断编译跟调试,直至没有任何错误和警告。

在keil中该程序能够运行证明编写成功。

程序见附录2。

图4流程图

5系统仿真及实际调试

按照实验电路图在proteus中找到相应的元器件,并搭建电路,将相应元器件的规格调到合适值。

在keil中生成HEX文件,装入单片机中运行,按key1可看到花样灯闪烁,每按一次变化一种样式。

按key2可听到动听的音乐,每按一次变化为下一首歌。

按key3可以同时关闭灯跟歌曲。

按键均可实现要求的功能,proteus截图见附录1。

6总结

 上学期通过对《单片机原理及应用系统设计》的学习,使我对单片机的硬件结构,指令系统,以及系统设计有了一定的认识,在这基础之上进行单片机设计,可以说是轻松了不少,然而在实际设计的过程中依然暴露出许多问题。

例如我对单片机的中断系统就了解不够深,这使得我在设计按键控制的时候,面临很大的问题,最终我通过重新翻阅课本及相关资料,克服了这一困难。

在程序设计的过程中,也出现了不少问题,例如在总开关程序的编写中,我就无从下手。

最终我通过向老师答疑得以解决。

此次课程设计也使我对C编程的有关知识得以温习和重新学习。

总之可以说是收益匪浅。

参考文献

[1]王思明,张金敏,苟军年等.单片机原理及应用系统设计[M].北京:

科学出版社,2012.

[2]李云钢,周逢兴,龙志强.单片机原理与系统设计[M].北京:

中国水利水电出版社,2008.

[3]谭浩强.C语言程序设计(第四版)[M].北京:

清华大学出版社,2010.

[4]风波亲,吴宁.微型计算机原理与接口技术[M].北京:

清华大学出版社,2008.3.

[5]吴秀清,周荷琴.微型计算机与接口技术[M].合肥:

中国科学技术大学出版社,2002.

[6]宋戈等.单片机应用开发范例大全[M].北京:

人民邮电出版社,2010.5.

 

附录1

图5仿真图

附录2

源程序

#include

#defineucharunsignedchar

#defineuintunsignedint

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

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

sbitkey3=P3^1;//总开关,用于总体控制花样灯跟歌曲。

sbitfm=P3^7;//蜂鸣器连续到I/O口P3^7上

//---------------------六种花样灯闪烁代码----------------------------------

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};//花样灯3

ucharcodehuayang4[]={0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,

0xf9,0xf3,0xe7,0xcf,0x9f,0x3f};//花样灯4

ucharcodehuayang5[]={0x3f,0xfc,0x9f,0xf9,0xcf,0xf3,0xe7,

0xcf,0xf3,0x9f,0xf9,0x3f,0xfc};//花样灯5

ucharcodehuayang6[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};//花样灯6

ucharcount1;//花样标志

ucharcount2;//歌曲标志

uchartimeh,timel,i;

//---------------------------音乐代码---------------------------------------

//音乐代码中,字节高位控制频率,即为音调。

字节低位控制该音调持续的时间,

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

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

//最后的0是结束标志即0xff。

ucharcodeyldbwdx[]={//月亮代表我的心

0x02,0x82,

0x16,0x32,0x54,0x02,0x52,

0xA6,0x32,0x54,0x02,0x52,

0x64,0x74,0xB6,0x64,

0x52,0x5C,0x32,0x22,

0x16,0x12,0x14,0x32,0x22,

0x16,0x12,0x14,0x22,0x32,

0x26,0x12,0x94,0x22,0x32,

0x2C,

0x32,0x52,

0x36,0x22,0x14,0x54,

0xAC,0x92,0xA2,

0x96,0xA2,0x96,0x82,

0x3C,0x54,

0x36,0x22,0x14,0x54,

0xAC,0x92,0xA2,

0x16,0x12,0x14,0x22,0x32,

0x2C,0x02,0x82,

0x16,0x32,0x56,0x12,

0xA6,0x32,0x56,0x52,

0x66,0x72,0xB6,0x62,

0x1C,

0xff//结束标志

};

ucharcodekdqg[]={//康定情歌

0x64,0x84,0x92,0x91,0x81,0x93,0x61,0x54,0x62,

0x82,0x92,0x91,0x81,0x92,0x64,0x62,0x82,0x92,0x91,0x81,0x93,0x61,

0x54,0x82,0x62,0x51,0x61,0x51,0x41,0x52,0x24,0x92,0x54,0x82,0x64,0x52,

0x42,0x94,0x82,0x62,0x51,0x61,0x51,0x41,0x52,0x24,

0xff

};

ucharcodelzh[]={//国歌

0x03,

0x04,0x04,0xc2,0x14,0x12,0x12,0x12,0x11,0x11,0xc2,0xd1,

0xe1,0x14,0x02,0x32,0x12,0x21,0x31,0x52,0x51,0x51,0x54,

0x32,0x31,0x31,0x12,0x11,0x31,0x52,0x51,0x31,0x24,0x24,

0x24,0x64,0x54,0x24,0x34,0x52,0x32,0x21,0x31,0x12,0x11,0x21,0x34,0x04,

0x52,0x51,0xd1,0x12,0x12,0x32,0x31,0x31,0x52,0x51,0x51,0x22,0x22,0x22,

0xd2,0xd1,0x24,0x22,0xc2,0x14,0x12,0x34,0x32,0x32,0x54,0x54,0x54,0x54,

0x12,0x11,0x31,0x52,0x51,0x51,0x64,0x54,0x32,0x31,0x11,0x52,0x52,0x52,

0x32,0x02,0x12,0x02,0xc4,0x14,

0xa2,0xa1,0x11,0x52,0x52,0x52,0x32,0x02,0x12,0x02,

0xc4,0x14,0xc4,0x14,0xc4,0x14,0x14,0x04,

0x04,0x04,0x04,0x04,

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};

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};

//----------------------------不同音调对应的定时器初值---------------------------

//适合11.0592M的晶振

ucharcodechuzhi[]={

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;//唱第一首歌

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++)

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang1[x];

beep();

delay1(300);

if(count1!

=1)

break;

}

break;

case2:

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

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang2[x];

beep();

delay1(300);

if(count1!

=2)

break;

}

break;

case3:

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

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang3[x];

beep();

delay1(300);

if(count1!

=3)

break;

}

break;

case4:

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

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang4[x];

beep();

delay1(300);

if(count1!

=4)

break;

}

break;

case5:

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

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang5[x];

beep();

delay1(300);

if(count1!

=5)

break;

}

break;

case6:

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

{if(key3==1)

{P1=0xff;

fm=0;

break;}

P1=huayang6[x];

beep();

delay1(300);

if(count1!

=6)

break;

}break;

}

}

//else

if(count1==0)

{

song();

delay1(1000);

}

}

}

voidint0()interrupt0

{

EA=0;//关总中断

delay1

(1);//去抖

if(key1==0)

{

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

TR0=0;

count1++;

if(count1==7)

count1=1;

}

EA=1;//开总中断

}

voidint1()interrupt2

{

EA=0;//关总中断

delay1

(1);//去抖

if(key2==0)

{

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

TR0=1;

i=0;//从头开始唱

count2++;

if(count2==6)

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

当前位置:首页 > 考试认证 > 交规考试

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

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