|
本帖最后由 zpmzqr 于 2019-9-12 19:25 編輯
- #define uchar unsigned char
- #define uint unsigned int
- #define OUT_Port P0 //輸出
- #define ADC_CHO 0x00 //AD通道為(111) P1.0
- #define ADC_POWER 0x80 //AD電源
- #define ADC_START 0x08 //AD啟動
- #define ADC_FLAG 0x10 //AD標志
- //#define ADC_SPEED 0x00 //420 clocks
- //#define ADC_SPEED 0x20 //280 clocks
- //#define ADC_SPEED 0x40 //140 clocks
- #define ADC_SPEED 0x60 //70 clocks 31kHZ
- uchar code EF_Tab[]={0x01,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xff};//顯示效果
- uchar data ADCTmp_Tab[FFT_PCS]; // ADC輸入緩存
- uchar idata Gap_Tab[FFT_X]; //下落間隔計數
- uchar idata Out_Tab[FFT_X]; //實際輸出緩存
- uchar data ADC_Count=0; //采集計數
- sbit Rout=OUT_Port^4; //高中低音輸出端口
- sbit Gout=OUT_Port^5;
- sbit Bout=OUT_Port^6;
- sbit Yout=OUT_Port^7;
- bit ADCOK_BT;//采集完成標志
- void Display_OUT()//顯示數據輸出
- {
- if(Out_Tab[0]>7)Rout=1; else Rout=0; //高中低音指示燈輸出
- if(Out_Tab[1]>7)Gout=1; else Gout=0;
- if(Out_Tab[2]>6)Bout=1; else Bout=0;
- if(Out_Tab[3]>6)Yout=1; else Yout=0;
-
- TM1640_GRID[15]=EF_Tab[Out_Tab[0]]; //R0 1640點陣輸出
- TM1640_GRID[14]=0; //G0
- TM1640_GRID[13]=0;
- TM1640_GRID[12]=EF_Tab[Out_Tab[1]];
- TM1640_GRID[11]=EF_Tab[Out_Tab[2]];
- TM1640_GRID[10]=EF_Tab[Out_Tab[2]];
- TM1640_GRID[9]=EF_Tab[Out_Tab[3]];
- TM1640_GRID[8]=0;
- TM1640_GRID[7]=0;
- TM1640_GRID[6]=EF_Tab[Out_Tab[4]];
- TM1640_GRID[5]=EF_Tab[Out_Tab[5]];
- TM1640_GRID[4]=EF_Tab[Out_Tab[5]];
- TM1640_GRID[3]=EF_Tab[Out_Tab[6]];
- TM1640_GRID[2]=0;
- TM1640_GRID[1]=0;
- TM1640_GRID[0]=EF_Tab[Out_Tab[7]];
-
- TM1640B_GRID[15]=EF_Tab[Out_Tab[8]];
- TM1640B_GRID[14]=EF_Tab[Out_Tab[8]];
- TM1640B_GRID[13]=0;
- TM1640B_GRID[12]=EF_Tab[Out_Tab[9]];
- TM1640B_GRID[11]=0;
- TM1640B_GRID[10]=EF_Tab[Out_Tab[10]];
- TM1640B_GRID[9]=0;
- TM1640B_GRID[8]=EF_Tab[Out_Tab[11]];
- TM1640B_GRID[7]=EF_Tab[Out_Tab[12]];
- TM1640B_GRID[6]=0;
- TM1640B_GRID[5]=EF_Tab[Out_Tab[13]];
- TM1640B_GRID[4]=0;
- TM1640B_GRID[3]=EF_Tab[Out_Tab[14]];
- TM1640B_GRID[2]=0;
- TM1640B_GRID[1]=0;
- TM1640B_GRID[0]=EF_Tab[Out_Tab[15]];
- TM1640_WriteDisp(0x8b); //1640顯示
- }
- /*-----T1中斷-----------------------------刷新顯示----------------------*/
- void RefreshDisplay() interrupt 3
- {
- uchar i;
- TL1 = 0x33; //設置定時初值4MS
- TH1 = 0xE3; //設置定時初值
- if(Fft_DispBT) //顯示標志
- {
- for(i=0;i<FFT_X;i++)//輸出效果上升直接顯示,下落間斷
- {
- if(FftOut_Tab[i]>Out_Tab[i])
- {Out_Tab[i]=FftOut_Tab[i];Gap_Tab[i]=0;}
- else if(FftOut_Tab[i]<Out_Tab[i])
- {
- Gap_Tab[i]++;
- if(Gap_Tab[i]>4)
- {
- Out_Tab[i]--;Gap_Tab[i]=0;
- }
- }
- }
- Display_OUT(); //顯示輸出
- }
- }
- /*-----ADC中斷----------44100/128=345HZ頻率點------32000/64=500HZ頻率點----------------*/
- void ADC_Finish() interrupt 5 //ADC中斷
- {
- ADC_CONTR &= !ADC_FLAG; //清除標志
- ADCTmp_Tab[LIST_TAB[ADC_Count]]=ADC_RESL<<2;//按LIST_TAB表里的順序,進行存儲采樣值 低8位
- ADC_Count++;if(ADC_Count>=FFT_PCS){ADCOK_BT=1;ADC_Count=0;}//置位 EADC=0;TR0=0;
- }
- /*---T0中斷-啟動ADC控制采樣率,------------1000000US/32000HZ=31.25US-------------------------*/
- void Ad_Control() interrupt 1
- {
- ADC_CONTR = ADC_POWER | ADC_SPEED | ADC_START | ADC_CHO;//1110 1000 1打開 ADC_POWER轉換電源;11速度為70周期一次;0中斷標志清零;1啟動adc(ADC_START);000AD通道打開(這里為P1.0);
- }
- /*----------------------系統初始化----------22.1184-----------12T----------------------------*/
- void STC_INIT()
- {
- /*----------------------AD------------------------------------------------------------*/
- P1ASF = 0x01; //0000,0000, 將 P1.0 置成模擬口
- AUXR1|= 0x04; //1111,1011, ADRJ=1 高2位放ADC_RES 低8位放ADC_RESL
- EADC=1; //AD中斷打開
- ADC_CONTR = ADC_POWER | ADC_SPEED | ADC_CHO; //打開ADC電源
- /*----------------------Uint---------------------------------------------------------*/
- TMOD= 0X12; //T1 16位, T0 8位自動重載
- TL0 = 0xC6; //設置定時初值 頻率≈44KHZ,1000000/44100=22.67US; 值D6
- TH0 = 0xC6; //設置定時重載值 頻率≈32KHZ,1000000/32000=31.25US; 值C6
-
- TL1 = 0x33; //設置定時初值設4MS 采集64次時間 31.25*64=2000US+FFT時間≈3US
- TH1 = 0xE3; //設置定時初值
- ET0=1; //定時器0中斷打開
- TR0=0; //關閉定時器0
- ET1=1; //定時器1中斷打開
- TR1=1; //啟動定時器0
- PT1=0; //T1中斷優先級 0
- PT0=1; //T0中斷優先級 1
- IPH=0X20; //ADC中斷優先級 2
- PADC=1; //ADC中斷優先級 3
- EA=1; //總中斷打開
- OUT_Port=0X00; //輸出
- }
- void main()//主程序
- {
- unsigned char i;
- STC_INIT();
- TR0=1;EADC=1; //開啟定時器中斷0,開啟ADC
- while(1)
- {
- // ADC_Count=0;
- // TR0=1;EADC=1; //開啟定時器中斷0,開啟ADC
- // while(!ADCOK_BT);
- if(ADCOK_BT)
- {
- for(i=0;i<FFT_PCS;i++)
- {FftReal_Tab[i]=ADCTmp_Tab[i];FftImage_Tab[i]=0;}//
- FFT_OUT();//FFT運算并轉換為各頻段幅值
- ADCOK_BT=0;
- }
- }
- }
復制代碼 |
|