基于51单片机的电子琴设计附原理图、pcb和程序_课程设计说明书_第1页
基于51单片机的电子琴设计附原理图、pcb和程序_课程设计说明书_第2页
基于51单片机的电子琴设计附原理图、pcb和程序_课程设计说明书_第3页
基于51单片机的电子琴设计附原理图、pcb和程序_课程设计说明书_第4页
基于51单片机的电子琴设计附原理图、pcb和程序_课程设计说明书_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书题目基于单片机的电子琴设计院(系)电子工程与自动化学院专业测控技术与仪器卓越2013年9月21日目录1摘要12关键字13设计任务及要求14方案可行性论证15程序框图26关键单元电路与程序介绍361复位与震荡电路3624X4矩阵键盘363数码管与LED灯464蜂鸣器665音乐相关知识77调试过程118总结与体会119参考文献1110附录12101设备与仪器12102软件12103原件清单12104原理图与PCB图13105总程序14106实物图31【摘要】打造一个多功能电子琴,核心是一块单片机。单片机读取键值,为内置定时器赋初值,定时器每溢出一次,驱动蜂鸣器的引脚电平就取反一次,产生相应频率的方波,即音调;设好键值与数码管段码表的对应关系,键按下时,数码管显示对应音调。一首音乐储存在一个表中,表中的数据是音调与节拍,单片机读取音符的音调与节拍,根据音调赋予定时器初值,根据节拍决定定时器工作的时间,也就是蜂鸣器响的时间,一个接一个地读取音符,即可播放一首歌曲。节拍用LED灯的点亮个数表示。单片机读取音乐表中的节拍,控制LED灯的点亮个数,达到显示节拍的效果。特别要注意的是该方案采用了两个定时器,T0、T1。T0作为驱动蜂鸣器的定时器,要给予高优先级,不然会被T1干扰,音质变差。【关键字】单片机、STC89C52、电子琴、C51、KEIL。【设计任务及要求】1通过按键能够发出相应的音符并播放产生乐音,实现演奏;2演奏的同时可数字显示当前的音调,利于培养乐感3可以选定播放固定乐曲自动演奏,演奏时LED进行节拍指示;4在自动演奏和奏乐的过程中按停止键则中断演奏;5可以选择调节音或小。【方案可行性论证】本课题采用STC89C52单片机作为核心器件,实现基本的音乐弹奏、音乐播放、音调显示和音乐节拍指示的功能。1音乐弹奏通过程序识别4X4矩阵键盘中按下的键的坐标(X,Y),然后根据(X,Y)从计数初值表中读取对应的计数初值,赋值给定时器0,定时器产生对应频率的方波,达到播放对应音调的功能。2音乐播放先建立一个包含一首音乐的音调与节拍的表。其中,音调就是0X01低音、DO、0X12中音、RE、0X23(高音、MI)之类的数;节拍就是0X02(半拍),0X04(一拍)之类的数。然后,根据音调读取计数初值,再将计数初值赋给定时器T0开启定时器T0读取节拍并延时关闭定时器T0。这样就发出了一个音,然后再读下一个音的初值与节拍,重复上一个操作即可。(具体实现方法见附录总程序)3数码管显示音调按键读出按键坐标(X,Y),用IF语句来判断(X,Y)该给数码管赋什么值,然后从UCHARCODENUM表中读取这个值赋给数码管例如P0。播放歌曲时读入音调,根据音调的值来判断NUMI这个表中的I,再把NUMI赋给P0口。4LED灯的节拍指示采用定时器1来控制,作为节拍指示。按键时根据按下的时长来控制LED的点亮个数,并且是按一定的时间间隔逐个点亮;释放按键时,LED灯按一定的时间间隔逐个熄灭,从而达到一种比较简单的节拍指示效果。播放音乐时根据音符的节拍,控制点亮到哪一个灯,在点亮那个灯之前,前面的灯逐个等时距点亮。音符结束后,LED灯全部一起熄灭。这样,达到了一个精确显示节拍的效果。【程序框图】开始扫描键盘读取歌曲是否播放键按下有矩阵键按下否识别按键数码管显示音调算出定时器初值开启定时器,并赋初值,蜂鸣器发声按键是否释放关闭定时器P0口置0是否否算出音符的音调、节拍根据音调给T0赋初值开启T0T1按节拍延迟关闭T0T1数码管与LED是否结束符否读下一个音符数码管显示音调LED指示节拍是是否停止播放是【复位与震荡电路】原件的参数如图所示。C1,C2可采用30PF无极性陶瓷电容;C3可采用10F记性电解质电容。值得注意的是,晶振不能随便摸尤其在通电工作的时候,触摸容易损坏。自从摸过一次后,震荡频率变得不稳定,蜂鸣器声音时好时坏。【4X4矩阵键盘】键盘扫描的基本思路是先得出触发按键的“行”,即横坐标X,再得出他的“列”,即纵坐标Y。以下是获取横坐标X的代码UCHARKEY_X/P1口高位接纵坐标(P17P14)低位接横坐标P13P10/UCHARIP10X0F/有按键按下后对应按键的横坐标电位被拉低(注意低电位引脚不能被高电位引脚抬高,只能是低电位拉低高电位)/IFP1_00DELAYMS5/延时5MS去抖动IFP1_00I1ELSEIFP1_10DELAYMS5IFP1_10I2ELSEIFP1_20DELAYMS5IFP1_20I3ELSEIFP1_30DELAYMS5IFP1_30I4ELSEI0RETURNI/0表示按键未按下获取Y的方法与获取X的方法类似,具体可以参考附件总程序。得到触发按键的坐标(X,Y)之后,可以通过X,Y的值来确定按键的功能。例如X1,Y1时(S1按下),可以让数码管显示1IFX1或者更方便一点IFX1P0LED_TABLEY就能显示第一行的所有的数了。【数码管与LED灯】数码管在本课题中,数码管要显示AG,17,17,所以段码比较另类。NUM0的值是没用到的,起占位作用。UCHARCODENUM0X00,/共阴极数码管段选码0X77,0X7C,0X39,0X5E,0X79,0X71,0X3D,/AG0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,/170X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87/17编写程序时,要根据实际情况来编写比如16个按键不能够把低中高音都全部表示完全,只能选取合适的部分。我让第一行的按键触发低音47,第二行触发中音14,第三行触发中音57和高音1,第四行触发高音25。这样设置能弹奏大部分曲目。以下是控制数码管的代码片段IFX1P0NUM3Y/低音47ELSEIFX2P0NUM7Y/中音14ELSEIFX3P0NUM11Y/中音57和高音1ELSEIFX4P0NUM15Y/高音25LED灯因为LED灯要按一定的时间逐个点亮或者逐个熄灭,所以我用定时器1来控制它。定时器1每溢出一次并满足一定条件时FLASH变量就1或者1,然后从LED_TABLE这个表中读出相应的数赋给P2口。表UCHARCODELED_TABLE0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00/发光二极管闪烁表/代码IFX0P2LED_TABLEFLASH播放音乐时又有所不同播放音乐时,LED灯要精确地显示当前音符的节拍,所以IF语句里加了一条限制语句FLASH0FLASHP2LED_TABLEFLASH这样做,就能看得出音符的节拍了。只是,由于LED灯的个数有限,所以大于二分音符(2拍)的节拍就无法看到了。因为8个灯全亮才表示二分音符。如果当初采用16个灯的话,就没有这个窘境了。【蜂鸣器】蜂鸣器采用一个S8550NPN三极管驱动,一个可变电阻改变音量。三极管的选用要注意放大倍数,放大倍数太小会导致蜂鸣器声音很小。最初采用8050就造成了这个问题。另外,采用P30口连接接蜂鸣器是一个错误。因为P30、P31是烧写程序用到的接口。倘若连接了其他器件,每次调试都要拔下烧写线,很不方便。【音乐相关知识】【表651】音符频率对照表音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1DO262636280XF88C4FA740648601DO27763731中5SO784648980XFD82低2RE294638350XF95B5SO831649342RE31163928中6LA880649680XFDC8低3M330640210XF4FA349641030XFA67中7SI988650300XFE064FA37064185高1DO1046650580XFE22低5SO392642600XFB041DO1109650855SO41564331高2RE1175651100XFE56低6LA440644000XFB902RE124565134646664463高3M1318651570XFE85低7SI494645240XFC0C高4FA1397651780XFE9A中1DO523645800XFC444FA1480651981DO55464633高5SO1568652170XFEC1中2RE587646840XFCAC5SO1661652352RE62264732高6LA1760652520XFEE4中3M659647770XFD096186565268中4FA698648200XFD34高7SI1967652830XFF03音调、节拍以及编码的确定方法一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍。其中节拍表示一个音符唱多长的时间。音调的确定不同音高的乐音是用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、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者B号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,B叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046HZ)刚好是中音DO的频率(523HZ)的一倍,中音DO的频率(523HZ)刚好是低音DO频率(266HZ)的一倍;同样的,高音RE的频率(1175HZ)刚好是中音RE的频率(587HZ)的一倍,中音RE的频率(587HZ)刚好是低音RE频率(294HZ)的一倍。1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。2)利用STC89C52的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。3)例如频率为523HZ,其周期T1/5231912US,因此只要令计数器计时956US/1US956,在每次计数956次时将I/O反相,就可得到中音DO(523HZ)。计数脉冲值与频率的关系公式如下NFI2FRN计算值;FI内部计时一次为1US,故其频率为1MHZ;4)其计数值的求法如下T65536N65536FI2FR例如设K65536,F1000000FI1MHZ,求低音DO(261HZ)。中音DO(523HZ)。高音的DO(1046HZ)的计算值T65536N65536FI2FR6553610000002FR65536500000/FR低音DO的T65536500000/26263627中音DO的T65536500000/52364580高音DO的T65536500000/1047650595)C调各音符频率与计数值T的对照表如表1652所示。节拍的确定若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即BEAT,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实05S,则1/4拍为0125S。至于1拍多少S,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非低音频率T参数中音频率T参数高音频率T参数DO2621908229DO523956115DO10465757DO2771805217DO554903108DO11095454RE2941701204RE587852102RE11755151RE3111608193RE62280497RE12454848MI3301515182MI65975991MI13184545FA3491433172FA69871686FA13974343FA3701351162FA74067681FA14804141SO3921276153SO78463877SO15683838SO4151205145SO83160272SO16613636LA4401136136LA88056868LA17603434LA4641078129LA93253664LA18653232SI4941012121SI98850661SI19763030表652C调各音符频率与计数值T的对照表常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。音乐的编码每个音符采用2个字节。第一个字节表示音调,第二个字节表示节拍。音调字节中,高四位表示低中高音,0表示低音,1表示中音,2表示高音;低四位表示“音调”。比如0X11表示中音DO。节拍字节中,数值I表示代表着延迟I个十六分音符。比如0X04,表示延时4个16分音符,即延时1个四分之一音符。在以四分音符为一拍的歌曲中,0X04就代表一拍。底下没有横线,右侧也没有横线的数字(音调),就用0X04表示他的延时。底下有一横线0X02;右侧有一横0X08右侧两横0X0C右侧三横0X10;右下角有一点加上当前延时的一半。由于不同的歌曲有不同的播放速度,即曲速(单位拍每分钟)。所以音乐编码表中的第0和第1元素用来表示曲速。我们可以找到任意歌曲的简谱图,然后根据上述规则编写出单片机识别的简谱表。例如可以翻译成UCHARCODEYMT/玉满堂0X96,0X00,/曲速0X96表示150拍/分0X00,0X0A,0X05,0X02,0X15,0X02,0X12,0X02,0X13,0X04,0X13,0X02,0X15,0X02,0X12,0X04,0X12,0X02,0X13,0X02,0X12,0X10,0X13,0X04,0X13,0X02,0X12,0X02,0X13,0X04,0X15,0X02,0X16,0X02,0X15,0X0C,0X13,0X02,0X15,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X15,0X02,0X13,0X02,0X15,0X0C,0X15,0X02,0X16,0X02,0X21,0X04,0X21,0X02,0X22,0X02,0X23,0X04,0X22,0X02,0X21,0X02,0X22,0X10,0X23,0X08,0X15,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X13,0X04,0X15,0X10,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X02,0X21,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X02,0X25,0X02,0X23,0X02,0X22,0X0C,0X21,0X02,0X22,0X02,0X23,0X06,0X15,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X02,0X21,0X02,0X15,0X02,0X13,0X02,0X15,0X0C,0X13,0X02,0X15,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X22,0X04,0X22,0X02,0X23,0X02,0X22,0X04,0X22,0X02,0X23,0X02,0X25,0X02,0X26,0X02,0X23,0X02,0X25,0X02,0X22,0X02,0X23,0X02,0X21,0X02,0X16,0X02,0X21,0X10,0XFF【调试过程】编写程序阶段,一个功能、一个模块地编写。先写好键盘扫描程序,然后再到数码管显示、蜂鸣器发声、LED节拍指示。分部进行,个个击破。【总结体会】本课题让我更深刻地认识到了单片机这种器件,特别是对单片机里面的定时器收获最多。而且这是我第一次焊双面板,意义不同凡响。有了这次经验,对以后做板子定有深远的影响。制作过程中,感触最深的是解决杂音问题。在弹奏与播放时,蜂鸣器声音不纯,有颤音,影响音乐美感。为此,我煞费苦心,花了很多时间找原因。想到了精简定时器中断程序里的代码和运算,但效果甚微。直到最后,忽然想到了定时器有优先级的说法。试了一下,将控制蜂鸣器的定时器T0设为高优先级。终于问题解决了而且是如此的简单,但是过程却是又如此的艰辛,让人感觉不太值得。不过,终归是值得的【参考文献】单片微机原理、汇编与C51及接口技术(朱定华戴颖颖李川香著)【附录】设备与仪器电脑、单片机开发板(或者单片机烧写器)序号名称数量备注1四脚开关186X6MM212MHZ晶振1330PF陶瓷电容2410F无极性电容1510K22K电阻910KX922KX16240电阻107NPN三极管1S85508七段共阴极数码管29无源蜂鸣器110电位器111发光二极管10红色X8黄X1绿X112排针3排13双面覆铜铜板115X10CM1440P杜邦线115单片机底座216电源开关117STC89C52单片机1软件KEILUVISION4、DXP09原件清单原理图与PCB图总程序INCLUDEINCLUDEDEFINEUCHARUNSIGNEDCHARDEFINEUINTUNSIGNEDINTDEFINEALLSONG4/歌曲总数按实际写SBITP1_0P10SBITP1_1P11SBITP1_2P12SBITP1_3P13SBITP1_4P14SBITP1_5P15SBITP1_6P16SBITP1_7P17SBITBEEPP30SBITKEY_PLAYP31UCHARX0/矩阵键盘横坐标从1开始0为未按下的标志/UCHARY0/矩阵键盘纵坐标从1开始0为未按下的标志/UCHARFLASH0/控制LED灯显示的变量/UCHARF_L/按键发出音调的初值低位)/UCHARF_H/高位UCHARSONG_L/歌曲音调的初值(低位)/UCHARSONG_H/高位UCHAROUT0/声音输出变量1表示有输出0表示无输出/UCHARYINDIAO/音调定义为全局变量为了在播放时数码管能显示当前音调/UCHARYINDIAO_H/音调的高四位UCHARYINDIAO_L/音调的低四位UCHARJIEPAI/节拍(简而言之就是一个音调响的时间长度)/UCHARSONG_ID1/歌曲序号变量UCHARTEMP_ID1/歌曲临时序号UINTWHICH2/简谱表里的第几个音从第2个开始第0个用来存曲速,第1个占位/UCHARSAME0/在暂停时选了同一首歌曲,用于跳出暂停循环/UCHARKEY_X/获取键盘横坐标函数UCHARKEY_Y/获取键盘纵坐标函数VOIDPLAY/播放歌曲函数VOIDDELAYMSUINTMS/延时XXMS函数VOIDDELAYUINTPAI/节拍延时函数VOIDKEY_CHECK/检查按键状态函数VOIDDISPLAY/数码管显示对应音调函数VOIDSPEAK/按键后给定时器0赋对应音调的初值从而发出声音/UCHARCHOOSE/播放状态下选歌函数释放按键后才跳出函数,返回歌曲序号/UCHARCHOOSE2/暂停状态下选歌函数不用释放按键即可跳出函数,返回歌曲序号/VOIDPLAY/播放歌曲函数UCHARCODENUM0X00,/数码管段选码0X77,0X7C,0X39,0X5E,0X79,0X71,0X3D,/AG0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,/170X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87/17UCHARCODELED_TABLE0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00/发光二极管闪烁表/UCHARCODECHUZHI/音调对应的计数初值0XFF,0XFF,/占0位0XF8,0X8C,/低10X01A数码管显示方式0XF9,0X5B,/2B0XFA,0X15,/3C0XFA,0X67,/4D0XFB,0X04,/5E0XFB,0X90,/6F0XFC,0X0C,/低7(0X07)G0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,/占位0X080X0B811/0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,/占位0X0C0X101216/0XFC,0X44,/中1(0X11)170XFC,0XAC,/20XFD,0X09,/30XFD,0X34,/40XFD,0X82,/50XFD,0XC8,/60XFE,0X06,/中7(0X17)230XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,/占位0X180X1B2427/0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,/占位0X1C0X202832/0XFE,0X22,/高1(0X21)1330XFE,0X56,/220XFE,0X85,/330XFE,0X9A,/440XFE,0XC1,/550XFE,0XE4,/660XFF,0X03/高7(0X27)739UCHARCODEYMT/玉满堂0X96,0X00,/曲速0X96表示150拍/分0X00,0X0A,0X05,0X02,0X15,0X02,0X12,0X02,0X13,0X04,0X13,0X02,0X15,0X02,0X12,0X04,0X12,0X02,0X13,0X02,0X12,0X10,0X13,0X04,0X13,0X02,0X12,0X02,0X13,0X04,0X15,0X02,0X16,0X02,0X15,0X0C,0X13,0X02,0X15,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X15,0X02,0X13,0X02,0X15,0X0C,0X15,0X02,0X16,0X02,0X21,0X04,0X21,0X02,0X22,0X02,0X23,0X04,0X22,0X02,0X21,0X02,0X22,0X10,0X23,0X08,0X15,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X13,0X04,0X15,0X10,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X02,0X21,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X02,0X25,0X02,0X23,0X02,0X22,0X0C,0X21,0X02,0X22,0X02,0X23,0X06,0X15,0X02,0X16,0X02,0X21,0X02,0X22,0X02,0X23,0X04,0X23,0X02,0X22,0X02,0X21,0X06,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X02,0X21,0X02,0X15,0X02,0X13,0X02,0X15,0X0C,0X13,0X02,0X15,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X16,0X04,0X16,0X02,0X21,0X02,0X22,0X04,0X22,0X02,0X23,0X02,0X22,0X04,0X22,0X02,0X23,0X02,0X25,0X02,0X26,0X02,0X23,0X02,0X25,0X02,0X22,0X02,0X23,0X02,0X21,0X02,0X16,0X02,0X21,0X10,0XFFUCHARCODEDL/蝶恋0X8C,0X00,/曲速0X8C表示140拍/分0X13,0X04,0X13,0X04,0X13,0X04,0X12,0X04,0X13,0X08,0X12,0X04,0X13,0X04,0X12,0X04,0X12,0X04,0X06,0X08,0X06,0X04,0X07,0X04,0X11,0X08,0X12,0X04,0X11,0X04,0X07,0X08,0X06,0X04,0X05,0X04,0X06,0X10,0X13,0X04,0X13,0X04,0X13,0X04,0X12,0X04,0X13,0X0C,0X16,0X04,0X15,0X04,0X16,0X04,0X15,0X04,0X15,0X04,0X12,0X04,0X12,0X04,0X13,0X04,0X14,0X08,0X15,0X04,0X14,0X04,0X13,0X04,0X12,0X04,0X11,0X04,0X13,0X0F,0X13,0X0C,0X13,0X04,0X16,0X08,0X17,0X04,0X16,0X04,0X15,0X0C,0X13,0X04,0X15,0X0F,0X13,0X04,0X15,0X04,0X12,0X08,0X16,0X04,0X15,0X04,0X13,0X08,0X12,0X04,0X12,0X04,0X13,0X0C,0X12,0X08,0X16,0X04,0X16,0X0C,0X11,0X08,0X16,0X04,0X16,0X08,0X16,0X04,0X17,0X04,0X21,0X08,0X17,0X04,0X16,0X04,0X17,0X08,0X16,0X04,0X17,0X04,0X13,0X08,0X13,0X0C,0X13,0X04,0X16,0X08,0X17,0X08,0X16,0X04,0X15,0X0C,0X13,0X04,0X15,0X10,0X14,0X04,0X15,0X04,0X16,0X08,0X17,0X04,0X16,0X04,0X17,0X08,0X16,0X04,0X17,0X04,0X13,0X10,0X13,0X10,0X12,0X08,0X16,0X04,0X16,0X02,0X16,0X10,0X11,0X04,0X16,0X04,0X16,0X02,0X16,0X08,0X16,0X04,0X17,0X04,0X21,0X08,0X17,0X04,0X16,0X04,0X17,0X08,0X15,0X08,0X16,0X10,0X23,0X04,0X22,0X04,0X22,0X04,0X21,0X04,0X21,0X04,0X17,0X04,0X17,0X04,0X16,0X04,0X21,0X04,0X17,0X04,0X17,0X04,0X16,0X04,0X16,0X04,0X15,0X04,0X15,0X04,0X14,0X04,0X16,0X04,0X15,0X04,0X15,0X04,0X14,0X04,0X14,0X04,0X13,0X04,0X13,0X04,0X12,0X04,0X13,0X10,0X13,0X10,0XFFUCHARCODESRKL/生日快乐0X78,0X00,/曲速1200X15,0X02,0X15,0X02,0X16,0X04,0X15,0X04,0X21,0X04,0X17,0X04,0X00,0X04,0X15,0X02,0X15,0X02,0X16,0X04,0X15,0X04,0X22,0X04,0X21,0X08,0X15,0X02,0X15,0X02,0X25,0X04,0X23,0X04,0X21,0X04,0X17,0X04,0X16,0X08,0X16,0X04,0X00,0X04,0X24,0X02,0X24,0X02,0X23,0X04,0X21,0X04,0X22,0X04,0X21,0X08,0X21,0X08,0X00,0X08,0X15,0X02,0X15,0X02,/第二遍0X16,0X04,0X15,0X04,0X21,0X04,0X17,0X04,0X00,0X04,0X15,0X02,0X15,0X02,0X16,0X04,0X15,0X04,0X22,0X04,0X21,0X08,0X15,0X02,0X15,0X02,0X25,0X04,0X23,0X04,0X21,0X04,0X17,0X04,0X16,0X08,0X16,0X04,0X00,0X04,0X24,0X02,0X24,0X02,0X23,0X04,0X21,0X04,0X22,0X04,0X21,0X08,0X21,0X08,0X00,0X04,0XFFUCHARCODETEST/测试0X78,0X00,/曲速0X78表示120拍/分0X01,0X04,0X02,0X04,0X03,0X04,0X04,0X04,0X05,0X04,0X06,0X04,0X07,0X04,0X00,0X04,0X11,0X08,0X12,0X07,0X13,0X06,0X14,0X05,0X15,0X04,0X16,0X03,0X17,0X02,0X00,0X01,0X21,0X01,0X22,0X02,0X23,0X03,0X24,0X04,0X25,0X05,0X26,0X06,0X27,0X07,0X00,0X08,0XFF,VOIDDELAYMSUINTMS/MS等于1时,延时1MS等于2时,延时2MS,以此类推/UCHARA,B,C/3WHILEMSFORC1C0C/123FORB142B0B/111422285FORA2A0A/142122710VOIDDELAYUINTPAI/PAI是节拍PAI若定义成UCHAR类型,当节拍0X0C时,会造成数据溢出,产生失真。/UCHARA,B,CWHILEPAI/延迟PAI个625MSFORC1C0C/123FORB28B0B/1128257FORA110A0A/28111026188UCHARKEY_X/P1口高位接纵坐标(P17P14)低位接横坐标P13P10/UCHARIP10X0F/有按键按下后对应按键的横坐标电位被拉低(注意低电位引脚不能被高电位引脚抬高,只能是低电位拉低高电位)/IFP1_00DELAYMS5/延时5MS去抖动IFP1_00I1ELSEIFP1_10DELAYMS5IFP1_10I2ELSEIFP1_20DELAYMS5IFP1_20I3ELSEIFP1_30DELAYMS5IFP1_30I4ELSEI0RETURNI/0表示按键未按下UCHARKEY_YUCHARJP10XF0IFP1_40DELAYMS5IFP1_40J1ELSEIFP1_50DELAYMS5IFP1_50J2ELSEIFP1_60DELAYMS5IFP1_60J3ELSEIFP1_70DELAYMS5IFP1_70J4ELSEJ0RETURNJVOIDKEY_CHECK/检查矩阵按键坐标、播放键的状态及播放键状态设置/XKEY_XYKEY_YIFKEY_PLAY0KEY_PLAY0/保持播放键引脚低电平,让其作为歌曲正在播放的标志/ELSEKEY_PLAY1/保持播放键引脚高电平,让其作为歌曲未播放的标志/VOIDDISPLAY/数码管显示相应的音调/IFKEY_PLAY1/按键弹奏时IFX0/低音47ELSEIFX2P0NUM7Y/中音14ELSEIFX3P0NUM11Y/中音57和高音1ELSEIFX4P0NUM15Y/高音25ELSEP00X00ELSE/播放音乐时IFYINDIAO_H0/YINDIAO变量的高四位表示低(0)中(1)高(2)音/P0NUMYINDIAO_L/YINDIAO变量的低四位表示“调”,数码管显示当前音调/ELSEIFYINDIAO_H1/中音P0NUMYINDIAO_L7ELSEIFYINDIAO_H2/高音P0NUMYINDIAO_L14VOIDSPEAK/按键,为定时器0T0赋计数初值,让T0函数驱动蜂鸣器发出对应的音调/IFX1F_HCHUZHI2Y6/低音47F_LCHUZHI2Y61ELSEIFX2F_HCHUZHI16Y2/中音14F_LCHUZHI16Y21ELSEIFX3IFY0/最小减到0FLASHP2LED_TABLEFLASHELSEIFKEY_PLAY0/播放歌曲时IFOUT1P2LED_TABLEFLASHUCHARCHOOSE/播放状态下选歌UCHARI0/第I首歌初值0表示未选歌UCHARJXKEY_XYKEY_YIFX1/选第一首ELSEIFX1/选第二首ELSEIFX1ELSEIFX1ELSEIFX2ELSEIFX4ELSEIFX4ELSEIFX4ELSEIFX4/用作停止播放IFISONG_IDWHICH2/选同一首歌时,重播这首歌ELSEIFIALLSONGELSEIFI0/I等于初值说明未按键ISONG_ID/不按键选歌时,返回原歌曲的序号/RETURNIVOIDPLAY/播放歌曲UINTQUSU/歌曲播放速度(拍/分)UINTPAI2/PAI22400/QUSUJIEPAI送到DELAY()函数/WHILE1WHILE1CHOOSE_IDTEMP_IDCHOOSE/选歌/暂停/IFTEMP_ID14/如果按下暂停键DELAYMS500/延时500MSWHILE1TEMP_IDCHOOSE2/CHOOSE2按下就起作用不必等到放开按键才起作用/IFTEMP_ID14/再次按下“暂停键”表示继续播放/BREAKELSEIFTEMP_ID16/按下停止键,功能表现为暂停播放时也能停止播放,回到播放前状态/SONG_ID16BREAKELSEIFTEMP_ID13/上一首WHICH2IFSONG_ID1SONG_IDALLSONG/播放最后一首ELSESONG_IDBREAKELSEIFTEMP_ID15/下一首WHICH2IFSONG_IDALLSONGSONG_ID1/播放第一首ELSESONG_IDBREAKELSEIFTEMP_IDSONG_ID/从歌曲的第一个音播放0,1用来存曲速了故从2开始/SONG_IDTEMP_IDBREAKELSEIFSAME1BREAKSAME0/跳出循环后需重置为0/暂停/ELSEIFTEMP_ID13/上一首WHICH2IFSONG_ID1SONG_IDALLSONG/播放最后一首ELSESONG_IDELSEIFTEMP_ID15/下一首WHICH2IFSONG_IDALLSONGSONG_ID1/播放第一首ELSESONG_IDELSEIFTEMP_ID16SONG_ID16ELSEIFTEMP_IDSONG_ID/从歌曲的第一个音播放SONG_IDTEMP_ID/NOCHOOSE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论