单片机音乐播放器课程设计

更新时间:2023-12-03 21:07:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘 要

本文将介绍一种以89C51型单片机为基础元件设计的自动音乐播放器。在当今这个科技高速发展的时代,生活节奏的加快,人们长期处于工作、学习压力过大的状态,对于调节心理压力而言音乐对于每一个人都十分重要,由此音乐播放器在国内已经开始普及。校园里的上下课的铃声,宿舍内早晨的起床号声音,都由以前枯燥刺耳的铃音转变成了好听的音乐,公路、广场中的计时装置也逐渐开始采用音乐来充当铃声。此装置不仅为人们日常生活的计时提供了方便,同时也为目前快节奏的生活带来了乐趣。

本文是应用MCS-51单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语言进行程序设计。通过控制单片机内部的定时器来产生不同频率的方波,驱动蜂鸣器发出不同音调的音乐,再利用延迟来控制发音时间的长短。把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。

这种控制电路结构简单,可读性高,应用性强;软件程序适应范围广,对于不同的音乐只需要改变相应的定时常数即可。

关键词:单片机;音乐播放器;C语言。

I

目 录

绪 论 .................................................................. 1 第1章 音乐盒的设计总体方案 ............................................ 2 第2章 硬件电路设计 .................................................... 3 2.1 总体设计框图 ..................................................... 3 2.2 时钟电路 ......................................................... 3 2.3 复位电路 ......................................................... 3 2.4 选曲按键电路 ..................................................... 3 2.5 音频发生及放大电路 ................................................ 4 第3章 软件程序设计 .................................................... 5 3.1单片机发声概述 .................................................... 5 3.2 程序流程图 ........................................................ 6 3.3 音乐的产生 ........................................................ 7 第4章 KEIL仿真软件的应用 ............................................. 8 第5章 调试与故障分析 .................................................. 9 5.1 软件程序调试 ..................................................... 9 5.2 硬件电路调试 ..................................................... 9 总 结 ................................................................. 10 致 谢 ................................................................. 11 参考文献 ............................................................... 12 附录1:原理图 ......................................................... 13 附录2:源程序 ......................................................... 14

II

绪 论

单片机,更确切地说应称为作微控制器,是20世纪70年代中期发展起来的一种面向控制的大规模集成电路模块,其特点是功能强、体积小、可靠性高、价格低廉。它一面世便在工业控制、数据采集、智能仪表化、机电一体化、家用电器等领域得到了广泛应用,极大地提高了这些领域的技术水平和自动化程度。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。

本文将介绍一种以89C51型单片机为基础元件设计的自动音乐播放器。在当今这个科技高速发展的时代,生活节奏的加快,人们长期处于工作、学习压力过大的状态,对于调节心理压力而言音乐对于每一个人都十分重要,由此音乐播放器在国内已经开始普及。校园里的上下课的铃声,宿舍内早晨的起床号声音,都由以前枯燥刺耳的铃音转变成了好听的音乐,公路、广场中的计时装置也逐渐开始采用音乐来充当铃声。此装置不仅为人们日常生活的计时提供了方便,同时也为目前快节奏的生活带来了乐趣。

本次设计以89C51单片机为基础,利用单片机编成技术对芯片进行功能设定,实现音乐的播放。同时,利用单片机的定时器中断,在单片机内部产生所需要的音乐频率,并通过音频功率放大器将音频信号放大,通过蜂鸣器连续播放一段音乐。此设计通过多次测试,音乐声音宏亮清晰,节拍正常,达到预期效果。

本文将围绕基于单片机的自动音乐播放器,介绍一些关于单片机的基础知识、音乐播放器的制作原理及方法(其中包括了音乐编程原理)、定时器的设定,以及仿真软件(Keil、Proteus)的使用方法。

1

第1章 音乐盒的设计总体方案

单片机音乐播放器控制系统结构简单,环节较少,因此,单片机音乐播放器包括LED彩灯、数码管的显示。除了播放音乐有按键外,其余的硬件组成大体相同;对于单片机音乐播放器声音的读出除了蜂鸣器以外,还要配置合适的放大器播放出响亮的声音。

