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

QQ登錄

只需一步,快速開始

搜索
查看: 2|回復(fù): 0
收起左側(cè)

請(qǐng)教LED3264雙色頻譜顯示問題

[復(fù)制鏈接]
ID:86421 發(fā)表于 2025-5-9 16:39 | 顯示全部樓層 |閱讀模式
做了一個(gè)STC15單片機(jī)驅(qū)動(dòng)的LED3264頻譜,24MHZ,代碼移植于本論壇中STC12C5A60S驅(qū)動(dòng)程序,F(xiàn)在的問題是:只顯示幅值,與頻率無關(guān)了,就是16個(gè)光柱都一般高,隨著音量大小一起跳動(dòng)。煩請(qǐng)哪位老師幫忙看一下代碼,問題出在哪?
  1. #include<math.h>
  2. #include"stc15.h"
  3. #include <intrins.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. #define ADC_POWER   0x80     //ADC 電源控制位。
  7. #define ADC_FLAG    0x10     //ADC 完成標(biāo)志
  8. #define ADC_START   0x08     //ADC 起始控制位
  9. #define ADC_SPEEDLL 0x00     //540 個(gè)時(shí)鐘
  10. #define ADC_SPEEDL  0x20     //360 個(gè)時(shí)鐘
  11. #define ADC_SPEEDH  0x40     //180 個(gè)時(shí)鐘
  12. #define ADC_SPEEDHH 0x60     //90  個(gè)時(shí)鐘

  13. sbit  R1=P3^6;           //上紅數(shù)據(jù)
  14. sbit  R2=P3^7;     //下紅數(shù)據(jù)
  15. sbit  G1=P2^4;           //上綠數(shù)據(jù)       
  16. sbit  G2=P2^5;     //下綠數(shù)據(jù)

  17. sbit  STR=P2^6;    //鎖存
  18. sbit  CLK=P2^7;    //時(shí)鐘
  19. sbit  OE=P3^5;     //

  20. sbit  IA=P2^0;     //行控制線A
  21. sbit  IB=P2^1;     //行控制線B
  22. sbit  IC=P2^2;     //行控制線C
  23. sbit  ID=P2^3;     //行控制線D
  24. /*--------------------------------------------
  25.     行輸出控制
  26. --------------------------------------------*/
  27. void hang(unsigned char Value)
  28. {
  29.         switch(Value)
  30.         {
  31.                                         case  0: {IA=0;IB=0;IC=0;ID=0;}break;
  32.                       case  1: {IA=1;IB=0;IC=0;ID=0;}break;
  33.                       case  2: {IA=0;IB=1;IC=0;ID=0;}break;
  34.                       case  3: {IA=1;IB=1;IC=0;ID=0;}break;
  35.           case  4: {IA=0;IB=0;IC=1;ID=0;}break;
  36.                       case  5: {IA=1;IB=0;IC=1;ID=0;}break;
  37.                       case  6: {IA=0;IB=1;IC=1;ID=0;}break;
  38.                       case  7: {IA=1;IB=1;IC=1;ID=0;}break;
  39.           case  8: {IA=0;IB=0;IC=0;ID=1;}break;
  40.                       case  9: {IA=1;IB=0;IC=0;ID=1;}break;
  41.                       case 10: {IA=0;IB=1;IC=0;ID=1;}break;
  42.                       case 11: {IA=1;IB=1;IC=0;ID=1;}break;
  43.           case 12: {IA=0;IB=0;IC=1;ID=1;}break;
  44.                       case 13: {IA=1;IB=0;IC=1;ID=1;}break;
  45.                        case 14: {IA=0;IB=1;IC=1;ID=1;}break;
  46.                 case 15: {IA=1;IB=1;IC=1;ID=1;}break;
  47.         }
  48.                                        
  49. }

  50. uchar COUNT=15,COUNT1=0,LINE=15;
  51. uint TEMP1;       
  52. uchar xdata LED_TAB2[16];                                //記錄 漂浮物 是否需要 停頓一下
  53. uchar xdata LED_TAB[16];                                //記錄紅色柱狀
  54. uchar xdata LED_TAB1[16];                                //記錄 漂浮點(diǎn)


  55. struct compx                                                                           //定義復(fù)數(shù)結(jié)構(gòu)體
  56. {
  57.         float real;
  58.         float imag;
  59. };

  60. xdata struct compx s[ 64 ];                                                       //FFT數(shù)據(jù)緩存放在XDATA空間
  61. struct compx EE(struct compx,struct compx);   //復(fù)數(shù)乘法函數(shù)的聲明
  62. void FFT(struct compx xin[],int N);                                    //FFT函數(shù)的聲明

  63. /*---------------------------------------------
  64.    ADC初始化,P1^0口音頻輸入
  65. --------------------------------------------*/
  66. void InitADC()
  67. {
  68.           P1ASF =0x01;              //P10口做AD 使用
  69.           P1M0 = 0x01;                    //0000,0001用于A/D轉(zhuǎn)換的P1.x口,先設(shè)為開漏
  70.           P1M1 = 0x01;              //0000,0001 P1.0先設(shè)為開漏。斷開內(nèi)部上拉電阻
  71.     ADC_RES = 0;               //清除結(jié)果寄存器
  72.           ADC_RESL = 0;                  
  73.     ADC_CONTR = ADC_POWER | ADC_SPEEDHH;         //40.96K采樣率  0xC8
  74. }

  75. /*---------------------------------------------
  76.     讀 ADC 數(shù)據(jù)
  77. --------------------------------------------*/
  78. unsigned int  GetADCResult(unsigned char  ch)
  79. {
  80.     ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
  81.     _nop_();                        
  82.     _nop_();
  83.     _nop_();
  84.     _nop_();
  85.     while (!(ADC_CONTR & ADC_FLAG));
  86.     ADC_CONTR &= ~ADC_FLAG;         
  87.     return (ADC_RES<<2+ADC_RESL);               
  88. }

  89. /*--------------------------------------------------------
  90.    復(fù)數(shù)乘法
  91. ---------------------------------------------------------*/
  92. struct compx EE(struct compx a1,struct compx b2)        
  93. {
  94.         struct compx b3;
  95.         b3.real=a1.real*b2.real-a1.imag*b2.imag;
  96.         b3.imag=a1.real*b2.imag+a1.imag*b2.real;
  97.         return(b3);
  98. }
  99. /*--------------------------------------------------------
  100.   FFT函數(shù)
  101. ---------------------------------------------------------*/
  102. void FFT(struct compx xin[],int N)                                  
  103. {
  104.         int f,m,nv2,nm1,i,k,j=1,l;
  105.         struct compx v,w,t;
  106.         nv2=N/2;
  107.         f=N;
  108.         for(m=1;(f=f/2)!=1;m++){;}
  109.         nm1=N-1;
  110.         for(i=0;i<nm1;i++)                                           //倒序操作
  111.         {
  112.                 if(i<j)
  113.                 {
  114.                         t=xin[j];
  115.                         xin[j]=xin[i];
  116.                         xin[i]=t;
  117.                 }
  118.                 k=nv2;                                                       //k為倒序中相應(yīng)位置的權(quán)值
  119.                 while(k<j)
  120.                 {
  121.                         j=j-k;
  122.                         k=k/2;
  123.                 }
  124.                 j=j+k;
  125.         }
  126.         {
  127.                 int le,lei,ip;
  128.                   float pi;
  129.                   for(l=1;l<=m;l++)
  130.                    {
  131.                 le=pow(2,l);                                                 //乘方
  132.                     lei=le/2;
  133.                     pi=3.14159265;
  134.                     v.real=1.0;
  135.                 v.imag=0.0;  
  136.                    w.real=cos(pi/lei);                                           //旋轉(zhuǎn)因子
  137.                     w.imag=-sin(pi/lei);
  138.                    
  139.                 for(j=1;j<=lei;j++)                                           //控制蝶形運(yùn)算的級(jí)數(shù)
  140.                      {
  141.                         for(i=j-1;i<N;i=i+le)                                         //控制每級(jí)蝶形運(yùn)算的次數(shù)
  142.                               {
  143.                                     ip=i+lei;
  144.                                        t=EE(xin[ ip ],v);
  145.                                        xin[ ip ].real=xin[ i ].real-t.real;   //蝶形計(jì)算
  146.                                        xin[ ip ].imag=xin[ i ].imag-t.imag;
  147.                                        xin[ i ].real=xin[ i ].real+t.real;
  148.                                        xin[ i ].imag=xin[ i ].imag+t.imag;
  149.                               }
  150.                               v=EE(v,w);   
  151.                       }     
  152.                    }
  153.           }
  154. }

  155. /*--------------------------------------------------------
  156.   顯示模式
  157. ---------------------------------------------------------*/
  158. void showbar()
  159. {                               
  160.   unsigned char i,j;
  161.        
  162.         for(j=0;j<16;j++)          //讀取FFT轉(zhuǎn)換數(shù)據(jù)
  163.         {
  164.                 TEMP1=sqrt(pow((s[i  ].real+s[i+1].real),2)+pow((s[i  ].imag+s[i+1].imag),2))/2;

  165.                 if(TEMP1>1)TEMP1--;
  166.                         else TEMP1=0;
  167.                         if(TEMP1>31)TEMP1=31;
  168.                         if(TEMP1>(LED_TAB[j]))LED_TAB[j]=TEMP1;       
  169.                         if(TEMP1>(LED_TAB1[j]))
  170.                         {
  171.                                 LED_TAB1[j]=TEMP1;
  172.                                 LED_TAB2[j]=14;                                                //提頓速度=12
  173.                         }
  174.         }
  175. }

  176. /*------------------------------------------------
  177.                     定時(shí)器0初始化子程序
  178. ------------------------------------------------*/
  179. void Init_Timer0(void)
  180. {
  181. TMOD |= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                     
  182. ET0=1;           //定時(shí)器中斷打開
  183. TR0=1;           //定時(shí)器開關(guān)打開
  184. EA=1;            //總中斷打開
  185. }
  186. /*------------------------------------------------
  187.                  定時(shí)器0中斷子程序
  188. ------------------------------------------------*/
  189. void LED_Display() interrupt 1
  190. {
  191.         uchar G;
  192.   TH0=(65536-2000)/256;                  //重新賦值
  193.   TL0=(65536-2000)%256;
  194.        
  195.           for        (G=0;G<16;G++)                                                  //往點(diǎn)陣屏填充 一行的 數(shù)據(jù)
  196.                 {       
  197.                         if(LED_TAB[G]<=LINE+16)R1=0;
  198.                         else R1=1;
  199.                   if(LED_TAB[G]<=LINE)R2=0;
  200.                         else R2=1;

  201.                         if(LED_TAB1[G]==LINE){G1=0;G2=1;}
  202.                         else if(LED_TAB1[G]==(LINE+16)){G1=1;G2=0;}
  203.                         else G2=G1=0;
  204.                         CLK=1;CLK=0;
  205.                         CLK=1;CLK=0;
  206.                         CLK=1;CLK=0;
  207.                         G1=0;G2=0;R1=0;R2=0;
  208.                         CLK=1;CLK=0;
  209.                 }
  210.                 STR=1;STR=0;

  211.     if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;                   //柱狀遞減,
  212.           if(COUNT>0)COUNT--;
  213.     else COUNT=15;

  214.                 if(LED_TAB2[COUNT1]==0)
  215.                          {
  216.                                         if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;
  217.                          }
  218.                 else LED_TAB2[COUNT1]--;
  219.                          COUNT1++;
  220.                 if(COUNT1>=16)COUNT1=0;
  221.    
  222.                 OE=1;
  223.                 hang(15-LINE);                        //行選
  224.                 OE=0;
  225.     if(LINE>0)LINE--;
  226.                 else LINE=15;               
  227. }

  228. /*-------------------------------------------------------------------
  229. 主函數(shù)
  230. -------------------------------------------------------------------*/
  231. void main()                                                                    
  232. {
  233.        
  234.         int N=64,i;                                                             //變量初始化,64點(diǎn)FFT運(yùn)算
  235.         float offset;
  236.        
  237.         P0M1=0x00;
  238.         P0M0=0x00;
  239.         P1M1=0x00;
  240.         P1M0=0x00;
  241.         P2M1=0x00;
  242.         P2M0=0x00;
  243.         P3M1=0x00;
  244.         P3M0=0x00;
  245.         P5M1=0x00;
  246.         P5M0=0x00;

  247.   Init_Timer0();
  248.         InitADC();          //ADC初始化
  249.        
  250.         offset=GetADCResult(0);
  251.        
  252.         while(1)
  253.         {       
  254.                         for(i=0;i<N;i++)                                      //采集音頻信號(hào)
  255.                   {
  256.                                 ADC_CONTR=0xC8;                                         //40.96K采樣率

  257.                                 while(!(ADC_CONTR&0x10));
  258.                                    s[i].real=((float)ADC_RES*4+(float)(ADC_RESL%0x04)-offset)/4;  //((((int)ADC_DATA-128)/2))*4;
  259.                                    s[i].imag=0;
  260.                   }
  261.                        
  262.                   FFT(s,N);        //調(diào)用FFT函數(shù)進(jìn)行變換
  263.       showbar();
  264.         }
  265. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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