久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4541|回復: 2
打印 上一主題 下一主題
收起左側

51單片機音樂游戲設計與制作 附程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:432777 發表于 2018-11-25 11:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、課程設計內容
利用89c52單片機設計一款音樂游戲。
游戲說明:游戲基于單片機開發箱實現。游戲開始時,會播放一首音樂,同時每隔一個音符,LED點陣中會從最上方下落一個小點。玩家需要根據音樂的節奏,在小點下降到LED點陣的底部時,按下對應的按鍵。其中,矩陣鍵盤第一行從左到右的四個鍵分別對應LED點陣的1、3、5、7列。根據每個按鍵按下的時間,會有不同的得分,通過LED模塊的D1-D5亮起來代表獲得1-5分。如果沒有LED燈亮則代表得0分。當整首歌播放完后,會在LED點陣上顯示整首歌的得分,得分為0-99分。

二、設計思路和方案選擇
在決定制作音樂游戲后,利用開發箱的哪幾個模塊來制作也是需要考慮的一個問題,最終我們決定利用現在的這個方案。其主要原因是LED點陣和蜂鳴器是游戲中的主體部分,因此無可替代。獨立鍵盤還是矩陣鍵盤的選擇上,經過試驗發現獨立鍵盤由于離LED點陣較遠,在實際游戲中經常會有反應不過來的情況。而矩陣鍵盤就在點陣的正下方,因此在操作上較為方便,所以選擇了矩陣鍵盤。而游戲得分的顯示,最初是想利用數碼管來實現,后來發現數碼管和LED點陣都用到了單片機的P0口。在LED點陣無法被取代的情況下,只能退而求其次,選擇用LED模塊顯示得分。
程序的具體設計思路如下:
  • 實現音樂的播放效果            
  • 實現LED點陣的顯示下落效果
  • 實現音樂的節奏和LED點的下落同步
  • 實現按鍵得分功能
  • 實現顯示得分效果

三、硬件設計
本游戲的實現基于單片機開發試驗儀,其主要用到的硬件電路有
89C52CPU模塊,LED點陣模塊,74HC595模塊,LED模塊,矩陣鍵盤模塊和蜂鳴器模塊。
四、軟件框圖及設計

程序流程圖:



五、實物照片及調試結果
游戲時照片:
結束顯示分數照片:

六、心得體會
這次單片機的課程設計,也是我們第一次自己完成一個由自己構思并實現的作品。在選擇方案的時候,我們首先決定的是自己編寫一款游戲。在聽完老師講解蜂鳴器播放音樂和LED點陣的原理后,我想到了以前玩過的一款名為節奏大師的音樂游戲,我發現利用LED點陣和蜂鳴器結合,完全可以在單片機上實現它的主要框架。再配合按鍵的功能,就能用單片機來玩這一簡易的音樂游戲了。于是,我們便初步決定了這個題目。
然而,在制作的過程中,我們遇到了許多事先沒有料想到的困難。比如LED顯示點的出現和對應的音符的不同步,按鍵的不同得分判定難以實現,用于顯示分數的數碼管和LED點陣共用了一個端口等等。這些困難都給我們編寫程序造成了很大的困擾,甚至令我們一度想要放棄。但在我們的努力下,最終還是一個個解決了這些困難,實現了我們原本的構想。這也讓我體會到實踐才是檢驗問題最好的辦法。
通過這次課程設計,我也對單片機的軟件、硬件有了進一步的認識。完成這一課程設計,需要能熟練地運用51單片機的C語言編程,以及單片機內部的定時器、中斷等功能,也需要對LED、按鍵、蜂鳴器、數碼管等的原理進行一定的了解。更重要的是,能夠將這兩者結合,才能讓各個模塊都能受我們控制,達到我們想要的效果。