单 晶振电路 时钟电路 片 机 电源电路 复位电路 按键电路 发声电路 图 1-1 结构总图

单片机音乐播放器电路板向着小型化、低功耗、抗千扰、低成本、实用功能方向发展。因此在对单片机的选择趋向于容量适中、功能丰富、性能可靠、价格低的元件。因此本设计中应用最为广泛的MCS-51系列8位单片机8051。

2

R31KR210KRT110474

IN-V OUTBYPASSGAINGNDGAINLM38618R410第2章 硬件电路设计

1P10/TVcc2P11/TP00P123STC89C51/52P12P01VCC4P13P02S05C1P14P03扬声器 S1680c51 P15电源 P04P127P16P05单片机 8S2复位 P17歌曲制按钮 P0610ufP329RESETP07S310RXDEA/VP时钟晶振 R5P3511TXDALE/P10KP3212INT0PSEN 13INT1P27图 2-1 总设计图 14T0P26P35152.2 时钟电路 T1P25VCCD11610ufVCCC7WRP24C217386运放RDP2330p1836C6P22X2IN+19Vcc10425X1P21IN-V OUTR371C312MHZ20C5BYPASSGAINGNDP20R4R11K482.1 总体设计框图 2.2KR210KRT110430pGNDGAINLM38689C52RC 10473122.3 复位电路 P123VCC4S05C1S16P127S2810ufP329S310R5图 2-3 复位电路 P351110KP32122.4 选曲按键电路 1314P3515VCCD116C21730p1819C312MHZ20R12.2K

图 2-2 时钟电路 P10/TP11/TP12P13P14P15P16P17RESETRXDTXDINT0INT1T0T1WRRDX2X1GND89C52RC3

STC89C51/52 VccP00P01P02P03P04P05P06P07EA/VPALE/PPSENP27P26P25P24P23P22P21P20403938373635343332313029282726252423222130p

S1P12S2P32S3P35

图 2-4 选曲电路

其中P3.2 播放\\暂停, P1.2上一首歌,P3.5下一首歌。

2.5 音频发生及放大电路 386运放3274IN+VccIN-V OUTBYPASSGAINGNDGAINLM3866518VCCC7C6R41010ufC8BEEPC5473100uf+-0.25W104R31KR210KRT1104 图 2-5音频发生及放大电路

利用STC89C51的I/O口产生一定频率的方波脉冲,通过LM386功放电路驱动喇叭发出不同的音调从而演凑乐曲。

4

第3章 软件程序设计

3.1单片机发声概述

一般来说,单片机不像其他专业乐器那样能奏出多种音色的声音,即不包含相应幅度的谐振频率。单片机演奏的音乐基本都是单音频率。因此单片机演奏音乐比较简单,只需能清楚“音调”和“节拍”两个概念即可。 音调表示一个音符唱多高的频率。 节拍表示一个音符唱多长的时间。

知道了一个音符的频率后,便可以让单片机发出相应频率的振荡信号,从而产生相应的音符声音。通过单片机的定时器进行定时中断,在中断服务程序中将单片机上完结单片机I/O口来回置高电平或者是低电平的,从而让扬声器发出声音。通过节拍计算出每个音符所需要的时间,采用循环延时的方法来实现控制一个音符唱多长的时间,从而构成一首完整的音乐。

音调主要由声音的频率决定。对一定强度的纯音,音调随频率的升降而升降;对一定频率的纯音、低频纯音的音调随响度增加而下降,高频纯音的音调却随响度增加而上升。

以标准高音A的频率F=440HZ,其对应的周期为: T=1/F=1/440=2272us 因此需要在单片机I/O端口输出周期为T=2272us的方波脉冲,也就是t=T/2=2272/2=1136us

也就是说,单片机上定时器的中断出发时间为1136us。如果单片机采用定时器为工作方式1,它以振荡器的十二分频信号为计数脉冲。设外接晶振的振荡器频率为f,则定时器的预置初始值有以下公式来确定:

