TEA5767收音机模块的C51控制程序
2013-02-28
大炮

这几天做个案子,用到飞利浦的TEA5767的收音机模块,在网上搜了下相关的内容,发现很多人都在问,可是提供编程指导的很少,可能是高手都不屑回答这些小问题吧,在这里我把我的部分程序及TEA5767的相关资料放上来吧,给需要的人一些参考.(PS:无锡硅动力的SP3767和TEA5767完全兼容,有中文资料)

TEA5767采用I2C或者三线接口控制,我是用的I2C,单片机用STC89C52,带1K EEPROM,可以掉电存台,1602LCD显示.

TEA5767读写数据都是5个字节,其中PLL参数14位,具体数据格式请看datasheet.以下程序中的函数可以直接在主程序中调用.

#include "iic.c"
#define max_freq 108000
#define min_freq 87500
unsigned char radio_write_data[5] = {0x29, 0xc2, 0x20, 0x11, 0x00}; //要写入TEA5767的数据
unsigned char radio_read_data[5];//TEA5767读出的状态
unsigned int default_pll = 0x29c2; //0x29f9;//默认存台的pll,87.8MHz
//unsigned int max_pll=0x339b;//108MHz时的pll,
//unsigned int min_pll=9000;//70MHz时的pll
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[i]);
            iic_ack();
        }
    }
    iic_stop();
}

//读TEA5767状态,并转换成频率
void radio_read(void)
{
    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[i] = iic_read8bit();
            iic_ack();
        }
    }
    iic_stop();
    temp_l = radio_read_data[1];
    temp_h = radio_read_data[0];
    temp_h &= 0x3f;
    pll = temp_h * 256 + temp_l;
    get_frequency();
}

//由频率计算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)
{
    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 = (unsigned long)((float)(npll) * (float)8.192 + 225);    //频率单位:KHz
    }
}

//手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
void search(bit mode)
{
    radio_read();
    if (mode) {
        frequency += 100;
        if (frequency > max_freq) {
            frequency = min_freq;
        }
    }
    else {
        frequency -= 100;
        if (frequency
            frequency = max_freq;
    }
get_pll();
    radio_write_data[0] = pll / 256;
    radio_write_data[1] = pll % 256;
    radio_write_data[2] = 0x20;
    radio_write_data[3] = 0x11;
    radio_write_data[4] = 0x00;
    radio_write();
}

//自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台
void auto_search(bit mode)
{
    radio_read();
    get_pll();
    if (mode) {
        radio_write_data[2] = 0xa0;
    }
    else {
        radio_write_data[2] = 0x20;
    }
    radio_write_data[0] = pll / 256 + 0x40;
    radio_write_data[1] = pll % 256;
    radio_write_data[3] = 0x11;
    radio_write_data[4] = 0x00;
    radio_write();
    radio_read();
    while (!(radio_read_data[0] & 0x80)) { //搜台成功标志
        radio_read();
        disp_freq(9, 1);
    }
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号