数字音乐盒课程设计

合集下载

数字音乐盒的设计讲解

数字音乐盒的设计讲解

单片机与接口技术课程设计(论文) 数字音乐盒的设计院(系)名称电子与信息工程学院专业班级通信121班学号*********学生姓名潘凤麟指导教师高影讲师起止时间:2015.7.4—2015.7.13课程设计(论文)任务及评语院(系):电子与信息工程学院教研室:通信工程摘要单片机是把CPU、存储器和I/O接口集成在一片半导体硅片上的微型计算机。

本次课程设计所设计出的数字音乐盒就是基于单片机的一个系统。

它的的硬件电路部分采用Proteus软件进行设计,以AT89C51单片机作为主芯片,用其I/O口产生不同频率的方波来驱动蜂鸣器发出不同的音调,再配以LCD显示屏和4*4键盘实现必要的显示和控制。

软件部分采用Keil与Proteus进行联合仿真,并用汇编语言来设计程序,把用Keil生成的HEX文件写入到单片机中即可实现设计所要求的功能。

通过Proteus与Keil的联合仿真,该数字音乐盒可播放3首不同的歌曲,并可通过LCD显示屏显示歌曲名称或序号;可通过4*4键盘实现对歌曲的选择,暂停,与播放功能,故仿真结果符合设计要求。

关键词:数字音乐盒;LCD显示屏;键盘目录第1章绪论 (1)1.1 AT89C51简介 (1)1.2 仿真环境简介 (2)1.3本文研究内容 (3)第2章数字音乐盒硬件电路图的设计与分析 (4)2.1 总体设计方案分析 (4)2.2 数字音乐盒部分电路原理说明 (4)2.2.1 蜂鸣器驱动部分电路图与原理说明 (4)2.2.2 LCD显示部分电路图与原理说明 (5)2.2.3 键盘控制部分电路图与原理说明 (6)第3章数字音乐盒的软件设计 (7)3.1 数字音乐盒总体软件程序流程图与分析 (8)3.2 数字音乐盒各子程序的设计与分析 ......................... 错误!未定义书签。

3.2.1 系统初始化子程序设计与分析 (9)3.2.2 LCD显示子程序设计与分析 (10)3.2.3 蜂鸣器频率控制子程序设计与分析 (11)3.2.4 键盘控制子程序设计与分析 (11)第4章仿真结果与分析 (12)4.1 仿真结果 (12)4.2 仿真步骤与结果分析 (13)第5章总结 (16)参考文献 (17)附录Ⅰ (18)附录Ⅱ (19)附录Ⅲ (20)第1章绪论1.1 AT89C51简介所谓单片机,是指把CPU、存储器和I/O接口集成在一片半导体硅片上的微型计算机。

《数字音乐盒》设计报告

《数字音乐盒》设计报告

《数字音乐盒》设计报告
设计目标:
本数字音乐盒旨在提供一种方便、易用的音乐播放体验,让用户可以随时随地享受自己喜欢的音乐。

具体设计要求如下:
1. 支持多种音频格式,如MP3、FLAC等。

2. 采用简洁、直观的用户界面,方便用户操作。

3. 支持多种播放模式,如顺序播放、随机播放等,并且能够记忆用户播放模式。

4. 提供多种音效调节和均衡器设置,使用户可以自由调整音乐效果。

5. 支持歌词显示功能,使用户可以更好地理解音乐。

6. 支持歌曲收藏功能,使用户可以方便地收藏自己的喜爱歌曲。

设计思路与方案:
本数字音乐盒采用嵌入式系统设计,主要硬件部件包括音频芯片、显示屏幕和按键模块,其中音频芯片为核心部件,支持多种音频格式的解码和播放。

用户界面设计上,采用五向导航及确认键来进行操作,主界面分为“音乐播放”和“歌曲收藏”两大模块。

在“音乐播放”模块中,
用户可以选择不同的播放模式,包括顺序播放、随机播放和循环播放。