Temp = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC) TH = Temp /256 TL = Temp %6

5

3.2 程序流程图 开始 初始化堆栈 初始化音乐输出口及按钮 根据当前状态播放相应歌曲的某个音 暂停/播放键是否按下 是按键处理 否上一曲键是否按下,并且在开机后有一次按下暂停/播放键 是按键处理 否下一曲键是否按下,并且在开机后有一次按下暂停/播放键 是按键处理 否否开机后是否按下过暂停/播是按键处理 6

3.3 音乐的产生

一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。

利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,,则半周期为1912/2=956μs,因此只要令计数器计时956μs,每计数956次时将I/O反相,就可得到中音DO(523Hz)则初始值为65535-956 = 64579 = 0xFC43。

计数脉冲值与频率的关系式(如式3-1所示)是:

N=fi÷2÷fr (3-1) 式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。

其计数初值T的求法如下: T=65536-N=65536-fi÷2÷fr

例如:设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。

T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr

低音DO的T=65536-500000/262=63627 中音DO的T=65536-500000/523=64580 高音DO的T=65536-500000/1046=65059

7

第4章 KEIL仿真软件的应用

硬件与软件的设计一般都要分别借助一些软件,如我们通常用作电路设计与制版的Protel,MCS-51程序开发工具KEIL等。

Keil C51 uVision2集成开发环境是基于80C51内核的软件开发平台,支持工程建立、程序的编译与链接、软件仿真、硬件仿真、目标代码的生成等功能。Keil C51编译器在产生代码的准确性和效率方面达到了较高的水平。

与大多数集成开发环境类似,Keil C51集成开发环境也是用工程的方法来管理文件,在一个工程文件中源程序(C51程序、汇编程序)、头文件等都可以进行统一管理。

安装运行KEIL51,使用KEIL的开发工具进行项目开发过程,与其他软件开发项目的过程基本上相同:

创建C 语言或汇编语言的源程序。 编译或汇编源文件。 纠正源文件中的错误。

从编译器和汇编器连接目标文件。 测试连接的应用程序。

8

第5章 调试与故障分析

5.1 软件程序调试

本次设计的软件部分由音乐播放程序组成。

关于音乐播放程序的调试,我首先采用Preteus软件来仿真,但是该仿真软件中没有喇叭或蜂鸣器等声音播放工具。于是本人将图3-4中的单片机的P1.0处接了一个示波器,想通过这样来仿真并调试音乐播放程序,但是效果不是很理想。程序运行的时候,能看见示波器有不同频率的波形交替出现,但是频率变换得很快,无法确认是否显示的是所需要的频率,并且无法辨别音频变换的节奏是否正确。此方法并不适用。

接着,我制作了一个简单的单片机播放器电路。即在实验板上焊接实验电路,电路由单片机89C51、按钮外围电路组成,并在单片机的P1.0处用三极管连接一个简单的音频放大器,再外接一个蜂鸣器。将程序写入单片机中,这样就能听出声音和音乐节奏是否正确。

5.2 硬件电路调试

本次设计的硬件电路主要由单片机89C51组成,在调试电路的过程中也碰到了一些问题。

问题一:单片机无法正常下载程序。 调试步骤:

(1)检查单片机和串口电路是否连接错。 (2)检查焊接电路是否有虚焊和漏焊。 问题二:下载音频程序后无法播放音乐。 调试步骤:

检查电源是否正常接入电路中。

利用示波器测试单片机输出端是否有信号输出,发现信号输出正常,说明单片机正常工作。

利用示波器测试音频放大电路输出端是否有信号输出,发现信号输出正常,说明音频放大电路工作正常,同时说明是蜂鸣器部分出现了问题。

故障原因:焊接时将发声器件烧坏了,导致发不出声音。 解决方案:重新换一个无源蜂鸣器,即可正常播放音乐。

9

总 结

经过这次创新设计,我觉得自己学到了不少东西。归纳起来,主要有以下几点:

