搜索
bottom↓
回复: 2

请教用过立体声收音模块TEA5767的朋友!我的收音指示位(RF)工作不正常

[复制链接]

出0入0汤圆

发表于 2010-6-26 21:23:25 | 显示全部楼层 |阅读模式
现在在做一个东东,用PIC12F508控制立体声收音模块TEA5767,通过几个拨码开关,PIC12F508直接跟据开关的状态直接送频率值到TEA5767中,现在收音等都已正常工作,但用一个LED指示是否有信号就是不行,这个LED的状态由于从TEA5767读出的第1个字节的最高位RF来决定,手册说:其是准备好标志:RF=1,有一个频道被搜到或者一个制式已经符合,但现在不管我是否关掉发射机,LED都一直是亮.而我改用立体声位做测试时(第三个字节的STEREO位),却可以正常工作,可以跟据收到的信号是否是立体声而点亮熄灭LED.所以我实不知问题出在那里了.我换了两个模块,试过用电池供电,也不行.下面附上我的程式,看看做的朋友能不能指点一下.多谢了.
/******************************************************************************
              ------------------
        VDD--|                |--VSS
(开关1) GP5--|   PIC12F508/9        |--GP0(I2C-D)
(开关2) GP4--|       4 M               |--GP1(I2C-C)
(开关3) GP3--|                |--GP2(LED)
             ------------------
/******************************************************************/               
#include <pic.h>
#include <pic125xx.h>
//*********************************************************************
#define SDA  GP0          //I2C的数据引脚
#define SCL  GP1          //I2C的时钟引脚
//***********
#define LED  GP2          //LED驱动引脚
//***********
#define Switch1 GP5          //开关1
#define Switch2 GP4          //开关2
#define Switch3 GP3          //开关3
//************************************
unsigned char radio_write_data[5];//要写入TEA5767的数据
unsigned char radio_read_data[5];         //TEA5767读出的状态  
//************************************
void iic_start();//启动I2C总线
void iic_stop();//终止I2C总线
void iic_ack();//发送应答信号
void iic_NoAck();//没有应答信号
bit iic_testack();//测试应答信号
void iic_write8bit(unsigned char input);//IIC发送一个字节
unsigned char iic_read8bit();//IIC读一个字节
char ErrorBit=0;//应答出错标志位
//*********
void radio_write(void);//写TEA5767
void radio_read(void);//读TEA5767状态
void delay(void);//延时 150ms
//*********
unsigned char KeyChar=0;//三个按键的组合值。
unsigned char KeyCharTemp=0;//三个按键的数值长期保存寄存器
bit KeyChange=0;//有按键标志位。
//*********
unsigned int number;//延时用计数器
#define DelayNum 4//定义迁时的计数值,现大约延时50us左右。
//************************************
__CONFIG (MCLRDIS & WDTDIS & UNPROTECT & INTRC );//PIC12F508的配置字,内部晶体4M.
//****************************************************************************************   
//主程式
//****************************************************************************************
void main(void)
        {
//*******************************************
        OPTION=0X80;//定义选项寄存器
        TRIS=0b00111000;//定义GPIO引脚的方向。
//***************
        SDA=1;          //I2C的数据引脚
        SCL=1;          //I2C的时钟引脚
//***************
        while(1)
                {
                //*****************************三个按键扫描,组成组合值。
                KeyChar=0;
                if(Switch3==0)//取第三个键值
                        {
                        KeyChar=KeyChar+1;
                        }
                //*****
                KeyChar<<=1;
                //*****
                if(Switch2==0)//取第二个键值
                        {
                        KeyChar=KeyChar+1;
                        }
                //*****
                KeyChar<<=1;
                //*****
                if(Switch1==0)//取第一个键值
                        {
                        KeyChar=KeyChar+1;
                        }
                if(KeyCharTemp!=KeyChar)
                        {
                        KeyChange=1;
                        KeyCharTemp=KeyChar;
                        }
                else KeyChange=0;
//*****************************跟据键值的组合,决定输出到TEA5767的PLL值为多少。
        switch(KeyChar)
                {
                case 0:
                        {
                        radio_write_data[0]=0x29;
                        radio_write_data[1]=0xb6;//前面两个字节为PLL值87.7MHz:(87700-225)*4/32.768
                        break;
                        }
                case 1:
                        {
                        radio_write_data[0]=0x29;
                        radio_write_data[1]=0xce;//前面两个字节为PLL值87.9MHz
                        break;
                        }
                case 2:
                        {
                        radio_write_data[0]=0x29;
                        radio_write_data[1]=0xe6;//前面两个字节为PLL值88.1MHz
                        break;
                        }
                case 3:
                        {
                        radio_write_data[0]=0x29;
                        radio_write_data[1]=0xff;//前面两个字节为PLL值88.3MHz
                        break;
                        }
                case 4:
                        {
                        radio_write_data[0]=0x2a;
                        radio_write_data[1]=0x17;//前面两个字节为PLL值88.5MHz
                        break;
                        }
                case 5:
                        {
                        radio_write_data[0]=0x2a;
                        radio_write_data[1]=0x30;//前面两个字节为PLL值88.7MHz
                        break;
                        }
                case 6:
                        {
                        radio_write_data[0]=0x2a;
                        radio_write_data[1]=0x48;//前面两个字节为PLL值88.9MHz
                        break;
                        }
                case 7:
                        {
                        radio_write_data[0]=0x2a;
                        radio_write_data[1]=0x60;//前面两个字节为PLL值89.1MHz
                        break;
                        }
                }
//*****************************
        //radio_write_data[0]=0x30;
        //radio_write_data[1]=0x26;//前面两个字节为PLL值101.2MHz88.7MHz:(88700-225)*4/32.768
                radio_write_data[2]=0x20;//40
                radio_write_data[3]=0x11;//TEA5767用32.768K
                radio_write_data[4]=0x00;//00
                if(KeyChange==1) radio_write(); //写入配置到TEA5767中
                delay();//延时大约150ms左右,减慢CPU读TEA5767的速度,从而减少TEA5767的噪音
                radio_read();//读TEA5767
                radio_read_data[2]=(radio_read_data[2]&0x80);
                if(radio_read_data[2]==0x80)//立体声标志位 ,如果最高位stereo为1,则表示立体声。
                     {
                        LED=1; //收到一个台,则输出标志位
                     }  
                else LED=0;//收台不成功,则清LED标志位。
                }
//*******************************************
        }//主程式结束
