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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機音樂閃燈(類似于音樂頻譜)制作問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:239055 發表于 2017-11-9 08:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想用51單片機做一個類似于音樂頻譜,
音樂頻譜有些是8*8,12*12規格的,達到要求點亮每一級上面的LED,但點亮后的LED就只是點亮,而不是隨音樂閃動,
我是想達到要求點亮每一級上面的LED,并且LED隨音樂閃動,效果應該和舞廳效果差不多吧,
下面是論壇上面的源代碼,哪位可以幫我改改不?謝謝

  1. #include<reg52.h>                    //stc15系列1T單片機
  2. #define ADC_CHANNEL 0x01                    //AD轉換通道P1.0
  3. #define ADC_POWER 0x80                                                //ADC電源控制位
  4. #define ADC_SPEED 0x60                                                //90個時鐘周期
  5. #define ADC_START 0x08                                                //ADC啟動控制位
  6. #define ADC_FLAG 0x10                                                //ADC完成標志位
  7. #define SAMPLE_NUM 64                       //取64點FFT算法
  8. #define NUM_2_LOG 6                                                        //2的6次方
  9. #define FFT_OUT_MIN 1                       //FFT運算最小值
  10. #define LED_C1_8 P2                         //LED1~8列
  11. #define LED_C9_16 P3                        //LED9~16列
  12. #define LED_R1_8 P0                         //LED1~8行
  13. /***************************引腳定義*****************************/
  14. sbit LED_R1 = P0^0;                                                        //LED1~8行
  15. sbit LED_R2 = P0^1;
  16. sbit LED_R3 = P0^2;
  17. sbit LED_R4 = P0^3;
  18. sbit LED_R5 = P0^4;
  19. sbit LED_R6 = P0^5;
  20. sbit LED_R7 = P0^6;
  21. sbit LED_R8 = P0^7;
  22. sbit LED_R9 = P1^6;                        //LED第9行
  23. sbit LED_R10 = P1^7;                        //LED第10行                                 
  24. sbit SWITCH = P2^5;

  25. /*----------------------------變量表----------------------------*/
  26. unsigned char code BIT_RESORT[SAMPLE_NUM] = { 0, 32, 16, 48, 8, 40, 24, 56,4, 36, 20, 52, 12, 44, 28, 60,          //比特逆序重排
  27.                                                                             2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62,
  28.                                                                             1, 33, 17, 49, 9, 41, 25, 57,5, 37, 21, 53, 13, 45, 29, 61,
  29.                                                                              3, 35, 19, 51, 11, 43, 27, 59,7, 39, 23, 55, 15, 47, 31, 63};

  30. char code SIN_TAB[SAMPLE_NUM] = { 0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 ,              //正弦表
  31.                                                                    127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,
  32.                                                                    0 ,-12 ,-25 ,-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,
  33.                                                                    -127 ,-126 ,-125 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12  };

  34. char code COS_TAB[SAMPLE_NUM] = {127 ,126 ,125 ,122 ,117 ,112 ,106 ,98 ,90 ,81 ,71 ,60 ,49 ,37 ,25 ,12 ,            //余弦表
  35.                                                                   0 ,-12 ,-25 ,-37 ,-49 ,-60 ,-71 ,-81 ,-90 ,-98 ,-106 ,-112 ,-117 ,-122 ,-125 ,-126 ,
  36.                                                                   -127 ,-126 ,-125 ,-122 ,-117 ,-112 ,-106 ,-98 ,-90 ,-81 ,-71 ,-60 ,-49 ,-37 ,-25 ,-12 ,
  37.                                                                   0 ,12 ,25 ,37 ,49 ,60 ,71 ,81 ,90 ,98 ,106 ,112 ,117 ,122 ,125 ,126 };

  38. unsigned char LED_NUM[] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};          //led顯示數目
  39. unsigned char AMP, AMP_TAB[16];                      //頻譜幅值,幅值表
  40. unsigned char DISP_NUM;                              //顯示次數
  41. unsigned char KEEP, KEEP_NUM;                                                 //自動增益選擇
  42. int xdata FFT_REAL[SAMPLE_NUM];                      //FFT運算結果實部
  43. int xdata FFT_IMAGE[SAMPLE_NUM];                     //FFT運算結果虛部
  44. bit SWITCH_ON;
  45. /**************************************************************
  46. *名                稱:delay
  47. *功                能:微秒級延時
  48. **************************************************************/
  49. void Delay(unsigned int i)
  50. {
  51.         while(i--);
  52. }
  53. /**************************************************************
  54. *名                稱:Delay_ms
  55. *功                能:毫秒級延時
  56. **************************************************************/
  57. void Delay_ms(unsigned int x)
  58. {
  59.         unsigned int i, j;
  60.         for(i = 0; i < x; i++)
  61.                 for(j = 0; j < 500; j++);
  62. }
  63. /**************************************************************
  64. *名                稱:IOInit
  65. *功                能:IO端口初始化
  66. **************************************************************/
  67. void IOInit(void)
  68. {
  69.         P1M0 = 0x00;                        //高阻輸入
  70.         P1M1 = 0x01;
  71.         P1ASF = 0x01;                        //設為AD轉換
  72. }
  73. /**************************************************************
  74. *名                稱:Timer0Init
  75. *功                能:定時器0初始化100us定時
  76. **************************************************************/
  77. void TimerInit(void)                //100微秒@33.000MHz
  78. {
  79.         AUXR = 0XC0;                        //定時器0-1T,定時器1-12T
  80.         TMOD = 0X00;                        //定時器0/1-方式0-16位自動重裝
  81.         TL0 = 0X16;                                //定時器0-定時170us-顯示幅值
  82.         TH0 = 0Xea;                                
  83.         TL1 = 0X1C;                                //定時器1-定時1ms-檢測開關狀態
  84.         TH1 = 0XF3;
  85.         TR0=1;
  86.         TR1 = 1;
  87. }

  88. /**********************************************************
  89. *名                稱:Display
  90. *功                能:顯示幅值
  91. **********************************************************/
  92. void Display(void)
  93. {
  94.         DISP_NUM++;
  95.         if(DISP_NUM == 17)
  96.                 DISP_NUM = 1;
  97.         LED_R1_8 = 0X00; LED_R9 = 0; LED_R10 = 0; LED_R11 = 0; LED_R12 = 0;                        //顯示前先關閉
  98.         switch(DISP_NUM)                                                                                           //逐列顯示
  99.         {
  100.                 case 1: AMP = AMP_TAB[0]; LED_C1_8 = 0X01; LED_C9_16 = 0x00; break;
  101.                 case 2: AMP = AMP_TAB[1]; LED_C1_8 = 0X02; LED_C9_16 = 0x00; break;
  102.                 case 3: AMP = AMP_TAB[2]; LED_C1_8 = 0X04; LED_C9_16 = 0x00; break;
  103.                 case 4: AMP = AMP_TAB[3]; LED_C1_8 = 0X08; LED_C9_16 = 0x00; break;
  104.                 case 5: AMP = AMP_TAB[4]; LED_C1_8 = 0X10; LED_C9_16 = 0x00; break;
  105.                 case 6: AMP = AMP_TAB[5]; LED_C1_8 = 0X20; LED_C9_16 = 0x00; break;
  106.                 case 7: AMP = AMP_TAB[6]; LED_C1_8 = 0X40; LED_C9_16 = 0x00; break;
  107.                 case 8: AMP = AMP_TAB[7]; LED_C1_8 = 0X80; LED_C9_16 = 0x00; break;
  108.                 case 9: AMP = AMP_TAB[8]; LED_C1_8 = 0X00; LED_C9_16 = 0x01; break;
  109.                 case 10: AMP = AMP_TAB[9]; LED_C1_8 = 0X00; LED_C9_16 = 0x02; break;
  110.                 case 11: AMP = AMP_TAB[10]; LED_C1_8 = 0X00; LED_C9_16 = 0x04; break;
  111.                 case 12: AMP = AMP_TAB[11]; LED_C1_8 = 0X00; LED_C9_16 = 0x08; break;
  112.                 case 13: AMP = AMP_TAB[12]; LED_C1_8 = 0X00; LED_C9_16 = 0x10; break;
  113.                 case 14: AMP = AMP_TAB[13]; LED_C1_8 = 0X00; LED_C9_16 = 0x20; break;
  114.                 case 15: AMP = AMP_TAB[14]; LED_C1_8 = 0X00; LED_C9_16 = 0x40; break;
  115.                 case 16: AMP = AMP_TAB[15]; LED_C1_8 = 0X00; LED_C9_16 = 0x80; break;
  116.         }
  117.         if(AMP <= 8)
  118.         {
  119.                 LED_R1_8 = LED_NUM[AMP];
  120.                 LED_R9 = 0;
  121.                 LED_R10 = 0;
  122.                 LED_R11 = 0;
  123.                 LED_R12 = 0;
  124.         }
  125.         if(AMP == 9)
  126.         {
  127.                 LED_R1_8 = 0XFF;
  128.                 LED_R9 = 1;
  129.                 LED_R10 = 0;
  130.                 LED_R11 = 0;
  131.                 LED_R12 = 0;
  132.         }
  133.         if(AMP == 10)
  134.         {
  135.                 LED_R1_8 = 0XFF;
  136.                 LED_R9 = 1;
  137.                 LED_R10 = 1;
  138.                 LED_R11 = 0;
  139.                 LED_R12 = 0;
  140.         }
  141.         if(AMP == 11)
  142.         {
  143.                 LED_R1_8 = 0XFF;
  144.                 LED_R9 = 1;
  145.                 LED_R10 = 1;
  146.                 LED_R11 = 1;
  147.                 LED_R12 = 0;
  148.         }
  149.         if(AMP == 12)
  150.         {
  151.                 LED_R1_8 = 0XFF;
  152.                 LED_R9 = 1;
  153.                 LED_R10 = 1;
  154.                 LED_R11 = 1;
  155.                 LED_R12 = 1;
  156.         }
  157. }

  158. /************************************************
  159. *名                稱:ReadADC
  160. *功                能:讀取AD轉換結果
  161. ************************************************/
  162. unsigned char ReadADC(void)
  163. {
  164.         ADC_CONTR = ADC_POWER + ADC_START;           //啟動轉換
  165.         Delay(50);                                   
  166.         while(!(ADC_CONTR & ADC_FLAG));              //等待轉換結束
  167.         ADC_CONTR = ADC_POWER;
  168.         return (ADC_RES << 2 + ADC_RESL);
  169. }
  170. /************************************************
  171. *名                稱:sqrt
  172. *功                能:算平方根
  173. ************************************************/
  174. short sqrt( unsigned long M)                                            //不懂啊
  175. {
  176.     unsigned int N, i;
  177.     unsigned long tmp, ttp;
  178.     if( M == 0 )            
  179.         return 0;

  180.     N = 0;

  181.     tmp = ( M >> 30 );        
  182.     M <<= 2;
  183.     if( tmp > 1 )            
  184.     {
  185.         N ++;               
  186.         tmp -= N;
  187.     }

  188.     for( i=15; i>0; i-- )   
  189.     {
  190.         N <<= 1;           

  191.         tmp <<= 2;
  192.         tmp += (M >> 30);  

  193.         ttp = N;
  194.         ttp = (ttp<<1)+1;

  195.         M <<= 2;
  196.         if( tmp >= ttp )   
  197.         {
  198.             tmp -= ttp;
  199.             N ++;
  200.         }      
  201.     }

  202.     return N;
  203. }

  204. /************************************************
  205. *名                稱:FFT
  206. *功                能:快速傅里葉變換求取頻譜
  207. ************************************************/
  208. void FFT(void)                             //基2時分蝶式算法
  209. {
  210. //         unsigned char i, j, r, m1, m2, m3, m4, k1, k2;       //分別為:級號,蝶群號,運算蝶號,蝶群總數,蝶群長度,運算蝶數,蝶群址,蝶址
  211. //         unsigned char p;
  212. //         unsigned char MAX = 0;
  213. //         short u, v;
  214. //         unsigned long ulReal, ulImage;
  215.         register unsigned char i,bb,j,k,p,MAX;
  216.         register short TR,TI,temp;
  217.     unsigned long ulReal;                             
  218.     unsigned long ulImage;

  219.         for(i = 0; i < SAMPLE_NUM; i++)                                         //采樣
  220.         {
  221.                 FFT_REAL[BIT_RESORT[i]] = ReadADC() << KEEP;
  222.                 FFT_IMAGE[i] = 0;
  223.         }
  224.         KEEP_NUM = FFT_REAL[2] >> 4;
  225.         if((7 < KEEP_NUM) && (KEEP_NUM <= 8))
  226.                 KEEP = 1;
  227.         else if((4 < KEEP_NUM) && (KEEP_NUM <= 6))
  228.                 KEEP = 2;
  229.         else if((2 < KEEP_NUM) && (KEEP_NUM <= 4))
  230.                 KEEP = 3;
  231.         else
  232.                 KEEP = 5;
  233.     for( i=1; i<=NUM_2_LOG; i++)                          
  234.     {
  235.         bb=1;
  236.         bb <<= (i-1);                                      
  237.         for( j=0; j<=bb-1; j++)                           
  238.         {
  239.             p=1;
  240.             p <<= (NUM_2_LOG-i);            
  241.             p = p*j;
  242.             for( k=j; k<SAMPLE_NUM; k=k+2*bb)               
  243.             {
  244.                 TR = FFT_REAL[k]; TI = FFT_IMAGE[k]; temp = FFT_REAL[k+bb];
  245.                 FFT_REAL[k] = FFT_REAL[k] + ((FFT_REAL[k+bb]*COS_TAB[p])>>7) + ((FFT_IMAGE[k+bb]*SIN_TAB[p])>>7);
  246.                 FFT_IMAGE[k] = FFT_IMAGE[k] - ((FFT_REAL[k+bb]*SIN_TAB[p])>>7) + ((FFT_IMAGE[k+bb]*COS_TAB[p])>>7);
  247.                 FFT_REAL[k+bb] = TR - ((FFT_REAL[k+bb]*COS_TAB[p])>>7) - ((FFT_IMAGE[k+bb]*SIN_TAB[p])>>7);
  248.                 FFT_IMAGE[k+bb] = TI + ((temp*SIN_TAB[p])>>7) - ((FFT_IMAGE[k+bb]*COS_TAB[p])>>7);

  249.                 FFT_REAL[k]  >>= 1;            
  250.                 FFT_IMAGE[k]  >>= 1;
  251.                 FFT_REAL[k+bb]  >>= 1;                 
  252.                 FFT_IMAGE[k+bb]  >>= 1;

  253.             }  
  254.         }
  255.     }
  256.         for(i = 0; i < 16; i++)
  257.         {
  258.                 ulReal = FFT_REAL[i + 1];
  259.                 ulReal *= ulReal;
  260.                 ulImage = FFT_IMAGE[i + 1];
  261.                 ulImage *= ulImage;
  262.                 AMP_TAB[i] = sqrt(ulImage + ulReal);
  263.                 if(AMP_TAB[i] < FFT_OUT_MIN)
  264.                         AMP_TAB[i] = 0;
  265.                 else
  266.                         AMP_TAB[i] -= FFT_OUT_MIN;
  267.                 if(AMP_TAB[i] > MAX)
  268.                         MAX = AMP_TAB[i];
  269.         }
  270.         if(MAX > 12)
  271.         {
  272.                 MAX /= 12;
  273.                 for(i = 0; i < 16; i++)
  274.                         AMP_TAB[i] /= MAX;
  275.         }
  276. }

  277. /************************************************
  278. *名                稱:main
  279. *功                能:主函數
  280. ************************************************/
  281. void main()
  282. {
  283.         IOInit();                                                            //初始化
  284.         TimerInit();
  285.         DISP_NUM = 0;
  286.         KEEP = 0;
  287.         KEEP_NUM = 0;
  288.         EA = 1;                                                                        //開中斷
  289.         ET1 = 1;
  290.         while(1)
  291.         {
  292.                 if(SWITCH_ON == 0)
  293.                 {
  294.                         ET0 = 0;
  295.                 }
  296.                 if(SWITCH_ON == 1)
  297.                 {
  298.                         ET0 = 1;
  299.                         FFT();
  300.                 }
  301.         }
  302. }

  303. /************************************************
  304. *名                稱:Timer0Interrupt
  305. *功                能:定時器0中斷服務程序-顯示
  306. ************************************************/
  307. void Timer0Interrupt() interrupt 1
  308. {
  309.         Display();
  310.         Delay(300);
  311. }
  312. /************************************************
  313. *名                稱:Timer1Interrupt
  314. *功                能:定時器1中斷服務程序-檢測開關狀態
  315. ************************************************/
  316. void Timer1Interrupt() interrupt 3
  317. {
  318.         if(SWITCH == 1)
  319.                 SWITCH_ON = 1;
  320.         if(SWITCH == 0)
  321.                 SWITCH_ON = 0;

  322.    }
