新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT89S52+12MHZ+TEA5767的數碼管顯示調頻收音機

        AT89S52+12MHZ+TEA5767的數碼管顯示調頻收音機

        作者: 時間:2016-11-30 來源:網絡 收藏

        /*************************************************************************************************************/
        //由頻率計算PLL
        void get_pll(void)
        {
        unsigned char hlsi;
        unsigned int twpll = 0;
        hlsi = radio_write_data[2] & 0x10;
        if (hlsi)
        PLL = (unsigned int)((float)((frequency + 225) * 4) / (float)32.768); //頻率單位:k
        else
        PLL = (unsigned int)((float)((frequency - 225) * 4) / (float)32.768); //頻率單位:k
        }
        /*************************************************************************************************************/
        //由PLL計算頻率
        void get_frequency(void)//讀TEA5767狀態,并轉換成頻率
        {
        unsigned char hlsi;
        unsigned int npll = 0;
        npll = PLL;
        hlsi = radio_write_data[2] & 0x10;
        if (hlsi)
        frequency = (unsigned long)((float)(npll) * (float)8.192 - 225); //頻率單位:KHz
        else
        frequency = (unsignedlong)((float)(npll) * (float)8.192 + 225); //頻率單位:KHz
        }
        /**************************************************************************************************************/
        //讀TEA5767狀態,并轉換成頻率
        void radio_read(void)//讀收音機芯片數據
        {
        unsigned char i;
        unsigned char temp_l,temp_h;
        PLL = 0;
        iic_stop(); //結束總線傳輸
        iic_start(); //啟動總線傳輸
        iic_write8bit(0xc1); //TEA5767寫地址
        if(!iic_testack())
        {
        for(i = 0;i < 5;i++)
        {
        radio_read_data = iic_rdbyt();//從總線上讀取一個字節的數據
        iic_ack(); //發送應答位
        }
        }
        iic_stop(); //結束總線傳輸
        //RF = radio_read_data[0] & 0x80;
        IF = radio_read_data[2] & 0x7f; //去掉最高位就是IF值
        ADC = radio_read_data[3]; //去掉最高位就是IF值
        ADC >>= 4;
        //STEREO = radio_read_data[2] & 0x80; //最高位就是STEREO值
        temp_l = radio_read_data[1];
        temp_h = radio_read_data[0];
        temp_h &= 0x3f;
        PLL = temp_h * 256 + temp_l;
        get_frequency(); //讀TEA5767狀態,并轉換成頻率
        }
        /**************************************************************************************************************/
        #define max_freq 108000
        #define min_freq 87500
        //自動搜臺,mode=1,頻率增加搜臺; mode=0:頻率減小搜臺
        void auto_search(uchar dec)
        {
        int k = 0;
        //unsigned char aa[6] = {0};
        radio_write();//寫收音機芯片數據
        if(dec)//自動搜臺,mode=1,頻率增加搜臺
        {
        while(frequency < max_freq)//如果當前頻率小于最大頻率上限值
        {
        get_pll();//由頻率計算PLL
        radio_write_data[0] = PLL / 256;
        radio_write_data[1] = PLL % 256;
        radio_write_data[2] = 0xA0; //增加頻率搜索,低:ADC輸出大小為5,高充電電流
        radio_write_data[3] = 0x11; //fxtal=32.768KHz,軟件靜音開
        radio_write_data[4] = 0x80; //6.5MHz的鎖相環參考頻率開,去加重時間常數為50us。
        radio_write_data[0] |= 0x40; //0100 0000 = SM / SM=1 則處于搜索模式
        radio_write(); //寫入TEA5767
        desplay(frequency / 100); //調用顯示
        radio_read(); //讀收音機芯片數據
        //if((radio_read_data[0] & 0x80))//如果有一個頻道被搜到或者一個制式已經符合
        if((IF < 0x3e) && (IF > 0x31) && (ADC > 4))//&&(STEREO)&&(RF))//如搜到電臺
        {
        frequency += 100;
        return;
        }
        }
        frequency = min_freq;//將最小頻率下限值賦給當前頻率
        }
        else//自動搜臺, mode=0:頻率減小搜臺
        {
        while(frequency > min_freq)//如果當前頻率大于最小頻率下限值
        {
        get_pll();//由頻率計算PLL
        radio_write_data[0] = PLL / 256;
        radio_write_data[1] = PLL % 256;
        radio_write_data[2] = 0x20; //減小頻率搜索,低:ADC輸出大小為5,高充電電流
        radio_write_data[3] = 0x11; //fxtal=32.768KHz,軟件靜音開
        radio_write_data[4] = 0x80; //6.5MHz的鎖相環參考頻率開,去加重時間常數為50us。
        radio_write_data[0] |= 0x40; //0100 0000 = SM / SM=1 則處于搜索模式
        radio_write(); //寫入TEA5767
        desplay(frequency / 100); //調用顯示
        radio_read();//讀收音機芯片數據
        //if((radio_read_data[0] & 0x80))//如果有一個頻道被搜到或者一個制式已經符合
        if((IF < 0x3e) && (IF > 0x31) && (ADC > 4))//&&(STEREO)&&(RF))//如搜到電臺
        {
        frequency -= 100;
        return;
        }
        }
        frequency = max_freq;//將最大頻率上限值賦給當前頻率
        }
        }
        /**************************************************************************************************************/
        void main()
        {
        /**************************************************************************************************************
        //觀察變量用
        unsigned char B,D;
        frequency = 104900;
        PLL = (unsigned int)((float)((frequency + 225)) / (float)8.192);
        B = PLL/256;
        D = PLL % 256;
        delay();
        /**************************************************************************************************************/
        delays(1000); //延時消抖
        search(); //寫入初始化電臺頻率
        //radio_read();
        while(1)
        {
        if(!KEY1) //手動設置頻率, + 0.1MHz;
        {
        delays(250); //延時消抖
        frequency += 100;
        if(frequency > 108500) //頻率如果大于108.5MHz
        frequency = 87500; //頻率設定為87.5MHz
        search(); //將顯示的頻率算好后寫到TEA5767芯片里面
        desplay(frequency / 100); //調用顯示
        }
        /**************************************************************************************************************/
        if(!KEY2) //手動設置頻率,-0.1MHz;
        {
        delays(20); //延時消抖
        frequency -=100;
        if(frequency < 87500) //頻率如果小于87.5MHz
        frequency = 108500; //頻率設定為108.5MHz
        search(); //將顯示的頻率算好后寫到TEA5767芯片里面
        desplay(frequency / 100); //調用顯示
        }
        /**************************************************************************************************************/
        if(!KEY3) //加頻率
        {
        delays(250); //延時消抖
        if(!KEY3)
        {
        auto_search(1);//自動搜臺,mode=1,頻率增加搜臺
        }
        while(!KEY3) desplay(frequency / 100);//調用顯示
        }
        /**************************************************************************************************************/
        if(!KEY4) //減頻率
        {
        delays(20); //延時消抖
        if(!KEY4)
        {
        auto_search(0);//自動搜臺mode=0:頻率減小搜臺
        }
        while(!KEY4) desplay(frequency / 100);//調用顯示
        }
        desplay(frequency / 100); //調用顯示
        }
        }
        /**************************************************************************************************************/

        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长沙县| 收藏| 双流县| 柳林县| 林甸县| 房产| 靖江市| 安乡县| 温泉县| 沁水县| 大宁县| 沁阳市| 桂平市| 平果县| 平舆县| 和田市| 喜德县| 邵东县| 赤壁市| 林州市| 巢湖市| 南投县| 邻水| 峡江县| 卢龙县| 宜州市| 嵊州市| 平利县| 沂水县| 左权县| 长沙市| 镇宁| 聊城市| 河源市| 宝坻区| 玉山县| 竹溪县| 马关县| 白水县| 扎兰屯市| 黑龙江省|