yanyinzhong 发表于 2011-1-31 11:22:09

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();
}

fang_ls2001 发表于 2011-1-31 18:04:39

好东西。最近我也在做这个东西。顶一下。
页: [1]
查看完整版本: tea5767收音机模块