TEA5767完整收音机程序.docx
《TEA5767完整收音机程序.docx》由会员分享,可在线阅读,更多相关《TEA5767完整收音机程序.docx(17页珍藏版)》请在冰点文库上搜索。
![TEA5767完整收音机程序.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/225c6268-2784-4c9b-86c5-543129544e95/225c6268-2784-4c9b-86c5-543129544e951.gif)
TEA5767完整收音机程序
TEA5767完整收音机程序
/*tea5767完整程序*/
//****************************************************************************************************/
#include
#include
/***********************************************************************************/
#definemax_freq108000//108Mhz
#definemin_freq87500//87.5Mhz
#definemax_pll0x339b//108MHz时的pll.
#definemin_pll0x299d//87.5MHz时的pll.
#defineAdd_Freq1
#defineDec_Freq0
#defineREFERENCE_FREQ32.768
#defineATIIcxxDriverAddressW0xC0
#defineATIIcxxDriverAddressR0xC1
#define_Nop()_nop_(),_nop_(),_nop_(),_nop_(),_nop_()/*定义空指令*/
#defineLEDP0
voidInitialization(void);
voidGet_Pll(void);
voidGet_Frequency(void);
voidSearch(unsignedcharmode);
voidAuto_Search(unsignedcharmode);
unsignedcharGetKey();
voidDelay(unsignedcharTime);
voidLed_Display(unsignedlongi);
voidDelayD(unsignedcharTime);
unsignedcharGetKey();
voidDelay(unsignedcharTime);
voidATIICxx_PWrite(unsignedchar*McuAddress,unsignedcharcount);
voidATIICxx_PRead(unsignedchar*McuAddress,unsignedcharcount);
voidI2C_Send_Byte(unsignedcharsendbyte);
unsignedcharI2C_Receive_Byte(void);
voidI2C_Start(void);
voidI2C_Stop(void);
voidI2C_Ack(void);
voidI2C_Noack(void);
/*********************************************************************/
/*IIC读写程序芯片型号*/
sbitI2C_SCK=P3^0;/*实时时钟时钟线引脚*/
sbitI2C_SDA=P3^1;/*实时时钟数据线引脚*/
sbitk1=P1^7;
sbitk2=P1^6;
sbitk3=P1^5;
sbitk4=P1^4;
/*********************************************************************/
/************************************************************************/
sbitge=P2^3;
sbitshi=P2^2;
sbitbai=P2^1;
sbitqan=P2^0;
unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//0,1,23456789
/************************************************************************/
unsignedcharradio_write_data[5]={0x2d,0x56,0x20,0x11,0x00};//初始化写入TEA5767的数据(FM89.8Mhz)
unsignedcharradio_read_data[5];
unsignedintPll_Data;
unsignedlongFrequency_Data;
/***********************************************************************************/
voidInitialization(void)
{
TMOD=0x11;
TH0=0x5d;
TL0=0x3d;
TR0=0;//25ms
TH1=0x5d;
TL1=0x3d;
TR1=0;//25ms
T2CON=0x30;
RCAP2H=0xFE;
TH2=RCAP2H;
RCAP2L=0xFB;
TL2=RCAP2L;
TR2=0;//2400bps
PCON=0x00;
SCON=0xD0;
IP=0x14;
EX0=1;
IT0=1;
ET0=1;
EX1=1;
IT1=1;
ES=0;
EA=0;
}
/***********************************************************************************/
//读TEA5767状态,并转换成频率
voidRadio_Read(void)
{
unsignedchartemp_l,temp_h;
Pll_Data=0;
ATIICxx_PRead(&radio_read_data[0],5);
temp_l=radio_read_data[1];
temp_h=radio_read_data[0];
temp_h&=0x3f;
Pll_Data=temp_h*256+temp_l;
Get_Frequency();
}
/***********************************************************************************/
//由PLL计算频率
voidGet_Frequency(void)
{
unsignedcharhlsi;
unsignedintnpll=0;
npll=Pll_Data;
hlsi=radio_read_data[2]&0x10;
if(hlsi)
Frequency_Data=(unsignedlong)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25-225);//频率单位:
KHz
else
Frequency_Data=(unsignedlong)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25+225);//频率单位:
KHz
}
/***********************************************************************************/
//由频率计算PLL
voidGet_Pll(void)
{
unsignedcharhlsi;
hlsi=radio_read_data[2]&0x10;
if(hlsi)
Pll_Data=(unsignedint)((float)((Frequency_Data+225)*4)/(float)REFERENCE_FREQ);//频率单位:
k
else
Pll_Data=(unsignedint)((float)((Frequency_Data-225)*4)/(float)REFERENCE_FREQ);//频率单位:
k
}
/***********************************************************************************/
//手动设置频率,mode=1,+0.1MHz;mode="0:
-0".1MHz,不用考虑TEA5767用于搜台的相关位:
SM,SUD
voidSearch(unsignedcharmode)
{
Radio_Read();
if(mode)
{
Frequency_Data+=100;
if(Frequency_Data>max_freq)
Frequency_Data=min_freq;
}
else
{
Frequency_Data-=100;
if(Frequency_DataFrequency_Data=max_freq;
}
Get_Pll();
radio_write_data[0]=Pll_Data/256;
radio_write_data[1]=Pll_Data%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
ATIICxx_PWrite(&radio_write_data[0],5);
}
/***********************************************************************************/
//自动搜台,mode=1,频率增加搜台;mode="0:
频率减小搜台".
voidAuto_Search(unsignedcharmode)
{
Radio_Read();
Get_Pll();
if(mode)
{
radio_write_data[2]=0xb1;
if(Pll_Data>max_pll)
{
Pll_Data=min_pll;
}
}
else
{
radio_write_data[2]=0x41;
if(Pll_Data{
Pll_Data=max_pll;
}
}
radio_write_data[0]=Pll_Data/256+0x40;
radio_write_data[1]=Pll_Data%256;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
ATIICxx_PWrite(&radio_write_data[0],5);
Radio_Read();
while(!
(radio_read_data[0]&0x80))//RF电台就绪标志
{
Radio_Read();
}
}
/***********************************************************************************/
voidmain(void)
{
//0x2d,0x56,0x20,0x11,0x00
unsignedlongtemp;
Initialization();
radio_write_data[0]=0x2A;
radio_write_data[1]=0xB6;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
ATIICxx_PWrite(&radio_write_data[0],5);//初始化TEA5767(89.8Mhz)
Frequency_Data=89800;
while
(1)
{temp=Frequency_Data;
Led_Display(Frequency_Data);
if(k1==0)
{DelayD
(2);
while(k1==0);//等待键松开
Search(Add_Freq);
}
if(k2==0)
{DelayD
(2);
while(k2==0);//等待键松开
Search(Dec_Freq);
}
if(k3==0)
{DelayD
(2);
while(k3==0);//等待键松开
Auto_Search(Add_Freq);
}
if(k4==0)
{DelayD
(2);
while(k4==0);//等待键松开
Auto_Search(Dec_Freq);
}
}
}
/*********************************************************************/
structbytedata_2
{
unsignedcharByteH;
unsignedcharByteL;
};
unionint2byte
{
unsignedintIntData;
structbytedata_2ByteData;
};
/*********************************************************************/
//启动I2C总线,退出时SCL为低
voidI2C_Start(void)
{
I2C_SDA=1;/*发送起始条件的数据信号*/
_Nop();
I2C_SCK=1;
_Nop();_Nop();_Nop();_Nop();_Nop();/*起始条件建立时间大于4.7us,延时*/
I2C_SDA=0;/*发送起始信号*/
_Nop();_Nop();_Nop();_Nop();_Nop();/*起始条件锁定时间大于4μs*/
I2C_SCK=0;/*钳住I2C总线,准备发送或接收数据*/
_Nop();_Nop();_Nop();_Nop();_Nop();/*起始条件建立时间大于4.7us,延时*/
}
//*停止I2C总线
voidI2C_Stop(void)
{
I2C_SCK=0;
I2C_SDA=0;/*发送结束条件的数据信号*/
_Nop();/*发送结束条件的时钟信号*/
I2C_SCK=1;/*结束条件建立时间大于4μs*/
_Nop();_Nop();_Nop();_Nop();_Nop();
I2C_SDA=1;/*发送I2C总线结束信号*/
}
//MCU等待应答位(返回0表示应答)
bitI2C_WaitAck(void)
{
unsignedcharucErrTime=200;//因故障接收方无ACK,超时值。
I2C_SCK=0;
I2C_SDA=1;
_Nop();
I2C_SCK=1;
while(I2C_SDA)
{
ucErrTime--;
if(ucErrTime==0)
{
I2C_Stop();
return0;
}
}
I2C_SCK=0;
return1;
}
//MCU应答信号
voidI2C_Ack(void)
{
I2C_SCK=0;
I2C_SDA=0;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SCK=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
I2C_SCK=0;
}
//MCU发送非应答信号
voidI2C_Noack(void)
{
I2C_SCK=0;
I2C_SDA=1;
_Nop();
_Nop();
I2C_SCK=1;
_Nop();
_Nop();
I2C_SCK=0;
}
voidI2C_Send_Byte(unsignedcharsendbyte)
{
unsignedchari=8;
while(i--)
{
I2C_SCK=0;
_Nop();//_Nop();
if(sendbyte&0x80)I2C_SDA=1;
elseI2C_SDA=0;
_Nop();//_Nop();
I2C_SCK=1;
_Nop();//_Nop();
sendbyte<<=1;
}
I2C_WaitAck();
}
staticunsignedcharI2C_Receive_Byte(void)
{
unsignedchari=8,data_buffer;
I2C_SDA=1;
while(i--)
{
I2C_SCK=0;
_Nop();_Nop();
I2C_SCK=1;
_Nop();_Nop();
data_buffer<<=1;
if(I2C_SDA)data_buffer++;
}
return(data_buffer);
}
voidATIICxx_PWrite(unsignedchar*McuAddress,unsignedcharcount)
{
I2C_Start();
I2C_Send_Byte(ATIIcxxDriverAddressW);
while(count--)
{
I2C_Send_Byte(*(unsignedchar*)McuAddress);
((unsignedchar*)McuAddress)++;
}
I2C_Stop();
}
voidATIICxx_PRead(unsignedchar*McuAddress,unsignedcharcount)
{
I2C_Start();
I2C_Send_Byte(ATIIcxxDriverAddressR);
while(count--)
{
*McuAddress=I2C_Receive_Byte();
I2C_Ack();
McuAddress++;
}
I2C_Noack();
I2C_Stop();
}
voidDelayD(unsignedcharTime)
{
unsignedchari;
while(--Time!
=0)
{
for(i=0;i<125;i++);//i从0加到125,CPU大概就耗时1毫秒。
}
}
/************************************************************************/
voidLed_Display(unsignedlongi)//显示函数
{
LED=tab[i/100000];
qan=0;
bai=1;
shi=1;
ge=1;
DelayD(3);
LED=tab[(i%100000)/10000];
qan=1;
bai=0;
shi=1;
ge=1;
DelayD(3);
LED=tab[((i%100000)%10000)/1000]&0x7f;
qan=1;
bai=1;
shi=0;
ge=1;
DelayD(3);
LED=tab[(((i%100000)%10000)%1000)/100];
qan=1;
bai=1;
shi=1;
ge=0;
DelayD(3);
}