基于51单片机的音乐游戏_第1页
基于51单片机的音乐游戏_第2页
基于51单片机的音乐游戏_第3页
基于51单片机的音乐游戏_第4页
基于51单片机的音乐游戏_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、一、课程设计内容利用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. 实现音乐的节奏和LED点的下落同步4. 实现按键得分功能5.

3、实现显示得分效果三、硬件设计本游戏的实现基于单片机开发试验仪,其主要用到的硬件电路有 89C52CPU模块,LED点阵模块,74HC595模块,LED模块,矩阵键盘模块和蜂鸣器模块。四、软件框图及设计程序流程图:开始LED与SOUND指针指向第一个音符在顶部显示音符对应的LED灯按键是否按下计算并显示上个音符的得分显示时间达到一个16分音符LED灯下降一行有LED灯下降到底部发下一个音SOUND指针指向下个音符定时器1延时30msLED灯显示时间达到规定长度LED指针指向下个音符计算并显示整首歌的得分LED指针指向结束符号结束是否否是否是否否是是C语言程序:#include <REG52

4、.H> #include <INTRINS.H>#define COMMONPORTSP0/定义输出端口 sbit BeepIO=P15;/定义输出管脚sbit SRCLK=P36;sbit RCLK1=P35;sbit SER=P34;sbit k1=P13;/定义按键sbit k2=P12;sbit k3=P11;sbit 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,3

5、9,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,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

6、,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,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

7、,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,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,

8、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,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,34,16,4,34,8,2,

9、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,0unsigned char code P0TAB8 = 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/分别为选中点阵1-8列unsigned char code DIG_CODE104=0xf8,0x88,0xf8,0x00, /00x00,0x00,0xf8,0x00, /10xb8,0xa8,0xe8,0x00, /20xa8,0xa8,0xf8,0x00, /30x

10、e0,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_Temp_TL0;/音符定时器初值暂存 unsigned int Sound_Temp_TH1,Sound_Temp_TL1;/音长定时器初值暂存void InitialSound(void);void Hc595SendByte(unsigned char

11、 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 |= 0x11;Sound_Temp_TH1 = (65535-30000)/256;/计算TL1应装入的初值Sound_Temp_TL1 = (65535-30000)%256;/计算TH1应装入的初值 ET0= 1;ET1= 0;TR0= 0;TR1= 0;EA=

12、1;void ShowScore(unsigned int sum) /显示得分unsigned int tab,n;while(1)for(tab=0;tab<8;tab+)Hc595SendByte(0x00);/消隐COMMONPORTS= P0TABtab;/输出字码if(tab<4)n=sum/10;Hc595SendByte(DIG_CODEntab);elsen=sum%10;Hc595SendByte(DIG_CODEntab-4);Delay(1);void Delay(unsigned int n) /延时50usunsigned char a,b;for(;n

13、>0;n-) for(b=1;b>0;b-) for(a=22;a>0;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;a<8;a+)SER=dat>>7;dat<<=1;SRCLK=1;_nop_(

14、);_nop_();SRCLK=0;RCLK1=1;_nop_();_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,Current

15、Fre_sound,Fre_Temp,Temp_T,SoundLength,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 < SoundLength)/一个音符一个音符的来CurrentFre =

16、SoundPoint_led;LDiv1 = SoundPoint_led+1;LDiv1_sound = SoundPoint_sound+1; /发音长度 LDiv2 = SoundPoint_led+2;if(SoundPoint_led!=0) LDiv=LDiv1+LDiv2;/两个LED灯之间的间隔长度elseLDiv=5;if (Point_led!=0)if (Fre_Temp>CurrentFre)/频率比上个音符大,LED显示的点右移两行,比上个音符小则左移两行,移到最左或最右循环if(k=0)k=6;elsek=k-2;else if (Fre_Temp<Cu

17、rrentFre)if(k=6)k=0;elsek=k+2;Fre_Temp= CurrentFre;if(SoundPoint_led!=0)HC595TABk|=0x80;/显示led灯在最上方for(i=LDiv;i>0;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;P

18、2=253;else if(count=5)score=1;P2=254;elsescore=0;P2=255;sum=sum+score;j=1;if(LDiv16_temp=LDiv16) /每隔1个16分音符的时间for(tab=0;tab<8;tab+)HC595TABtab>>=1;/led灯下降1格if(HC595TABtab&1 = 1)/判断led灯是否下降到底部CurrentFre_sound = SoundPoint_sound;LDiv1_sound = SoundPoint_sound+1;LDiv2_sound = SoundPoint_so

19、und+2; LDiv1_temp=0;Temp_T = 65536-(5000/CurrentFre_sound)*10; /计算计数器初值Sound_Temp_TH0 = 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;

20、LDiv16_temp=0;while(TF1=0)for(tab=0;tab<8;tab+)Hc595SendByte(0x00);/消隐COMMONPORTS= 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

21、_temp=LDiv1_sound)TR0=0; if(SoundPoint_led!=0)Point_led+=3; /显示下个led灯P2=255;/最后一个音结束熄灭led灯main()InitialSound();Play(music_tab);ShowScore(sum/9);五、实物照片及调试结果游戏时照片:结束显示分数照片:六、心得体会这次单片机的课程设计,也是我们第一次自己完成一个由自己构思并实现的作品。在选择方案的时候,我们首先决定的是自己编写一款游戏。在听完老师讲解蜂鸣器播放音乐和LED点阵的原理后,我想到了以前玩过的一款名为节奏大师的音乐游戏,我发现利用LED点阵和蜂鸣器结合,完全可以在单片机上实现它的主要框架。再配合按键的功能,就能用单片机来玩这一简易的音乐游戏了。于是,我们便初步决定了这个题目。然而,在制作的过程中,我们遇到了许多事先没有料想到的困难。比如LED显示点的出现和对应的音符的不同步,按键的不同得分判定难以实现,用于显示分数的数码管和LED点阵共用了一个端口等等。这些困难都给我们编写程序造成了很大的困扰,甚至令我们一度想要放弃。但在我们的努力下,最终还是一个个解决了这些困难,实现了我们原本的构想。这也让我体会到实践才是检验问

温馨提示

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

评论

0/150

提交评论