内容发布更新时间 : 2024/12/23 3:45:05星期一 下面是文章的全部内容请认真阅读。
基于TEA5767模块的数字FM收音机设计
num5=(Frequency_Data/10); str[0]=num1+'0'; str[1]=num2+'0'; str[2]=num3+'0'; str[3]='.';
str[4]=num4+'0'; str[5]=num5+'0'; str[6]='\\0';
LcdShowStr(0,1,str); }
/////////////////////////////////////////// ////////读TEA5767状态,并转换成PLL值////// void Radio_Read(void) {
unsigned char temp_l,temp_h; Pll_Data = 0;
ATIICxx_PRead(&radio_read_data[0],5); temp_l = radio_read_data[1]; //PLL值 temp_h = radio_read_data[0]; //PLL值 temp_h &= 0x3f;
Pll_Data = temp_h*256+temp_l; Get_Frequency(); }
//////////////////////////////////////// //由PLL计算频率
void Get_Frequency(void) {
unsigned char hlsi; unsigned int npll = 0; npll = Pll_Data;
hlsi = radio_read_data[2]&0x10; if (hlsi)
Frequency_Data =
(unsignedlong)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25-225); else
Frequency_Data =
(unsignedlong)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25+225);} //由频率计算PLL void Get_Pll(void) {
unsigned char hlsi;
hlsi = radio_read_data[2]&0x10; if (hlsi)
Pll_Data = (unsigned
int)((float)((Frequency_Data+225)*4)/(float)REFERENCE_FREQ); //频率单位:k else
Pll_Data = (unsigned
int)((float)((Frequency_Data-225)*4)/(float)REFERENCE_FREQ); //频率单位:k }
///////自动搜台,mode=1,频率增加搜台; mode=\频率减小搜台\void Auto_Search(unsigned char mode) {
LcdShowStr(10,0,\ //当搜索时,显示Auto if(mode) //mode=1,自动向上搜索 {
switch(index) //电平转换
21
基于TEA5767模块的数字FM收音机设计
{
case 0:
radio_write_data[2] = 0xA0;//低电平 低本振立体声非静音 break; case 1:
radio_write_data[2] = 0xC0;//中低电平 低本振立体声非静音 break; case 2:
radio_write_data[2] = 0xE0;//高电平 低本振立体声非静音 break; }
if(Pll_Data > max_pll) //当频率处于最高时, {
Pll_Data = min_pll; //自动转为最低频率 } }
else//向下搜索 {
switch(index) {
case 0:
radio_write_data[2]=0x20; //低电平 break; case 1:
radio_write_data[2]=0x40; //中低电平 break; case 2:
radio_write_data[2]=0x60; //高电平 break; }
if(Pll_Data < min_pll) {
Pll_Data = max_pll; } }
//////////调用I2C总线的写模式////////
ATIICxx_PWrite(&radio_write_data[0],5); Delay();//延时 Radio_Read(); LCDshow();
while(!(radio_read_data[0]&0x80))//RF电台就绪标志 若RF=1 则发现了一个电台或搜索到头;若 RF=0 未找到电台 {
Delay();//延时 Radio_Read();
if((radio_read_data[0]&0x40)==0x40)//搜索到头 {
if(mode) {
//ATIICxx_PWrite(&rdata[0],5);//初始化TEA5767(89.8Mhz) }
else {
//ATIICxx_PWrite(&radio_write_data[0],5);//初始化 TEA5767(89.8Mhz) } }
22
基于TEA5767模块的数字FM收音机设计
LCDshow(); }
LcdShowStr(10,0,\}
/////////////微调程序/////////////////////// void Search10(unsigned char mode) {
LcdShowStr(10,0,\ Delay();//延时 if(mode) {
Frequency_Data += 10;
if(Frequency_Data > max_freq) Frequency_Data = min_freq;
radio_write_data[2] = 0xA0;//低电平 低本振立体声非静音 }
else//向下搜索 {
Frequency_Data -= 10;
if(Frequency_Data < min_freq) Frequency_Data = max_freq;
radio_write_data[2]=0x20; //低电平 ,向下搜索模式 } Get_Pll();
radio_write_data[0] = Pll_Data/256;
radio_write_data[1] = Pll_Data%6; radio_write_data[3] = 0x17;//去噪 radio_write_data[4]=0x00;
ATIICxx_PWrite(&radio_write_data[0],5); LCDshow();
LcdShowStr(10,0,\}
//////////////////////////////////////// /////////抖动延迟程序/////////////////// void delay15ms(void) //误差 0us {
unsigned char i, j;
i = 30; j = 43; do {
while (--j); } while (--i); }
/////////////////////////////////////////
//////////////按键功能/////////////////// void Key() {
unsigned char str[3]; if(Key1==0) {
delay15ms();
while(Key1==0);//自动频道+ Auto_Search(Add_Freq); }
else if(Key2==0)//自动频道- {
23
基于TEA5767模块的数字FM收音机设计
delay15ms(); while(Key2==0);
Auto_Search(Dec_Freq); }
else if(Key3==0) //手动微加0.01 {
delay15ms(); if(Key3==0) {
Search10(Add_Freq); } }
else if(Key4==0) //手动微减0.01 {
delay15ms(); if(Key4==0) {
Search10(Dec_Freq); } }
else if(Key5==0)// {
delay15ms(); while(!Key5); if(index<2) {
index++; } else {
index=0; }
str[0]=index+'0'; str[1]='\\0';
LcdShowStr(15,1,str); } }
///////////////////////////////////// //////////////屏幕初始化///////////// void InitLCD() {
unsigned char str[3]; str[0]=index+'0'; str[1]='\\0'; LcdInit();
LcdShowStr(0,0,\ LcdShowStr(7,1,\ LcdShowStr(10,0,\ LcdShowStr(15,1,str); }
////////////////////////////////////// void main(void) {
InitLCD();//屏幕设置
ATIICxx_PWrite(&radio_write_data[0],5);//初始化TEA5767(89.8Mhz) Delay();
Radio_Read(); //把输入TEA5767的地址转换为频率 LCDshow(); //在屏幕上显示出来
24