這一次的實驗作品的完成,讓我們充分體會到了學習是一個循序漸進的過程。在課程開始之初,我們對于單片機一無所知,老師給與我們的開發箱也只不過是一個上課依葫蘆畫瓢,展現一下黑板上程序的工具。然而隨著課程的深入,我們可以不斷的運用課本上新學到的知識已經實驗之中運用過的程序和結構,來實現更多的功能以及想法。直到最后,我們在開發箱上,依靠著這門課程給予我們的知識和技巧,完成了一個簡易的音樂游戲。雖然游戲非常的簡單,但是能夠設計出這樣一個游戲是我們在開始完全沒有預想到的。
通過這門課程,我們第一次實際感受到了知識是如何運用于實際的。在別的課程之中考核基本都是通過書面的考試,而這一次是讓我們自己在開發箱上創造自己的作品,讓我們受益匪淺。我們不僅僅需要用這一門課程上的知識,許多之前學過的知識也再一次被我們從課本中找了回來,運用于其中。在這一次的期末作業考核之中,我們真正認識到了之前學過的許多知識的作用,例如微機原理、C語言等等,這些東西不再是課本上的知識,而變成了我們的一種能力,這是我們在開發箱創造作品的過程之中最大的收獲。
另外,通過這次的作品,讓我感受到了團隊協作的真諦。團隊成員通過配合來揚長避短,兩個人的知識和想法融合在一起,來更好地完成這次考核。我們的作品也從最初的一直空白,變成了一個簡易但是很完整的音樂游戲。我們都從這次的創作中受益匪淺。