(1)通过这次创新设计,我能将以前四年所学到的专业知识与实践相联系,将所学到的知识充分运用到本次设计中。同时,我也认识到自己知识上不足的地方,体会到了所学理论知识的重要性,知识掌握得越多,设计得就更全面、更顺利、更好。

(2)进一步熟悉了单片机的知识。通过本次设计,我对单片机的基本原理、内部结构、各引脚功能、定时器和中断的应用都有了更深刻的理解。并且,能够以单片机为基础元件设计一个简单的系统。

(3)通过本次设计,熟悉了设计一个项目所必经的几个阶段。本次设计从理论研究到硬件原理图设计,从元器件的选择到PCB板的制作,从软件编程到最后的调试过程都由我独立完成。这不仅锻炼了我独立完成设计工作的能力,更重要的是了解了一个电子产品的设计流程,为将来投入工作增加了宝贵的经验,奠定了坚实的基础。

(4)提高了自己查找资料的能力。在设计过程中,我碰到了一些暂时无法解决的问题,于是我通过上网查阅和图书馆借阅资料,或是通过与老师同学交流一步步地解决了。从中我懂得了我们这个专业的知识面相当广泛,我们需要不断通过各种途径更新自己的知识,不断充实自己,同时要懂得与他人交流意见,积极听取别人的建议,懂得不断学习的重要性。

10

致 谢

在枣庄学院的求学生涯在师长、亲友的大力支持下,走得辛苦却也收获满囊,在论文即将付梓之际,思绪万千,心情久久不能平静。 伟人、名人为我所崇拜,可是我更急切地要把我的敬意和赞美献给一位平凡的人,我的导师。我不是您最出色的学生,而您却是我最尊敬的老师。您治学严谨,学识渊博,思想深邃,视野雄阔,为我营造了一种良好的精神氛围。授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,使我不仅接受了全新的思想观念,树立了宏伟的学术目标,领会了基本的思考方式,从论文题目的选定到论文写作的指导,经由您悉心的点拨,再经思考后的领悟,常常让我有“山重水复疑无路,柳暗花明又一村”。

感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚谢意!

最后再一次感谢所有在创新设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。

11

参考文献

[1] 郑郁正.单片机原理及应用.四川大学出版社,2003 [2] 谭浩强.C程序设计(第二版).清华大学出版社,1999

[3] 王晓君.安国臣等. MCS—51及兼容单片机原理与选型. 北京-电子工业出版社, 2003 [4] 李启炎. Protel 99SE应用教程. 上海-同济大学出版社 2005.2

[5] 胡烨, 姚鹏翼, 江思敏. Protel 99 SE电路设计与仿真教程. 北京-机械工业出版社,

2006

[6] 张义和,陈敌北。例说8051。北京:人民邮电出版社,2006 [7] 张洪润,张亚凡。单片机原理及应用。清华大学出版社,2004 [8] AT89C51 DATA SHEEP Philips Semiconductors 1999.dec

[9]Yang. Y., Yi. J., Woo, Y.Y., and Kim. B.: ‘Optimum design for linearityand

efficiency of microwave Doherty amplifier using a new loadmatching technique’, Microw. J., 2001, 44, (12), pp. 20–36

[10] Vizimuller, P.: ‘RF design guide-systems, circuits, and equations’

(ArtechHouse, Boston, MA, 1995)

12

附录1:原理图

386运放R31KR210KRT11043274IN+VccIN-V OUTBYPASSGAINGNDGAINLM3866518VCCC7C6R41010ufC8BEEPC5473VCC1234567891011121314151617181920P10/TP11/TP12P13P14P15P16P17RESETRXDTXDINT0INT1T0T1WRRDX2X1GND89C52RCVccP00P01P02P03P04P05P06P07EA/VPALE/PPSENP27P26P25P24P23P22P21P204039383736353433323130292827262524232221P121POWER100uf+-0.25W104P12VCCC1S1P12S2P32S3P35R510KP3210ufS0STC89C51/523VCCP35VCCD1C230pR12.2KC330p12MHZS1SWITCH246246135135

