找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3112|回复: 3
打印 上一主题 下一主题
收起左侧

网友TEA5767做FM收音机

[复制链接]
跳转到指定楼层
楼主
ID:104287 发表于 2016-1-30 01:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 51黑fan 于 2016-1-30 01:18 编辑

可能好多朋友说一个买收音机也就几块钱,何必花这么大精力鼓捣这个烂玩意,如果真有这个想法的朋友请打住,不要在往下面看了。之前也一直认为TEA5767较差,实际中发觉选择大厂的模块出来的音频经放大器推动后还是很有震撼力,大大超出我的预期。不过前提是使用好模块,而不是现在满淘宝卖的那种5-7块左右的那种简装版咯。

  TEA5767主要出来的音频没音量控制,也不够推动耳机。我就外加电子音量调节芯片、小功率放大、调节显示等。我电子音量选用M62429  显示选用了一种非常小尺寸的MINI1602  另外使用了手机上那种5向导航键、加了单键开关机电路,小功率放大选用2块TDA2822(3-6V) 就是TDA2822这次把我害惨了,PCB出来后所有正常,就是推动2个2W的小喇叭会有那种噗噗声,晕死。线路输出则很好,在网上一查,发觉很多朋友都有这个问题,现在这个玩意买不到贴片封装的原装进口的,而国产的做BTL方式放大时,由于内部2个放大器的参数国产工艺存在差异较大造成,而做普通双声道放大则不存在这个问题。唉~~ 国货呀,你什么时候才能让人放心!发誓以后再一不会选择使用TDA2822这个垃圾了(需要的朋友 我可以送 现在看着就恼火)




内部震荡 8M

部分参考程序:

Tea5767.c


#include "Tea5767.h"
#include "TwiLib.h"

// 初始化TEA5767
void TEA5767_Init(ulong Freq,uchar Mono)
{
    // 初始化
    TWI_Init();
    TEA5767_Adjust(Freq,Mono,TRUE);   
}

// 调整频率、声道
void TEA5767_Adjust(ulong Freq,uchar Mono,uchar MuteControl)
{
    uchar data[5]     = { 0 };
    ulong pll         = TEA5767_GetPLLFromFreq(Freq);
    data[0]         = (uchar)(pll/256);
    data[1]            = (uchar)(pll%256);
    data[2]         = (Mono!=0)?0x09:0x01;
    data[3]         = 0x92;
    if( MuteControl )
    {
        data[0]     |= 0x80;
        TWI_MasterSendBytes(TEA5767_TWI_ADDR,5,data);
        data[0]     &= 0x7f;
        DelayMs(500);
    }
    TWI_MasterSendBytes(TEA5767_TWI_ADDR,5,data);     
}

// 信号强度
uchar TEA5767_GetLevel()
{
    uchar data[5]     = { 0 };
    TWI_MasterRecvBytes(TEA5767_TWI_ADDR,5,data);
    return (data[3]>>4);
}



// 由频率计算PLL(频率单位为KHZ)
ulong TEA5767_GetPLLFromFreq(ulong Freq)
{
    ulong pll = (ulong)(((Freq-225)*4000)/32768);
    return pll;
}

// 由PLL计算频率(频率单位为KHZ)
ulong TEA5767_GetFreqFromPLL(ulong Pll)
{
    ulong Freq = (ulong)(((float)Pll)*((float)8.192)+225);
    return Freq;
}


Tea5767.h


#ifndef __TEA5767__H__INCLUDED__
#define __TEA5767__H__INCLUDED__
#include "common.h"

// TEA5767的TWI地址
#define TEA5767_TWI_ADDR             0xC0 // TEA5767基地址


// 初始化TEA5767(频率单位为KHZ)
void TEA5767_Init(ulong Freq,uchar Mono);

// 调整频率、声道
void TEA5767_Adjust(ulong Freq,uchar Mono,uchar MuteControl);

// 信号强度
uchar TEA5767_GetLevel();


// 由频率计算PLL(频率单位为KHZ)
ulong TEA5767_GetPLLFromFreq(ulong Freq);

// 由PLL计算频率(频率单位为KHZ)
ulong TEA5767_GetFreqFromPLL(ulong Pll);

#endif //  __TEA5767__H__INCLUDED__


FM62429.c
#include "FM62429.h"


// 初始化函数
void FM62429_Init(uchar Volume)
{
    FM62429_PORT_INIT();
    FM62429_AdjustVolume(Volume);
}

// 调整音量(0~84)
void FM62429_AdjustVolume(uchar Volume)
{
    uchar  i = 0;
    ushort VolData = 0;
    if( Volume > 0 )
    {
        Volume = Volume+3;
        VolData    = (ushort)(Volume&0x7C);
        VolData |= (ushort)((Volume&0x03)<<7);
    }
   
    // D9、D10均为1
    VolData |= 0x600;

    FM62429_SDA_L();
    FM62429_SCL_L();
    for( i = 0; i < 10; i++)
    {
        if( VolData & 0x01 )
            FM62429_SDA_H();
        else
            FM62429_SDA_L();
        
         FM62429_SCL_H();
         FM62429_SDA_L();
         FM62429_SCL_L();
         VolData >>= 1;
    }
    FM62429_SDA_H();
    FM62429_SCL_H();
    NOP();
    FM62429_SCL_L();
}

FM62429.h
  1. #ifndef __FM62429_H_INCLUDED__
  2. #define __FM62429_H_INCLUDED__
  3. #include "Common.h"


  4. // 端口定义
  5. #define FM62429_SDA_H()    SET_BIT(PORTB,PB2)
  6. #define FM62429_SDA_L()    CLR_BIT(PORTB,PB2)
  7. #define FM62429_SCL_H()    SET_BIT(PORTB,PB5)
  8. #define FM62429_SCL_L() CLR_BIT(PORTB,PB5)
  9. #define FM62429_PORT_INIT()    SET_BIT(DDRB,DDB2);SET_BIT(DDRB,DDB5)


  10. // 初始化函数
  11. void FM62429_Init(uchar Volume);

  12. // 调整音量(0-83)
  13. void FM62429_AdjustVolume(uchar Volume);

  14. #endif //__FM62429_H_INCLUDED__

  15. main.c

  16. #include <avr/eeprom.h>
  17. #include "common.h"
  18. #include "LCD1602.h"
  19. #include "TWILib.h"
  20. #include "Tea5767.h"
  21. #include "FM62429.h"


  22. #define OPER_MODE_RADIO            0         // 正常收音机模式
  23. #define OPER_MODE_SET            1        // 设置模式

  24. // 正确保存标志
  25. #define SAVE_MASK                0x4B    // 'K'

  26. // 设置模式
  27. #define SET_MODE_SEARCH            1    // 搜索
  28. #define SET_MODE_SOUNDMODE        2    // 立体声、单声道模式选中
  29. #define SET_MODE_MIN            1
  30. #define SET_MODE_MAX            2

  31. // 声音模式
  32. #define SOUND_MODE_STEREO        1
  33. #define SOUND_MODE_MONO            2
  34. #define SOUND_MODE_MIN            1
  35. #define SOUND_MODE_MAX            2

  36. // 音量
  37. #define VOLUME_MAX                84
  38. #define VOLUME_MIN                0
  39. #define CHANNEL_NUM                10
  40. #define CHANNEL_MIN                1
  41. #define CHANNEL_MAX                CHANNEL_NUM

  42. // 搜索模式
  43. #define STATE_SEARCH            1
  44. #define STATE_STORE                2

  45. // 最小频率
  46. #define FREQ_MIN                ((ulong)87500)
  47. #define FREQ_MAX                ((ulong)120000)

  48. // 全局变量
  49. uchar OperMode        = OPER_MODE_RADIO;  // 操作模式
  50. uchar SetMode       = SET_MODE_MIN;        // 搜索频道
  51. uchar SoundMode     = SOUND_MODE_MIN;    // 声音模式
  52. BOOL  DoingMenu     = FALSE;            // 是否处于选择菜单方式
  53. ushort BlinkCounter = 0;                // 控制闪烁
  54. uchar Volume         = 42;                // 音量
  55. ulong ChannelFreq    = 96600;            // 频道频率(单位为KHZ)
  56. ulong ChannelSearch = FREQ_MIN;            // 搜索起始频率
  57. uchar ChannelIndex        = 0;            // 当前播放的频道编号(1-10)
  58. uchar ChannelSaveIndex    = CHANNEL_MIN;
  59. uchar ChannelState        = STATE_SEARCH;


  60. // 开关健(PD7)
  61. #define POWER_ON()            
  62. #define POWER_OFF()            SET_BIT(DDRD,DDD7);CLR_BIT(PORTD,PD7);


  63. // 闪烁控制变量的最大值
  64. #define BLINK_COUNTER_MAX     10

  65. // 是否闪烁
  66. #define IS_BLINK()    (BlinkCounter > BLINK_COUNTER_MAX/2)

  67. //======================================================================================================
  68. // 预先保持的10个频道
  69. //======================================================================================================
  70. ulong EEMEM  ChannelConfig[CHANNEL_NUM+1]    =  { 0 };
  71. ulong          ChannelArray[CHANNEL_NUM+1 ]    =  { 0 };

  72. // 读取预先保持的频道
  73. void ReadChannelConfig()
  74. {
  75.     ulong data = 0;
  76.     uchar mask = 0 , i = 0;
  77.    
  78.     // 等待EEPROM空闲
  79.     eeprom_busy_wait();
  80.    
  81.     // 写入数据
  82.     eeprom_read_block( ChannelArray,ChannelConfig, 4*(1+CHANNEL_NUM));
  83.    
  84.     // 解析第一个字节,构造第一个字节,从地位到高位分别是:ChannelIndex,Volume,SoundMode,SAVEMASK
  85.     data = ChannelArray[0];
  86.     ChannelIndex = (uchar)(data & 0xFF);
  87.     data >>= 8;
  88.     Volume         = (uchar)(data & 0xFF);
  89.     data >>= 8;
  90.     SoundMode      = (uchar)(data & 0xFF);
  91.     data >>= 8;
  92.     mask         = (uchar)(data & 0xFF);
  93.     if( ( mask != SAVE_MASK ) ||
  94.         ( ChannelIndex < CHANNEL_MIN || ChannelIndex > CHANNEL_MAX ) ||
  95.         ( SoundMode < SOUND_MODE_MIN || SoundMode > SOUND_MODE_MAX ) ||
  96.         ( Volume    > VOLUME_MAX ) )            
  97.     {
  98.         ChannelIndex = 0;
  99.         Volume          = 42;
  100.         SoundMode     = SOUND_MODE_STEREO;
  101.         for(i = 0; i < CHANNEL_NUM+1; i++ )
  102.             ChannelArray[i] = 0;
  103.     }
  104.     else
  105.     {   
  106.         ChannelFreq = ChannelArray[ChannelIndex];
  107.     }
  108. }

  109. // 写设置
  110. void WriteChannelConfig()
  111. {
  112.     // 构造第一个字节,构造第一个字节,从低位到高位分别是:ChannelIndex,Volume,SoundMode,SaveMask
  113.     ulong data = SAVE_MASK;
  114.     data <<=8;   
  115.     data |= SoundMode;
  116.     data <<=8;
  117.     data |= Volume;
  118.     data <<=8;
  119.     data |= ChannelIndex;
  120.     ChannelArray[0] = data;
  121.         
  122.     // 等待EEPROM空闲
  123.     eeprom_busy_wait();
  124.    
  125.     // 写入数据
  126.     eeprom_write_block( ChannelArray,ChannelConfig, 4*(1+CHANNEL_NUM) );   
  127. }

  128. // 显示存储频道信息
  129. void DisplayFreqSave(uchar Index)
  130. {
  131.     uchar i = 0;
  132.     uchar buffer[17] = { 0 };
  133.    
  134.     // 显示音量、声音模式
  135.     for( i = 0;i < 16; i++ )buffer[i] = ' ' ;
  136.     buffer[0] = 'S';
  137.     buffer[1] = 'T';
  138.     buffer[2] = 'O';
  139.     buffer[3] = 'R';
  140.     buffer[4] = 'E';
  141.     buffer[5] = ':';
  142.     buffer[6] = 'C';
  143.     buffer[7] = 'H';
  144.     buffer[8] = (Index/10)+'0';
  145.     buffer[9] = (Index%10)+'0';
  146.     LCD1602_Display_String(1,0,buffer);
  147. }

  148. // 显示频率信息
  149. void DisplayFreqInfo(ulong Freq,uchar Index)
  150. {
  151.     uchar i = 0,j = 0;
  152.     ulong data = 0;
  153.     uchar buffer[17] = { 0 };

  154.     // 显示频率
  155.     data = Freq/10;
  156.     for( i = 0;i < 16; i++ )buffer[i] = ' ';
  157.     if( Index <= CHANNEL_MAX )
  158.     {
  159.         j = 3;
  160.         buffer[0] = (Index/10)+'0';
  161.         buffer[1] = (Index%10)+'0';
  162.     }
  163.     else
  164.     {
  165.         j = 2;   
  166.     }
  167.     buffer[j+0] = 'F';
  168.     buffer[j+1] = 'M';
  169.     buffer[j+2] = ':';
  170.     if( data > 9999 )
  171.     {
  172.         data %= 100000;
  173.         buffer[j+3] = (data/10000)+'0';data %= 10000;
  174.         buffer[j+4] = (data/1000)+'0'; data %= 1000;
  175.         buffer[j+5] = (data/100)+'0';     data %= 100;
  176.         buffer[j+6] = '.';
  177.         buffer[j+7] = (data/10)+'0';     data %= 10;
  178.         buffer[j+8]= (data%10)+'0';
  179.         buffer[j+9]= 'M';
  180.         buffer[j+10]= 'H';
  181.         buffer[j+11]= 'Z';
  182.     }
  183.     else
  184.     {
  185.         buffer[j+3] = (data/1000)+'0';data %= 1000;
  186.         buffer[j+4] = (data/100)+'0'; data %= 100;
  187.         buffer[j+5] = '.';
  188.         buffer[j+6] = (data/10)+'0';  data %= 10;
  189.         buffer[j+7] = (data%10)+'0';
  190.         buffer[j+8]= 'M';
  191.         buffer[j+9]= 'H';
  192.         buffer[j+10]= 'Z';
  193.         
  194.     }
  195.     LCD1602_Display_String(2,0,buffer);
  196. }


  197. //=======================================================================
  198. // 按键处理
  199. //=======================================================================

  200. // 按键S1-S5(PD2-PD7)
  201. // 是否为单个键按下
  202. #define IS_KEY_PRESSED(k)    (((k) > 0) && (((k) & ((k)-1)) == 0 ))
  203. //#define GET_KEY_CODE()        ((~PIND) & 0x1F)
  204. #define KEY_CODE(n)            (((uchar)1) << (n) )
  205. #define KEY_S1                KEY_CODE(0)
  206. #define KEY_S2                KEY_CODE(1)
  207. #define KEY_S3                KEY_CODE(2)
  208. #define KEY_S4                KEY_CODE(3)
  209. #define KEY_S5                KEY_CODE(4)
  210. #define KEY_S6                KEY_CODE(5)

  211. // 读取按键
  212. uchar GET_KEY_CODE()
  213. {
  214.     uchar keycode = PIND;
  215.     keycode >>= 2;
  216.     keycode = ~keycode;
  217.     keycode &= 0x3F; // 6个键
  218.     return keycode;
  219. }


  220. // 读取按键
  221. uchar GetKey( )
  222. {
  223.     uchar key = 0;
  224.     static uchar lastkey = 0;    // 记录上次的按键
  225.    
  226.     // 读取键盘
  227.     key = GET_KEY_CODE();
  228.     if( !IS_KEY_PRESSED(key) )
  229.     {
  230.         lastkey = 0;
  231.         return 0;
  232.     }
  233.    
  234.     // 确定是否新的键按下
  235.     if( lastkey == 0 )     
  236.     {   
  237.         lastkey = key; // 保存本次扫描结果
  238.         DelayMs(10);   // 去抖处理
  239.         key = GET_KEY_CODE();
  240.         if( key == lastkey )
  241.         {
  242.             return key;
  243.         }
  244.     }
  245.     return 0;
  246. }

  247. //=======================================================================
  248. // 设置函数
  249. //=======================================================================
  250. void SetHandler()
  251. {
  252.     uchar key = 0;

  253.     // 切换闪烁标志
  254.     BlinkCounter++;
  255.     if( BlinkCounter > BLINK_COUNTER_MAX )
  256.         BlinkCounter = 0;
  257.    
  258.     // 确定是否为选择菜单
  259.     if( DoingMenu )
  260.     {
  261.         key = GetKey();
  262.         if( key == KEY_S1)            // 设置键(确认)
  263.         {
  264.             DoingMenu = FALSE;         // 结束菜单选择
  265.             if( SetMode == SET_MODE_SOUNDMODE )
  266.                 SoundMode = SOUND_MODE_MIN;
  267.             else
  268.                 ChannelState = STATE_SEARCH;
  269.         }
  270.         else if( key == KEY_S4 ) // 左移键
  271.         {
  272.             if(SetMode <= SET_MODE_MIN)
  273.                 SetMode = SET_MODE_MAX;
  274.             else
  275.                 SetMode--;
  276.             
  277.         }
  278.         else if( key == KEY_S5 ) // 右移键
  279.         {
  280.             if( SetMode >= SET_MODE_MAX )
  281.                 SetMode = SET_MODE_MIN;
  282.             else
  283.                 SetMode++;
  284.             
  285.         }
  286.         else // 显示菜单
  287.         {
  288.             // 选中的菜单应该闪烁(SETMODE)
  289.             LCD1602_Display_String(1,0,(const uchar*)"    FM RADIO    ");
  290.             LCD1602_Display_String(2,0,(const uchar*)"1:SEARCH 2:MODE ");
  291.             if(IS_BLINK())
  292.             {
  293.                 if( SetMode == SET_MODE_SEARCH )
  294.                     LCD1602_Display_Char(2,0,' ');
  295.                 else
  296.                     LCD1602_Display_Char(2,9,' ');
  297.             }
  298.         }
  299.     }
  300.     else
  301.     {
  302.         key = GetKey();
  303.         if( SetMode == SET_MODE_SOUNDMODE ) // 声音模式
  304.         {
  305.             if( key == KEY_S1) // 确认
  306.             {
  307.                 // 结束设置
  308.                 OperMode = OPER_MODE_RADIO;
  309.             }
  310.             else if( key == KEY_S4 ) // 左移键
  311.             {
  312.                 if(SoundMode <= SOUND_MODE_MIN)
  313.                     SoundMode = SOUND_MODE_MAX;
  314.                 else
  315.                     SoundMode--;
  316.                
  317.                 // 保存声道模式                    
  318.                 WriteChannelConfig();   
  319.             }
  320.             else if( key == KEY_S5 ) // 右移键
  321.             {
  322.                 if( SoundMode >= SOUND_MODE_MAX )
  323.                     SoundMode = SOUND_MODE_MIN;
  324.                 else
  325.                     SoundMode++;
  326.                
  327.                 // 保存声道模式   
  328.                 WriteChannelConfig();   
  329.             }
  330.             else // 显示菜单
  331.             {
  332.                 // 显示声音模式菜单,选中的声音模式闪烁
  333.                 LCD1602_Display_String(1,0,(const uchar*)"MODE            ");
  334.                 LCD1602_Display_String(2,0,(const uchar*)"1.STEREO  2.MONO");
  335.                 if(IS_BLINK())
  336.                 {
  337.                     if( SoundMode == SOUND_MODE_STEREO )
  338.                         LCD1602_Display_Char(2,0,' ');
  339.                     else
  340.                         LCD1602_Display_Char(2,10,' ');
  341.                 }
  342.             }
  343.         }
  344.         else // 搜索频道
  345.         {
  346.             if(ChannelState == STATE_SEARCH)
  347.             {
  348.                 if( key == KEY_S1)
  349.                 {
  350.                     ChannelState = STATE_STORE;

  351.                 }
  352.                 else if ( key == KEY_S2 )
  353.                 {
  354.                     if( ChannelSearch < FREQ_MAX )
  355.                     {
  356.                         ChannelSearch += 100;
  357.                         TEA5767_Adjust( ChannelSearch,(SoundMode == SOUND_MODE_MONO),FALSE);
  358.                     }
  359.                 }
  360.                 else if( key == KEY_S3 )
  361.                 {
  362.                     if( ChannelSearch > FREQ_MIN )
  363.                     {
  364.                         ChannelSearch -= 100;
  365.                         TEA5767_Adjust( ChannelSearch,(SoundMode == SOUND_MODE_MONO),FALSE);
  366.                     }
  367.                 }
  368.                 else
  369.                 {
  370.                     LCD1602_Display_String(1,0,(const uchar*)"SEARCHING...    ");
  371.                     DisplayFreqInfo(ChannelSearch,CHANNEL_MAX+1);
  372.                 }
  373.             }
  374.             else // 选择存取频道
  375.             {
  376.                 if( key == KEY_S1)
  377.                 {
  378.                     // 显示正在存储信息
  379.                     LCD1602_Display_String(1,0,(const uchar*)"STOREING...     ");
  380.                     DisplayFreqInfo(ChannelSearch,CHANNEL_MAX+1);
  381.                     
  382.                     // 存储频道信息
  383.                     ChannelArray[ChannelSaveIndex] = ChannelSearch;
  384.                     WriteChannelConfig();     
  385.                     
  386.                     // 显示存储完成信息
  387.                     LCD1602_Display_String(1,0,(const uchar*)"STORE OK!       ");
  388.                     DisplayFreqInfo(ChannelSearch,CHANNEL_MAX+1);

  389.                     // 自动移动到下一个频道                    
  390.                     if(ChannelSaveIndex < CHANNEL_MAX )
  391.                         ChannelSaveIndex++;
  392.                     else
  393.                         ChannelSaveIndex = CHANNEL_MIN;
  394.                     
  395.                     // 切换到正常收听状态
  396.                     OperMode = OPER_MODE_RADIO;
  397.                 }
  398.                 else if ( key == KEY_S4 )
  399.                 {
  400.                     if( ChannelSaveIndex > CHANNEL_MIN )
  401.                         ChannelSaveIndex--;
  402.                 }
  403.                 else if( key == KEY_S5 )
  404.                 {
  405.                     if( ChannelSaveIndex < CHANNEL_MAX )
  406.                         ChannelSaveIndex++;
  407.                 }
  408.                 else
  409.                 {
  410.                     DisplayFreqSave(ChannelSaveIndex);
  411.                     DisplayFreqInfo(ChannelSearch,CHANNEL_MAX+1);
  412.                 }
  413.             }
  414.         }
  415.     }
  416. }



  417. //=======================================================================
  418. // 显示音量、信号强度、声音模式、频率
  419. //=======================================================================
  420. void DisplayChannelInfo()
  421. {
  422.     uchar i = 0;
  423.     uchar buffer[17] = { 0 };
  424.     uchar level = TEA5767_GetLevel(); // 0-15
  425.     for( i = 0;i < 16; i++ )buffer[i] = ' ' ;

  426.     // 显示音量、声音模式
  427.     buffer[6] = 'V';
  428.     buffer[7] = 'O';
  429.     buffer[8] = 'L';
  430.     buffer[9] = ':';
  431.     buffer[10]= (Volume/10)+'0';
  432.     buffer[11]= (Volume%10)+'0';
  433.     if( SoundMode == SOUND_MODE_STEREO)
  434.     {
  435.         buffer[14]= 'S';
  436.         buffer[15]= 'T';
  437.     }
  438.     else
  439.     {
  440.         buffer[14]= 'M';
  441.         buffer[15]= 'O';
  442.     }
  443.     LCD1602_Display_String(1,4,&buffer[4]);
  444.     LCD1602_Display_Volume();
  445.     LCD1602_Display_Level(level);
  446.    
  447.     // 显示频率
  448.     DisplayFreqInfo(ChannelFreq,ChannelIndex);
  449.    
  450. }

  451. // 正常收听函数
  452. void RadioHandler()
  453. {
  454.     DisplayChannelInfo();
  455. }

  456. // 关机函数
  457. void PowerOff()
  458. {
  459.     LCD1602_Display_String(1,0,(const uchar*)"Power Off ...   ");
  460.     LCD1602_Display_String(2,0,(const uchar*)"                ");
  461.     DelayMs(500);
  462.     POWER_OFF();   
  463. }


  464. //=======================================================================
  465. // 主函数
  466. //=======================================================================
  467. int main()
  468. {
  469.     uchar key         = 0;
  470.    
  471.     // 初始化端口(S1-S5)
  472.     DDRD  = 0;
  473.     PORTD = 0xFF;

  474.     // 先把音量改为0
  475.     FM62429_Init(0);
  476.    
  477.     // 处理开关键
  478.     POWER_ON();
  479.    
  480.     // 读取频道配置
  481.     ReadChannelConfig();
  482.             
  483.     // LCD初始化
  484.     LCD1602_Init();
  485.    
  486.     // Tea5767初始化
  487.     TEA5767_Init(ChannelFreq,(SoundMode == SOUND_MODE_MONO));
  488.     DelayMs(500);
  489.    
  490.     // FM62429初始化
  491.     if( Volume %2 ) Volume--;
  492.     FM62429_AdjustVolume(Volume);
  493.     while(1)   
  494.     {

  495.         // 设置模式
  496.         if( OperMode == OPER_MODE_SET )
  497.         {
  498.             SetHandler();
  499.         }
  500.         else // 正常收听模式
  501.         {
  502.             key = GetKey();
  503.             switch(key)
  504.             {
  505.             case KEY_S1:
  506.                 OperMode    = OPER_MODE_SET;
  507.                 DoingMenu    = TRUE;
  508.                 SetMode      = SET_MODE_MIN;
  509.    
  510.                 // 调用设置函数
  511.                 SetHandler();
  512.                 break;
  513.             case KEY_S2: // 音量增加
  514.                 if(Volume < VOLUME_MAX )
  515.                 {
  516.                     Volume += 2;
  517.                     FM62429_AdjustVolume(Volume);
  518.                     WriteChannelConfig();// 保存音量
  519.                 }
  520.                 break;
  521.             case KEY_S3: // 音量减少
  522.                 if( Volume > VOLUME_MIN )
  523.                 {
  524.                     Volume -=2;
  525.                     FM62429_AdjustVolume(Volume);
  526.                     WriteChannelConfig();// 保存音量
  527.                 }
  528.                 break;
  529.             case KEY_S4: // 切换到前一频道
  530.                 if( ChannelIndex > CHANNEL_MIN )
  531.                 {
  532.                     ChannelIndex--;
  533.                     ChannelFreq  = ChannelArray[ChannelIndex];
  534.                     FM62429_AdjustVolume(0);
  535.                     TEA5767_Adjust( ChannelFreq,(SoundMode == SOUND_MODE_MONO),FALSE);
  536.                     DelayMs(500);
  537.                     FM62429_AdjustVolume(Volume);
  538.                     WriteChannelConfig(); // 保存频道
  539.                 }
  540.                 break;
  541.             case KEY_S5: // 切换到后一频道
  542.                 if( ChannelIndex < CHANNEL_MAX )
  543.                 {
  544.                     ChannelIndex++;
  545.                     ChannelFreq  = ChannelArray[ChannelIndex];
  546.                     FM62429_AdjustVolume(0);
  547.                     TEA5767_Adjust( ChannelFreq,(SoundMode == SOUND_MODE_MONO),FALSE);
  548.                     DelayMs(500);
  549.                     FM62429_AdjustVolume(Volume);
  550.                     WriteChannelConfig();// 保存频道
  551.                 }
  552.                 break;
  553.             case KEY_S6:
  554.                 PowerOff();   
  555.                 break;
  556.             default:            
  557.                 // 正常收听函数
  558.                 RadioHandler();
  559.                 break;
  560.             }
  561.         }
  562.         
  563.         // 延时
  564.         DelayMs(50);
  565.     }
  566.     return 0;
  567. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:493290 发表于 2019-3-28 20:55 | 只看该作者
您好,有图纸吗
回复

使用道具 举报

板凳
ID:1063423 发表于 2024-4-26 11:41 来自手机 | 只看该作者
5向指的是ec11?
回复

使用道具 举报

地板
ID:277550 发表于 2024-4-26 12:07 | 只看该作者

也做过,放大用数字放大  PM8403。。。。使用红外遥控控制0-9快速选台、调频率、保存频率、调音量,等
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表