在播放过程中,用户可以通过前进、后退、暂停等操作来控制音乐播放进程。

同时,也提供了多种音效调节和均衡器设置,用户可以自行选择调整音乐效果。

在播放过程中,歌词会自动显示在屏幕上,方便用户理解歌曲。

在“歌曲收藏”模块中,用户可以收藏自己喜爱的歌曲,方便日后收听。

总结:
本数字音乐盒设计主要针对音乐爱好者,通过简洁、易用的界面设计和多种音效、播放模式等功能的设计,为用户提供了更为便捷、自由的音乐播放体验。

同时,歌曲收藏功能也使用户可以随时查找和收听自己喜爱的歌曲,满足用户对音乐的品质需求。

数字音乐和课程设计

数字音乐和课程设计

数字音乐和课程设计一、教学目标本课程的教学目标是让学生了解和掌握数字音乐的基本概念、技术和应用,提高学生在音乐创作、制作和表演方面的技能,培养学生的创新思维和团队协作能力。

具体目标如下:1.知识目标:学生能够理解数字音乐的基本概念、音乐制作流程和常用数字音乐软件。

2.技能目标:学生能够运用数字音乐软件进行音乐创作、制作和表演,具备基本的音乐制作技能。

3.情感态度价值观目标:学生通过参与数字音乐制作,培养对音乐的热爱和敬业精神,提高创新意识和团队协作能力。

二、教学内容本课程的教学内容主要包括数字音乐的基本概念、音乐制作流程、数字音乐软件使用和音乐创作实践。

具体安排如下:1.数字音乐的基本概念:介绍数字音乐的发展历程、特点和分类。

2.音乐制作流程:讲解音乐制作的各个环节,包括作曲、编曲、录音、混音等。

3.数字音乐软件使用:学习常用数字音乐软件(如FL Studio、AbletonLive等)的基本操作和功能。

4.音乐创作实践:分组进行音乐创作、制作和表演,锻炼学生的实践能力。

三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。

具体方法如下:1.讲授法:讲解数字音乐的基本概念、音乐制作流程和软件使用方法。

2.讨论法:学生就音乐制作中的问题进行讨论,促进学生思考。

3.案例分析法:分析经典音乐作品,讲解其制作过程和方法。

4.实验法:学生分组进行音乐创作、制作和表演,锻炼实践能力。

四、教学资源本课程所需教学资源包括教材、参考书、多媒体资料和实验设备。

具体如下:1.教材:选用权威、实用的数字音乐教材,为学生提供系统的学习资料。

2.参考书:推荐学生阅读相关音乐制作、音乐理论等方面的书籍,丰富知识体系。

3.多媒体资料:收集各类数字音乐作品、教学视频等,为学生提供丰富的学习资源。

4.实验设备:配备数字音乐制作所需的计算机、软件和音响设备,确保学生能够进行实际操作。

五、教学评估本课程的评估方式包括平时表现、作业和考试等,旨在全面、客观地评价学生的学习成果。

《数字音乐盒》课程设计

《数字音乐盒》课程设计

《数字音乐盒》课程设计报告专业:通信工程班级:0801姓名:张雨阳指导教师:李晶二零一一年六月二十二日目录1、设计任务和要求 (2)2、总体设计 (2)3、硬件设计 (3)3.1硬件电路 (3)3.2原理说明 (3)4、软件设计 (3)5、仿真、安装和调试 (4)6、收获与体会 (5)参考文献 (6)附件1:元件清单 (7)附件2: 总电路图 (7)附件3:音乐程序 (8)1、设计任务和要求(1)利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存两首乐曲)。

(2)采用七段数码管显示当前播放的歌曲序号。

(3)可通过功能键选择乐曲,暂停,播放,上一曲,下一曲。

