久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4035|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品视频网 | 日韩免费一二三区 | 国产成人精品一区二区三区在线 | 二区视频| 欧美一级二级在线观看 | 免费精品久久久久久中文字幕 | 亚洲二区在线 | 羞羞网站在线观看 | 美国a级毛片免费视频 | 国产精品日产欧美久久久久 | 99re在线视频 | 亚洲性在线 | 国产精品美女久久久久久久久久久 | 精品一级 | 日韩成人一区 | 成人免费观看男女羞羞视频 | 99精品久久久国产一区二区三 | 午夜成人在线视频 | 黄色免费在线观看网站 | 亚洲国产中文字幕 | 久久久精 | 久久亚洲一区二区三区四区 | 天堂资源最新在线 | 亚洲 欧美 另类 日韩 | 成人福利网站 | 成人亚洲片 | 免费观看黄色一级片 | 91精品国产乱码久久久久久久久 | 久久精品99久久 | www.99精品 | 国产精品久久国产精品 | 欧美一区二区三区的 | 久草新在线 | 在线观看免费高清av | 日本成人片在线观看 | 亚洲高清在线播放 | 在线成人精品视频 | 亚洲精品专区 | 亚洲高清在线 | 久久久久网站 | 人人人人爽 |