现在在做一个东东,用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;
}
//*************************************************************
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>