新闻中心

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 下一页

评论


技术专区

关闭