五首歌曲的音乐门铃Word格式.docx
《五首歌曲的音乐门铃Word格式.docx》由会员分享,可在线阅读,更多相关《五首歌曲的音乐门铃Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
关键词:
单片机;
音乐;
外中断
目录
设计要求1
1、设计方案1
2、各功能模块设计1
2.1控制电路设计1
2.2振荡电路设计2
2.3驱动电路设计3
2.4电源电路设计4
2.5音乐播放控制4
3、原理图4
4、软件的设计5
4.1设计流程图5
4.2设计音频脉冲5
4.3设计音乐的节拍6
5、调试与操作说明6
6、元器件及仪器设备明细表7
参考文献8
附录19
附录210
设计要求
T0作为门铃的按钮输入,每按一次,歌曲就改变,按完5次,再重复循环。
1、设计方案
电路仍以STC89C52为主要控制芯片,采用单片机最小系统和外围驱动电路推动扬声器发出声音,此电路比方案一电路更为简单,程序不复杂,通过外中断T0控制音乐的播放,并且五首歌曲能够循环播放。
音乐声音稳定、清晰。
减少了外围电路原件,节约了成本,电路基本框图如图1所示。
图1方案方框图
2、各功能模块设计
2.1控制电路设计
本次设计音乐播放系统是由单片机控制,因此控制电路主要是由STC89C52作为控制芯片,电路如图2所示。
图2控制电路
2.2振荡电路设计
要使单片机能够正常工作,那么就必须在STC89C52单片机的18和19脚之间接上一个振荡电路,因为振荡电路就是为单片机工作提供所需要的时钟脉冲信号,使单片机的内部电路及内部程序开始工作,在单片机最小系统当中我们只需在18和19脚之间接一个石英晶体,给单片机加上工作所需直流电源,振荡器就能开始工作,STC89C52常常外接6MHZ、12MHZ的石英晶体,图3所示的电路中接入的是12MHZ的石英晶体,为了防止单片机自激在18和19脚上分别对地接了一个30pF的电容。
其电路如图3所示。
图3振荡电路
2.3驱动电路设计
由于单片机输出的信号不能够直接驱动扬声器,因此还需要在单片机的最小系统中接一个外围电路,因为本次设计对声音的要求不高,所以不需要做一个功放电路去驱动,只需一个的简单驱动电路就可以实现。
电路如图4所示。
图4驱动电路
2.4电源电路设计
电源电路如图5所示,通过单片机实验板上的电源插座接入6—9V的直流电压,经7805稳压后给整个电路提供5V直流电压。
R2和D1为电源指示电路,通电后D1亮,为了有效消除干扰,输入和输出端并接入了滤波电容。
图5电源电路
2.5音乐播放控制
此部分的设计,我们采用了外中断T0来控制音乐的播放。
每按一次T0单片机就播放一首歌曲。
当播放了五首歌曲后,继续按T0,单片机又重复播放歌曲。
外中断T0的按键部分电路图如图6所示。
图6T0键电路图
3、原理图
综合各个模块可以做出总体电路原理图。
见附录1。
4、软件的设计
4.1设计流程图
软件的设计主要是对STC89C52单片机进行编程,音乐门铃的程序主要是对音符频率的转换,采用定时中断,延时等实现其设计指标,通过外中断T0控制音乐的播放。
程序框图如图7所示。
具体程序见附录2。
图7程序框图
4.2设计音频脉冲
对于单片机而言,产生不同频率的脉冲非常方便,可以利用他的定时计数器来产生这样方波频率信号。
因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
本例中,单片机工作在12MHz时钟,使用其定时计数器T0,工作模式为1,改变计数值TH0和TL0可以产生不同频率的脉冲信号。
在此情况下,C调的各音符频率与计数值T的对照表如表所示。
T的值决定了TH0和TL0的值,其关系如下。
TH0=T/256,TL0=T%256。
C调各音符频率T(12MHz单片机,T0工作模式1)对照表
音符
频率
简谱码(T值)
低1D0
262
63628
#4FA#
740
64860
低#1DO#
277
63731
中5SO
784
64898
2RE
294
63835
中#5SO#
831
64934
#2RE#
311
63928
6LA
880
64968
低3MI
330
64021
6
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO
415
64331
高2RE
1175
65110
低6LA
440
64400
1245
65134
#6
466
64463
高3MI
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
#5SO#
1661
65235
622
64732
高6LA
1760
65252
中3MI
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
4.3设计音乐的节拍
除了音符以外,节拍也是音乐的关键组成部分。
节拍实际上是音持续时间的长短,在单片机系统中可以用延时来实现。
如果1/4拍的延时设为47m秒,则1拍的延时是188m秒。
只要知道1/4拍的延时时间,其余的节拍延时时间就是它的倍数。
5、调试与操作说明
在Keil平台上进行单片机系统程序设计、编辑、编译、调试,最后生成目标代码文件(*.hex)。
启动单片机,将生成的目标代码文件下载到单片机中去。
下载完成后按下T0,这时通过扬声器我们可以听到有音乐播放,再按一次T0可以听到单片机所播放的音乐换成了不同的歌曲。
当播放了五首不同的歌曲后,继续按下T0,单片机又开始播放第一首歌曲。
6、元器件及仪器设备明细表
表1元器件及仪器设备明细表
元件序号
设计参数
备注
U1
STC89C52
C1
30pF
无极性瓷片电容
C2
C3
220uF
有极性电解电容
C4
100uF
Y1
12MHZ
石英晶体
R1
1KΩ
R2
D0
整流二极管
D1
发光二极管
Q1
9015
参考文献
[1]朱永金,成友才编著.单片机应用技术.北京:
中国劳动社会保障出版社,2007
[2]陈振源编著.电子技术基础.北京:
高等教育出版社,2001
[3]李朝青编著.单片机原理及接口技术(第3版).北京:
航空航天大学出版社,2005
[4]范风强编著.单片机语言C51应用实战集锦.北京:
电子工业出版社,2003
[5]张鑫编著.单片机原理及应用.北京:
电子工业出版社,2005
[6]陈家俊,郑滔编著.程序设计教程.北京:
机械工业出版社,2004
附录1
附录2
文件名:
MusicPlay.c
描述:
单片机演奏音乐;
程序结构描述:
main()函数在初始化后即进入while
(1);
功能主要在两个中断中完成;
定时器0中断主要输出一定频率的方波,初始值在于FreqTab中获取;
定时器1中断完成音长的控制,在完成特定音符的音长后读取下一个
音符,并且更新定时器0的初始设置值;
补充音乐知识:
音乐主要由音频和音长;
换个角度,
要输出一首音乐即用一个IO口输出特定时间长度和频率的方波
|<
-------音长1(节拍)--------->
|<
----音长2(节拍)------>
|...
___________________
|__||__||__||__||__||___||___||___||___
|音符1(频率1)|音符2(频率2)|...
**************************************************************/
#include<
reg52.h>
voiddelay(inti){while(i--);
}
unsignedcharvolatileFlagBeat;
//基本节拍单位计数变量
unsignedintvolatileFreqTemp;
unsignedcharvolatilemusic_temp;
//暂时存放从MusicTable数组中读出的变量
unsignedcharvolatilebeat;
//
unsignedcharvolatilefreq;
//简谱码对应T值数组的下标
unsignedcharvolatile*pmusic;
unsignedintflag=0,k=0;
sbitPin_Buzzer=P3^3;
unsignedintcodeFreqTab[]={//值
65535,
64260,64400,64524,64580,64684,
64777,64820,64898,64968,65030,
65058,65110,65157,65178,65217
};
//音符节拍码
unsignedcharcodesong1[]={//生日快乐
0x82,0x01,0x81,0x94,0x84,
0xb4,0xa4,0x04,
0xc4,0xb4,0x04,
0x82,0x01,0x81,0xf4,0xd4,
0xb4,0xa4,0x94,
0xe2,0x01,0xe1,0xd4,0xb4,
0x00
};
unsignedcharcodesong2[]={0x42,0x42,0x42,0x52,0x64,0x04,//哈巴狗
0x62,0x62,0x62,0x72,0x84,0x04,
0x92,0x92,0x82,0x72,0x64,0x04,
0x82,0x82,0x52,0x62,0x44,0x04,
0x42,0x42,0x42,0x52,0x64,0x04,
0x00};
unsignedcharcodesong3[]={0x84,0x94,0x88,//不倒翁
0x64,0x54,0x68,
0x84,0x64,0x54,
0x44,0x52,0x42,
0x52,0x62,0x48,
0x84,0x94,0x88,
unsignedcharcodesong4[]={//两只老虎
0x44,0x54,0x64,0x44,
0x44,0x54,0x64,0x44,
0x64,0x74,0x88,
0x82,0x92,0x82,0x72,
0x64,0x44,0x82,0x92,
0x82,0x72,0x64,0x44,
0x44,0x14,0x48,
0x44,0x14,0x48,0x00
};
unsignedcharcodesong5[]={//三只小猫
0x62,0x82,0x82,0x62,0x98,
0x92,0xb2,0xb2,0x82,0x98,
0x62,0x82,0x82,0x52,0x68,
0x62,0x82,0x82,0x62,0x92,
0x92,0x94,0x92,0xb2,0xb2,
0x92,0x84,0x94,0xb8,0xb4,
0x04,
0x00};
voidwai()interrupt0//中断优先级最高
{flag=1;
TR0=0;
TR1=0;
if(k<
5)
k=k+1;
else
k=1;
delay(100000);
}
//产生FreqTab表中对应的频率即产生不同的脉冲对应不同的音调
voidtimer0()interrupt1using1
{
TR0=0;
TL0=FreqTemp;
TH0=FreqTemp>
>
8;
TR0=1;
Pin_Buzzer=~Pin_Buzzer;
//用于控制音长的定时中断,每1/4拍变量FlagBeat加1
//47ms中断一次
voidtimer1()interrupt3using2
FlagBeat++;
TR1=0;
TL1=0x68;
//定为4.7ms
TH1=0x48;
TR1=1;
if(*pmusic==0x00){TR0=0;
{if(FlagBeat==beat)
{
FlagBeat=0;
music_temp=*pmusic;
beat=music_temp&
0x0F;
//取得节拍数低四位
beat=beat*4;
freq=music_temp>
4;
//取得音符编码高四位
pmusic++;
if(freq==0)TR0=0;
FreqTemp=FreqTab[freq];
}
voidmain()
beat=1;
TMOD=0x11;
//定时器0,1都工作16位计数方式
ET0=1;
//允许定时器0溢出中断;
ET1=1;
//允许定时器1溢出中断
EA=1;
TL1=0xF0;
TH1=0xFF;
EX0=1;
IT0=0;
while
(1)
{if(flag==1)
{TR1=1;
TR0=1;
if(k==1){pmusic=song1;
flag=0;
TR0=1;
TR1=1;
}
if(k==2){pmusic=song2;
if(k==3){pmusic=song3;
if(k==4){pmusic=song4;
if(k==5){pmusic=song5;