找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9892|回复: 3
打印 上一主题 下一主题
收起左侧

基于51单片机的电子音乐盒的设计与实现(文档下载)

[复制链接]
跳转到指定楼层
楼主
ID:453219 发表于 2018-12-24 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于单片机的电子音乐盒的设计与实现
一、设计目的
为证明单片机可以通过软件程序控制硬件电路实现简单音乐播放器的功能,以此证明单片机的功能强大。
二、设计概述
   本课题是一个基于51单片机的电子音乐盒,依据单片机控制技术原理,设计出一个可以播放多首音乐的数字音乐盒,通过数码管显示当前是第几首音乐,系统设计了三个按键,具体功能:S1:暂停/播放;S2:加一首(下一首);S3:减一首(上一首)。通过硬件电路制作以及以及软件编程,设计制作出一个多功能的电子音乐盒。
三、设计方案
在这个系统的设计中,单片机采用51兼容系列的STC89C52RC。有以下几部分构成:电源电路、单片机最小系统、发声系统、键盘控制电路、显示电路。经过论证后我确定的系统框图,如下图所示:




四、设计原理
1、原理
本系统由单片机系统,独立按键、数码管组成。利用I/O口产生一定频率的方波,驱动扬声器,发生不同的音调,从而实现乐曲的演奏。系统能通过功能键完成选择乐曲、播放、暂停、和复位的基本功能。在播放乐曲的同时LCD上显示所播放的歌曲序号,可以通过复位键使音乐盒从第一首歌曲重新播放,本系统成本低廉,功能强大实用。
2、音乐基础简介
<1>音乐频率表
低音
频率
中音
频率
高音
频率
11
262
1
523
11
1046
22
294
2
587
22
1175
33
330
3
659
33
1318
44
349
4
698
44
1397
55
392
5
784
55
1568
66
440
6
880
66
1760
77
494
7
988
77
1967
<2>音调表建立
由于单片机输出为方波输入信号,波形图如下:
高低电平各占1/2,根据单片机定时器工作原理。
定时时间=(满值-初值)X机器周期
    初值=满值-定时时间/机器周期
        =216-(1/f)X(1/2)X106
以低音11为例,初值为=216-(1/262)X(1/2)X106
                    =63627.6
                    =63628
同理得其他音调值,具体如下:
Unsigned int code table[]={0,63628,63835,64021,64103,64260,64399,64523,64579,64684,64777,64819,64898,64968,65030,65058,65110,65157,65178,65217,65252,65282};
<3>音乐表的建立
我们以两只老虎音乐为例子,然后我们就会得到该音乐表
Uchar code music1[]={8,4,9,4,10,4,8,4,9,4,10,4,8,4,10,4,11,4,12,8,10,4,11,4,12,8,12,3,13,1,12,3,11,1,10,4,8,4,12,3,13,1,12,3,11,1,10,4,8,4,9,4,5,4,8,8,9,4,5,4,8,8,0,0xff};
3、硬件电路设计
  • 单片机最小系统
在基于单片机的应用系统中,其核心是单片机的最小系统,而单片机又是最小系统的核心,为了方便起见,采用的型号是:STC89C52RC,内部资源有:8kbflash,512b sram,4个8位I/O口,2个TC,1个UART,带ISP和IAP功能。是近年来流行的低端51单片机。时钟电路采用12MHz晶体,复位电路采用简单的RC复位电路。R4=1KΩ,R3=10KΩ,C5=10Uf。
  • 发声控制电路
音乐的发生器采用小喇叭,使用PNP型三极管。
  • 键盘控制电路
通过安按键来控制乐曲的暂停/播放、加+、减-。S1、S2、S3的功能设定如下。S1暂停/播放;S2乐曲/+;S3乐曲/-。
  • 音乐数目显示电路
显示当前的乐曲序列。为了直观的观察室哪一首曲子的效果,设置一位数码管显示,数码管需要接一个200-100Ω的电阻起分压作用。
4、程序流程图


五、仿真结果
所仿真出来的结果,去掉N2905,声音变小了,加上之后声音变大了,额,第一首是两只老虎,第二首,我换成通天大道,不过没找到乐谱规律,错了,第三首是小兔子快开门,第四首新年好,第五首歌曲接连被放出来。效果不错。
六、总结
通过本次仿真作图,以及程序编写,仿真原图,和自己再画图,和程序再组合效果,依然不错,原图只是作为参考,其次,通过本次作业,明白,每一门课代表以后的每项工作,而这门课开设的原因估计是要我们认为,在一台机器,里面通过芯片,芯片的程序带动硬件,一件成品就出来了。所以,软件和硬件属于相辅相成,在未来的世界中,是属于硬件和软件共存的时代,没有软件,硬件别想动;同理硬件也是一样的。认可了工程师的伟大,以及程序员的厉害之处。
七、附录
1、元件清单
元件清单:2N2905、2W10G、7SEG-MPX2-CA  A700127M004ATE018、AT89C52、BUTTON、BUZZER、CAP  CRYSTAL、 DIODE-LED、 RES、 SW-SPDT
2、电路图