13

附录2:源程序

#include

#define sound_amount 5 //歌曲的数量 sbit play_up=P1^3; //上一首歌 sbit play_down=P3^5; //下一首歌 sbit pause=P3^2; //播放\\暂停 sbit speaker=P1^0; //无源蜂鸣器

unsigned char timer0h,timer0l,time;//timer0h,timer0l为定时器T0的高低位初值,time为对应的节拍时间

unsigned char music_num; //music_num为歌曲编号,music_num=0表示刚开机时的状态,num是查找歌曲数据表的地址

unsigned int num;

signed int fre; //对应频率数据表的地址

bit play_enable; //歌曲播放的使能标志位,用于播放\\暂停 void delay(unsigned char t);

//延时子函数,控制发音的时间长度

void delayms(unsigned int t); //普通延时子程序,可用于按键消抖 void music_play(void); //播放歌曲 ////////////////////////////////////////////// //每三个数字,代表一个音符

//第一个数字是音符的数值1234567之一(第几个音),代表哆来咪发... //第二个数字是0123之一,代表低音\\中音\\高音\\超高音(第几个八度) //第三个数字是时间长度,以半拍为单位,乐曲数据表的结尾是三个0 //《烟花易冷》

unsigned char code song1[]={

5,2,1, 3,2,1, 2,2,2, 2,2,4, 3,2,1, 1,2,1, 2,2,1, 3,2,4, 5,2,1, 3,2,1, 2,2,2, 2,2,2, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1, 7,2,1, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,1, 5,1,1, 6,1,6, 5,2,1, 3,2,1, 2,2,2, 2,2,1, 2,2,1, 2,2,1, 5,1,1, 3,2,1, 4,2,1, 3,2,4, 3,2,1, 3,2,1,

14

7,2,3, 3,2,1, 2,2,2, 1,2,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 6,2,3, 6,1,1, 1,2,1, 3,2,1, 2,2,1, 6,1,1, 1,2,1, 7,1,2, 5,1,2, 6,1,6, 0,0,0 }; //《发如雪》

unsigned char code song2[]={

5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1, 3,2,1, 6,2,1, 5,2,1, 3,2,1, 5,2,3, 5,2,1, 6,2,1, 1,3,2, 6,2,1, 5,2,1, 3,2,1, 5,2,1, 3,2,2, 1,2,1, 2,2,1, 3,2,1, 1,2,1, 6,1,1, 3,2,1, 2,2,1, 5,1,1, 2,2,1, 3,2,2, 2,2,1, 3,2,1, 5,2,1, 6,2,1, 5,2,3, 1,2,1, 2,2,1, 5,2,1, 3,2,1, 5,2,1, 3,2,2, 1,2,1, 6,1,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 2,2,1, 2,2,1, 1,2,4, 0,0,0 }; //《简单爱》

unsigned char code song3[]={

5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,

3,2,1, 3,2,1, 1,2,1, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 7,1,1, 1,2,1, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1, 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1, 3,2,1, 3,2,1, 1,2,2, 5,2,1, 1,2,1, 5,2,1, 5,2,1, 7,1,1, 1,2,1, 0,0,0 }; //《世上只有妈妈好》 unsigned char code song4[]={

6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, //6,2,3代表6,中音,3个半拍; //5,2,1代表5,中音,1个半拍; //3,2,2代表3,中音,2个半拍; //5,2,2代表5,中音,2个半拍; //1,3,2代表1,高音,2个半拍;

3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1, 6,2,1, 3,2,2, 2,2,2,

15

1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0}; //《当你孤单你会想起谁》 unsigned char code song5[]={

3,2,2, 3,2,1, 4,2,1, 3,2,2, 2,2,1, 1,2,1, 2,2,2, 5,2,2, 2,2,2, 2,2,3, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 5,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,2, 6,1,2, 2,2,1, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 7,1,1, 1,2,6, 0,0,0 };

//《乡间小路》

