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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于51单片机的音乐游戏.docx

1、基于51单片机的音乐游戏基于51单片机的音乐游戏一、课程设计内容利用89c52单片机设计一款音乐游戏。游戏说明:游戏基于单片机开发箱实现。游戏开始时,会播放一首音乐,同时每隔一个音符,LED点阵中会从最上方下落一个小点。玩家需要根据音乐的节奏,在小点下降到LED点阵的底部时,按下对应的按键。其中,矩阵键盘第一行从左到右的四个键分别对应LED点阵的1、3、5、7列。根据每个按键按下的时间,会有不同的得分,通过LED模块的D1-D5亮起来代表获得1-5分。如果没有LED灯亮则代表得0分。当整首歌播放完后,会在LED点阵上显示整首歌的得分,得分为0-99分。二、设计思路和方案选择在决定制作音乐游戏后

2、,利用开发箱的哪几个模块来制作也是需要考虑的一个问题,最终我们决定利用现在的这个方案。其主要原因是LED点阵和蜂鸣器是游戏中的主体部分,因此无可替代。独立键盘还是矩阵键盘的选择上,经过试验发现独立键盘由于离LED点阵较远,在实际游戏中经常会有反应不过来的情况。而矩阵键盘就在点阵的正下方,因此在操作上较为方便,所以选择了矩阵键盘。而游戏得分的显示,最初是想利用数码管来实现,后来发现数码管和LED点阵都用到了单片机的P0口。在LED点阵无法被取代的情况下,只能退而求其次,选择用LED模块显示得分。程序的具体设计思路如下:1. 实现音乐的播放效果 2. 实现LED点阵的显示下落效果3. 实现音乐的节

3、奏和LED点的下落同步4. 实现按键得分功能5. 实现显示得分效果三、硬件设计本游戏的实现基于单片机开发试验仪,其主要用到的硬件电路有 89C52CPU模块,LED点阵模块,74HC595模块,LED模块,矩阵键盘模块和蜂鸣器模块。四、软件框图及设计程序流程图:C语言程序:#include #include #define COMMONPORTS P0 /定义输出端口 sbit BeepIO=P15; /定义输出管脚sbit SRCLK=P36;sbit RCLK1=P35;sbit SER=P34;sbit k1=P13; /定义按键sbit k2=P12;sbit k3=P11;sbit

4、k4=P10;sbit button=P17;unsigned char code music_tab= 33,16,4,33,8,2,34,8,2,39,16,4,26,8,2,29,8,2,33,8,2,33,8,2,33,8,2,34,8,2,39,16,4,29,8,2,33,8,2,34,16,4,34,8,2,33,8,2,26,16,4,34,8,2,33,8,2,34,16,4,11,8,2,26,8,2,29,16,4,26,8,2,29,8,2,33,16,4,33,8,2,34,8,2,39,16,4,44,8,2,49,8,2,104,8,2,104,8,2,33,8,

5、2,34,8,2,39,16,4,29,8,2,33,8,2,34,8,2,33,8,2,34,8,2,104,8,2,104,16,4,29,8,2,33,8,2,34,8,2,33,8,2,34,8,2,117,8,2,117,16,4,104,8,2,49,8,2,104,26,4,117,8,2,132,8,2,117,8,2,104,8,2,49,8,2,104,26,4,104,8,2,49,8,2,39,8,2,39,8,2,26,8,2,44,26,4,44,8,2,39,8,2,26,8,2,26,8,2,33,8,2,29,26,4,33,4,1,34,4,1,34,8,2

6、,39,8,2,104,8,2,49,8,2,104,26,4,117,8,2,132,8,2,117,8,2,104,8,2,49,8,2,104,26,4,104,8,2,49,8,2,39,8,2,39,8,2,26,8,2,44,26,4,44,8,2,39,8,2,39,8,2,104,8,2,49,8,2,104,76,4,44,8,2,44,8,2,44,8,2,49,8,2,49,8,2,44,8,2,39,8,2,39,16,4,33,8,2,26,5,5,26,8,2,29,8,2,33,8,2,34,8,2,33,4,1,34,5,0,34,8,2,33,4,1,34,5

