音乐盒设计(单片机课程设计)1
单片机音乐盒课程设计

单片机音乐盒课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和编程方法,掌握音乐盒制作的硬件和软件需求。
2. 使学生掌握音乐盒音符的组合和编排,能运用单片机制作个性化的音乐作品。
3. 帮助学生了解声音的产生、传播和接收过程,提高对声学知识的理解和应用能力。
技能目标:1. 培养学生动手实践能力,能独立完成单片机音乐盒的组装和编程。
2. 培养学生创新思维和问题解决能力,能针对实际问题提出解决方案并优化改进。
3. 提高学生团队协作能力,能在小组合作中发挥个人优势,共同完成项目任务。
情感态度价值观目标:1. 培养学生对单片机编程和电子制作的兴趣,激发学习热情和积极性。
2. 培养学生勇于尝试、不断探索的精神,增强克服困难的信心和毅力。
3. 培养学生关注社会、关爱他人的责任感,通过音乐盒的制作,传递美好情感,传播正能量。
课程性质:本课程为实践性强的课程,旨在通过单片机音乐盒的制作,将理论知识与实际应用相结合,提高学生的综合素养。
学生特点:学生具备一定的电子基础知识,对单片机和编程有一定了解,喜欢动手实践,富有创新精神。
教学要求:教师应注重理论与实践相结合,引导学生主动探究,鼓励学生创新思维,关注学生个体差异,提供个性化指导。
通过课程学习,使学生达到预定的学习成果,为后续学习打下坚实基础。
二、教学内容1. 理论知识:- 单片机原理与编程基础:介绍单片机的硬件结构、工作原理,C语言编程基础。
- 声音原理:讲解声音的产生、传播、接收等基本知识,以及音符、音阶和旋律的概念。
- 音频信号处理:介绍音频信号的产生、放大和输出过程,以及如何利用单片机控制音频信号。
2. 实践操作:- 硬件组装:指导学生按照电路图组装单片机音乐盒,包括单片机、扬声器、按键等元件的连接。
- 软件编程:教授学生编写程序,实现音乐盒的基本功能,如播放音符、调整音量、切换曲目等。
- 创新设计:鼓励学生发挥创意,为音乐盒增加新功能,如定时播放、录音等。
单片机的音乐盒设计报告

单片机的音乐盒设计报告一、引言音乐盒作为一种能够带来美妙旋律的装置,一直以来都深受人们的喜爱。
随着科技的不断发展,单片机技术的应用使得音乐盒的设计更加多样化和智能化。
本报告将详细介绍基于单片机的音乐盒的设计过程,包括硬件设计、软件编程以及最终的实现效果。
二、设计目标与需求本次设计的目标是制作一个基于单片机的音乐盒,能够播放多首预存的音乐曲目,并且可以通过按键进行曲目选择和控制播放暂停等功能。
具体需求如下:1、能够存储至少三首不同的音乐曲目。
2、具备简单直观的操作界面,通过按键实现曲目切换、播放暂停等功能。
3、具有良好的音质输出,能够清晰地播放音乐。
4、设计成本低,易于实现和维护。
三、硬件设计1、单片机选择选用 STC89C52 单片机作为核心控制器,其具有丰富的 I/O 端口和较高的性价比,能够满足本设计的需求。
2、存储模块使用 EEPROM 芯片(如 AT24C02)来存储音乐曲目数据,以便在掉电情况下仍能保存曲目信息。
3、音频输出模块采用无源蜂鸣器作为音频输出设备,通过单片机的 I/O 端口输出不同频率的方波信号来驱动蜂鸣器发声。
4、按键模块设置四个独立按键,分别用于曲目选择、播放、暂停和停止功能。
5、电源模块采用 5V 直流电源为整个系统供电。
四、软件设计1、编程语言选择使用 C 语言进行编程,具有较高的可读性和可移植性。
2、主程序流程系统初始化,包括单片机端口设置、EEPROM 读取等。
进入按键扫描循环,检测按键操作并执行相应的功能。
根据当前曲目播放状态,输出相应的音频信号。
3、音乐数据存储与读取将音乐曲目数据以特定的格式存储在 EEPROM 中,通过读取相应地址的数据来获取曲目信息。
4、音频信号产生根据不同的音符频率,计算出对应的方波周期,并通过定时器中断来产生相应频率的方波信号,驱动蜂鸣器发声。
五、系统实现与调试1、硬件焊接与组装按照设计原理图,将各个硬件模块焊接在电路板上,并进行组装和连接。
单片机课程设计-简易音乐盒