单片机源程序如下:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit buzzer=P2^7;
  5. void delay(uint z);
  6. void scan();
  7. sbit S1=P3^1;
  8. sbit S2=P3^2;
  9. sbit S3=P3^3;
  10. bit flag=1;
  11. uchar buf,high,low,n;
  12. char i;
  13. uint sound;
  14. uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  15. uint code table[]={0,63628,63835,64021,64103,64260,64399,64523,64579,64684,64777,64819,64898, 64968,65030,65058,65110,65157,65178,65217,65252,65282};
  16. uchar code music1[]={8,4,9,4,10,4,8,4,9,4,10,4,8,4,10,4,11,4,12,8,10,4,11,4,12,8,12,3,13,1,12,3,11,1,10, 4,8,4,12,3,13,1,12,3,11,1,10,4,8,4,9,4,5,4,8,8,9,4,5,4,8,8,0xff};
  17. uchar code music2[]={10,10,10,9,8,9,10,12,10,10,9,8,9,10,20,19,20,17,19,19,19,15,20,19,17,19,19,19, 15,16,17,16,19,17,16,15,16,19,8,20,19,19,8,20,19,17,19,20,8,8,20,19,10,10,12,9,8,8,0xff};
  18. uchar code music3[]={12,4,15,2,13,2,12,4,12,4,10,2,12,2,13,2,15,4,12,4,12,4,13,4,12,2,10,2,9,4,9,4,10, 4,12,2,10,2,9,2,10,2,8,4,13,4,12,4,13,4,12,4,13,4,12,4,10,4,13,4,12,4,12,2,12,2,10,2,9,2,8,2,8,8,2,8,2,9,2,10,2,8,8,0xff};
  19. uchar code music4[]={8,3,8,3,8,3,5,3,10,3,10,3,10,3,8,4,8,3,10,3,12,3,12,4,10,3,11,3,10,3,9,6,9,3,10,3, 11,3,11,4,10,3,9,3,10,3,8,4,8,3,10,3,9,3,5,4,7,3,9,3,8,6,0xff};
  20. uchar code music5[]={0,2,8,2,10,2,11,2,12,2,12,2,11,2,12,4,13,2,14,2,15,2,10,2,10,2,11,2,12,8,13,4,12, 2,11,2,12,2,15,2,15,4,13,4,13,2,14,2,15,4,14,4,12,4,10,2,11,2,10,2,11,2,12,4,13,2,14,2,15,4,14,2,13,2,12,8,12,2,13,24,9,8,16,0xff};
  21. uchar code *menu[]={0,music1,music2,music3,music4,music5};
  22. uchar *p;
  23. char j;
  24. void int0() interrupt 0
  25. {if(S2==0)
  26.    {delay(1);
  27.      if(S2==0)
  28.               {j++;
  29.          if(j==6)
  30.                             {j=1;}            
  31.            P0=num[j];
  32. TR0=0;TR1=0;
  33. n=0;i=3;
  34. p=menu[j];
  35. }     
  36. delay(1);
  37. while(! S2);
  38.   }
  39. }
  40. void int1() interrupt 2
  41. {
  42.    if(S3==0)
  43.    {  delay(1);
  44. if(S3==0)
  45. { j--;
  46.   if(j==0){j=5;}
  47.    P0=num[j];TR0=0;TR1=0;n=0;i=3;p=menu[j];}
  48. delay(1);
  49. while(! S3);
  50. }
  51. }
  52. void t1() interrupt 3
  53. {
  54.               TH1=(65536-50000)/256;
  55.               TL1=(65536-50000)%256;
  56.               n--;
  57.               scan();
  58. }
  59. void t0() interrupt 1
  60. {
  61.               TH0=high;
  62.               TL0=low;
  63.               buzzer=!buzzer;
  64. }
  65. void init()
  66. {
  67.               TMOD=0x11;
  68.               TH1=(65536-50000)/256;
  69.               TL1=(65536-50000)%256;
  70.               EA=1;ET0=1;ET1=1;EX0=1;
  71.               EX1=1;IT0=1;IT1=1;
  72. }
  73. void main()
  74. {            
  75.               init();
  76.               while(1)
  77.               {
  78.               for(j=1;j<6;j++)
  79.               {P0=num[i];
  80.                 i=0;p=menu[j];
  81.                  delay(200);while(p[i]!=0)
  82.                  {
  83.                                           buf=p[i];
  84.                                           if(buf!=0)
  85.                                           {
  86.                                                                       sound=table[buf];
  87.                                                                       high=sound/256;
  88.                                                                       low=sound%256;
  89.                                                                       TH0=high;
  90.                                                                       TL0=low;
  91.                                                                       if(flag)
  92.                                                                       {
  93.                                                                         TR0=1;
  94.                                                                         }
  95.                                                                         else
  96.                                                                         {
  97.                                                                         while(!flag);
  98.                                                                         }
  99.                                               }
  100.                                                         else{
  101.                                                         TR0=0;
  102.                                                         }
  103.                                                         i++;
  104.                                                         n=p[i]*2;
  105.                                                         TR1=1;
  106.                                                         while(n!=0);
  107.                                                         i++;
  108.                      }
  109.                  }
  110.               }
  111. }
  112. void scan()
  113. {                           
  114.                             if(S1==0)
  115.                             {
  116.                                 delay(10);
  117.                                           if(S1==0)
  118.                                           {
  119.                                                                       flag=!flag;
  120.                                                                       TR0=~TR0;
  121.                                           }
  122.                                           while(!S1)
  123.                                           {
  124.                                              delay(10);
  125.                                           }
  126.                                              while(!S1);
  127.                             }
  128. }
  129. void delay(uint z)
  130. {uint x,y;
  131.               for(x=0;x<100;x++)
  132.                             for(y=0;y<z;y++);}
复制代码

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
基于单片机的电子音乐盒的设计与实现.docx (123.75 KB, 下载次数: 115)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:770726 发表于 2020-6-9 09:25 | 只看该作者
如果把第二首音乐去掉,那其他代码的哪些部分需要改动呀
回复

使用道具 举报

板凳
ID:777601 发表于 2020-6-21 09:53 | 只看该作者
有电路图吗
回复

使用道具 举报

地板
ID:783980 发表于 2020-6-21 10:12 | 只看该作者
有资源包吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表