7、,0,34,26,4,33,8,2,34,8,2,33,8,2,34,8,2,117,8,2,117,16,4,104,8,2,49,8,2,104,26,4,117,8,2,132,8,2,117,8,2,104,8,2,49,8,2,104,26,4,104,4,1,49,5,0,49,8,2,39,8,2,39,8,2,26,8,2,44,26,4,44,8,2,39,8,2,26,8,2,26,8,2,33,8,2,29,26,4,33,4,1,34,4,1,34,8,2,39,8,2,104,8,2,49,8,2,104,26,4,117,8,2,132,8,2,117,8,2,10

8、4,8,2,49,8,2,104,26,4,104,8,2,49,8,2,39,8,2,39,8,2,26,8,2,44,26,4,44,8,2,39,8,2,39,8,2,104,8,2,49,8,2,104,76,4,34,16,4,34,8,2,44,8,2,39,10,0,26,8,2,26,16,4,34,26,4,29,16,4,33,16,4,26,76,4,0,0,0; /歌曲格式为音调,发音长度,不发音长度,.,0,0,0 unsigned char code P0TAB8 = 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe; /分别为选中点阵

9、1-8列unsigned char code DIG_CODE104=0xf8,0x88,0xf8,0x00, /00x00,0x00,0xf8,0x00, /10xb8,0xa8,0xe8,0x00, /20xa8,0xa8,0xf8,0x00, /30xe0,0x20,0xf8,0x00, /40xe8,0xa8,0xb8,0x00, /50xf8,0xa8,0xb8,0x00, /60x80,0x80,0xf8,0x00, /70xf8,0xa8,0xf8,0x00, /80xe8,0xa8,0xf8,0x00, /9; unsigned int Sound_Temp_TH0,Sound

10、_Temp_TL0; /音符定时器初值暂存 unsigned int Sound_Temp_TH1,Sound_Temp_TL1; /音长定时器初值暂存void InitialSound(void);void Hc595SendByte(unsigned char dat);void Delay(unsigned int n);void Play(unsigned char *Sound);void ShowScore(unsigned int sum);unsigned int sum;void InitialSound(void) button = 0; BeepIO = 0; TMOD

11、|= 0x11; Sound_Temp_TH1 = (65535-30000)/256; /计算TL1应装入的初值 Sound_Temp_TL1 = (65535-30000)%256; /计算TH1应装入的初值 ET0= 1; ET1= 0; TR0= 0; TR1= 0; EA= 1;void ShowScore(unsigned int sum) /显示得分 unsigned int tab,n; while(1) for(tab=0;tab8;tab+) Hc595SendByte(0x00); /消隐 COMMONPORTS = P0TABtab; /输出字码 if(tab0;n-)