-5-
音调 1 2 3 4 5 6 7
音调 1 2 3 4 5 6 7
音调 1 2 3 4 5 6 7
河南理工大学本科课程设计报告
表 1:低音区音调频谱
频率(hz)
延时(us)
220
2270
247
2024
277
1805
294
1701
330
1515
370
1351
415
1205
表 2:中音区音调频谱
sbit K1=P1^0; sbit SPK=P2^7;
uchar Song_Index=0; uchar Tone_Index=0;
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248}; uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3}; uchar code SONG[][50]={{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},
delayMS(300*LEN[Song_Index][Tone_Index]); Tone_Index++; } TR0=0; while(K1==0); } }
-8-
河南理工大学本科课程设计报告
4 Proteus 仿真
点击运行模拟器,按键没有按下时 P2^7 显示低电平 点击按下按钮,P2^7 端口高低电平变换
单片机课程设计音乐盒

单片机课程设计音乐盒一、教学目标本课程旨在通过学习单片机课程设计音乐盒,让学生掌握单片机的基本原理和应用,培养学生动手实践能力和创新思维。
具体的教学目标如下:知识目标:使学生了解单片机的基本结构、工作原理和编程方法;掌握音乐盒的基本电路设计和制作方法。
技能目标:培养学生使用单片机开发工具进行程序设计和调试的能力;训练学生进行音乐盒电路搭建和故障排查的能力。
情感态度价值观目标:激发学生对单片机技术和音乐盒制作的兴趣,培养学生的创新精神和团队合作意识。
二、教学内容本课程的教学内容主要包括单片机的基本原理、音乐盒的设计与制作、编程与调试等。
具体安排如下:1.单片机的基本原理:介绍单片机的结构、工作原理和编程语言。
2.音乐盒的设计与制作:讲解音乐盒的基本电路设计、元件选型和制作方法。
3.编程与调试:教授如何使用单片机开发工具进行程序设计和调试。
三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行教学。
具体方法如下:1.讲授法:讲解单片机的基本原理、音乐盒设计和编程方法。
2.实验法:让学生动手搭建音乐盒电路,进行编程和调试。
3.讨论法:学生进行小组讨论,分享学习心得和经验。
4.案例分析法:分析实际案例,让学生了解单片机在实际应用中的优势和局限。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:选用权威、实用的单片机和音乐盒制作教材。
2.参考书:提供相关的技术资料和案例分析,丰富学生的知识体系。
3.多媒体资料:制作精美的PPT和教学视频,提高学生的学习兴趣。
4.实验设备:准备单片机开发板、音乐盒电路元件等实验设备,确保学生能动手实践。
五、教学评估本课程的教学评估将采用多元化、全过程的评价方式,以全面、客观、公正地评估学生的学习成果。
具体评估方式如下:1.平时表现:通过观察学生在课堂上的参与程度、提问回答、小组讨论等表现,评估其学习态度和理解能力。
2.作业:布置相关的编程练习和音乐盒制作任务,评估学生的实践能力和创新能力。
单片机课程设计音乐盒设计