//****************************************************************************************
//主程式结束
//****************************************************************************************
//*******************************************************
//延时 150ms
//*******************************************************
void delay(void)
        {
        unsigned char i,j;
        for(i=20;i>0;i++)
        for(j=248;j>0;j--);
        }

//*******************************************************
//写TEA5767
//*******************************************************
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();   
        }
//*******************************************************
//读TEA5767状态
//*******************************************************
void radio_read(void)
        {
    unsigned char i;
    iic_start();
    iic_write8bit(0xc1);        //TEA5767读地址
    if(!iic_testack())
            {
        for(i=0;i<5;i++)
                {
            radio_read_data=iic_read8bit();
            iic_ack();
                }
            }
    iic_stop();
        }
//****************************************************************************************
//以下部份为IIC部份的子程式。
//用PIC软件模拟IIC总线时,要注意定义IO的方向。
//*******************************************************
//IIC发送一个字节
//*******************************************************
void iic_write8bit(unsigned char input)
        {
        unsigned char temp;
        for(temp=8;temp!=0;temp--)
                 {
         // SDA=(bit)(input&0x80);
                  if(input&0x80)SDA=1;
                  else SDA=0;
                  //for(number=0;number<DelayNum;number++);
                  SCL=1;
                  //for(number=0;number<DelayNum;number++);
                  SCL=0;
          //        for(number=0;number<DelayNum;number++);
                  input=input<<1;
                 }
        }
//*******************************************************
//IIC读一个字节
//*******************************************************
unsigned char iic_read8bit()
        {
        unsigned char temp,rbyte=0;
        TRIS=0b00111001;//定义GP0(SDA)引脚输入。
        for(temp=8;temp!=0;temp--)
                 {
            SCL=1;
                  //for(number=0;number<DelayNum;number++);
                  rbyte=rbyte<<1;
                  rbyte=rbyte|((unsigned char)SDA);
                  SCL=0;
                 }
        TRIS=0b00111000;//定义GP0(SDA)引脚输出。
        return rbyte;
        }
//*******************************************************
//启动I2C总线的函数,当I2CSCL为高电平时使I2CSDA产生一个负跳变  
//*******************************************************
void iic_start()
        {
        SDA=1;
        //for(number=0;number<DelayNum;number++);
        SCL=1;
        //for(number=0;number<DelayNum;number++);
        SDA=0;
        //for(number=0;number<DelayNum;number++);
        SCL=0;
//        for(number=0;number<DelayNum;number++);
        }
//*******************************************************
//终止I2C总线,当I2CSCL为高电平时使I2CSDA产生一个正跳变
//*******************************************************
void iic_stop()
        {
        SCL=0;
//        for(number=0;number<DelayNum;number++);
        SDA=0;
//        for(number=0;number<DelayNum;number++);
        SCL=1;
//        for(number=0;number<DelayNum;number++);
        SDA=1;
//        for(number=0;number<DelayNum;number++);
        }
//*******************************************************
//发送应答信号
//*******************************************************
void iic_ack()
        {
        SDA=0;
        //for(number=0;number<DelayNum;number++);
        SCL=1;
//        for(number=0;number<DelayNum;number++);
        SCL=0;
        //for(number=0;number<DelayNum;number++);
        SDA=1;
//        for(number=0;number<DelayNum;number++);
        }
//*******************************************************
//没有应答信号
//*******************************************************
void iic_NoAck()
        {
        SDA=1;
        //for(number=0;number<DelayNum;number++);
        SCL=1;
//        for(number=0;number<DelayNum;number++);
        SCL=0;
//        for(number=0;number<DelayNum;number++);
        SDA=0;
//        for(number=0;number<DelayNum;number++);
        }
//*******************************************************
//测试应答信号
//*******************************************************
bit iic_testack()
        {
        TRIS=0b00111001;//定义GP0(SDA)引脚输入。
        SDA=1;
//        for(number=0;number<DelayNum;number++);
        SCL=1;
//        for(number=0;number<DelayNum;number++);
        ErrorBit=SDA;
//        for(number=0;number<DelayNum;number++);
        SCL=0;
//        for(number=0;number<DelayNum;number++);
        TRIS=0b00111000;//定义GP0(SDA)引脚输出。
        return ErrorBit;
        }
//*************************************************************

出0入0汤圆

 楼主| 发表于 2010-6-26 22:17:43 | 显示全部楼层
自已顶一下吧.

出0入0汤圆

 楼主| 发表于 2010-6-27 12:43:58 | 显示全部楼层
有谁用过,说一句吧.多谢了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 22:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表