標(biāo)題: 流水燈花樣電子琴仿真設(shè)計(jì) [打印本頁]

作者: 倉與無涯    時(shí)間: 2018-1-1 11:03
標(biāo)題: 流水燈花樣電子琴仿真設(shè)計(jì)
單品機(jī)課程設(shè)計(jì)做的一個(gè)小課題,流水燈和電子琴結(jié)合到一塊。采用8個(gè)按鍵,前七個(gè)為電子琴按鍵,產(chǎn)生0 1 2 3 4 5 6 7七個(gè)音調(diào)并在數(shù)碼管上顯示當(dāng)前按鍵值。第八個(gè)按鍵為音樂切換按鍵,共四首音樂。蜂鳴器播放音樂時(shí),流水燈隨著音樂節(jié)拍產(chǎn)生花樣,共四種流水燈花樣。電路采用protuse進(jìn)行仿真設(shè)計(jì)。整套資料都在附件里。

QQ截圖20180101104739.png (113.38 KB, 下載次數(shù): 132)

仿真

仿真

0.png (5.83 KB, 下載次數(shù): 136)

0.png

流水燈花樣電子琴.zip

66.47 KB, 下載次數(shù): 95, 下載積分: 黑幣 -5

全套資料


作者: admin    時(shí)間: 2018-1-2 00:12
樓主的源碼:
  1. /******************************************************************/
  2. #include <reg52.h>
  3. #include "main.h"
  4. /******************************************************************/
  5. sbit BeepIO = P2^3; //定義音頻輸出管腳
  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        音樂切換

  14. uchar music=0;
  15. uchar n=0;
  16. uchar n1=0;
  17. uchar n2=0;
  18. uchar n3=0;
  19. uchar key=0;
  20. char temp1,temp2;                //存放初值的中間變量

  21. /*********************數(shù)碼管段碼1-8*********************/
  22. uchar code shumaguan[]={0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00};

  23. /*********************流水燈花樣*********************/
  24. uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,         
  25.                                                 0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花樣1
  26. uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,
  27.                                                 0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花樣2
  28. uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,
  29.                                                 0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
  30. char code huayang4[]={ 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};

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

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

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

  229. /**********************************************************************************
  230. 主函數(shù)
  231. 作用是:判斷按鍵是否按下,然后把預(yù)設(shè)好的初值賦給定時(shí)器,從而得到想要的得到的音調(diào)
  232. **********************************************************************************/       
  233. void main()
  234. {       
  235.         BeepIO=0;
  236.         systimer0_init();
  237.         while(1)
  238.         {
  239.                 BeepIO=1;
  240.                 key_scan();
  241.                 if(music > 0)
  242.                 {
  243.                         key = 0;
  244.                         if(music == 1)                                                                //判斷按鍵是否按下
  245.                         {
  246.                                 while(1)
  247.                                 {
  248.                                         key_scan();       
  249.                                         if(key != 0)
  250.                                         {
  251.                                                 if(key != 8)
  252.                                                 {
  253.                                                         music = 0;
  254.                                                 }                                               
  255.                                                 break;
  256.                                         }
  257.                                         TH0=table1[music_dat[n][0]]/256;                //賦初值
  258.                                         TL0=table1[music_dat[n][0]]%256;
  259.                                         TR0=1;                                                                //音樂開始
  260.                                         P0=huayang1[n];                                                //流水燈花樣1
  261.                                         delay100ms(music_dat[n][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  262.                                         n++;                                                        //下個(gè)音調(diào)開始
  263.                                         if(music_dat[n][0]==0xff)
  264.                                         {
  265.                                                 n=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  266.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  267.                                         }                               
  268.                                 }                                               
  269.                         }
  270.                         if(music == 4)                                                                //判斷按鍵是否按下
  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_dat1[n1][0]]/256;                //賦初值
  284.                                         TL0=table1[music_dat1[n1][0]]%256;
  285.                                         TR0=1;                                                                                   //音樂開始
  286.                                         P0=huayang2[n1];                                                                //流水燈花樣2
  287.                                         delay100ms(music_dat1[n1][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  288.                                         n1++;                                                        //下個(gè)音調(diào)開始
  289.                                         if(music_dat1[n1][0]==0xff)
  290.                                         {
  291.                                                 n1=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  292.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  293.                                         }                               
  294.                                 }                                               
  295.                         }
  296.                         if(music == 3)                                                                //判斷按鍵是否按下
  297.                         {
  298.                                 while(1)
  299.                                 {
  300.                                         key_scan();       
  301.                                         if(key != 0)
  302.                                         {
  303.                                                 if(key != 8)
  304.                                                 {
  305.                                                         music = 0;
  306.                                                 }                                               
  307.                                                 break;
  308.                                         }
  309.                                         TH0=table1[music_dat2[n2][0]]/256;                //賦初值
  310.                                         TL0=table1[music_dat2[n2][0]]%256;
  311.                                         TR0=1;                                                                                        //音樂開始
  312.                                         P0=huayang3[n2];                                                                //流水燈花樣3
  313.                                         delay100ms(music_dat2[n2][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  314.                                         n2++;                                                        //下個(gè)音調(diào)開始
  315.                                         if(music_dat2[n2][0]==0xff)
  316.                                         {
  317.                                                 n2=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  318.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  319.                                         }                               
  320.                                 }                                               
  321.                         }       
  322.                         if(music == 2)                                                                //判斷按鍵是否按下
  323.                         {
  324.                                 while(1)
  325.                                 {
  326.                                         key_scan();       
  327.                                         if(key != 0)
  328.                                         {
  329.                                                 if(key != 8)
  330.                                                 {
  331.                                                         music = 0;
  332.                                                 }                                               
  333.                                                 break;
  334.                                         }
  335.                                         TH0=table1[music_dat3[n3][0]]/256;                //賦初值
  336.                                         TL0=table1[music_dat3[n3][0]]%256;
  337.                                         TR0=1;                                                                                        //音樂開始
  338.                                         P0=huayang4[n3];                                                        //流水燈花樣4
  339.                                         delay100ms(music_dat3[n3][1]);                //調(diào)用延時(shí),用做節(jié)拍的發(fā)生
  340.                                         n3++;                                                        //下個(gè)音調(diào)開始
  341.                                         if(music_dat3[n3][0]==0xff)
  342.                                         {
  343.                                                 n3=0;                                                        //判斷是否到最后一個(gè)音調(diào)
  344.                                                 TR0=0;                                                        //一個(gè)調(diào)放完,即將進(jìn)行下一個(gè)調(diào)
  345.                                         }                               
  346.                                 }                                               
  347.                         }                                                                                       
  348.                 }       
  349.                 else
  350.                 {
  351.                         TR0=0;
  352.                         TR1=0;
  353.                         BeepIO = 1;       
  354.                 }                                                                                                               
  355.         }
  356. }
  357. /**********************************************************************************
  358. 中斷函數(shù)
  359. ***********************************************************************************/
  360. void time0() interrupt 1
  361. {
  362.         if(music == 1)
  363.         {
  364.                 TH0=table1[music_dat[n][0]]/256;                //賦初值
  365.                 TL0=table1[music_dat[n][0]]%256;
  366.         }
  367.         else if(music == 4)
  368.         {
  369.                 TH0=table1[music_dat1[n1][0]]/256;                //賦初值
  370.                 TL0=table1[music_dat1[n1][0]]%256;
  371.         }
  372.         else if(music == 3)
  373.         {
  374.                 TH0=table1[music_dat2[n2][0]]/256;                //賦初值
  375.                 TL0=table1[music_dat2[n2][0]]%256;
  376.         }
  377.         else if(music == 2)
  378.         {
  379.                 TH0=table1[music_dat3[n3][0]]/256;                //賦初值
  380.                 TL0=table1[music_dat3[n3][0]]%256;
  381.         }
  382.         else
  383.         {
  384.                 TH0=temp1;
  385.                 TL0=temp2;       
  386.         }
  387.         BeepIO=~BeepIO;                                                        //不斷取反得到相應(yīng)的音調(diào)
  388. }
復(fù)制代碼

作者: 訾JJJ    時(shí)間: 2018-1-5 13:18
請(qǐng)問這個(gè)是按照89C52開發(fā)板設(shè)計(jì)的嗎
作者: 此12345    時(shí)間: 2018-1-5 15:35
為什么程序有兩個(gè)錯(cuò)誤
作者: 倉與無涯    時(shí)間: 2018-2-11 12:18
訾JJJ 發(fā)表于 2018-1-5 13:18
請(qǐng)問這個(gè)是按照89C52開發(fā)板設(shè)計(jì)的嗎

對(duì),使用的是普中的51板
作者: 倉與無涯    時(shí)間: 2018-2-11 12:19
此12345 發(fā)表于 2018-1-5 15:35
為什么程序有兩個(gè)錯(cuò)誤

沒有錯(cuò)誤,我已經(jīng)運(yùn)行成功,你再仔細(xì)看看
作者: xiaotianzhuifen    時(shí)間: 2018-4-13 09:26
admin 發(fā)表于 2018-1-2 00:12
樓主的源碼:

你好
我想問一下,這個(gè)代碼怎么能改為從鍵盤控制那八個(gè)按鈕
作者: xiaotianzhuifen    時(shí)間: 2018-4-13 10:59
你好
我想問一下,這個(gè)代碼怎么能改為從鍵盤控制那八個(gè)按鈕
作者: 書睫毛    時(shí)間: 2018-12-20 19:19
admin 發(fā)表于 2018-1-2 00:12
樓主的源碼:

峰鳴器怎么不響
作者: fhivdunduj    時(shí)間: 2019-12-28 12:44
蜂鳴器為什么不響?





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1