2、总体设计(1)要产生音频脉冲,只要算出某一音频的周期(1/音频),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲(2)利用8051的内部定时器使其工作在计数器模式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的T6=5536-500000/1047=650593、硬件设计3.1 硬件电路本设计中用到89C51单片机,喇叭,七段显示数码管LED。

数字音乐盒的设计与实现

数字音乐盒的设计与实现
716
86
Fa
1397
43
43
Fa#
370
1351
162
Fa#
740
676
81
Fa#
1480
41
41
So
392
1276
153
So
784
638
77
So
1568
38
38
So#
415
1205
145
So#
831
602
72
So#
1661
36
36
La
440
1136
136
La
880
568
68
La
1760
34
34
La#
附录(关键部分程序清单)
#in elude <reg51.h>
#defi ne ucharu nsig nedchar
#defi neuint un sig nedi nt
#define LEDLen 6
xdataunsignedcharOUTBIT _at_0x8002;//位控制口
xdataunsignedcharOUTSEG _at_0x8004;//段控制口
社,20154பைடு நூலகம்
[2]张仁彦,高正中,黄鹤松.单片机原理及应用.北京:机械工业出版社,
2016.3.
[3]付先成,,高恒强,蔡红娟.单片机原理与C语言程序设计.武汉:华中科技大
学出版社,2015.8.
[4]张校珩.单片机C语言编程100例■北京:中国电力出版社,2014.1.
⑸唐颖■单片机综合设计实例与实验■北京:电子工业出版社,2015.1.

数字音乐盒课程设计

数字音乐盒课程设计

数字音乐盒课程设计一、课程目标知识目标:1. 让学生掌握数字音乐的基础知识,包括音符、音阶、节奏等概念;2. 培养学生运用电子设备进行音乐创作的能力,了解数字音乐盒的基本原理;3. 让学生了解不同音乐风格的特点,拓展音乐视野。

技能目标:1. 培养学生运用音乐软件进行创作、编辑和播放数字音乐的能力;2. 提高学生团队协作能力,学会与他人共同完成音乐作品;3. 培养学生创新思维,能够独立设计并制作具有个人特色的数字音乐作品。

情感态度价值观目标:1. 培养学生对音乐的热爱和兴趣,激发他们积极参与音乐活动的热情;2. 培养学生尊重他人作品,树立正确的版权意识;3. 通过音乐创作,培养学生审美观念,提高审美情趣。

分析课程性质、学生特点和教学要求,本课程目标旨在让五年级学生在掌握音乐基础知识的基础上,运用现代科技手段创作音乐作品。

课程将帮助学生将所学知识应用于实际操作中,培养他们的创新精神和团队协作能力,同时提高音乐素养,为今后的音乐学习打下坚实基础。

二、教学内容1. 数字音乐基础知识:音符、音阶、节奏、拍子等基本概念的学习,使学生能够理解音乐的基本元素。

- 教材章节:第一章《音乐的基础知识》- 内容列举:音符的识别、音阶的构成、节奏的练习。

2. 数字音乐创作:运用音乐软件(如GarageBand)进行音乐创作,了解数字音乐盒的工作原理。

- 教材章节:第二章《数字音乐创作》- 内容列举:音乐软件的介绍与操作、音色的选择与搭配、简单旋律的创作。

3. 音乐风格学习:学习不同音乐风格的特点,分析经典作品,培养学生音乐鉴赏能力。

- 教材章节:第三章《音乐风格》- 内容列举:流行音乐、古典音乐、民族音乐等风格的学习与鉴赏。

4. 团队协作与创作实践:分组进行音乐创作,培养学生团队协作能力和创新思维。

- 教材章节:第四章《音乐创作实践》- 内容列举:团队协作流程、音乐创作方法、作品展示与评价。

5. 音乐作品展示与评价:展示学生创作的数字音乐作品,进行自评、互评和教师评价,提高学生的审美观念。

8086音乐盒课程设计

8086音乐盒课程设计

8086音乐盒课程设计一、课程目标知识目标:1. 学生能理解8086音乐盒的基本工作原理和组成结构。

2. 学生掌握使用8086处理器编程,控制音乐盒播放不同旋律的方法。

3. 学生了解音乐盒中音符与频率的关系,能运用此关系创作简单旋律。

技能目标:1. 学生能够运用汇编语言编写程序,实现音乐盒的基本控制功能。

2. 学生通过实践操作,培养动手能力和问题解决能力,提升编程技巧。

3. 学生学会运用逻辑思维和算法设计,实现对音乐盒旋律的精确控制。

情感态度价值观目标:1. 学生培养对计算机硬件和编程的兴趣,激发探索精神。

2. 学生在团队协作中,学会沟通与分享,培养合作精神。

3. 学生通过创作音乐盒旋律,培养审美情趣,提高人文素养。

本课程针对高中年级学生,结合学科特点,将理论知识与实践操作相结合,旨在提高学生的编程技能、动手能力和创新意识。

课程目标具体明确,可衡量,以便于学生和教师在教学过程中有针对性地进行评估和调整。

通过本课程的学习,学生将能够掌握8086音乐盒的相关知识,提升编程技能,并在创作过程中培养良好的情感态度价值观。

二、教学内容1. 8086音乐盒硬件组成及工作原理- 8086处理器基础知识- 音乐盒硬件结构及功能- 音符与频率的关系2. 汇编语言编程基础- 汇编语言指令系统- 程序结构及编写规范- 常用寄存器及功能3. 音乐盒编程控制- 软件编程控制硬件原理- 音乐盒播放旋律的编程方法- 实例分析与操作演示4. 实践操作与作品创作- 编程练习:控制音乐盒播放指定旋律- 创作实践:自主设计音乐盒旋律- 团队协作:分组讨论、展示与评价教学内容根据课程目标,结合教材相关章节,制定详细的教学大纲。

教学安排注重科学性和系统性,从基础知识到实践操作,逐步引导学生掌握8086音乐盒的相关知识。

在教学过程中,教师需关注学生个体差异,合理安排教学进度,确保学生能够扎实掌握所学内容。

同时,通过实践操作和作品创作,培养学生动手能力、创新意识和团队协作精神。

数字逻辑课程设计音乐盒

数字逻辑课程设计音乐盒

数字逻辑课程设计音乐盒一、教学目标本课程旨在通过音乐盒的制作,让学生掌握数字逻辑的基本原理和技能,培养学生的创新意识和动手能力。

具体目标如下:1.知识目标:使学生了解音乐盒的工作原理,理解数字逻辑的基本概念和电路组成。

2.技能目标:培养学生运用数字逻辑设计简单电路的能力,以及使用相关工具和软件进行编程和调试的能力。

3.情感态度价值观目标:培养学生对科技创新的热爱,增强团队协作意识,提高问题解决能力。

二、教学内容教学内容主要包括音乐盒的工作原理、数字逻辑基本电路、编程与调试等。

具体安排如下:1.音乐盒的工作原理:介绍音乐盒的基本结构和工作原理,使学生了解音乐盒是如何产生音乐的。

2.数字逻辑基本电路:讲解数字逻辑电路的组成、功能和应用,包括编码器、译码器、触发器等。

3.编程与调试:教授如何使用相关工具和软件进行编程,让学生动手实践,调试并优化电路。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:用于讲解音乐盒的工作原理和数字逻辑基本电路。

2.讨论法:在课堂上学生进行讨论,分享学习心得和解决问题的方法。

3.案例分析法:分析具体案例,使学生更好地理解数字逻辑电路在实际应用中的作用。

4.实验法:让学生动手制作音乐盒,培养实际操作能力和团队协作精神。

四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备等。

1.教材:选用权威、实用的教材,为学生提供系统的数字逻辑知识。

2.参考书:提供丰富的参考资料,帮助学生拓展知识面。

