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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超詳細(xì)單片機(jī)八按鍵電子琴仿真+程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
超詳細(xì)單片機(jī)八按鍵電子琴仿真+程序
四首歌切換,可暫停,可輸出八個音節(jié)。
見附件


單片機(jī)源程序如下:
  1. /******************************************************************/
  2. #include <reg52.h>
  3. #include "main.h"
  4. /******************************************************************/
  5. sbit BeepIO = P3^4; //定義音頻輸出管腳
  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 KEY9   = P1^7; //按鍵9 do
  14. sbit KEY8   = P3^2; //按鍵8        音樂切換

  15. sbit LED=P3^7;

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

  81. /****************************************************************
  82. 延時函數(shù),在程序里是當(dāng)做節(jié)拍。我們把100ms作為1/4節(jié)拍
  83. *****************************************************************/
  84. void delay100ms(unsigned char z)
  85. {
  86.         unsigned int i;
  87.         z++;
  88.         while(--z)
  89.         {
  90.                 for(i=11502;i;i--);
  91.         }
  92. }
  93. /**********************************************************************************
  94. 延時函數(shù),這個延時函數(shù)的延時值,大概是1ms,改變z可以獲得不同時間的延時
  95. ***********************************************************************************/
  96. void delay(uint z)
  97. {       
  98.         uint x,y;
  99.         for(x=z;x>0;x--)
  100.                 for(y=110;y>0;y--);               
  101. }
  102. /**********************************************************************************
  103. 按鍵發(fā)音函數(shù)
  104. 作用是:判斷按鍵是否按下,然后把預(yù)設(shè)好的初值賦給定時器,從而得到想要的得到的音調(diào)
  105. **********************************************************************************/       
  106. void key_scan()
  107. {
  108.         if(KEY1==0)                                                //等待按鍵按下
  109.         {
  110.                 LED=0;
  111.                 temp1=table[0];                                //為賦初值做準(zhǔn)備
  112.                 temp2=table[1];
  113.                 TH0=temp1;
  114.                 TL0=temp2;
  115.                 while(KEY1==0);                                //等待松手
  116.                 TR0=1;                                                //開始計時
  117.                 LED=1;
  118.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  119.                 key = 1;
  120.         }
  121.         if(KEY2==0)                                                //等待按鍵按下
  122.         {
  123.                 LED=0;
  124.                 temp1=table[2];                                //為賦初值做準(zhǔn)備
  125.                 temp2=table[3];
  126.                 LED=0;
  127.                 TH0=temp1;
  128.                 TL0=temp2;
  129.                 while(KEY2==0);                                //等待松手
  130.                 TR0=1;
  131.                 LED=1;
  132.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  133.                 key = 2;
  134.         }
  135.         if(KEY3==0)                                                //等待按鍵按下
  136.         {
  137.                 LED=0;
  138.                 temp1=table[4];                                //為賦初值做準(zhǔn)備
  139.                 temp2=table[5];
  140.                 LED=0;
  141.                 TH0=temp1;
  142.                 TL0=temp2;
  143.                 while(KEY3==0);                                //等待松手                       
  144.                 TR0=1;                                                //開始計時
  145.                 LED=1;
  146.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  147.                 key = 3;
  148.         }
  149.         if(KEY4==0)                                                //等待按鍵按下
  150.         {
  151.                 LED=0;
  152.                 temp1=table[6];                                //為賦初值做準(zhǔn)備
  153.                 temp2=table[7];
  154.                 LED=0;
  155.                 TH0=temp1;
  156.                 TL0=temp2;
  157.                 while(KEY4==0);                                //等待松手
  158.                 TR0=1;                                                //開始計時
  159.                 LED=1;
  160.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  161.                 key = 4;
  162.         }
  163.         if(KEY5==0)                                                //等待按鍵按下
  164.         {
  165.                 LED=0;
  166.                 temp1=table[8];                                //為賦初值做準(zhǔn)備
  167.                 temp2=table[9];
  168.                 LED=0;
  169.                 TH0=temp1;
  170.                 TL0=temp2;
  171.                 while(KEY5==0);                                //等待松手
  172.                 TR0=1;                                                //按鍵松手
  173.                 LED=1;
  174.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  175.                 key = 5;
  176.         }
  177.         if(KEY6==0)                                                //等待按鍵按下
  178.         {
  179.                 LED=0;
  180.                 temp1=table[10];                        //為賦初值做準(zhǔn)備
  181.                 temp2=table[11];
  182.                 LED=0;
  183.                 TH0=temp1;
  184.                 TL0=temp2;
  185.                 while(KEY6==0);                                //等待松手
  186.                 TR0=1;                                                //開始計時
  187.                 LED=1;
  188.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  189.                 key = 6;
  190.         }
  191.         if(KEY7==0)                                                //等待按鍵按下
  192.         {
  193.                 LED=0;
  194.                 temp1=table[12];                        //為賦初值做準(zhǔn)備
  195.                 temp2=table[13];
  196.                 LED=0;
  197.                 TH0=temp1;
  198.                 TL0=temp2;
  199.                 while(KEY7==0);                                //等待松手
  200.                 TR0=1;                                                //開始計時
  201.                 LED=1;
  202.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  203.                 key = 7;
  204.         }
  205.         if(KEY9==0)                                                //等待按鍵按下
  206.         {
  207.                 LED=0;
  208.                 temp1=table[0];                                //為賦初值做準(zhǔn)備
  209.                 temp2=table[1];
  210.                 TH0=temp1;
  211.                 TL0=temp2;
  212.                 while(KEY9==0);                                //等待松手
  213.                 TR0=1;                                                //開始計時
  214.                 LED=1;
  215.                 delay(100);                                        //默認(rèn)節(jié)拍是100ms
  216.                 key = 1;
  217.         }
  218.         if(KEY8 == 0)
  219.         {
  220.                 delay(5);
  221.                 if(KEY8 == 0)
  222.                 {
  223.                         LED=0;
  224.                         while(!KEY8);
  225.                         music++;
  226.                         LED=1;
  227.                         if(music == 5)
  228.                         {
  229.                                 music = 0;
  230.                         }
  231.                         key = 8;
  232.                 }
  233.         }
  234.         TR0=0;        //計時器停止,也就是停止放音
  235. }
  236. /*-------------------------------------------------------------------
  237. 定時器初始化程序
  238. --------------------------------------------------------------------*/
  239. void systimer0_init(void)
  240. {
  241.         TMOD |=0x01;//設(shè)置為1時用或(|)
  242.         TMOD &=0xfd;//設(shè)置為0時用與(&)
  243.         EA = 1;
  244.         ET0 = 1;
  245.         TR0 = 1;  
  246. }

  247. /**********************************************************************************
  248. 主函數(shù)
  249. 作用是:判斷按鍵是否按下,然后把預(yù)設(shè)好的初值賦給定時器,從而得到想要的得到的音調(diào)
  250. **********************************************************************************/       
  251. void main()
  252. {       
  253.         BeepIO=0;
  254.         LED=0;
  255.         systimer0_init();
  256.         while(1)
  257.         {
  258.                 BeepIO=1;
  259.                 key_scan();
  260.                 if(music > 0)
  261.                 {
  262.                         key = 0;
  263.                         if(music == 1)                                                                //判斷按鍵是否按下
  264.                         {
  265.                                 while(1)
  266.                                 {
  267.                                         key_scan();       
  268.                                         if(key != 0)
  269.                                         {
  270.                                                 if(key != 8)
  271.                                                 {
  272.                                                         music = 0;
  273.                                                 }                                               
  274.                                                 break;
  275.                                         }
  276.                                         TH0=table1[music_dat[n][0]]/256;                //賦初值
  277.                                         TL0=table1[music_dat[n][0]]%256;
  278.                                         TR0=1;                                                        //音樂開始
  279.                                         delay100ms(music_dat[n][1]);                //調(diào)用延時,用做節(jié)拍的發(fā)生
  280.                                         n++;                                                        //下個音調(diào)開始
  281.                                         if(music_dat[n][0]==0xff)
  282.                                         {
  283.                                                 n=0;                                                        //判斷是否到最后一個音調(diào)
  284.                                                 TR0=0;                                                        //一個調(diào)放完,即將進(jìn)行下一個調(diào)
  285.                                         }                               
  286.                                 }                                               
  287.                         }
  288.                         if(music == 4)                                                                //判斷按鍵是否按下
  289.                         {
  290.                                 while(1)
  291.                                 {
  292.                                         key_scan();       
  293.                                         if(key != 0)
  294.                                         {
  295.                                                 if(key != 8)
  296.                                                 {
  297.                                                         music = 0;
  298.                                                 }                                               
  299.                                                 break;
  300.                                         }
  301.                                         TH0=table1[music_dat1[n1][0]]/256;                //賦初值
  302.                                         TL0=table1[music_dat1[n1][0]]%256;
  303.                                         TR0=1;                                                        //音樂開始
  304.                                         delay100ms(music_dat1[n1][1]);                //調(diào)用延時,用做節(jié)拍的發(fā)生
  305.                                         n1++;                                                        //下個音調(diào)開始
  306.                                         if(music_dat1[n1][0]==0xff)
  307.                                         {
  308.                                                 n1=0;                                                        //判斷是否到最后一個音調(diào)
  309.                                                 TR0=0;                                                        //一個調(diào)放完,即將進(jìn)行下一個調(diào)
  310.                                         }                               
  311.                                 }                                               
  312.                         }
  313.                         if(music == 3)                                                                //判斷按鍵是否按下
  314.                         {
  315.                                 while(1)
  316.                                 {
  317.                                         key_scan();       
  318.                                         if(key != 0)
  319.                                         {
  320.                                                 if(key != 8)
  321.                                                 {
  322.                                                         music = 0;
  323.                                                 }                                               
  324.                                                 break;
  325.                                         }
  326.                                         TH0=table1[music_dat2[n2][0]]/256;                //賦初值
  327.                                         TL0=table1[music_dat2[n2][0]]%256;
  328.                                         TR0=1;                                                        //音樂開始
  329.                                         delay100ms(music_dat2[n2][1]);                //調(diào)用延時,用做節(jié)拍的發(fā)生
  330.                                         n2++;                                                        //下個音調(diào)開始
  331.                                         if(music_dat2[n2][0]==0xff)
  332.                                         {
  333.                                                 n2=0;                                                        //判斷是否到最后一個音調(diào)
  334.                                                 TR0=0;                                                        //一個調(diào)放完,即將進(jìn)行下一個調(diào)
  335.                                         }                               
  336.                                 }                                               
  337.                         }       
  338.                         if(music == 2)                                                                //判斷按鍵是否按下
  339.                         {
  340.                                 while(1)
  341.                                 {
  342.                                         key_scan();       
  343.                                         if(key != 0)
  344.                                         {
  345.                                                 if(key != 8)
  346.                                                 {
  347.                                                         music = 0;
  348.                                                 }                                               
  349.                                                 break;
  350.                                         }
  351.                                         TH0=table1[music_dat3[n3][0]]/256;                //賦初值
  352.                                         TL0=table1[music_dat3[n3][0]]%256;
  353.                                         TR0=1;                                                        //音樂開始
  354.                                         delay100ms(music_dat3[n3][1]);                //調(diào)用延時,用做節(jié)拍的發(fā)生
  355.                                         n3++;                                                        //下個音調(diào)開始
  356.                                         if(music_dat3[n3][0]==0xff)
  357.                                         {
  358.                                                 n3=0;                                                        //判斷是否到最后一個音調(diào)
  359.                                                 TR0=0;                                                        //一個調(diào)放完,即將進(jìn)行下一個調(diào)
  360. ……………………

  361. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
電子琴主程序(4首).zip (63.82 KB, 下載次數(shù): 35)



評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:626398 發(fā)表于 2019-10-18 21:55 | 只看該作者
好懵哦....
回復(fù)

使用道具 舉報

板凳
ID:626813 發(fā)表于 2019-11-18 22:39 | 只看該作者
這個用不了啊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频在线观看免费 | 欧美成人精品一区 | h视频在线免费 | 国产精品视频999 | 激情在线视频网站 | 亚洲一区在线免费观看 | 99在线国产| 国产精品日韩欧美 | 久久精品99久久 | 亚洲国产一区二区三区在线观看 | 国产一区二区在线看 | 中文字幕乱码一区二区三区 | 狠狠入ady亚洲精品经典电影 | 亚洲女人天堂网 | 亚洲一区二区三区四区视频 | 成人激情免费视频 | 性视频网 | а_天堂中文最新版地址 | 日本视频一区二区 | 欧美亚洲国产日韩 | 最近中文字幕第一页 | 国产69精品久久99不卡免费版 | 日韩在线观看一区二区三区 | 精品国产欧美 | 国产精品久久久久无码av | 亚洲国产电影 | 精品一区二区三区不卡 | 精品欧美一区二区三区 | 精品国产色 | 日韩免费一区 | 国产精品美女久久久久aⅴ国产馆 | 黄色大片在线播放 | 一区二区三区四区五区在线视频 | 性高湖久久久久久久久3小时 | 国产一区二区在线免费观看 | 久久久久亚洲av毛片大全 | 欧美性久久 | 水蜜桃亚洲一二三四在线 | 亚洲一区二区在线播放 | 日韩一区三区 | 久久久精品 |