12、 for(b=1;b0;b-) for(a=22;a0;a-); void BeepTimer0(void) interrupt 1 /音符发生中断 BeepIO = !BeepIO; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;void Hc595SendByte(unsigned char dat) /向74H595发送一个字节的数据 unsigned char a; SRCLK=0; RCLK1=0; for(a=0;a7; dat=1; SRCLK=1; _nop_(); _nop_(); SRCLK=0; RCLK1=1; _nop_();

13、_nop_(); RCLK1=0;void Play(unsigned char *Sound) /演奏子程序 unsigned int HC595TAB8 = 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; unsigned char i; unsigned int tab,j,k,Point_led,Point_sound,LDiv,LDiv1,LDiv2,LDiv16,LDiv16_temp,CurrentFre,LDiv1_sound,LDiv2_sound,LDiv1_temp,CurrentFre_sound,Fre_Temp,Temp_T,Sou

14、ndLength,score,count; unsigned int temp4; SoundLength = 0; LDiv16=5; /16分音符的长度 while(SoundSoundLength != 0x00) /计算歌曲总长度 SoundLength+=3; LDiv1_temp=0; LDiv16_temp=0; Point_led=0; Point_sound=0; TR0=0; TR1=1; score=0; sum=0; j=1; while(Point_sound CurrentFre) /频率比上个音符大,LED显示的点右移两行,比上个音符小则左移两行,移到最左或最右循

15、环 if(k=0) k=6; else k=k-2; else if (Fre_Temp0;i-) /间隔规定长度显示下一个led灯 LDiv16_temp+; count+; if(j!=1) /判断得分 if(tempj/2!=0) if(count=1) score=5;P2=239; else if(count=2)score=4;P2=247; else if(count=3)score=3;P2=251; else if(count=4)score=2;P2=253; else if(count=5)score=1;P2=254; elsescore=0;P2=255; sum=s

16、um+score; j=1; if(LDiv16_temp=LDiv16) /每隔1个16分音符的时间 for(tab=0;tab=1; /led灯下降1格 if(HC595TABtab&1 = 1) /判断led灯是否下降到底部 CurrentFre_sound = SoundPoint_sound; LDiv1_sound = SoundPoint_sound+1; LDiv2_sound = SoundPoint_sound+2; LDiv1_temp=0; Temp_T = 65536-(5000/CurrentFre_sound)*10; /计算计数器初值 Sound_Temp_TH

17、0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; TR0=1; temp0=temp1=temp2=temp3=0; count=0; P2=255; j=tab; Point_sound+=3; /发下一个音 if(SoundPoint_sound=0) i=LDiv1_sound+LDiv2_sound; LDiv16_temp=0; while(TF1=0) for(tab=0;tab8;tab+) Hc595SendByte(0x00); /消隐 C

18、OMMONPORTS = P0TABtab; /输出字码 Hc595SendByte(HC595TABtab); Delay(1); if(k1=0) temp0=1; /判断按键是否按下 else if(k2=0) temp1=1; else if(k3=0) temp2=1; else if(k4=0) temp3=1; TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; LDiv1_temp+; if (LDiv1_temp=LDiv1_sound) TR0=0; if(SoundPoint_led!=0) Point_led+=3; /

19、显示下个led灯P2=255; /最后一个音结束熄灭led灯main() InitialSound(); Play(music_tab); ShowScore(sum/9);五、实物照片及调试结果游戏时照片:结束显示分数照片:六、心得体会这次单片机的课程设计,也是我们第一次自己完成一个由自己构思并实现的作品。在选择方案的时候,我们首先决定的是自己编写一款游戏。在听完老师讲解蜂鸣器播放音乐和LED点阵的原理后,我想到了以前玩过的一款名为节奏大师的音乐游戏,我发现利用LED点阵和蜂鸣器结合,完全可以在单片机上实现它的主要框架。再配合按键的功能,就能用单片机来玩这一简易的音乐游戏了。于是,我们便初步

20、决定了这个题目。然而,在制作的过程中,我们遇到了许多事先没有料想到的困难。比如LED显示点的出现和对应的音符的不同步,按键的不同得分判定难以实现,用于显示分数的数码管和LED点阵共用了一个端口等等。这些困难都给我们编写程序造成了很大的困扰,甚至令我们一度想要放弃。但在我们的努力下,最终还是一个个解决了这些困难,实现了我们原本的构想。这也让我体会到实践才是检验问题最好的办法。通过这次课程设计,我也对单片机的软件、硬件有了进一步的认识。完成这一课程设计,需要能熟练地运用51单片机的C语言编程,以及单片机内部的定时器、中断等功能,也需要对LED、按键、蜂鸣器、数码管等的原理进行一定的了解。更重要的是

21、,能够将这两者结合,才能让各个模块都能受我们控制,达到我们想要的效果。这一次的实验作品的完成,让我们充分体会到了学习是一个循序渐进的过程。在课程开始之初,我们对于单片机一无所知,老师给与我们的开发箱也只不过是一个上课依葫芦画瓢,展现一下黑板上程序的工具。然而随着课程的深入,我们可以不断的运用课本上新学到的知识已经实验之中运用过的程序和结构,来实现更多的功能以及想法。直到最后,我们在开发箱上,依靠着这门课程给予我们的知识和技巧,完成了一个简易的音乐游戏。虽然游戏非常的简单,但是能够设计出这样一个游戏是我们在开始完全没有预想到的。通过这门课程,我们第一次实际感受到了知识是如何运用于实际的。在别的课

22、程之中考核基本都是通过书面的考试,而这一次是让我们自己在开发箱上创造自己的作品,让我们受益匪浅。我们不仅仅需要用这一门课程上的知识,许多之前学过的知识也再一次被我们从课本中找了回来,运用于其中。在这一次的期末作业考核之中,我们真正认识到了之前学过的许多知识的作用,例如微机原理、C语言等等,这些东西不再是课本上的知识,而变成了我们的一种能力,这是我们在开发箱创造作品的过程之中最大的收获。另外,通过这次的作品,让我感受到了团队协作的真谛。团队成员通过配合来扬长避短,两个人的知识和想法融合在一起,来更好地完成这次考核。我们的作品也从最初的一直空白,变成了一个简易但是很完整的音乐游戏。我们都从这次的创作中受益匪浅。

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

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