單片機源程序如下:
  1. #include <REG52.H>   
  2. #include <INTRINS.H>
  3. #define COMMONPORTS              P0              //定義輸出端口                 
  4. sbit BeepIO=P1^5;                            //定義輸出管腳
  5. sbit SRCLK=P3^6;
  6. sbit RCLK1=P3^5;
  7. sbit SER=P3^4;
  8. sbit k1=P1^3;                                          //定義按鍵
  9. sbit k2=P1^2;
  10. sbit k3=P1^1;
  11. sbit k4=P1^0;
  12. sbit button=P1^7;

  13. unsigned char code music_tab[]={
  14. 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,
  15. 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,
  16. 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,
  17. 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,
  18. 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,
  19. 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,
  20. 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,
  21. 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,
  22. 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,
  23. 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,
  24. 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,
  25. 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,
  26. 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,
  27. 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,
  28. 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,
  29. 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,
  30. 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,
  31. 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,
  32. 39,10,0,26,8,2,26,16,4,34,26,4,29,16,4,33,16,4,26,76,4,0,0,0
  33. };              //歌曲格式為{音調,發音長度,不發音長度,...,0,0,0}                                                                     
  34. unsigned char code P0TAB[8]  =
  35. {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};              //分別為選中點陣1-8列
  36. unsigned char code DIG_CODE[10][4]=
  37. {
  38. {0xf8,0x88,0xf8,0x00}, //0
  39. {0x00,0x00,0xf8,0x00}, //1
  40. {0xb8,0xa8,0xe8,0x00}, //2
  41. {0xa8,0xa8,0xf8,0x00}, //3
  42. {0xe0,0x20,0xf8,0x00}, //4
  43. {0xe8,0xa8,0xb8,0x00}, //5
  44. {0xf8,0xa8,0xb8,0x00}, //6
  45. {0x80,0x80,0xf8,0x00}, //7
  46. {0xf8,0xa8,0xf8,0x00}, //8
  47. {0xe8,0xa8,0xf8,0x00}, //9
  48. };                                         
  49. unsigned int Sound_Temp_TH0,Sound_Temp_TL0;              //音符定時器初值暫存
  50. unsigned int Sound_Temp_TH1,Sound_Temp_TL1;              //音長定時器初值暫存
  51. void InitialSound(void);
  52. void Hc595SendByte(unsigned char dat);
  53. void Delay(unsigned int n);
  54. void Play(unsigned char *Sound);
  55. void ShowScore(unsigned int sum);
  56. unsigned int sum;

  57. void InitialSound(void)
  58. {
  59.               button = 0;
  60.               BeepIO = 0;
  61.               TMOD  |= 0x11;
  62.               Sound_Temp_TH1 = (65535-30000)/256;              //計算TL1應裝入的初值
  63.               Sound_Temp_TL1 = (65535-30000)%256;              //計算TH1應裝入的初值
  64.               ET0= 1;
  65.               ET1= 0;
  66.               TR0= 0;
  67.               TR1= 0;
  68.               EA= 1;
  69. }

  70. void ShowScore(unsigned int sum)               //顯示得分
  71. {
  72.               unsigned int tab,n;
  73.               while(1)
  74.               {
  75.                             for(tab=0;tab<8;tab++)
  76.                             {
  77.                             Hc595SendByte(0x00);              //消隱                                                      
  78.                             COMMONPORTS              = P0TAB[tab];              //輸出字碼
  79.                             if(tab<4)
  80.                             {
  81.                                           n=sum/10;            
  82.                                           Hc595SendByte(DIG_CODE[n][tab]);
  83.                             }
  84.                             else
  85.                             {
  86.                                           n=sum%10;
  87.                                           Hc595SendByte(DIG_CODE[n][tab-4]);
  88.                             }            
  89.                             Delay(1);                           
  90.                             }
  91. }
  92. }

  93. void Delay(unsigned int n)   //延時50us
  94. {
  95.               unsigned char a,b;
  96.               for(;n>0;n--)
  97.               {
  98.                                 for(b=1;b>0;b--)
  99.                                    for(a=22;a>0;a--);
  100.               }
  101. }

  102. void BeepTimer0(void) interrupt 1              //音符發生中斷
  103. {
  104.               BeepIO = !BeepIO;
  105.               TH0    = Sound_Temp_TH0;
  106.               TL0    = Sound_Temp_TL0;
  107. }

  108. void Hc595SendByte(unsigned char dat)     //向74H595發送一個字節的數據
  109. {
  110.               unsigned char a;
  111.               SRCLK=0;
  112.               RCLK1=0;
  113.               for(a=0;a<8;a++)
  114.               {
  115.                             SER=dat>>7;
  116.                             dat<<=1;
  117.                             SRCLK=1;
  118.                             _nop_();
  119.                             _nop_();
  120.                             SRCLK=0;            
  121.               }
  122.               RCLK1=1;
  123.               _nop_();
  124.               _nop_();
  125.               RCLK1=0;
  126. }

  127. void Play(unsigned char *Sound)                            //演奏子程序
  128. {
  129.               unsigned int HC595TAB[8]  = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  130.               unsigned char i;
  131.               unsigned int tab,j,k,Point_led,Point_sound,LDiv,LDiv1,LDiv2,LDiv16,
  132. LDiv16_temp,CurrentFre,LDiv1_sound,LDiv2_sound,LDiv1_temp,
  133. CurrentFre_sound,Fre_Temp,Temp_T,SoundLength,score,count;
  134.               unsigned int temp[4];                                                                                                               
  135.               SoundLength = 0;
  136.               LDiv16=5;                                                        //16分音符的長度            
  137.               while(Sound[SoundLength] != 0x00)              //計算歌曲總長度
  138.               {
  139.                             SoundLength+=3;
  140.               }
  141.               LDiv1_temp=0;
  142.               LDiv16_temp=0;
  143.               Point_led=0;
  144.               Point_sound=0;            
  145.               TR0=0;
  146.               TR1=1;
  147.               score=0;
  148.               sum=0;
  149.               j=1;
  150.               while(Point_sound < SoundLength)              //一個音符一個音符的來
  151.               {
  152.               CurrentFre  = Sound[Point_led];            
  153.               LDiv1 = Sound[Point_led+1];                           
  154.               LDiv1_sound = Sound[Point_sound+1]; //發音長度                                          
  155.               LDiv2 = Sound[Point_led+2];
  156.               if(Sound[Point_led]!=0)                              
  157.                             LDiv=LDiv1+LDiv2;              //兩個LED燈之間的間隔長度
  158.               else
  159.                             LDiv=5;
  160.               if (Point_led!=0)
  161.               {
  162. if (Fre_Temp>CurrentFre)              //頻率比上個音符大,LED顯示的點右移兩行,比上個音符小則左移兩行,移到最左或最右循環
  163.               {
  164.                             if(k==0)              k=6;
  165.                             else              k=k-2;
  166.               }
  167.               else if (Fre_Temp<CurrentFre)
  168.               {
  169.                             if(k==6)              k=0;
  170.                             else              k=k+2;
  171.                             }
  172.               }
  173.               Fre_Temp= CurrentFre;
  174.               if(Sound[Point_led]!=0)
  175.               HC595TAB[k]|=0x80;                            //顯示led燈在最上方
  176.               for(i=LDiv;i>0;i--)               //間隔規定長度顯示下一個led燈
  177.               {
  178.                             LDiv16_temp++;
  179.                             count++;                                                      
  180.                             if(j!=1)                                                        //判斷得分
  181.                             {                                         
  182.                             if(temp[j/2]!=0)
  183.                             {
  184.                             if(count==1){              score=5;P2=239;}
  185.                             else if(count==2){score=4;P2=247;}
  186.                             else if(count==3){score=3;P2=251;}
  187.                             else if(count==4){score=2;P2=253;}
  188.                             else if(count==5){score=1;P2=254;}
  189.                             else{score=0;P2=255;}
  190.                             sum=sum+score;
  191.                             j=1;
  192.                             }
  193.               }                           
  194.               if(LDiv16_temp==LDiv16) //每隔1個16分音符的時間
  195.               {            
  196.               for(tab=0;tab<8;tab++)                           
  197.               {
  198.                             HC595TAB[tab]>>=1;              //led燈下降1格            
  199.                             if(HC595TAB[tab]&1 == 1)              //判斷led燈是否下降到底部            
  200.                             {                                                                                                
  201.                             CurrentFre_sound  = Sound[Point_sound];            
  202.                             LDiv1_sound = Sound[Point_sound+1];
  203.                             LDiv2_sound = Sound[Point_sound+2];
  204.                             LDiv1_temp=0;                                                                                                                                          
  205. Temp_T = 65536-(5000/CurrentFre_sound)*10; //計算計數器初值
  206.                             Sound_Temp_TH0 = Temp_T/256;
  207.                                           Sound_Temp_TL0 = Temp_T%256;
  208.                                           TH0 = Sound_Temp_TH0;
  209.                                           TL0 = Sound_Temp_TL0 + 12;
  210.                                           TR0=1;
  211.                                           temp[0]=temp[1]=temp[2]=temp[3]=0;
  212.                                           count=0;
  213.                                           P2=255;
  214.                                           j=tab;
  215.                                           Point_sound+=3;              //發下一個音
  216.                                           if(Sound[Point_sound]==0)
  217.                                           i=LDiv1_sound+LDiv2_sound;            
  218.                                           }                                                                                      
  219.                             }
  220.                             LDiv16_temp=0;
  221.               }                           
  222.               while(TF1==0)                                                                                                                             
  223.               {                                                      
  224. ……………………

  225. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
基于51單片機的音樂游戲.docx (459.93 KB, 下載次數: 47)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:543985 發表于 2019-5-21 17:07 來自手機 | 只看該作者
小白,有的部分看不懂,希望博主能回下,可以有償解釋
回復

使用道具 舉報

板凳
ID:1148086 發表于 2025-4-16 15:27 | 只看該作者
我想要源碼呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区精品 | 精品美女久久久 | 一区二区三区av | 91视频在线观看免费 | 亚洲天堂av网 | 久久精品中文字幕 | 少妇性l交大片免费一 | 国产女人与拘做受免费视频 | 成人毛片网 | 久久久久亚洲国产| 国产一区二区三区四区 | 午夜精品久久久久久久 | 午夜精品久久久久久久久久久久久 | 狠狠躁夜夜躁人人爽天天高潮 | 日韩av免费看| 激情亚洲 | 少妇淫片aaaaa毛片叫床爽 | 999精品视频 | 91久久精品国产 | 亚洲一区 | 成人欧美一区二区三区 | 在线日韩欧美 | 日韩中文字幕视频 | 91免费在线 | 四虎影院欧美 | 欧美一区二区三区一在线观看 | 欧美中文字幕一区二区三区亚洲 | 操操操av | 欧美不卡一区 | av黄色网| 国产精品久久久久一区二区 | 成人在线免费观看 | 色播视频在线观看 | 色综合久久久 | 中文字幕综合 | 精品一区二区在线观看 | 国产伊人精品 | 国产丝袜一区二区三区免费视频 | 中文字幕视频一区 | 国产精品网址 | jlzzjlzz欧美大全 |