3.多媒体资料:制作精美的课件和视频,直观地展示音乐盒的制作过程。

4.实验设备:提供充足的实验设备,确保每个学生都能动手实践。

五、教学评估本课程的评估方式包括平时表现、作业和考试等,以全面客观地评价学生的学习成果。

1.平时表现:评估学生在课堂上的参与度、提问和回答问题的表现,以及团队合作和沟通能力。

2.作业:布置适量的作业,评估学生的理解和应用能力,以及对数字逻辑电路的掌握程度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机多功能数字音乐盒《单片机原理及应用》课程设计任务书一、目的意义《单片机原理及应用》是高校工程专业的一门专业基础课,该门课程具有很强的实践性。

通过课程的学习,使学生掌握基本概念、基本理论和基本技能,为今后从事相应的生产设计和科研工作打下一定的基础。

因此,除课程的理论教学和实验教学外,课程设计也是一个必要和重要的实践教学环节。

通过课程设计,进一步培养学生理论联系实际的能力,学会正确地分析工程实际问题,善于查阅参考文献,准确地选择相应的数据、参数,具备全面地解决实际问题的素质,同时课程设计也为今后的毕业设计打下基础。

二、设计时间、地点、班级时间:第16、17周(二周)地点:三教433 、426班级:09电气99人三、设计内容(二十)基于单片机的多功能数字音乐盒的设计1、功能描述用A T89S52单片机的I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲。

共有4乐曲,每首乐曲都由相应的按键控制,并且有开关键、暂停键、上一曲以及下一曲控制键。

按键输入电路的设计复位电路的设计;时钟电路的设计显示电路及驱动电路的设计;扫描模式的选择设计系统主程序及子程序的设计;元件及元件参数的选择前言:本设计是以AT89C51芯片的电路为基础,外部加上放音设备,以此来实现音乐演奏控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其演奏出优美动听的音乐。

用户可以按照自己的喜好选择音乐并将其转化成机器码存入单片机的存储器中。

对于不同型号的单片机只需要相应的改变一下地址即可。

该软、硬件系统具有很好的通用性,很高的实际使用价值,为广大的单片机和音乐爱好者提供了很好的借鉴。

1、设计原理及相关说明设计原理:通过按键给单片机的P2口输入低电平,进而利用程序来判断是否执行某一播放功能。

而利用单片机的定时器0中断来控制播放乐曲。

2.1芯片AT89C51的介绍AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)的低电压,高性能CMOS 8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU 和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

外形及引脚排列如图2.1所示图3.2 AT89C51引脚排列图XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732 P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427 U1AT89C522.2 时钟振荡电路、复位电路利用12MHZ的晶振做外部时钟;AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。

这个放大器与作为反馈元件的片外石英晶体(陶瓷)谐振器一起构成自然振荡器。

外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。

对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。

如果使用石英晶体,我们推荐电容使用30PF±10PF(而如果使用陶瓷振荡器建议选择40PF±10PF)。

用2.3控制电路:键盘接口电路如图,本次设计中,按键有7个.键分别接于7根I/O线(P2口),各按键在实物连接上相互独立,彼此的工作状态互不影响,STC单片机自带上拉电阻因此无需外接上拉电阻,用查询法完成按键功能。

2.4蜂鸣器电路:利用PNP管(9012)放大驱动。

基极接10K 欧姆的电阻,发射极接蜂鸣器,集电极接电源。

3系统软件设计程序设计流程图如图7所示设计流程图依据所写源程序所绘制,所用代号均为源程序中所使用,源程序可参照源程序清单。

仿真调试及操作说明调试步骤调试分为硬件调试和软件调试。

硬件调试主要是检查硬件电路是否有短路、断路和虚焊等,首先接上电源,电源的指示灯亮了之后,检测一下单片机的电源脚有没有电源输入,如果有这说明焊接无误,然后可以用万用表检查各个元器件的管脚之间的焊接,检查过程中需要细心和耐心。