单片机课程设计音乐盒设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解其在音乐盒设计中的应用。
2. 使学生了解并掌握音乐盒的基本组成部分,如音符、节拍等。
3. 帮助学生理解并运用编程语言,实现对音乐盒乐曲的编程与控制。
技能目标:1. 培养学生动手实践能力,能够独立完成音乐盒硬件电路的搭建。
2. 培养学生运用编程软件进行单片机程序设计的能力,实现音乐盒乐曲的播放与控制。
3. 提高学生的问题解决能力,能够针对音乐盒设计过程中遇到的问题进行调试与优化。
情感态度价值观目标:1. 激发学生对单片机及电子制作的兴趣,培养其创新意识和动手能力。
2. 培养学生团队协作精神,学会与他人共同分析问题、解决问题。
3. 引导学生关注科技发展,认识到所学知识在实际应用中的价值。
分析课程性质、学生特点和教学要求:本课程为单片机课程设计,结合音乐盒设计,旨在让学生在实际操作中掌握单片机原理和应用。
学生为高年级学生,已具备一定的电子基础和编程能力。
教学要求注重实践与理论相结合,培养学生的动手能力和实际应用能力。
二、教学内容1. 理论知识:- 单片机原理及功能特点,对应教材第3章。
- 音乐盒基本构成及工作原理,对应教材第6章。
2. 实践操作:- 硬件电路搭建,包括单片机、扬声器、按键等元件的连接,对应教材第4章。
- 程序设计,使用C语言或汇编语言编写音乐盒乐曲播放程序,对应教材第5章。
3. 教学大纲:- 第一周:学习单片机原理及功能特点,了解音乐盒基本构成及工作原理。
- 第二周:进行硬件电路搭建,学习并掌握相关元件的使用方法。
- 第三周:编写音乐盒乐曲播放程序,学会编程控制单片机播放音乐。
- 第四周:调试与优化,针对音乐盒设计过程中遇到的问题进行解决。
4. 教学内容安排与进度:- 理论与实践相结合,每周安排2课时理论知识学习,2课时实践操作。
- 按照教学大纲,逐步完成音乐盒设计的相关内容。
5. 教材章节及内容列举:- 第3章:单片机原理及功能特点,重点学习单片机的内部结构、工作原理及编程方法。
单片机音乐盒课程设计

51单片机的电子音乐盒的设计班级:自动化112202H姓名:***学号:************9前言随着科技越来越发达,单片机技术也越来越纯熟,单片机的应用也越来越广泛,可以说几乎很难找到哪个领域没有单片机的踪迹。
如今,单片机在各个领域都起着至关重要的作用[1]。
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
随着人类社会的发展,人们对于视听方面的享受提出了更高的要求。
而传统的音乐盒大部分是机械型的,体积庞大,而且沉重,发音单调,且不悦耳,不能实现大批量的生产,所以很难满足当代人们的需求。
但是本文设计的数字音乐盒是以单片机为核心元件的数字音乐盒。
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点。
因此该数字音乐盒也就具有体积小,重量轻,能演奏各种各样的音乐,功能多,外观绚丽多彩,使用非常方便等诸多优点。
而且具有一定的开发价值。
101 设计目的和要求1.1 设计目的(1) 通过设计,查阅相关资料,掌握如何利用单片机设计产品,同时了解与单片机有关的软件模拟器的使用及取字模块软件的使用方法。
(2) 通过本课程设计巩固并扩展单片机课程的基本概念、基本理论、分析方法和实现方法。
结合Proteus和Keil软件等,学习单片机产品的设计方法,有效地将理论和实际紧密结合,培养创新思维和设计能力,增强软件编程实现能力和解决实际问题的能力。
(3) 学习Proteus软件,掌握Proteus中各种芯片的功能以及模拟。
由于Proteus提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养实践精神、创造精神的平台。
单片机音乐盒课程设计

