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

📄 72131-c51.txt

📁 LC72131驱动收音机高频头的C语言程序希望能给你开发收音机以帮助
💻 TXT
📖 第 1 页 / 共 2 页
字号:

  if (band == BAND_AM){                // Set Band 
    dwPLL_Shadow_IN2 |= BO1_ON; 
  }
  else if (band == BAND_FM){
    dwPLL_Shadow_IN2 |= BO4_ON;
  }
    
  if (!bST_MONO) {dwPLL_Shadow_IN2 |= BO3_ON;}    // Stereo

//  dwPLL_Shadow_IN2 &= DO_MODE_MASK;
  dwPLL_Shadow_IN2 |= DO_MODE_UNLOCK;          //

  // IN1 Mode -----------------------------------------------------------

  if (band == BAND_AM){                // Set Frequency
    dwPLL_Shadow_IN1 |= (cur_count[band] << 4); 
  }
  else {
    dwPLL_Shadow_IN1 |= cur_count[band];       
  }

  dwPLL_Shadow_IN1 |= pBInfo -> DivMode;        // Set DIv Mode
  dwPLL_Shadow_IN1 |= pBInfo -> DivRefPara;      // Set DIV Ref Para
}

//---------------------------------------------------------------------------
// Count_To_Freq
//---------------------------------------------------------------------------
static WORD Count_To_Freq(void){
BAND_INFO code *pBInfo;

  switch(band){
    case BAND_AM:
      if (b_amstep) pBInfo = &BandInfo_AM_10KHz; else pBInfo = &BandInfo_AM_9KHz; break;

    case BAND_FM:
      if (b_fmstep) pBInfo = &BandInfo_FM_100KHz; else pBInfo = &BandInfo_FM_50KHz; break;

    case BAND_SW:
      break;
  }

  if ((band == BAND_AM) || (band == BAND_SW)){
    return cur_count[band] * pBInfo -> FRef - 450;
  }
  else {
    return cur_count[band] * ((FM_FREF *100)/1000) - 1070;
  }
}

#define LC72131_DELAY()  {_nop_(); _nop_(); _nop_();}

//---------------------------------------------------------------------------
// Write_LC72131_Addr
//  addr: the addr of the control register
// value: the valude to set to 
//---------------------------------------------------------------------------
static void Write_LC72131_Addr(BYTE addr){
register BYTE i;

  PIN_TUNER_CE = 0;
  PIN_TUNER_CL = 1;

  LC72131_DELAY();

  for (i = 8; i>0; --i){ 
    PIN_TUNER_CL = 0;
    LC72131_DELAY();

    if (addr & 0x01) PIN_TUNER_DI=1; else PIN_TUNER_DI=0;
    addr >>= 1;

    LC72131_DELAY();

    PIN_TUNER_CL = 1;

    LC72131_DELAY();
  }
}

//---------------------------------------------------------------------------
// Write_LC72131
//  addr: the addr of the control register
// value: the valude to set to 
//---------------------------------------------------------------------------
static void Write_LC72131(BYTE addr, DWORD value){
register BYTE i;

  // Send the addr byte first ------------//
  Write_LC72131_Addr(addr);

  PIN_TUNER_CE = 1;
  LC72131_DELAY();

  // Send the control value in following------------//
  for (i = 24; i>0; --i){ 
    PIN_TUNER_CL = 0;
    LC72131_DELAY();

    if (value & 0x01) PIN_TUNER_DI=1; else PIN_TUNER_DI=0;
    value >>= 1;

    LC72131_DELAY();

    PIN_TUNER_CL = 1;

    LC72131_DELAY();
  }

  PIN_TUNER_CE = 0;
}

//---------------------------------------------------------------------------
// Read_LC72131
//  addr: the addr of the control register
// return value 
//---------------------------------------------------------------------------
static DWORD Read_72131(void){
register BYTE i;
DWORD temp = 0;

  // Send the addr byte first ------------//
  Write_LC72131_Addr(MODE_OUT);

  PIN_TUNER_CE = 1;
  LC72131_DELAY();

  // read the value dword ------------//
  for (i=24; i>0; --i){
    PIN_TUNER_CL = 0;

    LC72131_DELAY();

    temp <<= 1;
    if (PIN_TUNER_DO) temp |= 1;

    PIN_TUNER_CL = 1;
    LC72131_DELAY();
  }

  PIN_TUNER_CE = 0;

  return temp;
}

头文件如下:

#ifndef  __TUNER_INT_H__
#define __TUNER_INT_H__

#include <types.h>

// ----------------------------------------------------------------
// Control Pins
// ----------------------------------------------------------------
extern BOOL PIN_TUNER_DO;
extern BOOL PIN_TUNER_CL;
extern BOOL PIN_TUNER_DI;
extern BOOL PIN_TUNER_CE;

// use 24c02, 0x80 - 0xff

enum TUNER_EE {
  EE_AMSTEP = 0x80,
  EE_BAND,
  EE_CURCNT_LOW,
  EE_CURCNT_HIGH,

  EE_PRESET_BASE            // To store the preset station   
};

#define MAX_PRESET_NUMBER  0x29    // can store 20 channels for each band

// -------------------------------------------------------------
// Tuner Modle: T-989 of Guangzhou Youshen
// -------------------------------------------------------------

// work mode type define:
#define MODE_IN1      0x28
#define MODE_IN2      0x29
#define MODE_OUT      0x2a

#define CTE_ON        0x040000

#define IOC1        0x000001
#define IOC2        0x000002
#define IO1          0x000004
#define IO2          0x000008

#define BO1_ON        0x000010
#define BO2_ON        0x000020
#define BO3_ON        0x000040
#define BO4_ON        0x000080

#define DO_MODE_UNLOCK    0x000200
#define DO_MODE_END_UC    0x000400
#define DO_MODE_MASK    ~0x000e00

// ----------------------------------------
// DEVIDER mode type define
// ----------------------------------------
#define AM_DV_MODE      0x000000    // 16 BIT
#define SW_DV_MODE      0x020000    // 20 
#define FM_DV_MODE      0x020000    // 20 BIT SWALLOW

#define AM_DV_REF_9KHz     0x900000    // 9 KHZ
#define AM_DV_REF_10KHz   0x800000    // 10 KHZ

#define SW_DV_REF      0xa00000    // 5 KHZ
#define FM_DV_REF      0x300000    // 25 KHZ

#define PLL_OFF_REF      0xe00000    // PLL inhibit and OSC stop.

// ----------------------------------------
// IF Count
// ----------------------------------------
#define GATE_TIME      32

#define GATE_TIME_32MS    0x020000    //
#define GATE_TIME_4MS    0x000000
#define GATE_TIME_8MS    0x010000

#define IFS          0x100000    

#define AM_IF_CNT       450*GATE_TIME      // 450KH; 
#define AM_IF_CNT_MIN     AM_IF_CNT - AM_IF_CNT*0.01
#define AM_IF_CNT_MAX     AM_IF_CNT + AM_IF_CNT*0.01

#define SW_IF_CNT       450*GATE_TIME      // 450KH;
#define SW_IF_CNT_MIN     SW_IF_CNT - SW_IF_CNT*0.01
#define SW_IF_CNT_MAX     SW_IF_CNT + SW_IF_CNT*0.01

#define FM_IF_CNT       10700*GATE_TIME      // 10.7 MH; 
#define FM_IF_CNT_MIN     FM_IF_CNT - FM_IF_CNT*0.01    
#define FM_IF_CNT_MAX     FM_IF_CNT + FM_IF_CNT*0.01  

// ----------------------------------------
// Frequence Refrence
// ----------------------------------------
#define AM_FREF_9KHz    9      // 9khz
#define AM_FREF_10KHz    10      // 10khz

#define SW_FREF        5      // 5khz
#define FM_FREF        (25*2)   // Fref=25*2 khz

// Frequence Range
#define AM_MIN_9KHz      522      // KHZ
#define AM_MAX_9KHz      1611    // KHZ

#define AM_MIN_10KHz    530      // KHZ
#define AM_MAX_10KHz    1610    // KHZ

#define SW_MIN        1700    // KHZ
#define SW_MAX        25000    // KHZ

