新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用51單片機(jī)實(shí)現(xiàn)音頻信號(hào)的頻譜顯示

        用51單片機(jī)實(shí)現(xiàn)音頻信號(hào)的頻譜顯示

        作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏

        void Init()
        {

        //-----------------------------------------------------------------------------------
        P1ASF = 0x02; //0000,0010, 將 P1.1 置成模擬口
        AUXR1 &=0xFB; //1111,1011, 令 ADRJ=0
        EADC=1; //AD中斷打開(kāi)
        ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ADC_START | channel;
        //1110 1001 1打開(kāi) A/D (ADC_POWER)轉(zhuǎn)換電源;11速度為70周期一次;
        //0中斷標(biāo)志清零;1啟動(dòng)adc(ADC_START);001AD通道打開(kāi)(這里為P1.1);
        //-----------------------------------------------------------------------------------
        P2M0=1;
        P0M0=1;
        TMOD=0X12;
        TH0=0x30; //大約20K的采樣率(要完整頻段需40K以上。但音頻中10k以下居多,故本人選擇20K采樣,美觀些)
        TL0=0x30;
        TH1=0xEE;
        TL1=0XC0;
        ET0=1; //定時(shí)器0 打開(kāi)
        TR0=0; //關(guān)閉定時(shí)器
        ET1=1;
        TR1=1;
        PT1=0;
        PT0=1;
        IPH=PADCH;
        IP=PADC; //中斷優(yōu)先級(jí)
        EA=1; //總中斷打開(kāi)
        }


        void ADC_Finish() interrupt 5
        { ADC_CONTR &= !ADC_FLAG;
        Fft_Real[LIST_TAB[ADC_Count]]=(int)((ADC_RES)<<1)+(ADC_RESL>>1)-256;//-512; //按LIST_TAB表里的順序,進(jìn)行存儲(chǔ)采樣值,,
        // ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel; // 為了采集負(fù)電壓,采用 偏置采集。電壓提高到1/2 vcc,,所以要減去256
        if(ADC_Count<=127)ADC_Count++;
        else {EADC=0;TR0=0;}
        }

        void LED_Display() interrupt 3 //中斷一次 顯示一行。。。
        {
        TH1=0xF3;
        TL1=0X00;
        for (G=0;G<64;G++) //往點(diǎn)陣屏填充 一行的 數(shù)據(jù)
        {
        if(LED_TAB[G]<=LINE+16)SDA_R_TOP=1;
        else SDA_R_TOP=0;
        if(LED_TAB[G]<=LINE)SDA_R=1;
        else SDA_R=0;

        if(LED_TAB1[G]==LINE){SDA_G_TOP=1;SDA_G=0;}
        else if(LED_TAB1[G]==(LINE+16)){SDA_G_TOP=0;SDA_G=1;}
        else SDA_G=SDA_G_TOP=1;
        SHCP=1;SHCP=0;
        }
        STCP=1;STCP=0;
        P2=15-LINE;
        if(LINE>0)LINE--;
        else LINE=15;
        //////////////////////////

        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--; //柱狀遞減,
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--; //柱狀遞減,
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(LED_TAB[COUNT]>0)LED_TAB[COUNT]--;
        COUNT++;
        if(COUNT>=64)COUNT=0;

        //漂浮物遞減
        if(LED_TAB2[COUNT1]==0) //判斷是否需要停頓
        {
        if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;//大于柱狀則遞減(保持漂浮物在柱狀之上)
        }
        else LED_TAB2[COUNT1]--;
        COUNT1++;
        if(LED_TAB2[COUNT1]==0)
        {
        if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;
        }
        else LED_TAB2[COUNT1]--;
        COUNT1++;
        if(LED_TAB2[COUNT1]==0) //判斷是否需要停頓
        {
        if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;//大于柱狀則遞減(保持漂浮物在柱狀之上)
        }
        else LED_TAB2[COUNT1]--;
        COUNT1++;
        if(LED_TAB2[COUNT1]==0)
        {
        if(LED_TAB1[COUNT1]>LED_TAB[COUNT1])LED_TAB1[COUNT1]--;
        }
        else LED_TAB2[COUNT1]--;
        COUNT1++;
        if(COUNT1>=64)COUNT1=0;
        }

        void Ad_Control() interrupt 1 //控制采樣率
        {
        ADC_CONTR = ADC_POWER | ADC_SPEEDHH| ADC_START | channel; //開(kāi)始AD采集
        }
        //==============================================================================================================
        // ******************* main() *********************************
        //===============================================================================================================

        void main()
        {
        Init();
        while(1)
        {
        ADC_Count=0;
        TR0=1;
        EADC=1; //開(kāi)啟定時(shí)器中斷0,,開(kāi)啟ADC
        while(ADC_Count<128);
        FFT();
        //FFT運(yùn)算。并轉(zhuǎn)換為功率值。。。
        // TR1=1;
        }
        }


        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 贡觉县| 巴彦县| 十堰市| 射阳县| 邵阳县| 南康市| 鹿泉市| 禄丰县| 勃利县| 罗甸县| 张家川| 桐城市| 墨竹工卡县| 南昌县| 涪陵区| 罗甸县| 精河县| 苏尼特右旗| 彭州市| 禹城市| 利川市| 年辖:市辖区| 景德镇市| 曲靖市| 鄯善县| 中山市| 通江县| 友谊县| 南皮县| 江口县| 京山县| 吉木乃县| 富民县| 平湖市| 同德县| 富锦市| 江门市| 永仁县| 错那县| 海城市| 建阳市|