1、 摘 要 长久以来,音乐都在我们的身边,封建时期的编钟到现在我们的各种各样的音乐播放,音乐盒不但在我们日常生活中经常拿来当礼物来赠送,更重要的是音乐盒悠扬的乐声,能经常勾起人们对美好往事的回忆,甚至魂牵梦萦,坠入时光岁月的追忆中。为了好好利用学到的知识用于自己喜欢的事情中我选择了单片机音乐盒的设计,这让我有回忆起了儿时的美好时光。 单片机因其体积小、功能强、价格低廉而得到广泛运用。用STC89C52单片机设计音乐盒,只需STC89C52RC最小系统,扩展三个按键,再加一片由两个NPN组成的达林顿管以及输出设备蜂鸣器和数码管,通过两个按键可以选择上一首歌曲和下一首歌曲,并在数码管上直
2、观的显示歌曲的序号。 关键词:音乐盒;单片机;数码管 Abstract For a long time, music is around us, the feudal period of chimes to a variety of music we play, music box, not only in our daily lives are often used as a gift to gift, more important melodious music box music, can often remind people of good memories
3、 of the past, and even dreaming, crashed into the recollections of the years in time. In order to make good use of acquired knowledge to their favorite things in the music box I chose single-chip design, which makes me remember the good times of childhood. Microcontroller because of its small size,
4、 powerful inexpensive and widely used. Single-chip design with STC89C52 music box, just STC89C52 minimum system, extended three buttons, plus one composed by two NPN Darlington buzzer and output devices and digital control, by two buttons on a choice songs and the next song, and visual display of di
5、gital songs on the serial number. Key words: Music Box; Single-chip; LED 目 录 引言 1 1 选题的背景 1 2 选题总体设计说明 1 3 设计方法 1 3.1 设计思想 1 3.2 系统硬件设计 2 3.2.1主控芯片 2 3.2.2蜂鸣器及其驱动 3 3.2.3按键 4 3.2.4元器件清单 4 4 设计内容 4 4.1 基本知识—音调 4 4.1.1音频脉冲 4
6、4.1.2方法 5 4.1.3计算公式 5 4.1.4其计数值的求法 5 4.1.5C调音符频率与计数值T的对照表 5 4.2 基本知识—节拍 6 4.2.1相关知识 6 4.3 程序代码 6 5 结论 11 参考文献 13 附录A 14 附录B 15 附录C 16 附录D 17 引言 随着社会的不断高速发展,人们的压力也越来越大。减压的方式很多,但音乐确是最简单而有效的方式,它不仅能让人们感到愉悦和快乐,更重要的是它也能让人感到轻松。 1 选题的背景 本次课设是应用单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语
7、言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同的音调的音乐,在利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳的音乐。 运用单片机制作一个能演奏美妙音乐的电路,通过这一有趣的项目制作,巩固定时器和键盘的运用技能,增进对单片机应用产品的过程的了解。 2 课题总体设计说明 音乐盒可以发出怡人的音乐旋律,能给生活增加不少的乐趣。用51系列单片机设计一个音乐盒的基本功能如下: 1.利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲。 2.用七段数码管显示当前播放的歌曲序号。 3.通过对单片
8、机的电路控制并结合按键功能实现播放,暂停,停止,上一曲,下一曲,的音阶和节拍的配合实现歌曲(共四首歌)演奏。 3 设计方案 3.1 设计思想 本设计采用STC89C52RC作为主控芯片,蜂鸣器作为输出设备产生音乐,通过按键1和2能够选择歌曲。数码管(LED)能够实时的显示当前的歌曲名及歌曲号。其中P3.3和P3.2外接按键,P0口用作LED输出数据端口,P2.0接蜂鸣器端口。 设计框图如图所示 LED显示 主控芯片 (STC89C52RC) 按键 蜂鸣器 图3.1 音乐盒设计框图 3.2 系统硬件设计 3.
9、2.1 主控芯片 设计中所采用主控芯片为STC89C52RC。因其价格便宜,在市场上已经很成熟,各个方面都能够满足设计要求故选择它。其采用标准双列直插式引脚DIP-40大规模集成电路封装。它的引脚排列如下图所示 STC89C52RC引脚功能说明 VCC(40引脚):电源电压 VSS(20引脚):接地 P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有
10、效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。 P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O, P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通 过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流()。 P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。对端口写入1
11、时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流()。 P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流()。 RST(9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚
12、输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。 ALE/(30引脚):地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚()也用作编程输入脉冲。 (29引脚):外部程序存储器选通信号()是外部程序存储器选通信号。当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。 /VPP(31引脚):访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,必须接GND。注意
13、加密方式1时,将内部锁定位RESET。 为了执行内部程序指令,应该接VCC。在Flash编程期间,也接收12伏VPP电压。 XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2(18引脚):振荡器反相放大器的输入端。 3.2.2蜂鸣器及其驱动 达林顿三极管又称复合三极管,它将二只三极管组合在一起,以组成一只等效的新的三极管。达林顿三极管的放大倍数是二只三极管放大倍数之积。达林顿三极管可以看作是一种直接耦合的放大器,三极管间以直接方式串接,没有加上任何耦合元件。这样的晶体管串接型式最大的作用是:提供高电流放大增益。两只三极管同为NPN型,将前 级三极
14、管的射极电流直接引入下一级的基极,当作下级的输入。这种使用相同类型的三极管组成的达林顿管称为同极型达林顿管。由于以上原因,我们选择通过两个NPN三级管搭建成一个达林顿作为为驱动。如图所示。 图3.3 三极管组成的达林顿管采用常用的四引脚按键,其中各有两个引脚相连。按下时,接通,放开时,将断开。设计中需要两个按键,作为上一首和下一首的信号输入。 3.2.4元器件清单 表3.1 元器件清单 元器件序号 型号 主要参数 数量 备注 R1~R4 10K 4 1/4w C1、C2 10pF 2 瓷片电容 C3
15、 10uF 1 电解电容 Y1 12MHz 1 晶振 S1~S3 3 按钮 Q1~Q2 2 NPN三极管 LS1 1 无源小喇叭 U1 STC89C52RC 1 单片机 LED1 1 7段一位共阴数码管 LED0 1 LED灯 P1 1 10K排阻 4 设计内容 4.1 基本知识—音调 4.1.1音频脉冲 要生产音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反 相,
16、然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。 4.1.2方法 利用89C52的内部定时器使用其工作在计数器模式MODE1下,改变计数值THO及TLO以产生不同频率的方法。 4.1.3计算公式 例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次计数956次时将I/O反相,就可得到中音DO (523Hz)。 计数脉冲值与频率的关系公式如下: N: 计算值;Fi:内部计时一次为1us, 故其频率为1MHz; 4.1.4其计数值的求法 例如:设K=65536
17、 F=1000000=Fi=1MHz, 求低音DO(261Hz)。中音DO (523Hz)。 高音的DO (1046Hz)的计算值。 = 低音DO的 中音DO的 高音DO的 4.1.5 C调各音符频率与计数值T的对照表 表4.1 C调各音符频率与计数值T的对照表 音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值) 低 1 DO 262 63628 # 4 FA# 740 64860 # 1 DO# 277 63731 中 5 SO 784 64898 低 2 RE 294 63853 # 5 SO# 831 64
18、934 # 2 RE# 311 63928 中 6 LA 880 64968 低 3 M 330 64021 # 6 932 64994 低 4 FA 349 64103 中 7 SI 988 65030 # 4 FA# 370 64185 高 1 DO 1046 65058 低 5 SO 392 64260 # 1 DO# 1109 65085 # 5 SO# 415 64331 高 2 RE 1175 65110 低 6 LA 440 64400 # 2 RE# 1245 65134 # 6 466
19、64463 高 3 M 1318 65157 低 7 SI 494 64524 高 4 FA 1397 65178 中1 DO 523 64580 # 4 FA# 1480 65198 # 1 DO# 554 64633 高 5 SO 1568 65217 中 2 RE 587 64684 # 5 SO# 1661 65235 # 2 RE# 622 64732 高 6 LA 1760 65252 中 3 M 659 64777 # 6 1865 65268 中 4 FA 698 64820 高 7
20、SI 1967 4.2 基本知识--节拍 4.2.1相关知识 每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表三为节拍与节拍码的对照.如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间.假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推.所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表四为1/4和1/8节拍的时间设定。 表4.2 节拍与节拍码对照 节 拍 码 节 拍 数 节 拍 码 节 拍 数 1 1/4 拍 1 1/8 拍 2 2/4 拍 2 1/4 拍 3 3/4
21、 拍 3 3/8 拍 4 1 拍 4 1/2 拍 5 1又1/4 拍 5 5/8 拍 6 1又1/2 拍 6 3/4 拍 8 2 拍 8 1 拍 A 2又1/2 拍 A 1又1/4 拍 C 3 拍 C 1又1/2 拍 F 3又3/4 拍 表4.3 各调1/4节拍的时间设定及各调1/8节拍的时间设定 曲 调 值 DELAY 曲 调 值 DELAY 调 4/4 125 毫秒 调 4/4 62 毫秒 调 3/4 187 毫秒 调 3/4 94 毫秒 调 2/4 250 毫秒 调 2/4 125毫秒
22、 4.3 程序代码 #include "reg52.h" sbit BUZZER=P2^0; unsigned char th,tl; unsigned char flag1,flag2; char code table[] ={ 0x3f,0x06,0x5b,0x4f /*,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71*/};//0~f 的字型码(共阴) // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
23、// 7L 1 2 3 4 5 6 7 1H 2H 3H 5L 6L 4L unsigned int TONE[14]={1012,956,852,759,716,638,568,506,478,426,379,1276,1136,1433}; // 1 2 3 4 5 6 7 // 低音 1908 1701 1515 1433 1276 1136 1012 // 中音 956 852 759
24、 716 638 568 506 // 高音 478 426 379 358 319 284 253 unsigned char code SONG[4][150]={ /*20为结束符,用于判断是否结束*/ //同桌的你 {5,5,5,5,3,4,5,8,6,6,6,6,8,6,5,5, 5,5,5,5,7,6,4,4,4,4,4,4,4,3,2,1,1, 8,8,8,8,5,
25、3,8,8,10,9,9,9,9,8,7,6,6, 7,7,7,7,7,8,9,5,7,7,8,9,8,7,8,8,20}, //一分钱 {5,8,6,8,5,3,5,2,3,5,3,5,6,8,5,6,5,3, 5,1,3,2,3,2,1,2,3,6,5,3,5,6, 5,8,6,5,3,5,2,5,2,3,2,1,20}, //小燕子 {3,5,8,6,5,3,5,6,8,5,8,10,9,8,9,8
26、6,8,5,3,5,6,5,6,8,9,5,6,3,2,1,2,2,2,3,5,5,8,2,3,5,3,5,8,6,5,3,5,6,8,5,8,10,9,8, 9,8,6,8,5,3,5,6,5,6,8,9,5,6,3,8,6,5,3,2,1,2,2,3,5, 8,10,9,8,9,8,5,6,8,20}, //两只老虎 {1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,11,1,2,11,1,20} }; unsigned
27、 char code BEAT[4][150]= { {4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,4, 4,4,4,4,4,4,8,8,4,4,4,4,4,2,8,8,4,4,4,4,4,4,8,4,8,4,4,4,4,2,4,8,8,4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,8}, {8,8,4,4,8,4,4,4,4,8,4,4,4,4,4,4,4,4,4,8,4,8,4,4,4,4,16,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,16}, {4,4,4,4,16,4,4,4,4,16,8,4,8,8,4,4,4
28、4,16,8,4,8,4,4,8,4,4,16,4,4,8,16,8,4,4,8,8,8,4,4,16,4,4,4,4,16,4,4,4,4,16,8,4,8,8,4,4,4,4,16,8,4,8,4,4,8,4,4,16,8,4,8,8,4,4,8,16,8,4,16,8,4,8,8,4,4,4,4,16}, {4,4,4,4,4,4,4,4,4,4,8,4,4,8,2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8} }; /*****************设置音调*******************/ //对定时器0的初始值更新 voi
29、d SET_BUZZER_TONE(unsigned int tone) //tone为计数器实际要计数的次数即为N<--->Fr N=Fi/2/Fr Fr为频率数 { //设置蜂鸣器的音调,其本质为对计数器的填装 TR0=0; //关闭定时器0 //TH0=(65536-tone)/256; //TL0=(65536-tone)%256; th=(65536-tone)/256; tl=(65536-tone)%256; TR0=1; //开启定时器0 } /**************设置节拍***********
30、/ //通过延时来设置其节拍
//x为最小节拍的倍数
void DELAY_MIN_BEAT(unsigned char x)
{
unsigned int i,j,k;
for(i=0;i 31、并开启定时器0
TMOD=0x01; //定时器0工作在方式1
IP=0x02; //定时器0具有最高优先级
}
/**************外部中断0和1初始化***********/
void INT_INIT()
{
IE|=0x85;//1000_0101 开启总中断并开启外部中断0,1
TCON|=0x05; //外部中断0和1负边缘触发
}
/******************显示歌曲(数码管)****************/
void display(char a)
{
P0=table[a];
}
vo 32、id main()
{
char num1,num2;
unsigned char flag0;
num1=0;//对应递增按钮,即外部中断0
num2=0;//对应递减按钮,即外部中断1
flag0=1;//定时器T0中断标志位
flag1=0;//递增中断标志位
flag2=0;//递减中断标志位
BUZZER=0;
TIME0_INIT(); //定时器初始化
INT_INIT(); //外部中断初始化
while(1)
{
display(num1);
while(flag0) //定时器T0中断标 33、志位
{
if(SONG[num1][num2]==20)flag0=0; //如果检测到最后一个音调为20,说明此曲应该结束
else
{ if(flag1==1) //中断检测
{
num1++;
if(num1>3)num1=0;
num2=0;
flag1=0;
display(num1);
}
if(flag2==1) //中断检测
{
num1--;
i 34、f(num1<0)num1=3;
num2=0;
flag2=0;
display(num1);
}
SET_BUZZER_TONE(TONE[SONG[num1][num2]]);//音调
DELAY_MIN_BEAT(BEAT[num1][num2]);//节拍
num2++;
}
}
num2=0;
flag0=1;
num1++;
if(num1==4)num1=0;
}
}
/*************定时器0中断函数****************/
v 35、oid T0_TONE(void) interrupt 1
{
TH0=th;
TL0=tl;
BUZZER=~BUZZER;
}
/**************外部中断0函数*****************/
void INT0_SELECT(void) interrupt 0
{
flag1=1;
}
/**************外部中断1函数*****************/
void INT1_SELECT(void) interrupt 2
{
flag2=1;
}
5 结论
此次课程设计过程中,我查阅了一些相关资 36、料,使得我更深入的了解单片机芯片的工作原理和音乐知识以及相关软件、硬件的使用方法。在这一段的时间里,我不仅完成设计所要求的内容,也掌握了STC89C52芯片的具体功能。此外,设计中所涉及到的元器件还有:三极管、电阻、瓷片电容等,我通过查阅相关元器件的作用及工作原理,并对其进行测试,从而减少实验中的客观误差。
结果紧张的做板以及焊接元器件,然后就就行相关的调试,刚开始的时候怎么调都不出结果,然后就开始分析原理图和相关的仿真图,才发现原来是在画原理图的时候把一个接地的地方给弄错了,所以才导致什么结果都没有!而后结果修正和跳线改进,以及仔细的检查PCB电路的每条线是不是都相通以及不应该相通的电路会 37、不会因为由于线路太靠近而导致其相接,最后再经过详细和仔细的检查下,制作的音乐盒终于播放出了美妙的音乐,在那一刻,突然发现以前不停的查找资料和冷天出去腐蚀板子的种种都过去了,就这一刻,抵过以前付出的种种。
参考文献
[1] 王静..北京:水利水电出版社,2010.
[2] 郭天祥.新概念51单片机C语言教程.北京:电子工业出版社,2009.
附录A:原理图
附录B:仿真图
附录C:PCB图
附录D:实物测试图
(1)播放第一首歌的某个频率图 (2)播放第二首歌的某个频率图
(3)播放第三首歌的某个频率图 (4)播放第四首歌的某个频率图






