#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);
}
霞光照华
- 粉丝: 0
- 资源: 3
最新资源
- Python实现AVL树:自平衡二叉搜索树的构建与维护
- Python中的文本分析技术:从特征提取到模型应用
- 基于C++的Qt+mysql实现医院信息管理系统源码+数据库脚本(高分项目)
- NOI 全国青少年信息学奥林匹克竞赛(官网)-2024.11.05.pdf
- 【Unity抢劫和犯罪题材的低多边形3D资源包】POLYGON Heist - Low Poly 3D Art
- 网络安全是一个广泛的领域,涉及的知识和技能非常多样.docx
- 用Python实现,PySide构建GUI界面的“井字棋”游戏 具备学习功能(源码)
- 系统测试报告模板 测试目的、测试依据、测试准备、测试内容、测试结果及分析、总结
- 雷柏2.4G无线鼠标键盘对码软件V3.1
- Python基础入门-待办事项列表.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