tea5767收音机模块
单片机采用stc12c5404ad收音芯片是tea5767 输出接小音箱(做喇叭部分) 硬件电路已经搭建完毕喇叭的声音一直是莎莎的音由于我房间只能搜到一个台(以前的收音机收的)99.5mhz#include<stc12c5404.h>
#include <iic.h>
/***********************************************/
#define uchar unsigned char
#define uint unsigned int
#define duan P2
#define max_freq 108000
#define min_freq 87500
/***********************************************/
uchar code numtab={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0~f段码
uchar data disptab={0,9,0,5};
unsigned char radio_write_data={0x29,0xc2,0x20,0x11,0x00}; //要写入TEA5767的数据
unsigned char radio_read_data; //TEA5767读出的状态
/***********************************************/
unsigned long frequency;
unsigned int pll;
/***********************************************/
sbit d1=P1^4;sbit d2=P1^5;sbit d3=P1^6;sbit d4=P1^7;sbit sp=P3^7; //喇叭
/***********************************************/
// 函数声明区
void delay(void);
void display(void);
uchar read_key(void);
void delay1ms (unsigned int b);
void radio_write(void);
void get_pll(void);
void get_frequency(void);
void radio_read(void);
void search(bit mode);
/***********************************************/
void main(void) //主程序
{
uchar key;
P0=0x00;
P2=0x00;
P3=0x00;
ADC_CONTR=( 0x80|ADC_CONTR ); // 开ad电源
delay1ms(1);
P1M0=( 0x08|P1M0 ); // io模式
P1M1=( 0x08|P1M1 );
radio_write();
while(1)
{
display();
key=read_key();
switch (key)
{
case 1:search(1);break;
case 2:search(0);break;
default:break;
}
delay1ms(20);
// disptab=( (frequency/10)/100 );
// disptab=( (frequency/100) %10 );
// disptab=( (frequency%100 ) /10 );
// disptab=( frequency%10 );
}
}
void delay1ms (unsigned int b)//1ms
{
for(b;b>0;b--)
{unsigned int i;
for(i=0;i<300;i++)
{;}
}
}
void display(void) //显示程序
{
duan=numtab[ ( disptab ) ];d1=1;delay1ms(1);d1=0;
duan=numtab[ ( disptab ) ];d2=1;delay1ms(1);d2=0;
duan=numtab[ ( disptab ) ];d3=1;delay1ms(1);d3=0;
duan=numtab[ ( disptab ) ];d4=1;delay1ms(1);d4=0;
}
uchar read_key(void)
{
uchar key_temp;
ADC_CONTR=0x0e3; //设p1.3口为ad转换
ADC_CONTR=(ADC_CONTR | 0x08); //
while( ( !(ADC_CONTR & 0x10) ) );
ADC_CONTR=0xe7;
if( ADC_DATA <= 80) key_temp=0x01;
else if( (ADC_DATA >= 80) && (ADC_DATA <= 150) ) key_temp=0x02;
else if( (ADC_DATA >= 150) && (ADC_DATA <= 185) ) key_temp=0x03;
else if( (ADC_DATA >= 185) && (ADC_DATA <= 200) ) key_temp=0x04;
else key_temp=0x00;
return (key_temp);
}
void get_pll(void) //由频率计算PLL
{
unsigned char hlsi;
hlsi=radio_write_data&0x10;//HLSI位
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
}
void get_frequency(void) //由PLL计算频率
{
unsigned char hlsi;
unsigned int npll=0;
npll=pll;
hlsi=radio_write_data&0x10;
if (hlsi)
frequency=(unsigned long)((float)(npll)*(float)8.192-225); //频率单位:KHz
else
frequency=(unsigned long)((float)(npll)*(float)8.192+225); //频率单位:KHz
}
void radio_write(void)
{
unsigned char i;
iic_start();
iic_write8bit(0xc0); //TEA5767写地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
iic_write8bit(radio_write_data);
iic_ack();
}
}
iic_stop();
}
void radio_read(void) //读TEA5767状态,并转换成频率
{
unsigned char i;
unsigned char temp_l,temp_h;
pll=0;
iic_start();
iic_write8bit(0xc1); //TEA5767读地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
radio_read_data=iic_read8bit();
iic_ack();
}
}
iic_stop();
temp_l=radio_read_data;
temp_h=radio_read_data;
temp_h&=0x3f;
pll=temp_h*256+temp_l;
get_frequency();
}
void search(bit mode) //手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
{
radio_read();
if(mode)
{
frequency+=100;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
frequency-=100;
if(frequency<min_freq)
frequency=max_freq;
}
frequency=99500;
get_pll();
radio_write_data=pll/256;
radio_write_data=pll%256;
radio_write_data=0x20;
radio_write_data=0x11;
radio_write_data=0x00;
radio_write();
} 好东西。最近我也在做这个东西。顶一下。
页:
[1]