📄 tea5767.h
字号:
/*
TEA5767驱动程序:
unsigned char TEA5767_INTI(void); //初始化TWI
unsigned char set5767(void); //写TEA5767寄存器
void read5767(void); //读TEA5767寄存器
void set_frequency(unsigned long frequency) //设定频率 (输入设定频率)
void frequency_UP_DOWN(unsigned char mode) //当前频率+/- 步进 0.1MHz
占用AVR资源:
I/O口两个:SDA & SCL
两线串行接口TWI
正点原子@scut 08/09/11 (参考龙南代码)
/////////////////////////////////////////////////////////////////////////////////////////////////
TEA5767 FEATURES
FM band:
US/Europe (87.5 to 108 MHz)
Japanese (76 to 91MHz)
TEA5767 GENERAL DESCRIPTION
The TEA5767HN is a single-chip electronically tuned FM
stereo radio for low-voltage application with fully integrated
IF selectivity and demodulation. The radio is completely
adjustment-free and only requires a minimum of small and
low cost external components. The radio can be tuned to
the European, US and Japanese FM bands.
*/
#ifndef _TEA5767_INCLUDED_
#define _TEA5767_INCLUDED_
#include <delay.h>
#include <mega32.h>
#include "lcd13164.h"
#include "comm.h"
#define TWINT 7
#define TWSTA 5
#define TWEN 2
#define TWSTO 4
#define TWEA 6
#define START 0x08 //TWI 状态指示
#define MT_SLA_ACK 0x18
#define MT_DATA_ACK 0x28
#define LowestFM_US 87500 //87.5MHz
#define HighestFM_US 108000//108Mhz
#define LowestFM_JA 76000 //76MHz
#define HighestFM_JA 91000 //91Mhz
#define LOW_US_H 0x69
#define LOW_US_L 0xD8 //87.5 &108 MHz
#define HIG_US_H 0x73
#define HIG_US_L 0x9E //PLL FOR US band
#define LOW_JA_H 0x64
#define LOW_JA_L 0x5C //76 & 91 MHz
#define HIG_JA_H 0x6B
#define HIG_JA_L 0x83 //PLL FOR JA band
#define SLA_W 0xC0 //write TEA5767 地址
#define SLA_R 0xC1 //read
#define JPS 0X32 //日本模式
#define USA 0X12 //美国模式
unsigned char TEA5767_INTI(void); //初始化TWI
unsigned char set5767(void); //写TEA5767寄存器
void read5767(void); //读TEA5767寄存器
void change_frequency(void);
uchar search_station(unsigned char UP_DOWN);
void set_frequency(unsigned long frequency);
void frequency_UP_DOWN(unsigned char mode);
uchar senddata[5] ;//发送数据缓冲
uchar readdata[5] ;//接收数据缓冲
bit STEREO=0; //是否立体声
uchar SIGNAL_ADC=0;//信号强度
uchar Adc_Level; //搜索停止条件
uchar sCh_Num=0; //搜索到的最大的电台个数
uchar sCh_Cho=0; //当前选择的电台号码 CHx
eeprom uchar Ch_Cho,Ch_Num; //eeprom中的数据
eeprom unsigned long Ch_Value[30]; //存储电台
eeprom uchar JPUS;//欧美或者日本频段选择 0x12欧美 0x02日本
unsigned long frequency_set=0;//Khz 从寄存器里面读出的 频率值
unsigned long set_freq=0;//自己设定的 最终频率
/*
可显示 当前频率
是否立体声
ADC电压强度(信号强度)
搜到电台
频率到达最大/最小值指示
*/
//////////////////////////////TWINT 标志的清零必须通过软件写 "1" 来完成
unsigned char set5767(void)
{
uchar i = 0;
if(STEREO)senddata[2]&=0xf7;//bit3=0,立体声
else senddata[2]|=0x08;//bit3=1,单声道
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL
while (!(TWCR & (1<<TWINT)));// WAIT FOR START SIG 等待START信号发送完成
if ((TWSR & 0xF8) != START) return 0;
TWDR = SLA_W; // send address 写TEA5767的地址
TWCR = (1<<TWINT)|(1<<TWEN); //清TWI中断标志,使能发送。。。
while (!(TWCR & (1<<TWINT))); //等待发送完成。。。
if ((TWSR & 0xF8) !=MT_SLA_ACK) return 0; //ACK
for ( i = 0; i < 5; i++ )//连续发送5个字节
{
TWDR = senddata[i]; //写数据
TWCR = (1<<TWINT)|(1<<TWEN); // send data
while (!(TWCR & (1<<TWINT))); //等待发送完成
if ((TWSR & 0xF8) != MT_DATA_ACK) return 0;//ACK
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL
return 1;//发送成功
}
//////////////////////////////////////////////////////////////////
//改变频率之后读取收音机的状态
void change_frequency(void)
{
unsigned long nPLL =0; //PLL
uchar tbTmp1=readdata[1];//PLL7~PLL0
uchar tbTmp2=readdata[0];//PLL13~PLL8
read5767();//读取tea5767
tbTmp2&=0x3f;
nPLL=(unsigned long)tbTmp2*256+tbTmp1;//pll的数值 (0~8192)
if(senddata[2]&0x10)
frequency_set =(unsigned long)(nPLL*(float)8.192-225);
else
frequency_set =(unsigned long)(nPLL*(float)8.192+225);
SIGNAL_ADC=(readdata[3]&0xF0)>>4;//得到adc值的大小
}
//读tea5767的寄存器
void read5767(void)
{
uchar i = 0;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL
while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG 等待起始信号发送成功
//if ((TWSR & 0xF8) != START) return;
TWDR = SLA_R;//读tea5767
TWCR=(1<<TWINT)|(1<<TWEN); // send address 发送地址&读
while (!(TWCR & (1<<TWINT))); //等待发送完成
//if ((TWSR & 0xF8) !=MT_SLA_ACK) return; //ACK
for ( i = 0; i < 5; i++ ) //接收5个字节
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); // read data 使能自动应答
while (!(TWCR & (1<<TWINT))); //是否收到一个字节
readdata[i] = TWDR ; //保存到缓冲区
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL
//show_frequency();刷新读出的数据
}
//初始化tea5767
unsigned char TEA5767_INTI(void)
{
TWBR=0x5C; //分频系数 SCL frequency = CPU Clock frequency/(16+2*(TWBR)*4)
//约 70KHz 的时钟频率
TWCR = (1<<TWEN); //SEND STOP SIGNAL
senddata[0] = 0x29; //load 88.3MHz BIT6用于选择是否搜台模式1是/0否 0x29
//bit6 1搜索模式
//BIT7 MUTE1/NO MUTE0 PLL13...8
senddata[1] = 0xFF; // PLL7...0 F1
senddata[2] = 0x60; //bit7 0用于选择向上1/向下搜台0
//bit3 MS:1单声道 0:立体声
//bit 6&5ADC选择 0x20 ADC 5
//0x40 ADC 7
//0x60 ADC 10
//初始化EEPROM
if(Adc_Level>4)Adc_Level=0;//Adc_Level初始化
if(Ch_Num>30)Ch_Num=0;
if(Ch_Cho>30)Ch_Cho=0;
sCh_Num=Ch_Num;
sCh_Cho=Ch_Cho;
if(JPUS!=JPS&&JPUS!=USA)JPUS=USA;//初始化eeprom
senddata[3] = JPUS; //bit5 用于选择日本1/欧洲模式0
senddata[4] = 0x00; //不用改
return (set5767());
}
//频点显示
//类似进度条的东东,指示频段的位置
void pos_show(void)
{
uchar pos=0;
uchar t;
uint freq=0;
freq=set_freq/100;//显示设置的频率
if((senddata[3]&0x20)==0x20)pos=((freq-760)*8)/15;//日本模式
else pos=((freq-875)*16)/41; //欧美模式
Set_page(6);//定位行(页0~7)
Set_column(27);//定位列 28~108 80个精度位
Write_data(0xFC);
for(t=0;t<80;t++)//显示进度调
{
if(t==pos||t==pos+1)Write_data(0xfc);
else Write_data(0x84);
}
Write_data(0xFC);
}
//当条件改变时,更新LCD的显示信息
void Radio_msg(void)
{
uchar t;
//音量信息显示
Show_num(0,12,voltemp[0]);//显示音量
Show_num(0,40,voltemp[1]+7);//显示低音
Show_num(0,68,voltemp[2]+7);//显示高音
//频道信息显示
Show_icon(0,84,15+STEREO);//单声道/立体声
Show_num(0,115,SIGNAL_ADC);//显示信号强度
//显示极限值
if((senddata[3]&0x20)==0x20)//日本模式 76~91Mhz
{
show_minichar(6,0,12);//清掉8
show_minichar(6,6,12);//清掉5
show_minichar(6,124,12);//把8字去掉
Show_mininum(6,12,76);Show_mininum(6,112,91);
}else // 欧美模式 87.5~108Mhz
{
show_minichar(6,0,8);
show_minichar(6,6,7);
show_minichar(6,12,13);//小数点
show_minichar(6,18,5);
Show_mininum(6,112,10);
show_minichar(6,124,8);
}
//显示当前门限ADC的值
LCD_write_cstr(1,6,"Level:");
Show_char(1,42,Adc_Level+'0'); //显示adc值
//显示静音 或者 频道数
if(MUTE)
{
LCD_write_cstr(1,90,"MUTE");
Show_char(1,114,' ');
}
else
{
LCD_write_cstr(1,90,"CH:");
Show_num(1,108,sCh_Cho);//频道
}
//超重低音
Set_page(7);//定位行(页0~7)
Set_column(95);//定位列
if(voltemp[3]==0)for(t=0;t<24;t++)Write_data(bass[t]);//显示图标
else for(t=0;t<24;t++)Write_data(0x00); //不显示图标
//显示频率
Show_Freq(2,47,set_freq/100);//显示频率数值
pos_show();//显示频率位置
}
//收音机模式 gui显示
void Radio_GUI(void)
{
uchar t;
Cleardisplay(4); //清屏
invt=0; //防止反相显示
for(t=0;t<3;t++)Show_icon(0,28*t,5+t);//显示 音量/低音/高音
Show_icon(0,84,15); //显示立体声
Show_icon(0,103,17);//显示信号强度
Set_page(6); //定位行(页0~7)
Set_column(28); //定位列 28~108 80个精度位
Write_data(0xFC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -