标题: 单片机数字音乐盒设计说明书文档及源代码 [打印本页]

作者: 13顶顶顶单反    时间: 2025-5-22 09:59
标题: 单片机数字音乐盒设计说明书文档及源代码
第1章 绪论
随着科学技术的进步和社会的发展,人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人们已经能够利用计算机等工具高效准确地对之进行处理。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。
第2章 系统论述
2.1 总体方案

本次设计是一个基于AT89C51单片机的音乐盒,该音乐盒主要由按键电路、复位电路、时钟电路、蜂鸣器以及显示电路组成。使用其中两个按键来控制播放和暂停另外两个按键用来控制换曲。利在液晶上显示曲目的更换,共三首音乐,蜂鸣器每播放一首歌时液晶上显示相对应的歌曲次序。系统组成框图如图2-1。

2.2 基本原理
1)主体电路:

直流电机PWM控制模块:这部分电路主要由89C51单片机的I/O端口、定时计数器、外部中断扩展等控制直流电机的加速、减速以及电机的正转和反转,并且可以调整电机的转速,还可以方便的读出电机转速的大小和了解电机的转向,能够很方便的实现电机的智能控制。

此外,还包括直流电机的直接清零、启动(置数)、暂停、连续功能。其间是通过89C51单片机产生脉宽可调的脉冲信号并输入到L298驱动芯片来控制直流电机工作的。

2)各部分电路模块的组成:

  (a)设计输入部分:这一模块主要是利用带中断的独立式键盘来实现。

  (c)设计控制部分:主要由89C51单片机的外部中断扩展电路组成。

  (b)设计显示部分:是直接采用SM410564四位共阳数码管组成显示模块。

3)直流电机PWM控制实现部分:

   主要由一些二极管、电机和L298直流电机驱动模块组成。

2.3 原理框图
1)系统组成:如图2-1所示

图2-1  直流电机PWM调速方案

    2)方案说明:

直流电机PWM调速系统以AT89C51单片机为控制核心,由命令输入模块、LED显示模块及电机驱动模块组成。采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,定时不断给直流电机驱动芯片发送PWM波形,H型驱动电路完成电机正,反转控制;同时单片机不停的将从键盘读取的数据送到LED显示模块去显示,从中不仅能读取其速度,而且能知道它的转向。

     

第3章 系统的硬件设计
3.1 单片机最小系统的设计
1)单片机AT89C51

    AT89C51是一种带4K字节闪烁可编程可擦出只读存储器的低电压,高性能 CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术,与工业标准MCS-51指令集合输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且廉价的方案。

2)复位电路及时钟电路:

    复位电路和时钟电路是维持单片机最小系统运行的基本模块。

两种常用复位电路:上电复位和手动复位。

其中:上电复位,如图3-1所示;手动复位,如图3-2所示。

              

             图3-1 上电复位                        图3-2 手动复位

有时系统在运行过程中出现程序跑飞的情况,在程序开发过程中,经常需要手动复位。所以本次设计选用手动复位。

高频率的时钟有利于程序更快的运行,也有利于实现更高的信号采样率,从而实现更多的功能。但是高速对系统的要求较高,而且功耗大,运行环境苛刻。考虑到单片机本身用于控制,而并非高速信号采样处理,所以选取合适的频率即可。合适频率的晶振对于选频信号强度准确度都有好处。

本次设计选取12.0M无源晶振接入XTAL1和XTAL2引脚。并联2个30pF陶瓷电容帮助起振。单片机最小系统如图3-3所示:

   

                             图3-3  单片机最小系统

3.2 电源电路设计

直流稳压电源的基本原理:直流稳压电源一般有电源变压器T、整流滤波电路及稳压电路所组成,基本框图如图3-4所示。

图3-4 直流电源原理

1)电源变压器T

    将220V的交流电压变换成整流滤波电路所需要的交流电压Ui,变压器副边与原边的功率比为P2/P1=n,式中n是变压器的效率。

2)整流电路:

   整流电路将交流电压Ui变换成脉动的直流电压。再经滤波电路滤除较大的波纹成分,输出波纹较小的直流电压U1。常用的整流滤波电路有全波整流滤波、桥式整流滤波等。

3)滤波电路:

   各滤波电路C满足RL-C=(3~5)T/2,式中T为输入交流信号周期,RL为整流滤波电路的等效负载电阻。

4)稳压电路:

   常用的稳压电路有两种形式:一是稳压管稳压电路,二是串联型稳压电路。二者的工作原理有所不同。稳压管稳压电路其工作原理是利用稳压管两端的电压稍有变化,会引起其电流有较大变化这一特点,通过调节与稳压管串联的限流电阻上的压降来达到稳定输出电压的目的。它一般适用于负载电流变化较小的场合。串联型稳压电路是利用电压串联负反馈的原理来调节输出电压的。集成稳压电源事实上是串联稳压电源的集成化。

3.3 直流电机驱动电路设计

由于单片机P3口输出的电压最高才有5V,难以直接驱动直流电机。所以我们需要使用恒压恒流桥式2A驱动芯片L298N来驱动电机。

本设计所采用的L298N,可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V,输出电流可达2.5A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。

L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机,连接于OUT1和OUT2端口之间(电动机在子图中未画出)。

此外,5,7脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。同时,需要加四个二极管在电机的两端,防止电机反转的时候产生强大的冲击电流烧坏电机。具体直流电机驱动电路,如图3-5所示。

                                 图3-5 驱动电路

3.4 显示模块设计

本次设计显示模块直接采用的是SM410564 四位共阳数码管显示。又因为单片机的输出端口输出的电流较小,点亮数码管的能力不大,所以需要采用三极管对输出电流进行放大,此次三极管采用的是C9013,具体放大电路如图3-6所示:

                                图3-6 放大电路

3.5 按钮电路设计

正转、反转、急停、加速、减速五个开关分别与单片机的P1.0,P1.1,P1.2,P1.3,P1.4相连,然后再与地相连。急停实现直流电机的停转,正转实现直流电机的正转,反转实现直流电机的反转,加速实现直流电机的加速,减速实现直流电机的减速,其电路如图3-7所示。

     图3-7 控制按钮电路

3.6 元件参数选择
1)实际计算过程

  (a)变压器选择:变压器选择双15V变压,考虑到电流不需要太大,最大电流为1A,实际选择变压器输出功率为10W,可以很好的满足要求。

  (b)整流桥:考虑到电路中会出现冲击电流,整流桥的额定电流是工作电流的2~3倍。选取RS301(100V,3A)即可,实际购买过程中选择了RS30(700V,3A)也符合设计要求。

  (c)滤波电容:考虑到对纹波电压要求比较高,故选择了2200μF耐压值为25V以及100μF耐压值50v的电解电容。

  (d)去耦电容:去耦电容的选择是7812及7805芯片要求的,查手册可知分别为0.01μF,用来滤除高频分量防止产生自激。

  (e)电解电容:为了防止负载产生冲击电流,故在输出端加入2200μF、耐压值为25V的电解电容。

  (f)7805支路的元件参数基本相同。

直流电源产生电路:12V如图3-7所示、5V如图3-8所示:

                                图3-7 12V电源

                                 图3-8 5V电源

第4章 系统的软件设计
4.1 总体方案

利用P3口,编制程序输出一串脉冲,经放大后驱动直流电机,改变输出脉冲的电平的持续时间,达到使电机正转、反转、加速、减速、停转等目的。由软件编程从P3.0/P3.1管脚产生PWM 信号,经驱动电路输出给电机,从而控制电机得电与失电。软件采用延时法进行设计。单片机上电后,系统进入准备状态。当按动启动按钮后,根据P3.0为高电平时实现电机正转,P3.1为高电平时实现电机反转。根据不同的加减速按钮,调整P3.0/ P3.1输出高低电平时的占空比,从而可以控制P3.0/ P3.1输出高低电平时的有效值,进而控制电机的加减速。


其总体流程图如图4-1所示:
图4-1 总体程序流程图

P3.0/P3.1脉冲宽度调制器(PWM) 通道,它们产生可由编程决定宽度和间隔的脉冲。脉冲的间隔周期是由一个FOR循环控制,来产生不同的占空比。单片机产生的PWM信号不能直接驱动电机,这就需要设计合适的驱动电路,用以可以间接地驱动电机,使其能够正常运行。为此,我们可借助于恒压恒流桥式2A驱动芯片L298N来完成对电动机的驱动。具体的设计方法是通过Keil C编程,Proteus联合仿真来实现的。

4.2 相关软件介绍
1)Proteus

Proteus是一种低投资的电子设计自动化软件,提供Schematic Drawing,SPICE仿真与PCB设计功能,这一点Proteus与multisim比较类似,只不过它可以仿真单片机和周边设备,可以仿真51系列、AVR,PIC等常用的MCU,与Keil和MPLAB不同的是它还提供了周边设备的仿真,只要给出电路图就可以仿真,例如373,led,示波器,Proteus提供了大量的元件库有RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件,编译方面支持Keil和MPLAB,里面有大量的例子参考。

   (a)Proteus可提供的仿真元件资源Proteus软件提供了可仿真数字和模拟、交流和直流等数千种元器件和多达30多个元件库;

   (b)Proteus可提供的仿真仪表资源虚拟仪器仪表的数量、类型和质量,是衡量仿真软件实验室是否合格的一个关键因素。在Proteus软件中,理论上同一种仪器可以在一个电路中随意的调用;

   (c)除了现实存在的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来;

   (d)Proteus还提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。

2)Keil

    Keil是德国开发的一个51单片机开发软件平台,最开始只是一个支持C语言和汇编语言的编译器软件。后来随着开发人员的不断努力以及版本的不断升级,使它已经成为了一个重要的单片机开发平台,不过KEIL的界面并不是非常复杂,操作也不是非常困难,很多工程师的开发的优秀程序都是在KEIL的平台上编写出来的。可以说它是一个比较重要的软件,熟悉他的人很多很多,用户群极为庞大,要远远超过伟福等厂家软件用户群,操作有不懂的地方只要找相关的书看看,到相关的单片机技术论坛问问,很快就可以掌握它的基本使用了。

  (a)Keil的UVision2可以进行纯粹的软件仿真(仿真软件程序,不接硬件电路),也可以利用硬件仿真器,搭接上单片机硬件系统,在仿真器中载入项目程序后进行实时仿真;

  (b)可以使用UVision2的内嵌模块Keil Monitor-51,在不需要额外的硬件仿真器的条件下,搭接单片机硬件系统对项目程序进行实时仿真;

  (c)uVision2调试器具备所有常规源极调试,符号调试特性以及历史跟踪,代码覆盖,复杂断点等功能。DDE界面和shift语言支持自动程序测试。

4.3 应用软件的编制、调试

使用Keil 软件工具时,项目开发流程和其它软件开发项目的流程极其相似。

1)创建一个项目,从器件库中选择目标器件,配置工具设置;

2)用C语言或汇编语言创建源程序;

3)用项目管理器生成应用;

4)修改源程序中的错误;

5)测试,连接应用。

第5章 仿真结果与分析5.1仿真电路图

如图5-1所示:

图5-1 仿真电路图
5.2 仿真结果

1)半速运行状态,运行结果如图5-1所示:

        

      图5-1 电机半速运行

2)按下急停键,停止运行如图5-2所示:

图5-2 电机停止运行

3)按下加速键,加速运行如图5-3所示:

图5-3 电机加速运行

4)按下减速键,减速运行如5-4所示:

图5-4 电机减速运行

按下反转键,反转运行如图5-5所示:

图5-5 电机反向运行

第6章总结

这次设计,运用AT89C51单片机为核心硬件,设计了直流电机的转速控制系统。实现了对直流电机的停止、加速、减速、正转、反转等多种控制功能,基本满足设系统计的要求。同时,在驱动芯片和电动机的连接之间我有加入续流二极管,在电机反向运转时进行续流,避免烧坏电机及其他元件。在此设计中P0口作为输出端口,我们在P0口接入了排阻使电路复位后P0口输出的为高电平。

通过本次设计,学习与掌握了AT98C51单片机的基本原理及其各种应用,对它的各种硬件接口与软件设计方法有较深入的认识。对自动控制系统的动、静态性能及其控制有了一定的认识。本设计重点在于应用,因此在设计过程中使自己的动手能力得到锻炼,同时提高了解决实际问题的能力

感谢两周以来每一位指导过自己的人,谢谢他们给自己的知识,以及在专业知识和学习方法方面给我的许多的指导和启发,使我受益匪浅。谢谢他们的教导,谢谢他们帮我成长。


单片机源程序如下:
  1. #include<at89x51.h>
  2. #define unchar unsigned char
  3. #define unint unsigned int
  4. unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,
  5. 0x99,0x92,0x82,0xf8,
  6. 0x80,0x90,0x88,0x83,
  7. 0xc6,0xa1,0x86,0x84,0xff,0xbf}; //显示代码
  8. unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7};   //位选口
  9. unsigned char dispbuf[4]={0,0,0,0};
  10. unsigned char dispbitcnt;
  11. unint mstcnt;
  12. unint i;

  13. unint count=0;
  14. unchar tp=0;
  15. void ledshow();
  16. void keyscan();
  17. void delay();
  18. void just();
  19. void turn();
  20. void motorstop();
  21. void speedup();
  22. void speeddown();

  23. void main(void)
  24. {
  25. P3_0=1;
  26. P3_1=0;
  27. dispbuf[0]=16;
  28. TMOD=0x02;
  29. TH0=0x06;
  30. TL0=0x06;
  31. TR0=1;
  32. ET0=1;
  33. EA=1;
  34. while(1)
  35.     {
  36.         ledshow();//数码管显示
  37.         keyscan();//键盘扫描
  38.     }
  39. }
  40. //延时10ms程序
  41. void delay()
  42. {
  43. unsigned char i,j;
  44. for(i=20;i>0;i--)
  45. for(j=248;j>0;j--);
  46. }
  47. //键盘扫描程序
  48. void keyscan()
  49. {
  50.     unchar temp=0;
  51.     P1=0xff;
  52.     if((P1&0x1f)!=0x1f)
  53.     {
  54.         delay();
  55.         if((P1&0x1f)!=0x1f)
  56.         {
  57.             temp=P1&0x1f;
  58.             switch(temp)
  59.             {
  60.             case 0x1e:
  61.                 just();break;
  62.             case 0x1d:
  63.                 turn();break;
  64.             case 0x1b:
  65.                 motorstop();break;
  66.             case 0x17:
  67.                 speedup();break;
  68.             case 0x0f:
  69.                 speeddown();break;
  70.             }
  71.         }
  72.     }
  73.     while((P1&0x1f)!=0x1f);
  74. }
  75. //数码管显示程序
  76. void ledshow()
  77. {
  78. P0=dispcode[dispbuf[dispbitcnt]];
  79. P2=dispbitcode[dispbitcnt];
  80. dispbitcnt++;
  81. if(dispbitcnt==4)
  82. {
  83. dispbitcnt=0;
  84. }  

  85. P2=0x01;P0=dispcode[dispbuf[0]];
  86. for(i=0;i<700;i++);

  87. P2=0x02;P0=dispcode[dispbuf[1]];
  88. for(i=0;i<700;i++);

  89. P2=0x04;P0=dispcode[dispbuf[2]];
  90. for(i=0;i<700;i++);

  91. P2=0x08;P0=dispcode[dispbuf[3]];
  92. for(i=0;i<700;i++);

  93.     dispbuf[1]=tp/100;
  94.     dispbuf[2]=(tp%100)/10;
  95.     dispbuf[3]=tp%10;
  96. }
  97. //中断服务程序
  98. void t0(void) interrupt 1 using 0</font>
复制代码

word文档下载: 数字音乐盒全套说明书及源代码.doc (346.89 KB, 下载次数: 0)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1