新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > TEA5767的簡單收音機設計

        TEA5767的簡單收音機設計

        作者: 時間:2016-11-21 來源:網絡 收藏
        TEA5767是飛利浦公司生產的一款收音機芯片,很多手機,MP3、MP4里的收音機功能都是于他實現的。

          TEA5767HN 基本資料:
           高靈敏、低噪聲高頻放大器,
           收音頻率:87.6MHz~108MHz,(支持頻率范圍在76MHz~87.5MHz 之間的校園收音頻道),
           LC 調諧振蕩器使成本更低,RF AGC 電路
           內置調頻中頻選擇 ,I2C 總線控制
           內置FM 立體聲解調器 ,PLL 合成調諧解碼器
           兩個可編程端口 ,軟靜音,SNC(立體聲噪聲消除)
           自適應立體聲解碼,自動搜索功能
           等待模式,需要一個32.768KHz 晶體
           40 腳LQFP 封裝

        本文引用地址:http://www.104case.com/article/201611/319372.htm


        CPU:STC89C54RD+
        晶震:40M


        #include
        #include
        #include

        sbit SDA_5767=P1^0; //數據
        sbit SCL_5767=P1^1; // 時鐘
        sbit BUS_MODE=P1^2; // 總線選擇
        sbit BUS_ENABLE=P1^3; // 總線使能

        #define max_freq 108000 //108Mhz
        #define min_freq 87500 //87.5Mhz
        #define max_pll 0x339b //108MHz時的pll.
        #define min_pll 0x299d //87.5MHz時的pll.
        #define KEY P2 //P2口作為按鍵


        #define WADDR 0XC0 //寫地址
        #define RADDR 0XC1 //讀地址

        unsigned char write_data[5]={0x2b,0x05,0x61,0x11,0x40}; //每次寫入5字節 注釋如下(感覺有用的注下 詳細了解看手冊)
        //write_data[0] 第二位為1為搜索模式 后6為表示收音機頻率的高6位
        //write_data[1] 表示收音機頻率的低8位
        //write_data[2] 最高位表示搜索模式是向上還是向下 后兩位表示搜索的靈敏度 第四位立體聲和單聲道選擇位后四為左右聲道設置
        //write_data[3] 第三位表示日本頻率和國際頻率選擇位 第四位 震蕩頻率選擇位(與第五字節最高位共同決定)第七為數字降噪功能選擇
        //write_data[4] 最高位決定內部震蕩頻率
        unsigned char read_data[5]; //讀取5字節 讀以上各寄存器的狀態 主要是頻率讀取

        unsigned long frequencry=0; //32位讀取頻率數據
        unsigned int pll; //16位轉換數據


        void delay(void) //延時函數
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }

        void start_5767(void)//起始
        {
        BUS_ENABLE=1;
        SDA_5767=1;
        SCL_5767=1;
        delay();
        SDA_5767=0;
        delay();
        SCL_5767=0;
        }

        void stop_5767(void)//停止
        {
        SDA_5767=0;
        SCL_5767=1;
        delay();
        SDA_5767=1;
        delay();
        SCL_5767=0;
        BUS_ENABLE=0;
        }

        void Check_Ack(void) //檢查應答信號
        {
        SDA_5767=1;
        SCL_5767=1;
        F0=0;
        delay();
        if(SDA_5767) //如果數據為高 置位非應答標志FO
        F0=1; //通用標志位 PSW狀態寄存器
        SCL_5767=0; //準備下一變化數據
        }

        void Ack(void) //發響應信號
        {
        SDA_5767=0;
        delay();
        SCL_5767=1;
        delay();
        SCL_5767=0;
        }

        void no_Ack(void) //發非響應信號
        {
        SDA_5767=1;
        SCL_5767=0;
        delay();
        SCL_5767=1; //迫使數據傳輸結束
        delay();
        }

        void send_byte(unsigned char temp) //發送一字節數據
        {
        unsigned char i=8;
        while(i--)
        {
        SDA_5767=(bit)(temp&0x80);
        SCL_5767=1;
        delay();
        SCL_5767=0;
        temp<<=1;
        }
        SCL_5767=0;
        delay();
        SDA_5767=1; //釋放SDA數據線
        }

        unsigned char read_byte(void) //讀一字節數據
        {
        unsigned char i=8;
        unsigned char temp;
        while(i--)
        {
        temp<<=1;
        if(SDA_5767)
        temp++;
        SCL_5767=1;
        delay();
        SCL_5767=0;
        }
        SCL_5767=0;
        delay();
        SDA_5767=1; //釋放SDA數據線
        return (temp);
        }

        void write_radio()
        {
        unsigned char i;
        start_5767();
        send_byte(WADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        for(i=0;i<5;i++)
        {
        send_byte(write_data[i]);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        }
        stop_5767();
        }


        void read_radio()
        {
        unsigned char i;
        start_5767();
        send_byte(RADDR);
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        for(i=0;i<5;i++)
        {
        read_data[i]=read_byte();
        Check_Ack();
        if(F0)
        {
        no_Ack();
        return;
        }
        Ack();
        }
        stop_5767();
        }

        unsigned int get_radio() //獲得頻率數據
        {
        unsigned char tmp_h,tmp_l;
        read_radio();
        tmp_h=read_data[0]&0x3f;
        tmp_l=read_data[1];
        return (tmp_h<<8|tmp_l);
        }

        void get_frequencry() //將數據轉換為標準頻率
        {
        unsigned char tmp_data;
        unsigned int pll_data;
        pll_data=get_radio();
        tmp_data=read_data[2]&0x10;
        if(tmp_data)
        frequencry= (pll_data*32768/4-225000)/1000; //(單位KHZ)
        else
        frequencry= (pll_data*32768/4+225000)/1000; // (單位KHZ)
        }

        void get_pll() //將頻率轉換數據
        {
        unsigned char tmp_data;
        unsigned int pll_data;
        unsigned long tmp_pll;
        pll_data=get_radio();
        tmp_data=read_data[2]&0x10;
        if(tmp_data)
        tmp_pll=(frequencry+255000)*4/32768;// (單位HZ)
        else
        tmp_pll=(frequencry-255000)*4/32768; //(單位HZ)
        pll=(unsigned int)(tmp_pll/1000); //(單位 KHZ)
        }

        void search(bit mode) //手動搜臺
        {
        get_frequencry();
        if(mode)
        {
        frequencry+=100;
        if(frequencry>max_freq)
        frequencry=87500;
        }
        else
        {
        frequencry-=100;
        if(frequencry frequencry=108000;
        }
        get_pll();
        write_data[0]=(pll>>8)&0x3f;
        write_data[1]=pll&0xff;
        write_data[2]=0x61;
        write_data[3]=0x11;
        write_data[4]=0x40;
        write_radio();
        }

        void auto_search(bit mode) //自動搜臺
        {
        get_frequencry();
        get_pll();
        if(mode)
        {
        write_data[2]=0xe1;
        if(pll>max_pll)
        pll=min_pll;
        }
        else
        {
        write_data[2]=0x61;
        if(pllpll=max_pll;
        }
        write_data[0]=(pll>>8)&0x3f+0x40; //自動搜臺
        write_data[1]=pll&0xff;
        write_data[2]=0x61;
        write_data[3]=0x11;
        write_data[4]=0x40;
        write_radio();
        read_radio();
        while(!(read_data[0]&0x80)) //最高位為1 電臺就緒 否則一直讀
        {
        read_radio();
        }
        }

        void delay_xms(unsigned int count) //1MS延時函數
        {
        register unsigned char j;
        while (count --)
        {
        for (j=0;j<230;j++);
        }
        }


        unsigned char GetKey() //鍵盤處理函數
        {
        unsigned char m,n,e=0xff;

        KEY = 0x0f; //鍵盤口置00001111
        if (KEY != 0x0f) //查尋鍵盤口的值是否變化
        {
        delay_xms(20); //延時20毫秒
        if (KEY != 0x0f) //有鍵按下處理
        {
        m = KEY; //鍵值放入寄存器m
        }
        KEY = 0xf0; //將鍵盤口置為11110000
        n = KEY; //將第二次取得值放入寄存器n
        m |= n;
        switch(m)
        {
        case 0x7e: e = 0x00; break;
        case 0xbe: e = 0x01; break;
        case 0xde: e = 0x02; break;
        case 0xee: e = 0x03; break;
        case 0x7d: e = 0x04; break;
        case 0xbd: e = 0x05; break;
        case 0xdd: e = 0x06; break;
        case 0xed: e = 0x07; break;
        case 0x7b: e = 0x08; break;
        case 0xbb: e = 0x09; break;
        case 0xdb: e = 0x0a; break;
        case 0xeb: e = 0x0b; break;
        case 0x77: e = 0x0c; break;
        case 0xb7: e = 0x0d; break;
        case 0xd7: e = 0x0e; break;
        case 0xe7: e = 0x0f; break;
        default: break;
        }
        }

        KEY = 0x0f;
        while (KEY != 0x0f);

        return (e);
        }


        void main(void)
        {
        unsigned char i;
        TMOD = 0x11;
        TH0 = 0x5d;
        TL0 = 0x3d;
        TR0 = 0;
        TH1 = 0x5d;
        TL1 = 0x3d;
        TR1 = 0;
        PCON = 0x00;
        SCON = 0xD0;
        IP = 0x14;
        EX0 = 1;
        IT0 = 1;
        ET0 = 1;
        EX1 = 1;
        IT1 = 1;
        ES = 0;
        EA = 0;
        BUS_MODE=0;
        write_radio();//初始寫入 90M
        frequencry = 90000;

        while(1)
        {
        i = GetKey();

        switch (i)
        {
        case 0x00:
        search(1);
        break;


        case 0x01:
        search(0);
        break;


        case 0x02:
        auto_search(1);
        break;

        case 0x03:
        auto_search(0);
        break;

        default: break;
        }
        }
        }




        關鍵詞: TEA5767收音機設

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 万年县| 阿巴嘎旗| 克拉玛依市| 资兴市| 望城县| 苏尼特左旗| 修文县| 周至县| 报价| 沁水县| 渭源县| 万全县| 荔波县| 平和县| 宝清县| 明星| 大理市| 宜阳县| 庐江县| 崇文区| 获嘉县| 常宁市| 威宁| 中山市| 昌图县| 昆明市| 即墨市| 高阳县| 望城县| 阿图什市| 黄骅市| 四会市| 健康| 翼城县| 常德市| 疏勒县| 元朗区| 龙井市| 杭锦后旗| 太湖县| 金寨县|