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

📄 tuner.lst

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE TUNER
OBJECT MODULE PLACED IN tuner.OBJ
COMPILER INVOKED BY: C:\Keil51\C51\BIN\c51.exe tuner.c DB OE SMALL ROM(LARGE)

line level    source

   1          #include        "reg52.h"
   2          #include        "intrins.h"
   3          #include        "..\..\inc\globedef.h"
   4          #include        "..\..\inc\keydef.h"
   5          #include    "..\..\inc\keyproc.h"
   6          #include        "..\..\inc\vfddef.h"
   7          #include        "..\..\inc\delay.h"
   8          #include        "..\..\inc\i2c.h"
   9          #include        "..\..\inc\tuner.h"
  10          
  11          
  12          /************************************************
  13           * MCU向TUNER发送一个字节数据                               *
  14           * 输入: ucData 要发送的无符号字节              *
  15           * 无返回值                                                     *
  16           * 注意:是低位选发送                                       *
  17           ************************************************/
  18          void SendByte_ToTuner(BYTE ucData)
  19          {
  20   1              BYTE i;
  21   1      
  22   1              for(i=0; i<8; i++)
  23   1              {
  24   2                      CLEAR_TUNER_CLK;
  25   2                      if(ucData & 0x01) 
  26   2                              SET_TUNER_DATA;
  27   2                      else
  28   2                              CLEAR_TUNER_DATA;
  29   2                      Delay5US();
  30   2                      SET_TUNER_CLK; //上升沿发送数据
  31   2                      ucData >>= 1;
  32   2              }
  33   1      }
  34          /************************************************
  35           * MPU自TUNER读一个字节数据职                     *
  36           * 无输入值                                     *
  37           * 返回值读入的无符号字节                       *
  38           * 注意:是高位先读入                           *
  39           ************************************************/
  40          BYTE ReadByte_FromTuner(void)
  41          {
  42   1              BYTE i, ucData = 0;
  43   1              
  44   1          //TRI_TUNER_DATA;
  45   1              for(i=0; i<8; i++)
  46   1              {
  47   2                      CLEAR_TUNER_CLK;
  48   2                      Delay5US();
  49   2                      SET_TUNER_CLK;
  50   2                      Delay5US();
  51   2                      ucData <<= 1;
  52   2                      if(TUNER_DATA_HIGH)
  53   2                              ucData++; //高电平置1
  54   2              }
  55   1              return(ucData);
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 2   

  56   1      }
  57          
  58          /****************************************************
  59           * MCU向TUNER指定地址发送多个字节数据                 *
  60           * 输入: *ucData 要发送的无符号字节数据组           *
  61           *      unN     发送数据个数                                *
  62           *      unAddr  CCB地址                                 *
  63           * 无返回值                                         *
  64           * 注意:是低位先发送                               *
  65           ****************************************************/
  66          void SendString_ToTuner(BYTE ucAddr, BYTE ucN, BYTE *ucData)
  67          {
  68   1              BYTE i;
  69   1      
  70   1              CLEAR_TUNER_CS;            
  71   1              SendByte_ToTuner(ucAddr);          
  72   1              SET_TUNER_CS;
  73   1              for(i=0; i<ucN; i++)
  74   1                 SendByte_ToTuner(ucData[i]); //发送数据
  75   1              CLEAR_TUNER_CS;                   
  76   1      }
  77          
  78          /************************************************
  79           * MPU自CCB指定地址读多个字节数据               *
  80           * 输入:        unN     要求读入数据个数                *
  81           *      unAddr  CCB地址                             *
  82           * 返回值 *ucData所读入的无符号字节数据组       *
  83           * 注意:每个字节的高位先读入                   *
  84           ************************************************/
  85          void ReadString_FromTuner(BYTE ucAddr, BYTE ucN, BYTE *ucData)
  86          {
  87   1              BYTE i;
  88   1      
  89   1              CLEAR_TUNER_CS;                       //准备发送CCB地址
  90   1              SendByte_ToTuner(ucAddr);             //发送CCB地址
  91   1              SET_TUNER_CS;
  92   1              for(i=0; i<ucN; i++)
  93   1                 ucData[i] = ReadByte_FromTuner(); //接收数据
  94   1              CLEAR_TUNER_CS;                           //结束
  95   1      }       
  96          
  97          /****************************************
  98           * 收音模块的初始化                             *
  99          ucRadioControl[0] 的各位代表值
 100          
 101          ucRadioControl[0].7 = STSW;  = 0, MONO; =1, stereo
 102          ucRadioControl[0].6 = BDSW1; = 0, AM;   =1, FM
 103          ucRadioControl[0].5 = B02;
 104          ucRadioControl[0].4 = IFSW;  =1, MUTED, =0 RECEIVED
 105          ucRadioControl[0].3 = B01;
 106          ucRadioControl[0].2 = 0;
 107          ucRadioControl[0].1 = 1;
 108          ucRadioControl[0].0 = 0;
 109          
 110          
 111          *******************************************/
 112          void RadioInit(void)
 113          {
 114   1      
 115   1              if(FM_AM_Select == FM_MODE)
 116   1              {
 117   2                      //FM state
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 3   

 118   2                      ucRadioControl[0]=0xc2;//STEREO, FM MODE
 119   2                      //设置DEAD BAND WIDTH 为DZC, 检测到立体声Tuner_DATA_OUT变低
 120   2                      ucRadioControl[1]=0x8c;
 121   2      
 122   2                      //一般操做模式,设置中频计数的计算时间为32ms和等待时间为4ms左右
 123   2                      ucRadioControl[2]=0x17;//
 124   2              }
 125   1              else
 126   1              {
 127   2                      //AM state
 128   2                      ucRadioControl[0]=0x02;//MONO, AM mode
 129   2                      ucRadioControl[1]=0x8c;//81;
 130   2                      ucRadioControl[2]=0x17;//12;
 131   2              }
 132   1              SendString_ToTuner(IN2_MODE,3,ucRadioControl);
 133   1      }
 134          
 135          
 136          /****************************************
 137           *收音头静音                                    *
 138           ****************************************/
 139          void RadioMute(void)
 140          {
 141   1              if(FM_AM_Select == FM_MODE)
 142   1              {
 143   2                      //FM state ucRadioControl[0].4的IFSW位控制静音
 144   2                      ucRadioControl[0]=0xd2;//0a;
 145   2                      ucRadioControl[1]=0x8c;//80;
 146   2                      ucRadioControl[2]=0x17;//12;
 147   2              }
 148   1              else 
 149   1              {
 150   2                      //AM state
 151   2                      ucRadioControl[0]=0x12;//62;
 152   2                      ucRadioControl[1]=0x8c;//81;
 153   2                      ucRadioControl[2]=0x17;//12;
 154   2              }
 155   1              SendString_ToTuner(IN2_MODE,3,ucRadioControl);
 156   1      }
 157          
 158          /****************************************
 159           *STRERO/MONO                           *
 160           ****************************************/
 161          
 162          void SetRadioMono(void)
 163          {
 164   1              if(FM_AM_Select == FM_MODE)
 165   1              {
 166   2                      //ucRadioControl[0].7控制立体声或者单声道
 167   2                      ucRadioControl[0]=0x42;//aa;
 168   2                      ucRadioControl[1]=0x8c;//80;
 169   2                      ucRadioControl[2]=0x17;//12;
 170   2                      SendString_ToTuner(IN2_MODE,3,ucRadioControl);
 171   2              }
 172   1      }       
 173          
 174          /****************************************
 175           *收音头打开声音, 其实是针对FM的操做                                    *
 176           ****************************************/
 177          void RadioOpen(void)
 178          {
 179   1              if(Mono_Stereo_Select == Tuner_MONO)
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 4   

 180   1                      SetRadioMono();
 181   1              else            
 182   1                      RadioInit();
 183   1      }
 184          
 185          /****************************************
 186           * 写入收音频率值       (IN1 Mode)              *
 187           * 输入:uiFreq 要写入的频率值          *
 188           ****************************************/
 189          void RadioFreq(WORD uiFreq)
 190          {       
 191   1          if(FM_AM_Select == FM_MODE)
 192   1              {
 193   2                      //设置参考频率为25KHZ, 设置PLL的divisor = P[15:0] * 2;
 194   2                      //reset中频计数
 195   2                      ucRadioControl[2]=0x2a;
 196   2              }
 197   1              else
 198   1              {
 199   2                      //设置参考频率为 5KHZ,设置PLL的divisor = P[15:4];
 200   2                      ucRadioControl[2]=0x98;
 201   2                      uiFreq<<=4;//移位是因为P[3:0]是被忽略的
 202   2              }
 203   1              ucRadioControl[0]=(BYTE)(uiFreq&0x00ff);
 204   1              ucRadioControl[1]=(BYTE)((uiFreq&0xff00)>>8);
 205   1              SendString_ToTuner(IN1_MODE,3,ucRadioControl); //写入CCB总线
 206   1              DelayX1ms(60);
 207   1      
 208   1              //GTE = 1; START中频计数
 209   1              ucRadioControl[2]|=0x04;
 210   1              SendString_ToTuner(IN1_MODE,3,ucRadioControl);
 211   1      }
 212          
 213          
 214          /****************************************
 215           *读中频计数和状态                              *
 216           *返回值为状态字节                              *
 217           *中频计数值去后4个BIT保存在uiIFCount   *
 218           ****************************************/
 219          void RadioCountIF(void)
 220          {       
 221   1          //BYTE TEMP[3];
 222   1          ReadString_FromTuner(OUT_MODE,3,ucRadioControl); //自CCB上读3个字节
 223   1              //计算读出的中频值,忽略低4个BIT        
 224   1              //最高位STINT  =1代表立体声, =0代表单声道
 225   1              Mono_Stereo_Select = ucRadioControl[0] & 0x80;
 226   1              if(Mono_Stereo_Select != 0)
 227   1                      Mono_Stereo_Select = Tuner_STEREO;
 228   1              else
 229   1                      Mono_Stereo_Select = Tuner_MONO;
 230   1              Mono_Stereo_Select = ((ucRadioControl[0] & 0x80) >> 7);
 231   1              uiIFCount = (WORD)(ucRadioControl[2] >> 4) + (WORD)(ucRadioControl[1] << 4)
 232   1                                                                                                 + (WORD)(ucRadioControl[0] << 12);
 233   1              
 234   1      }
 235          
 236          /****************************************
 237           *判断是否锁到台                                        *
 238           *返回:TRUE    锁到                            *
 239           *     FALSE    未锁到                          *
 240           ****************************************/
 241          BYTE RadioLock(void)
C51 COMPILER V7.20   TUNER                                                                 06/30/2005 14:02:57 PAGE 5   

 242          {               
 243   1              if(Wait_Lock_40ms < Wait_Timer_Out)
 244   1                      return 0xFF;
 245   1              else
 246   1              {               
 247   2                      Wait_Lock_40ms = 0;             
 248   2                      RadioCountIF();                         
 249   2                      if( FM_AM_Select == FM_MODE )
 250   2                      {

⌨️ 快捷键说明

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