硬件调试无误后,进行软件调试。

软件调试可以针对子程序调试,测试其是否正常工作。

5.2 性能分析将程序烧入单片机后,在proteus软件中进行仿真。

通过仿真和实物测试发现,按下按键时,存在一定的延时,不能立刻反应,按下按键时,必须有足够的时间。

附录:总图方针; 实物图:程序文件:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit BEEP = P1^4; //蜂鸣器sbit k0=P2^0;sbit k1=P2^1;sbit k2=P2^2;sbit k3=P2^3;sbit k4=P2^4;sbit k5=P2^5;sbit k6=P2^6;uint code Tone_Delay_Table[] = { 64021,64103,64260,64400,64524,64580,64684,64777, 64820,64898,64968,65030,65058,65110,65157,65178 };uchar code Song1_Tone[]={1, 1, 5, 5, 6, 6, 5,4, 4, 3 ,3, 2, 2, 1,5, 5, 4, 4, 3, 3, 2, 5, 5, 4, 4, 3, 3, 2,1,1, 5, 5, 6, 6 ,5,4 ,4, 3, 3, 2, 2, 1,0xff};uchar code Song1_Time[]={2,2,2,2,2,3,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,5,2,2,2,2,2,2,5,2,2,2,2,2,2,5,0xf f};uchar code Song2_Tone[]={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 ,1,5,1,0xff};uchar code Song2_Time[]={2,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0xff}; uchar code Song3_Tone [] ={ 1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,6,7,2,1,0xFF};uchar code Song3_Time [] ={ 2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0xFF};uchar code Song4_Tone [] ={ 8,9,2,3,7,6,2,3,10,11,1,2,3,1,2,3,3,4,5,6,5,3,5,6,5,3,5,3,2,1,1,2,3,0xFF};uchar code Song4_Time [] ={ 3,6,7,2,4,5,8,1,2,2,5,5,1,9,1,1,1,1,6,1,1,2,4,1,1,2,1,1,1,1,1,2,2,1,0xFF};uchar Song_Index = 0, Tone_Index = 0; //音乐片段索引,音符索引uchar *Song_Tone_Pointer, *Song_Time_Pointer; //音符指针,延时指针uchar i = 0; uchar j=0,k=0,m=0; //从当前数组中取音符的位置void DelayMS(uint ms) //延时{uchar t;while(ms--) for (t = 0; t < 120; t++);}void play0() //按键产生的INT0{ ET0=1;TR0 = 0;k0=1;Song_Index = ( Song_Index + 1) % 4; //切换到下一音乐switch (Song_Index){case 0: Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;break;case 1: Song_Tone_Pointer = Song2_Tone;Song_Time_Pointer = Song2_Time;break;case 2: Song_Tone_Pointer = Song3_Tone;Song_Time_Pointer = Song3_Time;break;case 3: Song_Tone_Pointer = Song4_Tone;Song_Time_Pointer = Song4_Time;break;}//从下一段音乐的第0个音符开始i = 0;while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void play1(){ ET0=1;TR0 = 0;k1=1;Song_Index = ( Song_Index + 3) % 4; //切换到上一段音乐switch (Song_Index){case 0: Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;break;case 1: Song_Tone_Pointer = Song2_Tone;Song_Time_Pointer = Song2_Time;break;case 2: Song_Tone_Pointer = Song3_Tone;Song_Time_Pointer = Song3_Time;break;case 3: Song_Tone_Pointer = Song4_Tone;Song_Time_Pointer = Song4_Time;break;}i = 0; //从上一段音乐的第0个音符开始while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1){Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void play2(){m=!m;TR0 = 0;k2=1;if(m==0){ j=1;TR0=0;ET0=0;}if(m==1){ ET0=1;k=1;if(j==1) //播放被暂停的音乐{switch (Song_Index){case 0: Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;break;case 1: Song_Tone_Pointer = Song2_Tone;Song_Time_Pointer = Song2_Time;break;case 2: Song_Tone_Pointer = Song3_Tone;Song_Time_Pointer = Song3_Time;break;case 3: Song_Tone_Pointer = Song4_Tone;Song_Time_Pointer = Song4_Time;break;}//从本一段音乐的第i个音符开始while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间Song_Index = ( Song_Index + 1) % 4; //播放下一首音乐switch (Song_Index){case 0: Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;break;case 1: Song_Tone_Pointer = Song2_Tone;Song_Time_Pointer = Song2_Time;break;case 2: Song_Tone_Pointer = Song3_Tone;Song_Time_Pointer = Song3_Time;break;case 3: Song_Tone_Pointer = Song4_Tone;Song_Time_Pointer = Song4_Time;break;}continue;}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}}if (j==0){ j=1;Song_Tone_Pointer = Song1_Tone; //开始播放音乐Song_Time_Pointer = Song1_Time;i = 0;while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间Song_Index = ( Song_Index + 1) % 4; //播放下一段音乐switch (Song_Index){case 0: Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;break;case 1: Song_Tone_Pointer = Song2_Tone;Song_Time_Pointer = Song2_Time;break;case 2: Song_Tone_Pointer = Song3_Tone;Song_Time_Pointer = Song3_Time;break;case 3: Song_Tone_Pointer = Song4_Tone;Song_Time_Pointer = Song4_Time;break;}continue;}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}}}return;}void play3(){ ET0=1;TR0 = 0;k3=1;//切换到第一段音乐Song_Tone_Pointer = Song1_Tone;Song_Time_Pointer = Song1_Time;Song_Index=0;//从第一段音乐的第0个音符开始i = 0;while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void play4(){ET0=1;TR0 = 0;k4=1;Song_Tone_Pointer = Song2_Tone; //切换到第二段音乐Song_Time_Pointer = Song2_Time;Song_Index=1 ;i=0;//从第二段音乐的第0个音符开始while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void play5(){ET0=1;TR0 = 0;k5=1;Song_Tone_Pointer = Song3_Tone; //切换到第三段音乐Song_Time_Pointer = Song3_Time;Song_Index=2;//从第三段音乐的第0个音符开始i = 0;while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1) {Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void play6(){ET0=1;TR0 = 0;k6=1;Song_Tone_Pointer = Song4_Tone; //切换到第四段音乐Song_Time_Pointer = Song4_Time;Song_Index=3;//从第四段音乐的第0个音符开始i = 0;while (k0==1&&k1==1&&k2==1&&k3==1&&k4==1&&k5==1&&k6==1){Tone_Index = Song_Tone_Pointer[i];if ( Tone_Index == 0xFF ){i = 0;DelayMS(2000); //每段音乐播放结束后停顿一段时间continue; //继续播放}TR0 = 1;DelayMS( Song_Time_Pointer[ Tone_Index] * 240);TR0 = 0;i++;}return;}void Timer0_Play_Music() interrupt 1 // T0 定时器控制播放{TH0 = Tone_Delay_Table[ Tone_Index ] / 256;TL0 = Tone_Delay_Table[ Tone_Index ] % 256;BEEP = ~BEEP;}void main() // 主程序{TMOD = 0x01;IE = 0x82; //许可INTO 和TO 中断TR0 = 0;while(1){if(k0==0&&k==1) { DelayMS(2000); play0();m=1;}if(k1==0&&k==1) { DelayMS(2000); play1();m=1;}if(k2==0) { DelayMS(2000); play2();}if(k3==0&&k==1) { DelayMS(2000); play3();m=1;}if(k4==0&&k==1) { DelayMS(2000); play4();m=1;}if(k5==0&&k==1) { DelayMS(2000); play5();m=1;}if(k6==0&&k==1) { DelayMS(2000); play6();m=1;}}}。

相关文档
最新文档