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

QQ登錄

只需一步,快速開始

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

單片機(jī)電子琴程序 按鍵實(shí)現(xiàn)音樂(lè)切換

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:103072 發(fā)表于 2016-1-14 15:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

完整代碼下載: 電子琴主程序(4首).rar (28.11 KB, 下載次數(shù): 239)

  1. /******************************************************************/
  2. #include <reg52.h>
  3. #include "main.h"
  4. /******************************************************************/
  5. sbit BeepIO = P2^0; //定義音頻輸出管腳
  6. sbit KEY1   = P1^0; //按鍵1 do
  7. sbit KEY2   = P1^1; //按鍵2        re
  8. sbit KEY3   = P1^2; //按鍵3        mi
  9. sbit KEY4   = P1^3; //按鍵4        fa
  10. sbit KEY5   = P1^4; //按鍵5        sol
  11. sbit KEY6   = P1^5; //按鍵6        la
  12. sbit KEY7   = P1^6; //按鍵7        si
  13. sbit KEY8   = P1^7; //按鍵8        音樂(lè)切換

  14. sbit LED=P0^0;

  15. uchar music=0;
  16. uchar n=0;
  17. uchar n1=0;
  18. uchar n2=0;
  19. uchar n3=0;
  20. uchar key=0;
  21. char temp1,temp2;                //存放初值的中間變量
  22. uchar code music_dat[][2]= //兩只老虎音樂(lè)數(shù)據(jù),下面每一組是【音調(diào)【節(jié)拍】
  23. //比如說(shuō):1,4。其中1是音調(diào),在函數(shù)中取得1的值然后在table[]中取得相應(yīng)的音調(diào)
  24. //其中4是節(jié)拍,通過(guò)這個(gè)值來(lái)確定延時(shí)的長(zhǎng)短
  25. {
  26. 1,4, 2,4, 3,4, 1,4,                                //第一節(jié)
  27. 3,4, 2,4, 3,4, 1,4,                                //第二節(jié)
  28. 3,4, 4,4, 5,8,                                        //第三節(jié)
  29. 3,4, 4,4, 5,8,                                        //第四節(jié)
  30. 5,3, 6,1, 5,3, 4,1, 3,4, 1,4,        //第五節(jié)
  31. 5,3, 6,1, 5,3, 4,1, 3,4, 1,4,        //第六節(jié)
  32. 1,4, 8,4, 1,8,                                        //第七節(jié)
  33. 1,4, 8,4, 1,8,                                        //第八節(jié)
  34. 0XFF                                                //結(jié)束
  35. };
  36. uchar code music_dat1[][2]= //祝你生日快樂(lè)音樂(lè)數(shù)據(jù),下面每一組是【音調(diào)【節(jié)拍】
  37. //比如說(shuō):1,4。其中1是音調(diào),在函數(shù)中取得1的值然后在table[]中取得相應(yīng)的音調(diào)
  38. //其中4是節(jié)拍,通過(guò)這個(gè)值來(lái)確定延時(shí)的長(zhǎng)短
  39. {
  40. 1,2, 1,2, 2,4, 1,4, 4,4, 3,8,                        //第一節(jié)
  41. 1,2, 1,2, 2,4, 1,4, 5,4, 4,8,                        //第二節(jié)
  42. 1,2, 1,2, 8,4, 6,4, 4,4, 3,4, 2,4,            //第三節(jié)
  43. 7,2, 7,2, 6,4, 4,4, 5,4, 4,8,                        //第四節(jié)
  44. 0XFF                                                //結(jié)束
  45. };
  46. uchar code music_dat2[][2]= //鈴兒響叮當(dāng)音樂(lè)數(shù)據(jù),下面每一組是【音調(diào)【節(jié)拍】
  47. //比如說(shuō):1,4。其中1是音調(diào),在函數(shù)中取得1的值然后在table[]中取得相應(yīng)的音調(diào)
  48. //其中4是節(jié)拍,通過(guò)這個(gè)值來(lái)確定延時(shí)的長(zhǎng)短
  49. {
  50. 6,2, 6,2, 6,4, 6,2,        6,2, 6,4,                                    //第一節(jié)
  51. 6,2, 8,2, 4,3, 5,1, 6,8,                                        //第二節(jié)
  52. 7,2, 7,2, 7,3, 7,1, 7,2, 6,2, 6,2, 6,1, 6,1,        //第三節(jié)
  53. 6,2, 5,2, 5,2, 4,2, 5,4, 8,4,                                        //第四節(jié)
  54. 6,2, 6,2, 6,4, 6,2, 6,2, 6,4,                        //第五節(jié)
  55. 6,2, 8,2, 4,3, 5,1, 6,8,                            //第六節(jié)
  56. 7,2, 7,2, 7,3, 7,1, 7,2, 6,2, 6,2, 6,1, 6,1,        //第七節(jié)
  57. 8,2, 8,2, 7,2, 5,2, 4,6,                                            //第八節(jié)
  58. 0XFF                                                                //結(jié)束
  59. };
  60. uchar code music_dat3[][2]= //音樂(lè)數(shù)據(jù),下面每一組是【音調(diào)【節(jié)拍】
  61. //比如說(shuō):1,4。其中1是音調(diào),在函數(shù)中取得1的值然后在table[]中取得相應(yīng)的音調(diào)
  62. //其中4是節(jié)拍,通過(guò)這個(gè)值來(lái)確定延時(shí)的長(zhǎng)短
  63. {
  64. 6,4,4,4,5,4,2,4,6,2,5,2,4,2,5,2,2,4,6,4,4,4,5,4,5,2,5,2,8,2,6,2,3,4,4,4,4,1,3,1,
  65. 2,4,3,2,4,2,5,4,1,4,9,2,8,2,6,4,6,4,5,2,4,4,5,2,6,2,5,4,1,4,2,4,2,1,4,1,2,4,
  66. 0XFF                                                                //結(jié)束
  67. };
  68. uint code table[]={                                                                                        //數(shù)組存放的數(shù)據(jù)是各個(gè)音調(diào)的初始值
  69. 0Xfc,0X8e,0Xfc,0Xed,0Xfd,0X43,0Xfd,0X6a,0Xfd,0Xb3,0Xfd,0Xf3,0Xfe,0X2d};
  70. unsigned int code table1[9]={                                        //這個(gè)數(shù)組里存放的是1-7的音調(diào)的初始值
  71. 0xfc5b,0xfc8e,0xfced,0xfd43,0xfd6a,0xfdb3,0xfdf3,0xfe2d,0xfb68
  72. };

  73. /****************************************************************
  74. 延時(shí)函數(shù),在程序里是當(dāng)做節(jié)拍。我們把100ms作為1/4節(jié)拍
  75. *****************************************************************/
  76. void delay100ms(unsigned char z)
  77. {
  78.         unsigned int i;
  79.         z++;
  80.         while(--z)
  81.         {
  82.                 for(i=11502;i;i--);
  83.         }
  84. }
  85. /**********************************************************************************
  86. 延時(shí)函數(shù),這個(gè)延時(shí)函數(shù)的延時(shí)值,大概是1ms,改變z可以獲得不同時(shí)間的延時(shí)
  87. ***********************************************************************************/
  88. void delay(uint z)
  89. {       
  90.         uint x,y;
  91.         for(x=z;x>0;x--)
  92.                 for(y=110;y>0;y--);               
  93. }
  94. /**********************************************************************************
  95. 按鍵發(fā)音函數(shù)
  96. 作用是:判斷按鍵是否按下,然后把預(yù)設(shè)好的初值賦給定時(shí)器,從而得到想要的得到的音調(diào)
  97. **********************************************************************************/       
  98. void key_scan()
  99. {
  100.         if(KEY1==0)                                                //等待按鍵按下
  101.         {

  102.                 temp1=table[0];                                //為賦初值做準(zhǔn)備
  103.                 temp2=table[1];
  104.                 TH0=temp1;
  105.                 TL0=temp2;
  106.                 while(KEY1==0);                                //等待松手
  107.                 TR0=1;                                                //開始計(jì)時(shí)
  108.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  109.                 key = 1;
  110.         }
  111.         if(KEY2==0)                                                //等待按鍵按下
  112.         {
  113.                 temp1=table[2];                                //為賦初值做準(zhǔn)備
  114.                 temp2=table[3];
  115.                 TH0=temp1;
  116.                 TL0=temp2;
  117.                 while(KEY2==0);                                //等待松手
  118.                 TR0=1;
  119.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  120.                 key = 2;
  121.         }
  122.         if(KEY3==0)                                                //等待按鍵按下
  123.         {
  124.                 temp1=table[4];                                //為賦初值做準(zhǔn)備
  125.                 temp2=table[5];
  126.                 TH0=temp1;
  127.                 TL0=temp2;
  128.                 while(KEY3==0);                                //等待松手                       
  129.                 TR0=1;                                                //開始計(jì)時(shí)
  130.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  131.                 key = 3;
  132.         }
  133.         if(KEY4==0)                                                //等待按鍵按下
  134.         {
  135.                 temp1=table[6];                                //為賦初值做準(zhǔn)備
  136.                 temp2=table[7];
  137.                 TH0=temp1;
  138.                 TL0=temp2;
  139.                 while(KEY4==0);                                //等待松手
  140.                 TR0=1;                                                //開始計(jì)時(shí)
  141.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  142.                 key = 4;
  143.         }
  144.         if(KEY5==0)                                                //等待按鍵按下
  145.         {
  146.                 temp1=table[8];                                //為賦初值做準(zhǔn)備
  147.                 temp2=table[9];
  148.                 TH0=temp1;
  149.                 TL0=temp2;
  150.                 while(KEY5==0);                                //等待松手
  151.                 TR0=1;                                                //按鍵松手
  152.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  153.                 key = 5;
  154.         }
  155.         if(KEY6==0)                                                //等待按鍵按下
  156.         {
  157.                 temp1=table[10];                        //為賦初值做準(zhǔn)備
  158.                 temp2=table[11];
  159.                 TH0=temp1;
  160.                 TL0=temp2;
  161.                 while(KEY6==0);                                //等待松手
  162.                 TR0=1;                                                //開始計(jì)時(shí)
  163.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  164.                 key = 6;
  165.         }
  166.         if(KEY7==0)                                                //等待按鍵按下
  167.         {
  168.                 temp1=table[12];                        //為賦初值做準(zhǔn)備
  169.                 temp2=table[13];
  170.                 TH0=temp1;
  171.                 TL0=temp2;
  172.                 while(KEY7==0);                                //等待松手
  173.                 TR0=1;                                                //開始計(jì)時(shí)
  174.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  175.                 key = 7;
  176.         }
  177.         if(KEY8 == 0)
  178.         {
  179.                 delay(5);
  180.                 if(KEY8 == 0)
  181.                 {
  182.                         while(!KEY8);
  183.                         music++;
  184.                         if(music == 5)
  185.                         {
  186.                                 music = 0;
  187.                         }
  188.                         key = 8;
  189.                 }
  190.         }
  191.         TR0=0;        //計(jì)時(shí)器停止,也就是停止放音
  192. }
  193. /*-------------------------------------------------------------------
  194. 定時(shí)器初始化程序
  195. --------------------------------------------------------------------*/
  196. void systimer0_init(void)
  197. {
  198.         TMOD |=0x01;//設(shè)置為1時(shí)用或(|)
  199.         TMOD &=0xfd;//設(shè)置為0時(shí)用與(&)
  200.         EA = 1;
  201.         ET0 = 1;
  202.         TR0 = 1;  
  203. }

  204. /**********************************************************************************
  205. 主函數(shù)
  206. 作用是:判斷按鍵是否按下,然后把預(yù)設(shè)好的初值賦給定時(shí)器,從而得到想要的得到的音調(diào)
  207. **********************************************************************************/       
  208. void main()
  209. {       
  210.         BeepIO=0;
  211.         LED=0;
  212.         systimer0_init();
  213.         while(1)
  214.         {
  215.                 BeepIO=1;
  216.                 key_scan();
  217.                 if(music > 0)
  218.                 {
  219.                         key = 0;
  220.                         if(music == 1)                                                                //判斷按鍵是否按下
  221.                         {
  222.                                 while(1)
  223.                                 {
  224.                                         key_scan();       
  225.                                         if(key != 0)
  226.                                         {
  227.                                                 if(key != 8)
  228.                                                 {
  229.                                                         music = 0;
  230.                                                 }                                               
  231.                                                 break;
  232.                                         }
  233.                                         TH0=table1[music_dat[n][0]]/256;                //賦初值
  234.                                         TL0=table1[music_dat[n][0]]%256;
  235.                                         TR0=1;                                                        //音樂(lè)開始
  236.                                         delay100ms(music_dat[n][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  237.                                         n++;                                                        //下個(gè)音調(diào)開始
  238.                                         if(music_dat[n][0]==0xff)
  239.                                         {
  240.                                                 n=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  241.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  242.                                         }                               
  243.                                 }                                               
  244.                         }
  245.                         if(music == 4)                                                                //判斷按鍵是否按下
  246.                         {
  247.                                 while(1)
  248.                                 {
  249.                                         key_scan();       
  250.                                         if(key != 0)
  251.                                         {
  252.                                                 if(key != 8)
  253.                                                 {
  254.                                                         music = 0;
  255.                                                 }                                               
  256.                                                 break;
  257.                                         }
  258.                                         TH0=table1[music_dat1[n1][0]]/256;                //賦初值
  259.                                         TL0=table1[music_dat1[n1][0]]%256;
  260.                                         TR0=1;                                                        //音樂(lè)開始
  261.                                         delay100ms(music_dat1[n1][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  262.                                         n1++;                                                        //下個(gè)音調(diào)開始
  263.                                         if(music_dat1[n1][0]==0xff)
  264.                                         {
  265.                                                 n1=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  266.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  267.                                         }                               
  268.                                 }                                               
  269.                         }
  270.                         if(music == 3)                                                                //判斷按鍵是否按下
  271.                         {
  272.                                 while(1)
  273.                                 {
  274.                                         key_scan();       
  275.                                         if(key != 0)
  276.                                         {
  277.                                                 if(key != 8)
  278.                                                 {
  279.                                                         music = 0;
  280.                                                 }                                               
  281.                                                 break;
  282.                                         }
  283.                                         TH0=table1[music_dat2[n2][0]]/256;                //賦初值
  284.                                         TL0=table1[music_dat2[n2][0]]%256;
  285.                                         TR0=1;                                                        //音樂(lè)開始
  286.                                         delay100ms(music_dat2[n2][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  287.                                         n2++;                                                        //下個(gè)音調(diào)開始
  288.                                         if(music_dat2[n2][0]==0xff)
  289.                                         {
  290.                                                 n2=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  291.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  292.                                         }                               
  293.                                 }                                               
  294.                         }       
  295.                         if(music == 2)                                                                //判斷按鍵是否按下
  296.                         {
  297.                                 while(1)
  298.                                 {
  299.                                         key_scan();       
  300.                                         if(key != 0)
  301.                                         {
  302.                                                 if(key != 8)
  303.                                                 {
  304.                                                         music = 0;
  305.                                                 }                                               
  306.                                                 break;
  307.                                         }
  308.                                         TH0=table1[music_dat3[n3][0]]/256;                //賦初值
  309.                                         TL0=table1[music_dat3[n3][0]]%256;
  310.                                         TR0=1;                                                        //音樂(lè)開始
  311.                                         delay100ms(music_dat3[n3][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  312.                                         n3++;                                                        //下個(gè)音調(diào)開始
  313.                                         if(music_dat3[n3][0]==0xff)
  314.                                         {
  315.                                                 n3=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  316.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  317.                                         }                               
  318.                                 }                                               
  319.                         }                                                                                       
  320.                 }       
  321.                 else
  322.                 {
  323.                         TR0=0;
  324.                         TR1=0;
  325.                         BeepIO = 1;       
  326.                 }                                                                                                               
  327.         }
  328. }
  329. /**********************************************************************************
  330. 中斷函數(shù)
  331. ***********************************************************************************/
  332. void time0() interrupt 1
  333. {
  334.         if(music == 1)
  335.         {
  336.                 TH0=table1[music_dat[n][0]]/256;                //賦初值
  337.                 TL0=table1[music_dat[n][0]]%256;
  338.         }
  339.         else if(music == 4)
  340.         {
  341.                 TH0=table1[music_dat1[n1][0]]/256;                //賦初值
  342.                 TL0=table1[music_dat1[n1][0]]%256;
  343.         }
  344.         else if(music == 3)
  345.         {
  346.                 TH0=table1[music_dat2[n2][0]]/256;                //賦初值
  347.                 TL0=table1[music_dat2[n2][0]]%256;
  348.         }
  349.         else if(music == 2)
  350.         {
  351.                 TH0=table1[music_dat3[n3][0]]/256;                //賦初值
  352.                 TL0=table1[music_dat3[n3][0]]%256;
  353.         }
  354.         else
  355.         {
  356.                 TH0=temp1;
  357.                 TL0=temp2;       
  358.         }
  359.         BeepIO=~BeepIO;                                                        //不斷取反得到相應(yīng)的音調(diào)
  360. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +35 收起 理由
暗光 + 35 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:150736 發(fā)表于 2016-11-28 14:00 | 只看該作者
不錯(cuò)不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:154324 發(fā)表于 2016-12-14 08:46 | 只看該作者
!!!!!!!!!good
回復(fù)

使用道具 舉報(bào)

地板
ID:154583 發(fā)表于 2016-12-14 08:55 | 只看該作者
不怎么懂
回復(fù)

使用道具 舉報(bào)

5#
ID:157052 發(fā)表于 2016-12-23 08:50 | 只看該作者
頭文件"main.h"在哪?
回復(fù)

使用道具 舉報(bào)

6#
ID:158179 發(fā)表于 2016-12-30 21:42 | 只看該作者
不錯(cuò),非常棒
回復(fù)

使用道具 舉報(bào)

7#
ID:190307 發(fā)表于 2017-4-17 16:14 來(lái)自手機(jī) | 只看該作者
頭文件在哪……
回復(fù)

使用道具 舉報(bào)

8#
ID:212637 發(fā)表于 2017-6-19 17:02 | 只看該作者
請(qǐng)問(wèn)頭文件main.h在哪呢
回復(fù)

使用道具 舉報(bào)

9#
ID:171296 發(fā)表于 2017-11-5 10:14 | 只看該作者
謝謝分享。。。
回復(fù)

使用道具 舉報(bào)

10#
ID:247636 發(fā)表于 2017-11-10 09:20 來(lái)自手機(jī) | 只看該作者
我想下載下來(lái)看看學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

11#
ID:239191 發(fā)表于 2017-11-11 19:59 | 只看該作者
鈴兒響叮當(dāng)適合圣誕節(jié)
回復(fù)

使用道具 舉報(bào)

12#
ID:239191 發(fā)表于 2017-11-11 19:59 | 只看該作者
圣誕節(jié)快到了,鈴兒響叮當(dāng)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

13#
ID:363129 發(fā)表于 2018-7-2 19:23 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

14#
ID:430147 發(fā)表于 2018-11-25 21:01 | 只看該作者
非常非常感謝
回復(fù)

使用道具 舉報(bào)

15#
ID:460972 發(fā)表于 2019-1-3 14:53 | 只看該作者
不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

16#
ID:460972 發(fā)表于 2019-1-3 14:54 | 只看該作者
不錯(cuò)哦
回復(fù)

使用道具 舉報(bào)

17#
ID:464634 發(fā)表于 2019-1-8 15:29 | 只看該作者
頂一下~~~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

18#
ID:464689 發(fā)表于 2019-1-8 16:15 來(lái)自手機(jī) | 只看該作者
非常感謝
回復(fù)

使用道具 舉報(bào)

19#
ID:564711 發(fā)表于 2019-6-17 16:06 | 只看該作者
你好,我的17行 為什么有錯(cuò)
回復(fù)

使用道具 舉報(bào)

20#
ID:591620 發(fā)表于 2020-6-21 12:58 | 只看該作者
我想問(wèn)一下,音樂(lè)的代碼是怎樣提取的
回復(fù)

使用道具 舉報(bào)

21#
ID:804791 發(fā)表于 2020-7-17 18:10 | 只看該作者
樓主有這個(gè)電子琴的電路圖嗎?求大佬回復(fù)
回復(fù)

使用道具 舉報(bào)

22#
ID:804791 發(fā)表于 2020-7-18 16:03 | 只看該作者
大佬有這個(gè)電子琴的電路圖么?
回復(fù)

使用道具 舉報(bào)

23#
ID:745442 發(fā)表于 2020-7-24 21:50 來(lái)自手機(jī) | 只看該作者
有電路圖嗎
回復(fù)

使用道具 舉報(bào)

24#
ID:809013 發(fā)表于 2020-7-29 22:09 | 只看該作者
寫的還不錯(cuò),如果用函數(shù)封裝更好了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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