unsigned char code song6[]={

3,1,2, 3,1,1, 3,1,1, 6,0,1, 6,0,1, 1,1,2,

6,0,1, 5,0,1, 6,0,4, 6,0,2, 6,0,1 ,6,0,1, 6,0,2, 6,0,1, 1,1,1, 2,1,2, 2,1,1, 3,1,1, 2,1,4, 3,1,1, 3,1,1, 3,1,1, 2,1,1, 4,1,2, 3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 5,1,1, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 4,1,2, 4,1,1, 3,1,1, 2,1,2, 1,1,1, 2,1,1, 3,1,1, 2,1,1, 1,1,1, 2,1,1, 3,1,4, 6,1,2, 3,1,1, 6,1,1, 7,1,1, 6,1,1, 5,1,1, 5,1,2, 2,1,1, 5,1,1, 6,1,1, 5,1,1, 4,1,1, 0,0,0}; //《送别》

unsigned char code song7[]={

5,1,2, 3,1,3, 5,1,1, 1,2,3, 6,1,2, 1,2,2,

5,1,4, 5,1,2, 1,1,1, 2,1,1, 3,1,2, 2,1,1, 1,1,1, 2,1,4, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 7,1,1, 1,2,4, 6,1,1, 7,1,1, 1,2,1, 6,1,1, 6,1,1, 5,1,1, 3,1,1, 1,1,1, 2,1,8, 5,1,2, 3,1,1, 5,1,1, 1,2,2, 7,1,1, 6,1,2, 1,2,2, 5,1,4, 5,1,2, 2,1,1, 3,1,1, 4,1,2, 7,0,2, 1,1,4, 0,0,0}; //《最浪漫的事》

unsigned char code song8[]={

5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 3,1,1, 5,1,5, 5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 6,1,1, 1,1,5, 3,1,2, 2,1,3, 5,1,1, 6,1,1, 1,2,1, 6,1,2, 6,1,1, 5,1,1, 6,1,1, 5,1,1, 6,1,1, 1,1,5, 1,1,1, 2,1,1, 3,1,1, 4,1,2, 4,1,1, 5,1,1, 6,1,1, 6,1,1,

16

5,1,1, 6,1,2, 1,2,1, 6,1,3, 1,2,1, 6,1,1, 5,1,1, 5,1,4, 1,1,1, 6,1,1, 5,1,5, 5,1,1, 6,1,1, 1,2,1, 3,1,1, 2,1,1, 3,1,1, 1,1,6, 0,0,0}; // 频率-半周期数据表 高八位 共保存了四个八度的28个频率数据 unsigned char code FREQH[]={

0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表 低八位 unsigned char code FREQL[]={

0x42, 0xC1, 0x17, 0xB6, //低音1234567

0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 void main(void) {

TMOD=0x11; //T0 T1 均在工作方式1 ET0=1; //T0开中断 EA=1; //CPU开中断 while(1) {

music_play(); //根据当前状态播放相应歌曲的某个音符 if(!pause) {

if(!pause) {

if(music_num==0) //music_num=0只有在刚开机,且未按下暂停键时

//暂停键处理

存在,表示刚开机时的状态,按下后从第一首开始播放

{

music_num=1; //歌曲序号置1

17

}

num=0; //从头播放 play_enable=1;

//允许播放

else {

play_enable=~play_enable;

speaker=1; }

while(!pause) //若按着暂停键不放手时的处理 {

if(play_enable==0){} //如果是暂停,则显示时间不变//(暂

停时play_enable==0)

}

}//暂停键处理结束

}//while结束

if((!play_up)&&(music_num!=0)) //上一首按键 {

delayms(5);

if((!play_up)&&(music_num!=0)) { speaker=1;

music_num-=1;//歌曲编号减一 if(music_num<=0) music_num=8; num=0;

//从头开始播放

if(music_num==(sound_amount+1))

music_num=1;

delayms(500);//歌曲切换时延时0.5S

} }

if((!play_down)&&(music_num!=0))

18

本文来源:https://www.bwwdw.com/article/6mot.html

Top