新聞中心

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

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

作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
TEA5767是飛利浦公司生產(chǎn)的一款收音機芯片,很多手機,MP3、MP4里的收音機功能都是于他實現(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://butianyuan.cn/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é) 注釋如下(感覺有用的注下 詳細了解看手冊)
//write_data[0] 第二位為1為搜索模式 后6為表示收音機頻率的高6位
//write_data[1] 表示收音機頻率的低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)答標志FO
F0=1; //通用標志位 PSW狀態(tài)寄存器
SCL_5767=0; //準備下一變化數(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)換為標準頻率
{
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收音機設(shè)

評論


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

關(guān)閉