復制代碼

評分

參與人數 1黑幣 +5 收起 理由
51heiikejilunta + 5 很給力!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线精品亚洲欧美日韩国产 | 亚洲欧美精 | 国产成人免费视频网站视频社区 | 色一情一乱一伦一区二区三区 | 亚洲一区二区三区在线播放 | 美女激情av | 狠狠亚洲 | 九九热免费在线观看 | 欧美日韩在线播放 | 九九热在线免费视频 | 免费观看毛片 | 久草资源在线视频 | 国产2区 | 色综合久 | 涩色视频在线观看 | 99久久久久 | 天天干狠狠干 | 欧美日韩在线成人 | 成人免费视频播放 | 欧美韩一区二区 | 国产一区二区中文字幕 | 91热爆在线观看 | 久久久久久亚洲精品不卡 | 香蕉视频91 | 欧美女优在线观看 | 欧美5区| 亚洲精品一区二区三区蜜桃久 | 欧美激情综合五月色丁香小说 | 国产小u女发育末成年 | 欧美一页 | 国产精品视频播放 | 亚洲日韩中文字幕一区 | 二区中文字幕 | 黄色毛片视频 | 欧美一区二区在线观看 | 欧美精品一区二区在线观看 | 99热精品在线观看 | 欧美日韩一卡 | 激情 婷婷 | 国产一区二区 | 91成人午夜性a一级毛片 |