《单片机数字音乐盒》课程设计报告专业:通信工程班级:0802姓名:彭孟秋指导教师:何小年、刘甫2011 年 6 月18 日目录1、课程设计目的 (2)2、数字音乐盒的设计要求 (2)3、电路工作原理、操作方法 (2)4、电路图 (2)5、程序框图 (3)6、关键程序 (3)7、总结 (12)8、参考书目 (12)数字音乐盒设计课程设计目的单片机原理与应用课程设计是在理论教学与有关的实验完成之后进行的,其目的是培养学生程序设计和实际应用单片机技术的能力。
通过此实践环节,使学生能够校熟练设计常用的各类汇编语言程序,掌握设计调试单片机应用系统基本方法和步骤,能够利用所学的知识设计一个中等难度的单片机应用系统,为后续实践课程奠定基础。
数字音乐盒的设计要求1.利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少三首乐曲,每首不少于30秒)。
2.采用数码管显示歌曲序号。
3.可通过功能键选择乐曲,暂停,播放。
电路工作原理、操作方法(1)硬件电路中用P1.0~P1.7控制按键,其中P1.0~P1.3扫描行,P1.4~P1.7扫描列。
(2)用P0.0~P0.7,P2.0~P2.7控制LED,其中P0.0~P0.7控制七段码a、b、d、e、f、g,用P2.0~P2.7为数码管位选信号。
(3)用,P2.0~P2.2作为LCD的RS,R/W,E的控制信号。
用P0.0~P0.7作为LCD的D0~D7的控制信号。
(4)用P3.7口控制蜂鸣器。
(5)电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。
电路图程序框图关键程序Soundplay:#include <reg52.h>#include "Music.h"#include "SoundPlay.h"#include "lcd.h"#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔sbit BeepIO = P2^0; //定义输出管脚unsigned char codeduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//duan code 0~9unsigned int code FreTab[12] ={ 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 };//1~7在频率表中的位置unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存//******************************************************************* #define MaxNo 3 //定义歌曲数目unsigned char code *Sound;unsigned char code * codeMusic[MaxNo]={Music_4,Music_8,Music_7,Music_6,Music_5,Music_9,Music_3 ,Music_2,Music_1};signed char FlagNo=0;static unsigned char KeyScan(void);static void Beep(void);bit RunStop = 1;//1表示运行sbit KeyB =P3^2; // 上一首sbit KeyF =P3^3; //下一首sbit KeyT =P3^5; //暂停extern void Delay1ms(unsigned int);void InitialSound(void){BeepIO = 0;Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值(10ms的初装值)Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |= 0x11; //两个定时器都工作在方式1ET0 = 1;ET1 = 0;TR0 = 0;TR1 = 0;EA = 1;FlagNo = 0;Sound = Music[FlagNo];P1 = duan[FlagNo+1];}void BeepTimer0(void) interrupt 1 //音符发生中断{BeepIO = !BeepIO;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0;}//*******************************************************************void Play(unsigned char Signature,unsigned Octachord,unsigned int Speed) {unsigned int NewFreTab[12]; //新的频率表unsigned char i,j;unsigned intPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;#ifdef USE_LCDlcd_init();lcd_write_string(0,"MusicPlayer");#endifAgain :Delay1ms(600);for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表{j = i + Signature;if(j > 11){j = j-12;NewFreTab[i] = FreTab[j]*2;}elseNewFreTab[i] = FreTab[j];if(Octachord == 1)NewFreTab[i]>>=2;else if(Octachord == 3)NewFreTab[i]<<=2;}SoundLength = 0;while(Sound[SoundLength] != 0x00) //计算歌曲长度{SoundLength+=2;}Point = 0;Tone = Sound[Point];Length = Sound[Point+1]; // 读出第一个音符和它时时值LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; // 算出4分音符的长度LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准TR0 = 0;TR1 = 1;while(Point < SoundLength){if(KeyScan())goto Again; /*more keyscan for speed*/SL=Tone%10; //计算出音符SM=Tone/10%10; //计算出高低音SH=Tone/100; //计算出是否升半CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率if(KeyScan())goto Again; /*more keyscan for speed*/ if(SL!=0){if (SM==1) CurrentFre >>= 2; //低音if (SM==3) CurrentFre <<= 2; //高音Temp_T =65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值Sound_Temp_TH0 = Temp_T/256;Sound_Temp_TL0 = Temp_T%256;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿}if(KeyScan())goto Again; /*more keyscan for speed*/ SLen=LengthTab[Length%10]; //算出是几分音符XG=Length/10%10; //算出音符类型(0普通1连音2顿音)FD=Length/100;LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)if (FD==1)LDiv=LDiv+LDiv/2;if(XG!=1)if(XG==0) //算出普通音符的演奏长度if (SLen<=4)LDiv1=LDiv-LDiv4;elseLDiv1=LDiv*SOUND_SPACE;elseLDiv1=LDiv/2; //算出顿音的演奏长度elseLDiv1=LDiv;if(SL==0) LDiv1=0;LDiv2=LDiv-LDiv1; //算出不发音的长度if(KeyScan())goto Again; /*more keyscan for speed*/ if (SL!=0){TR0=1;for(i=LDiv1;i>0;i--) //发规定长度的音{while(TF1==0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(KeyScan())goto Again; /*more keyscan for speed*/}}if(KeyScan())goto Again; /*more keyscan for speed*/if(LDiv2!=0){TR0=0; BeepIO=0;for(i=LDiv2;i>0;i--) //音符间的间隔{while(TF1==0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(KeyScan())goto Again; /*more keyscan for speed*/}}Point+=2;Tone=Sound[Point];Length=Sound[Point+1];if(KeyScan())goto Again; /*more keyscan for speed*/#ifdef USE_LCDlcd_write_char(12,FlagNo+49);#endif}BeepIO = 0;FlagNo ++;if (FlagNo == MaxNo)FlagNo =0;Sound = Music[FlagNo];P1 = duan[FlagNo+1];}/**************************************************************功能:键盘扫描函数入参: viod KeyF 下一首KeyB 上一首KeyT 暂停返回: unsigned char1 需跳转 0 不跳转***************************************************************/ static unsigned char KeyScan(void){unsigned char Cont;if (KeyF == 0){ //前进Delay1ms(5);if (KeyF == 0){while(KeyF == 0){EA = 0;FlagNo ++;if (FlagNo == MaxNo)FlagNo =0;P1 = duan[FlagNo+1];Beep();Delay1ms(600); //是长按EA = 1;}if (FlagNo == MaxNo)FlagNo =0;Sound = Music[FlagNo];P1= duan[FlagNo+1]; //刷显示while(KeyF == 0);return 1;}}if (KeyB == 0){ //后退Delay1ms(5);if (KeyB == 0){while(KeyB == 0){EA = 0;FlagNo --;if (FlagNo == -1)FlagNo =MaxNo-1;P1 = duan[FlagNo+1];//刷显示Beep();Delay1ms(600); //是长按EA = 1;}if (FlagNo == -1)FlagNo =MaxNo-1;Sound = Music[FlagNo];P1 = duan[FlagNo+1];while(KeyB == 0);return 1;}}if (KeyT == 0){ //暂停Delay1ms(20);Cont = 0;EA = 0;TR0 = 0;TR1 = 0;if (KeyT == 0){RunStop = ~RunStop;while(KeyT == 0); //等待第一次释放Beep();if (!RunStop){ //是暂停则关中断和定时器EA = 0;TR0 = 0;TR1 = 0;while(KeyT == 0); //检测第二次按键并等待它释放(若有的话) while (KeyT){ //第二次释放了等待第三次按下P1 = duan[Cont++%10]; //第三次未按下则暂停数秒0~9Delay1ms(100);} //此处暂停直到再次有按键低电平EA = 1; //重开定时器和中断TR0 = 1;TR1 = 1;Sound = Music[FlagNo];P1 = duan[FlagNo+1]; //恢复原来的显示}}EA = 1;TR0 = 1;TR1 = 1;return 0;}return 0;}void Beep(void){unsigned char i;for(i = 0;i < 200 ;i ++){BeepIO = ~BeepIO;Delay1ms(1);}}Playmusic:#include <REG52.H>#include "Music.h"#include "SoundPlay.h"void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}main(){InitialSound();while(1){Play(0,3,380);Delay1ms(500);}}Music:#include "Music.h"//*****************************Music******************************** //挥着翅膀的女孩unsigned char code Music_1[]={0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03,0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00};//同一首歌unsigned char code Music_2[]={0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x020x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03, 0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C, 0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03, 0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02, 0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03, 0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70, 0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66, 0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02, 0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C, 0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66, 0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00, 0x00,0x00 };//两只蝴蝶unsigned char code Music_3[] ={0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02, 0x10,0x03, 0x15,0x00, 0x00,0x00 };总结1.本学期学习单片机的时间只有十几周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。
单片机数字音乐盒设计

