<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > TEA5767的簡單收音機(jī)設(shè)計

          TEA5767的簡單收音機(jī)設(shè)計

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          TEA5767是飛利浦公司生產(chǎn)的一款收音機(jī)芯片,很多手機(jī),MP3、MP4里的收音機(jī)功能都是于他實現(xiàn)的。

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

          本文引用地址:http://www.ex-cimer.com/article/201611/319372.htm


          CPU:STC89C54RD+
          晶震:40M


          #include
          #include
          #include

          sbit SDA_5767=P1^0; //數(shù)據(jù)
          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字節(jié) 注釋如下(感覺有用的注下 詳細(xì)了解看手冊)
          //write_data[0] 第二位為1為搜索模式 后6為表示收音機(jī)頻率的高6位
          //write_data[1] 表示收音機(jī)頻率的低8位
          //write_data[2] 最高位表示搜索模式是向上還是向下 后兩位表示搜索的靈敏度 第四位立體聲和單聲道選擇位后四為左右聲道設(shè)置
          //write_data[3] 第三位表示日本頻率和國際頻率選擇位 第四位 震蕩頻率選擇位(與第五字節(jié)最高位共同決定)第七為數(shù)字降噪功能選擇
          //write_data[4] 最高位決定內(nèi)部震蕩頻率
          unsigned char read_data[5]; //讀取5字節(jié) 讀以上各寄存器的狀態(tài) 主要是頻率讀取

          unsigned long frequencry=0; //32位讀取頻率數(shù)據(jù)
          unsigned int pll; //16位轉(zhuǎn)換數(shù)據(jù)


          void delay(void) //延時函數(shù)
          {
          _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) //檢查應(yīng)答信號
          {
          SDA_5767=1;
          SCL_5767=1;
          F0=0;
          delay();
          if(SDA_5767) //如果數(shù)據(jù)為高 置位非應(yīng)答標(biāo)志FO
          F0=1; //通用標(biāo)志位 PSW狀態(tài)寄存器
          SCL_5767=0; //準(zhǔn)備下一變化數(shù)據(jù)
          }

          void Ack(void) //發(fā)響應(yīng)信號
          {
          SDA_5767=0;
          delay();
          SCL_5767=1;
          delay();
          SCL_5767=0;
          }

          void no_Ack(void) //發(fā)非響應(yīng)信號
          {
          SDA_5767=1;
          SCL_5767=0;
          delay();
          SCL_5767=1; //迫使數(shù)據(jù)傳輸結(jié)束
          delay();
          }

          void send_byte(unsigned char temp) //發(fā)送一字節(jié)數(shù)據(jù)
          {
          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數(shù)據(jù)線
          }

          unsigned char read_byte(void) //讀一字節(jié)數(shù)據(jù)
          {
          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數(shù)據(jù)線
          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() //獲得頻率數(shù)據(jù)
          {
          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() //將數(shù)據(jù)轉(zhuǎn)換為標(biāo)準(zhǔn)頻率
          {
          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() //將頻率轉(zhuǎn)換數(shù)據(jù)
          {
          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延時函數(shù)
          {
          register unsigned char j;
          while (count --)
          {
          for (j=0;j<230;j++);
          }
          }


          unsigned char GetKey() //鍵盤處理函數(shù)
          {
          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;
          }
          }
          }




          關(guān)鍵詞: TEA5767收音機(jī)設(shè)

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();