⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tea5767.h

📁 用Mega32+VS1003做的MP3(FAT32文件系统浏览)——源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/*
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 + -