单片机数字音乐盒设计
单片机数字音乐盒是一种基于单片机的音乐播放器,可以通过程序控制播放不同的音乐。
下面是一个简单的单片机数字音乐盒的设计思路:
1. 材料准备:
- 单片机:选择一种合适的单片机,如Arduino或者STM32等。
- 扬声器:选择一种合适的扬声器,可以是小型的音箱或者
蜂鸣器等。
- 按键:选择一组适量的按键,用于控制音乐的播放、暂停、切换等功能。
- 电源:准备一块适量的电源供电给单片机。
2. 程序设计:
- 编写单片机的控制程序,包括初始化单片机和音频模块、
判断按键输入、控制音乐的播放等功能。
- 将音乐转化为单片机可识别的数据,可以将音乐文件先转
化为.wav格式,再通过程序将.wav文件转化为单片机可以播
放的数据格式。
3. 连接电路:
- 将单片机与扬声器连接起来,通过合适的音频线连接扬声
器的输入端和单片机的输出端。
- 连接按键到单片机的输入口,使单片机可以接收到按键的
输入信号。
4. 调试测试:
- 将单片机与电源连接并上电。
- 通过按键测试音乐的播放、暂停和切换等功能。
- 如果出现问题,可以通过调试程序和检查电路连接等方式进行故障排除。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录摘要 (1)第一章设计方案的对比 (2)第二章总体方案设计 (3)2.1 原理简介 (3)2.2 方案设计思想 (3)第三章方案实现 (4)3.1、音频脉冲的产生 (4)3.2.音乐节拍的生成 (5)3.3.建立音乐的步骤 (5)第四章硬件设计 (6)4.1 硬件电路 (6)4.1.1、AT89C51的工作特性 (6)4.2 原理说明 (7)4.3 电路各模块说明 (7)4.3.1 键盘系统 (7)4.3.2 放大电路 (8)4.3.3 时钟电路 (9)4.3.4 复位电路 (9)5.3.5 显示电路 (10)第五章软件设计 (11)5.1 主模块的设计 (11)第六章仿真、安装和调试 (13)总结 (14)致谢 (15)参考文献 (15)附录 (16)附录一:音乐程序 (16)附录二:基于单片机的数字音乐盒总电路图 (33)摘要本设计是基于单片机的数字音乐盒设计,由单片机AT89C51芯片和LCD显示器为核心,辅以必要的电路,构成的一个单片机电子数字音乐盒。
要求利用I/O 口产生一定频率的方波,驱动蜂鸣器,发出不同的音调并采用LCD显示信息,从而演奏乐曲(最少三首乐曲,每首不少于30秒),开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称),可通过功能键选择乐曲,暂停,播放。
本设计采用4*4键盘,用Protel99来画系统硬件图,采用汇编语言进行编程,编程后利用KEIL C51来进行编译,再生成的HEX文件装入芯片中,采用proteus软件来仿真,检验功能得以正常实现。
该音乐盒的设计可以通过按键选择不同的曲目,播放和暂停,并通过LCD显示歌曲号及播放时间。
本设计键盘采用动态扫描方式。
每次扫描一行键盘,送此行低电平,读输入口的状态值,判断有没有键按下。
若有键按下,根据读入口的值选择显示值并送至显示值寄存单元,判断键值,启动计数器T0,根据次值为偏移地址找到要选择的音乐的代码的首地址,根据代码产生一定频率的脉冲,驱动蜂鸣器,放出音。
同时启动定时器T1,计算音乐的播放的时间。
关键词:数字音乐盒AT89C51 LCD显示器Proteus软件4*4键盘动态扫描 KEIL C5第一章 设计方案的对比方案一:本设计以89C51为核心,配合键盘系统,放大电路,时钟电路和数码管显示电路实现音乐的演奏。
音乐盒设计采用独立的键盘做为音符的输入以89C51为核心。
本设计中用到了89C51单片机,4*4矩阵式键盘,蜂鸣器,14引脚的LCD ,可以通过以下原理框图(图1.1)来实现该音乐盒的设计。
方案二:该方案以AT89S52单片机为核心,主要设计模块包括数码管显示部分,功能键盘部分,蜂鸣器发声部分,彩灯部分。
数码管采用共阳极数码管,通过单片机P1口控制,实现歌曲序号的显示;功能键盘采用1*8键盘按键开关,通过单片机P3口控制,实现歌曲播放顺序的调换和暂停播放功能;蜂鸣器由单片机的P2口控制,实现歌曲播放;彩灯是由普通发光二极管代替,能实现单色长亮和闪烁效。
综上所述:由于方案一的琴键输入是通过独立式键盘来完成的,这样便于控制且直观。
且本方案是采用我们所熟知的单片机类型和显示电路,便于我们理解。
而方案二中其他电路部分与方案一相差不大,但系统实现比较困难。
且主控芯片采用的是我们少用的AT89S51,所以我们选择方案一。
图1.1 系统结构框图琴键电路放大 电路P0.0 | P0.7P3.7时钟电路复位电路单片机89C51显示电路第二章总体方案设计2.1 原理简介当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,显示乐曲播放的时间,并驱动LCD,显示歌曲号。
2.2 方案设计思想(1)要产生音频脉冲,只要算出某一音频的周期(1/音频),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲(2)利用8951的内部定时器使其工作在计数器模式MODE1下,改变记数值TH0及TL0以产生不同频率的方法。
例如频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时956/1=956在每记数9次时将I/O口反相,就可得到中音D0(523HZ)。
记数脉冲值与频率的关系公式如下:N=Fi/2/Fr N:记数值Fi:内部计时一次为1微秒.故其频率为1MHZFr;要产生的频率(3):起记数值的求法如下:T=65536-N=65536-Fi/2/Fr例如:设K=65536,F=1000000=Fi=1MHZ,求低音D0(523HZ),高音的D0(1046HZ)的记数值。
T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr低音D0的T=65536-500000/262=63627中音D0的T=65536-500000/523=64580低音D0的T=65536-500000/1047=65059第三章 方案实现3.1、音频脉冲的产生对于音乐盒而言发出悦耳的音乐是其最主要的功能,那么对于使用单片机来制作出来的音乐盒怎么实现音符的发声呢?通过查看资料我们知道音符的发音主要靠不同的音频脉冲。
利用单片机的内部定时器/计数器0,使其工作在模式1,定时中断,然后控制引脚的输出音乐(本实验采用P1.0做为输出引脚)。
只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O 反相,然后重复计时此半周期时间再对I/O 反相,就可在I/O 脚上得到此频率的脉冲。
具体做法如下所示(以中音DO 为例):例如:中音1(DO )的音频= 523HZ,周期T=1/523s=1912s μ 定时器/计数器0的定时时间为:T/2=1912/2s μ=956s μ定时器956s μ的计数值=定时时间/机器周期=956s μ/1s μ=956(时钟频率=12MHZ)装入T0计数器初值为65536-956=64580将64580装入T0寄存器中,启动T0工作后,每计数956次时将产生溢出中断,进入中断服务时,每次对P1.0引脚的输出值进行取反,就可得到中音DO (523HZ )的音符音频。
将51单片机内部定时器工作在计数器模式1下,改变计数初值TH0,TL0以产生不同的频率。
下表3-1是C 调各音符频率与计数初值T 的对照表:表3-1 C调各音符频率与计数初值T的对照表音符频率(Hz)/初值(sμ)音符频率(Hz)/初值(sμ)低1DO 262/63627 中1DO 523/64580 高1DO 1042/65056 低2RE 294/63835中2RE 589/64687 高2RE1245/65134低3M 330/64021 中3M 661/64780 高3M 1318/65157 低4FA 350/64107中4FA 700/64822 高4FA1397/65178低5SO 393/64264 中5SO 786/64900高5SO 1568/65217 低6LA 441/64402中6LA 882/64969 高6LA 1760/65252低7SI 495/64526 中7SI 990/65031高7SI 1967/652823.2.音乐节拍的生成要唱出一首歌,只产生出音频脉冲还不够,还要考虑节拍。
定义:每个音符占用一个字节,字节的高4位代表音符的高低,低4位表示该音符的节拍,如果一拍为0.4秒,则1/4拍是0.1秒,只要设定延迟时间就可获得节拍的时间。
我们也可以设1/4拍为1个DELAY,则1拍应该是4个DELAY,只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数。
(见表3-2)表3-2节拍数1/4节拍2/4节拍3/4节拍1拍1又1/4拍节拍码 1 2 3 4 5节拍数1又1/2拍2拍2又1/2拍3拍3又3/4拍节拍码 6 8 A C F3.3.建立音乐的步骤先把谱的音符找出,然后由上表建立时间常数初值T的顺序表,标号为TABLE1。
建立音符和节拍表,标号为TABLE,将构成发音符的计数值放在其中。
TABLE表的结构为:简谱码(代表音符)为高4位,节拍码(表示节拍数)为低4位,在唱歌程序中对每一个有节拍的音符能通过设计共同生成音符节拍码,本程序的音符节拍码表见表3-2。
第四章硬件设计4.1 硬件电路本设计中用到了89C51单片机,其引脚图如右图4-1-1所示,矩阵式键盘模块,蜂鸣器,16*2 LCD,扬声器、LED数码管显示器等。
(数字音乐盒总硬件图如附录一所示)图4-1-1 89C51引脚图4.1.1、AT89C51的工作特性•内含4KB的FLASH存储器檫写次数1000次;•内含128字节的RAM;•具有32根可编程I/O 线; •具有2个16位编程定时器•具有6个中断源,5个中断矢量,2级优先权的中 断结构;•具有1个全双工的可编程串行通信接口; •具有1个数据指针DPTR ; •具有可编程3级程序锁定位;•AT89C51的工作电源为5(1±0.2)V 且典型值为5V ; •AT89C51最高工作频率为24MHZ ;•AT89C51的编程频率为3~24MHZ ,编程启动电流和启动电压 分别为1mA 、5或12V 。
4.2 原理说明当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,显示歌曲号。
(1) 硬件电路中用0INT 、1INT 分别接S1、S2作为上、下一曲的功能键 (2) 用P1.0-P1.6控制七段码a,b,c,d,e,f 。
(3) 用P2.0口控制喇叭。
(4) 电路为12MHZ 晶振频率工作,起振电路中C1,C2均为30pf 。
4.3 电路各模块说明4.3.1 键盘系统键盘模块采用4*4按键模式(S1-S16),接在单片机的P1口上。
键盘系统的链接电路图如图4-3-1所示:当用手按下一个键时,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。
这就是抖动。
抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms 。
很容易想到,抖动问题不解决就会引起对闭合键的识别。
用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms 来等待抖动消失,这之后,在读入键盘码。
具体编码如下所示:MAI: CLR TR0 ;关闭上一次定时,进入下一次按键判断MOV TMOD, #01HMOV IE, #82HMOV A, P1MOV 30H, A ;保存键盘状态值LCALL D10MS ;延迟10ms消除抖动MOV A , P1 ;再读键盘状态CJNE A, 30H, MAI ;两次结果不同,是抖动引起,转MAI图4-3-1 键盘模块电路图4.3.2 放大电路放大电路的分析如下所示,其电路图如图4-3-2所示:此部分的放大电路简单容易实现。