#define FM_MIN        8700    // 10KHZ
#define FM_MAX        10800    // 10KHZ

// Frequence Counter Range
#define AM_CNT_MIN_9KHz    ((AM_MIN_9KHz + 450)/9)
#define AM_CNT_MAX_9KHz    ((AM_MAX_9KHz + 450)/9)

#define AM_CNT_MIN_10KHz  ((AM_MIN_10KHz + 450)/10)
#define AM_CNT_MAX_10KHz  ((AM_MAX_10KHz + 450)/10)

#define SW_CNT_MIN      ((SW_MIN + 450)/SW_FREF)
#define SW_CNT_MAX      ((SW_MAX + 450)/SW_FREF)
#define FM_CNT_MIN      ((FM_MIN + 1070)/((FM_FREF *100)/1000))
#define FM_CNT_MAX      ((FM_MAX + 1070)/((FM_FREF *100)/1000))

// ----------------------------------------
// Search Step
// ----------------------------------------
#define AM_CNT_STEP      1            // F_step=1*5khz
#define SW_CNT_STEP      1            // F_step=1*5khz

#define FM_CNT_STEP_100KHz  2            // F_step=2*50khz when Fref=25khz
#define FM_CNT_STEP_50KHz  1            // F_step=50khz when Fref=25khz

typedef struct {
  DWORD DivMode;
  DWORD DivRefPara;

  WORD IFCntMax;
  WORD IFCntMin;

  BYTE FRef;

  WORD CntMax;
  WORD CntMin;

  BYTE CntStep;
}BAND_INFO;

enum {
  BAND_AM,
  BAND_FM,
  BAND_SW
};
  
static BAND_INFO code BandInfo_AM_9KHz = {AM_DV_MODE, AM_DV_REF_9KHz, AM_IF_CNT_MAX, AM_IF_CNT_MIN, AM_FREF_9KHz, AM_CNT_MAX_9KHz, AM_CNT_MIN_9KHz, AM_CNT_STEP};
static BAND_INFO code BandInfo_AM_10KHz = {AM_DV_MODE, AM_DV_REF_10KHz, AM_IF_CNT_MAX, AM_IF_CNT_MIN, AM_FREF_10KHz, AM_CNT_MAX_10KHz, AM_CNT_MIN_10KHz, AM_CNT_STEP};

static BAND_INFO code BandInfo_FM_100KHz = {FM_DV_MODE, FM_DV_REF, FM_IF_CNT_MAX, FM_IF_CNT_MIN, FM_FREF, FM_CNT_MAX, FM_CNT_MIN, FM_CNT_STEP_100KHz};
static BAND_INFO code BandInfo_FM_50KHz = {FM_DV_MODE, FM_DV_REF, FM_IF_CNT_MAX, FM_IF_CNT_MIN, FM_FREF, FM_CNT_MAX, FM_CNT_MIN, FM_CNT_STEP_50KHz};

static BAND_INFO code BandInfo_SW = {SW_DV_MODE, SW_DV_REF, SW_IF_CNT_MAX, SW_IF_CNT_MIN, SW_FREF, SW_CNT_MAX, SW_CNT_MIN, SW_CNT_STEP};

// ----------------------------------------------------------------
// Variables
// ----------------------------------------------------------------
static DWORD idata dwPLL_Shadow_IN1;
static DWORD idata dwPLL_Shadow_IN2;

static WORD idata cur_count[3];      // Current count

static BOOL bST_MONO;
static BOOL b_amstep;
static BOOL b_fmstep = 1;

static BYTE idata band;      

// ----------------------------------------------------------------
// external functions
// ----------------------------------------------------------------
static void Tuner_Set_Frequency_Int(void);
static void Write_LC72131_Addr(BYTE addr);
static DWORD Read_72131(void);
static void Write_LC72131(BYTE addr, DWORD value);
static WORD Count_To_Freq(void);

extern void Pause(BYTE);
extern BOOL Write_EEPROM(BYTE, BYTE);
extern BYTE Read_EEPROM(BYTE);

extern void Temp_Mute(BOOL bOnOff);

#endif  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -