ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:426.40KB ,
资源ID:10986349      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10986349.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机的音乐盒设计报告.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单片机的音乐盒设计报告.docx

1、单片机的音乐盒设计报告单片机-数字音乐盒设计报告学 院: 信息科学与工程学院 班 级: 设计人员: *完成时间: 2012 年06月03号 【摘要】本设计是一个基于AT89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用一个按键控制音乐盒,即切换歌曲按键,本音乐盒共有两首歌曲。播放歌曲时,蜂鸣器发出音调。本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。【关键字】音乐盒;AT89C51单片机; KEIL;

2、 PROTEUS; 音调一、概述01二、 系统组成框图01三、各部分硬件设计及其原理013.1 AT89C51简介013.2 时钟振荡电路023.3 硬件电路图及功能02四、软件设计034.1 音调、节拍以及编码的确定方法034.2程序相应代码块044.3 程序源代码(见附录A)05五、调试055.1 检查硬件连接055.2 检查软件系统065.3 总体运行图06六、 总结07参考文献07附录A 程序源代码及注释08一、概述本设计是以AT89C51芯片的电路为基础,外部加上放音设备,以此来实现音乐演奏控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其演奏出优美动听的音乐。用户可以按照自

3、己的喜好选择音乐并将其转化成机器码存入单片机的存储器中。对于不同型号的单片机只需要相应的改变一下地址即可。该软、硬件系统具有很好的通用性,很高的实际使用价值,为广大的单片机和音乐爱好者提供了很好的借鉴。二、 系统组成框图 音乐盒的系统结构以AT89C51单片机位控制核心,加上1个按键、时钟复位电路、蜂鸣器、L模块组成。图3.1总体设计框图三、各部分硬件设计及其原理3.1 AT89C51简介AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,

4、俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图3.2所示图3.2 AT89C51系列单片机3.2 时钟振荡电路 AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XT

5、AL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,我们推荐电容使用30PF10PF,而如果使用陶瓷振荡器建议选择40PF10PF。用户也可以采用外部时钟。采用外部时钟的电路如图示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。由于外部时钟信号是通过一个2分频触发器后作为内部时钟信

6、号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。振荡器电路图如下:图3.3 单片机内部、外部振荡电路3.3 硬件电路图及功能总体硬件电路实现功能如下,如图3.4所示1)电路中用P3.2、P3.3控制按键。2)P2.3控制蜂鸣器。3)电路为12MHZ晶振频率工作,起振电路中C1、C2均为30PF。四、软件设计在本程序中设置了一个标志count1,分别初始化为0。按键1使得count1在14之间切换。程序检测count1的值,count1等于1时播放第一首歌曲,等于2时播放第二首。4.1 音调、节拍以及编码的确定方法一般说来,单片机

7、演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD

8、、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者b号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。 1

9、)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。 2)利用AT89C51的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。 此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。 3)例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每

10、次技术956次时将I/O反相,就可得到中音DO(523Hz)。 计数脉冲值与频率的关系公式如下: N=Fi2Fr N:计算值; Fi:内部计时一次为1us,故其频率为1MHz;4)其计数值的求法如下:T=65536-N=65536-Fi2Fr例如:设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的计算值T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr低音DO的T=65536-500000/262=63627低音DO的T=65536-500000/523=

11、64580低音DO的T=65536-500000/1047=650594.2 程序相应代码块主程序代码:main() count2=1;/唱第一首歌 P34=0;/选取矩阵键盘的一列 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) duan=1; beep(); delay1(300); duan=0; song(); delay1(1000); 播放音乐子程序代码:void son

12、g() uint temp; uchar jp;/jp是简谱 i=0; while(1) if(count1=0) break; if(count1=1) /选曲 temp=qnzli; / 播放千年之恋 if(count1=2) temp=jmszli; / 播放寂寞沙洲冷 if(temp=0xff) /结束标志 break; jp=temp/16; /取数的高4位 duan=1; duan=0; if(jp!=0) timeh=cuzhijp*2; timel=cuzhijp*2+1; else TR0=0; fm=1;/关蜂鸣器 delay(temp%16); /取数的低4位 TR0=0

13、; /唱完一个音停10MS fm=1; delay1(10); TR0=1; i+; TR0=0; fm=1; 延时程序代码:void delay(uint z) /延时165MS,即十六分音符 uint x,y; for(x=z;x0;x-) for(y=19000;y0;y-);void delay1(uint z) /延时1MS uint x,y; for(x=z;x0;x-) for(y=112;y0;y-);4.3 程序源代码(见附录A)五、调试5.1 检查硬件连接 在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正确,例如:晶振电路的连接,复位电路是否设计正确。5.2 检查

14、软件系统 1根据系统的原理结构检查各流程图是否正确,再根据流程图来检查程序是否也正确。2将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现问题即可把源程序编译成HEX文件装载到单片机中,对硬件进行仿真。5.3 总体运行图图5.1 系统总体运行图六、 总结单片机的设计至今为止已经进入了令人鼓舞的阶段,在进行了长达一个学期的时间的摸索与实验,使我们不仅仅是对于单片机入门软件与硬件的常用设计与功能,还使我们对于一项设计研究的制作过程所需要的详细步骤和具体的实现方法的力度的掌握。 当然在这次宝贵的设计活动中,经验才是对于我们最大的收获,而且还

15、增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括这次难忘的活动我觉得再合适不过了。但是,光是完成了作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终目的下,随着对单片机这门学科的认识加深,到达了拓展的程度,我想这个目的将在不远的时期内被实现。总之,这次设计从软件编写、调试到软硬件联机调试,我们倾注了大量的时间和心血。真是曾经为程序的编写而冥思苦想过,曾经为无法找出错误而郁闷苦恼过,也曾经为某一功能不能实现而犹豫彷徨过,但最终我们完成设计了。参考文献1 谭浩强.C语言程序设计(第二版)M,北京:

16、清华大学出版社,1991. 2 彭伟. C语言程序设计初实训100例 基于8051+Proteus仿真 电子工业出版社 2009.6附录A 程序源代码及注释#include #define uchar unsigned char#define uint unsigned intsbit duan=P26;sbit key1=P33;/按key1可切换歌曲sbit fm=P37;/蜂鸣器连续的IO口sbit P34=P34;/矩阵键盘的一列uchar count1;/歌曲标志 uchar timeh,timel,i;/-简谱-/编程规则:字节高位是简谱,低位是持续时间,/代表多少个十六分音符/1

17、-7代表中央C调,8-E代表高八度,0代表停顿/最后的0是结束标志uchar code qnzl= /千年之恋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,

18、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,

19、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/结束标志;uchar code jmszl= /寂寞沙洲冷0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,0x51,0x52,0x31,0x52,0x62,

20、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,

21、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,0x3

22、2,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,0xff;/-简谱音调对应的定时器初值-uchar code cuzhi= 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,

23、 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 ;void delay1(uint z); /延时1MSvoid delay(uint z); /延时165MS,即十六分音符void song();void beep();/蜂鸣器叫一声main() count1=1;/唱第一首歌 P34=0;/选取矩阵键盘的一列 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) du

24、an=1; beep(); delay1(300); duan=0; song(); delay1(1000); void int0() interrupt 0 EA=0;/关总中断 delay1(1);/去抖 if(key1=0) count1=0;/不让蜂鸣器唱歌 TR0=0; EA=1;/开总中断void int1() interrupt 2 EA=0;/关总中断 delay1(1);/去抖 if(key1=0) TR0=1; i=0;/从头开始唱 count1+; if(count1=3) count1=1; EA=1;/开总中断void timer0() interrupt 1 /用

25、于产生各种音调 TH0=timeh; TL0=timel; fm=fm;void song() uint temp; uchar jp;/jp是简谱 i=0; while(1) if(count1=0) break; if(count1=1) /选曲 temp=qnzli; if(count1=2) temp=jmszli; if(temp=0xff) break; jp=temp/16; /取数的高4位 duan=1; duan=0; if(jp!=0) timeh=cuzhijp*2; timel=cuzhijp*2+1; else TR0=0; fm=1;/关蜂鸣器 delay(temp%16); /取数的低4位 TR0=0; /唱完一个音停10MS fm=1; delay1(10); TR0=1; i+; TR0=0; fm=1; void delay(uint z) /延时165MS,即十六分音符 uint x,y; for(x=z;x0;x-) for(y=19000;y0;y-);void delay1(uint z) /延时1MS uint x,y; for(x=z;x0;x-) for(y=112;y0;y-);void beep() /蜂鸣器叫一声 uchar i; for(i=0;i50;i+) fm=fm; delay1(1); fm=1;

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

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