找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3192|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子琴程序:兩只老虎,小星星,生日歌,歡樂頌 按鍵切換

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:974010 發(fā)表于 2022-4-12 21:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>
  2. /*反復(fù)輸出1~7七個(gè)音階*/
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. sbit beep=P1^5;
  6. sbit led=P2^0;
  7. sbit k1=P3^1;         //定義P31口是k1

  8. /*C調(diào)音符對(duì)應(yīng)的hz:1:523 1#:553 2:586 2#:621 3:658 4:697
  9.                    4#:739 5:783 5#:830 6:879 6#:931 7:987
  10.                                    (以下1.表示1為低音)
  11.                                    1.:262 1.#:277 2.:294 2.#:311 3.:330 4.:349
  12.                    4.#:370 5.:392 5.#:415 6.:440 6.#:466 7.:494
  13.                                     
  14.                                    (以下.1表示高音)
  15.                                    .1:1046 .1#:1109 .2:1175 .2#:1245 .3:1318 .4:1397
  16.                    .4#:1480 .5:1568 .5#:1661 .6:1760 .6#:1865 .7:1976
  17.                                    根據(jù)T=1/f,單片機(jī)通過對(duì)beep的IO口反復(fù)跳轉(zhuǎn)電平從而輸出相應(yīng)的頻率
  18.                                    輸出的每一個(gè)脈沖的高電平和低電平時(shí)間都為T的一半
  19. C調(diào)音符對(duì)應(yīng)的小時(shí)間為:1:956;  2:853; 3:760; 4:717; 5:639; 6:569; 7:507;
  20. 低音5對(duì)應(yīng)裝入定時(shí)器的十六進(jìn)制為FB04
  21.   關(guān)于節(jié)拍:設(shè)四分音符一拍等于400ms;則八分音符一拍等于200ms;十六分音符一拍等于100ms;

  22. 高位定時(shí)器的值:1 2 0xfc 3 4 5 6 0xfd 70xfe
  23. 低位定時(shí)器的值:1 0x44 2 0xab 3 0x08 4 0x33 5 0x81 6 0xc7 7 0x05;
  24.          (2)表示半拍 3.表示1拍半 2-表示2拍
  25. 歡樂頌簡譜如下: 3 3 4 5 |5 4 3 2 | 1 1 2 3| 3. (2) 2-|
  26.                              3 3 4 5 |5 4 3 2 | 1 1 2 3| 2. (1) 1-|
  27.                                  2 2 3 1 |2(3)(4)3 1| 2(3)(4)3 2|
  28.                                  1 2 5(di) 3|3 4 5 5 4 3 2 1 1 2 3 2 1 1|*/
  29.                                                                                                                         
  30. int tho[]={0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,//1234567的高位定時(shí)器的值
  31.            0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,//低音1234567的高位定時(shí)器的值
  32.                    0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe //高音1234567的高位定時(shí)器的值
  33.                    };
  34. int tlo[]={
  35.            0x44,0xab,0x08,0x33,0x81,0xc7,0x05,//1234567的高位定時(shí)器的值
  36.                    0x8c, 0x5b,0x15,0x67,0x04,0x90,0x0c,//低音1234567的低位定時(shí)器的值
  37.                    0x22,0x56,0x85,0x9a,0xc1,0xd3,0xe4 //高音1234567的低位定時(shí)器的值
  38.           };
  39. int tontime[]={200,400,600,800,1000,1200,1400,1600};
  40. //tontime函數(shù)的值代表四分之一拍,半拍,1拍,1拍半,2拍,2拍半,3拍,3拍半,4拍
  41. /*以下是歡樂頌的簡譜數(shù)據(jù)表,通過改變這兩個(gè)數(shù)組以及k的值可以播放不同的歌曲,其中5+6中的5表示低音5如果
  42. 需要其他的低音只需要將5改為其他低音音符即可*/
  43. int code gladsong[]={
  44. 3,3,4,5,5,4,3,2,1,1,2,3,3,2,2,3,3,4,5,5,4,3,2,1,1,2,3,2,1,1,
  45. 2,2,3,1,2,3,4,3,1,2,3,4,3,2,1,2,5+6,3,3,4,5,5,4,3,2,1,1,2,3,2,
  46. 1,1
  47. };//這個(gè)代表歌曲的簡譜
  48. float code timenum[]={
  49. 1,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,2,1,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,2,
  50. 1,1,1,1,1,0.5,0.5,1,1,1,0.5,0.5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  51. 1,1
  52. };//這個(gè)代表每一個(gè)音符的節(jié)拍。以4/4拍為例,1代表1拍,1.5代表1拍半,0.5代表半拍,2代表2拍。
  53. //twotiger和tigernum兩個(gè)數(shù)組是兩只老虎的簡譜數(shù)據(jù)表
  54. int code twotiger[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,2,5+6,1,2,5+6,1};
  55. int code tigernum[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,0.5,0.5,0.5,0.5,1,1,0.5,0.5,0.5,0.5,1,1,
  56.                      1,1,1,1,1,1};
  57. //smallstar和starnum是小星星的簡譜數(shù)據(jù)表
  58. int code smallstar[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,
  59.                                           5,5,4,4,3,3,2,1,1,5,5,6,6,5,4,4,3,3,2,2,1};
  60. int code starnum[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  61.                     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
  62. int code happybirthday[]={5+6,5+6,6+6,5+6,1,7+6,5+6,5+6,6+6,5+6,
  63.                           2,1,5+6,5+6,5,3,1,7+6,6+6,4,4,3,1,2,1};
  64. int code birthdaynum[]={0.5,0.5,1,1,1,1,0.5,0.5,1,1,1,1,1,1,1,1,1,1,1,1.5,0.5,1,1,1,1};
  65. static u8 k=0,j=1;
  66. static int HT,LT;//高低位定時(shí)器的值
  67. void Time0_init()
  68. {
  69. TMOD|=0X01;
  70. TR0=1;
  71. TH0=HT;
  72. TL0=LT;
  73. ET0=1;
  74. EA=1;
  75. }
  76. void delay(u16 ms){u16 b;for(ms;ms>0;ms--)for(b=120;b>0;b--);}

  77. void keypros()
  78. {
  79.         if(k1==0)                  //檢測(cè)按鍵K1是否按下
  80.         {        
  81.                 delay(10);   //消除抖動(dòng) 一般大約10ms
  82.                 if(k1==0)         //再次判斷按鍵是否按下
  83.                 {
  84.                         led=~led;          //led狀態(tài)取反
  85.                         j++;
  86.                         if(j==3)
  87.                                 {
  88.                                 j=1;
  89.                         }
  90.                 }
  91.                 while(!k1);         //檢測(cè)按鍵是否松開
  92.         }                }        
  93. void main()
  94. {
  95. Time0_init();        
  96. while(1)
  97. {
  98.   keypros();
  99.         {                     
  100. if(j==2)
  101.                 {
  102. HT=tho[twotiger[k]];
  103.    LT=tlo[twotiger[k]];
  104.    k++;  if(k>31)k=0;
  105.    delay(tontime[(int)tigernum[k]*2]); } //將這個(gè)注釋掉可以播放兩只老虎。
  106.    
  107. if(j==1)
  108. {         HT=tho[happybirthday[k]];
  109.    LT=tlo[happybirthday[k]];
  110.    k++;  if(k>24)k=0;
  111.    delay(tontime[(int)birthdaynum[k]*2]);}//將這個(gè)注釋掉就可以播放生日快快樂歌
  112. }
  113.         
  114.         if(k%4==0)delay(200);
  115. TR0=0;
  116. delay(100);TR0=1;
  117. }
  118. }

  119. void intf() interrupt 1                                                                                                
  120. {
  121. TH0=HT;
  122. TL0=LT;
  123. beep=~beep;
  124. }
復(fù)制代碼
可以通過按鍵切換生日歌和小星星。

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表