#include<avr/io.h>
#include<util/delay.h>
#include"./Head_main.h"
#include"./TEA5767.h"
#include"./EEPROM.h"
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
#define Wait() while(!(TWCR&(1<<TWINT))) //等待当前操作完成
#define TestACK() (TWSR&0xF8) //取出状态码
#define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
#define tea5767_add_w 0xc0
#define tea5767_add_r 0xc1
#define max_freq 108000
#define min_freq 87500
uint max_pll=0x339b; //108MHz时的pll,
uint min_pll=0x299d; //87.5MHz时的pll.
uchar radio_write_data[5]={0x2a,0xaa,0x40,0x11,0x40};//默认 897 江苏音乐电台 //要写入TEA5767的数据
uchar radio_read_data[5]={0}; //TEA5767读出的状态
//volatile unsigned long frequency=89800;
unsigned long frequency=89800;
uint pll=0x299d;
uint FMData[17]={
876,897,920,926,937,
966,975,997,1011,1017,
1024,1035,1043,1058,1066,
1071,1079};
/*
南京的调频:
01 FM 87.6 南京生活调频
02 FM 89.7 江苏音乐台城市之音
03 FM 92.0 南京曲艺调频
04 FM 92.6 江苏投资广播
05 FM 93.7 江苏全新闻调频
06 FM 96.6 南京新闻调频
07 FM 97.5 江苏经典音乐台
08 FM 99.7 江苏爱乐调频
09 FM 101.1 江苏交通广播网
10 FM 101.7 南京城市调频
11 FM 102.4 南京交通台
12 FM 103.5 南京城市管理广播
13 FM 104.3 南京体育台
14 FM 105.8 南京音乐台
15 FM 106.6 南京音乐台热力调频
16 FM 107.1 江苏居家广播
17 FM 107.9 江苏的士之声
*/
void Init_sys(void)
{
// DDRA=0X00;
// PORTA=0XFF;
// DDRB=0X00;
// PORTB=0XFF;
DDRC= 0xf0;
PORTC=0x03;//内部上拉电阻
}
/**************************************
模块名称:IIC总线初始化
模块功能:配置IIC总线,使之工作方式与tea5767相兼容。
**************************************/
void Init_twi(void)
{
TWCR=0x00; //关闭TWI总线
TWBR=12; //设置传输比特率
TWSR=0x00; //设置TWI总线的速度,频率不能大于400K,否则5767不工作
// TWCR=0x04; //使能TWI总线
TWCR=(1<<TWEN);
/* get_pll();
radio_write_data[0]=pll/256;
radio_write_data[1]=pll%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;*/
//radio_write();
}
//发送一个字节(twi_d为写入的数据)
void Write_byte(uchar twi_d)
{
TWDR=twi_d;
TWCR=(1<<TWINT)|(1<<TWEN);
Wait();
}
/**************************************
模块名称:TWI读取从设备数据程序
模块功能:读取5767
**************************************/
uchar Read_byte(void)
{
uchar temp=0;
//TWCR|=0x04;
TWCR=(1<<TWINT)|(1<<TWEN);
Wait();
temp=TWDR;
return temp;
}
void radio_write(void)
{
uchar i;
Start();
Wait();
// if((TWSR & 0xf8) == 0x18)
// PORTD |= (1<<PD3);
Write_byte(0xc0); //TEA5767写地址
//if(!iic_testack())
//{
for(i=0;i<5;i++)
{
Write_byte(radio_write_data[i]);
//iic_ack();
}
//}
Stop();
}
//由频率计算PLL
void get_pll(void)
{
uchar hlsi;
//uint 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)
{
uchar hlsi;
uint 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
}
//读TEA5767状态,并转换成频率
void radio_read(void)
{
uchar i=0;
uchar temp_l=0,temp_h=0;
pll=0;
Start();
Wait();
Write_byte(0xc1); //TEA5767读地址
//if(!iic_testack())
//{
for(i=0;i<5;i++)
{
radio_read_data[i] = Read_byte();
//iic_ack();
}
//}
Stop();
temp_l=radio_read_data[1];
temp_h=radio_read_data[0];
temp_h&=0x3f;
pll=temp_h*256+temp_l;
get_frequency();
}
//播放给定 频率点(KHZ)的电台
void Play_FM(unsigned long fre)
{
//uchar hlsi=0;
uint pllvalue=0;
//hlsi = radio_write_data[2] & 0x10;
//if(hlsi)
// pllvalue=(unsigned int)((float)((fre+225)*4)/(float)32.768); //频率单位:k
//else
pllvalue=(unsigned int)((float)((fre-225)*4)/(float)32.768); //频率单位:k
radio_write_data[0]=pllvalue/256; //不搜索模式
radio_write_data[1]=pllvalue%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x17; //高电平切割开,立体声噪声去除开
radio_write_data[4]=0x40;
radio_write();
}
//播放给定 Pll值 的电台
void Play_Pll(uint Pllvalue)
{
radio_write_data[0]=Pllvalue/256;//不搜索模式
radio_write_data[1]=Pllvalue%256;
radio_write_data[2]=0x41;
//radio_write_data[3]=0x11;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
radio_write();
}
//手动设置频率,mode=1,+0.01MHz; mode=0:-0.01MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
void search(uchar mode)
{
radio_read();
if(mode)
{
frequency+=100;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
frequency-=100;
if(frequency<min_freq)
frequency=max_freq;
}
get_pll();
radio_write_data[0]=pll/256;
radio_write_data[1]=pll%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
radio_write();
}
//自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台
void auto_search(uchar mode)
{
radio_read();
if(mode)
{
//radio_write_data[2]=0xb1;
radio_write_data[2]=0xd1;
frequency+=20;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
radio_write_data[2]=0x41;
frequency-=20;
if(frequency<min_freq)
frequency=max_freq;
}
get_pll();
radio_write_data[0]=pll/256+0x40; //加0x40是将SM置为1 为自动搜索模式
radio_write_data[1]=pll%256;
radio_write_data[3]=0x11; //SSL1和SSL0控制搜索停止条件
radio_write_data[4]=0x40;
radio_write();
radio_read();
PORTD &= ~(1<<PD4);
while(!(radio_read_data[0] & 0x80)) //搜台成功标志
{
radio_read();
}
PORTD |= (1<<PD4);
Play_Pll(pll);//搜索到台就播放
}
//播放预设的电台,频率值需 *100,num为电台序号
void Play_DianTai(uchar num)
{
Play_FM((unsigned long)FMData[num] * 100);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
我最新的调频收音机程序,单片机选用AVR,TWI完全兼容IIC,收音机模块为TEA5767,程序中有AVR内部EEPROM应用程序,虽主程序没有调用,但是EEPROM函数完全正确,我在其他地方用的,自写的,FM_TEA5767_OK_能自动搜台、播放_加入预设南京电台_加入EEPROM_2013.8.9
资源推荐
资源详情
资源评论
收起资源包目录
FM_TEA5767_OK_能自动搜台、播放_加入预设南京电台_加入EEPROM_2013.8.9.zip (20个子文件)
FM_TEA5767_OK_能自动搜台、播放_加入预设南京电台_加入EEPROM_2013.8.9
FM_TEA5767.aps 4KB
BSP
TEA5767.c 7KB
EEPROM.h 843B
TEA5767.h 1KB
EEPROM.c 2KB
Head_main.h 168B
fm_tea5767.aws 925B
FM_TEA5767_main.c 1KB
default
FM_TEA5767.lss 108KB
dep
EEPROM.o.d 2KB
TEA5767.o.d 2KB
FM_TEA5767_main.o.d 2KB
FM_TEA5767.elf 37KB
FM_TEA5767_main.o 4KB
EEPROM.o 5KB
FM_TEA5767.hex 14KB
Makefile 2KB
FM_TEA5767.eep 13B
TEA5767.o 11KB
FM_TEA5767.map 33KB
共 20 条
- 1
资源评论
- 不忘初心20222015-07-31可惜了,自动搜索功能都不能正常使用,别的功能都还不错
霞光照华
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功