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

📄 tuning.lst

📁 全数字高清电视数字调谐器
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.01  TUNING                                                                 08/17/2003 17:24:40 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE TUNING
OBJECT MODULE PLACED IN .\tuning.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\tuning.c LARGE MODDP2 DEBUG OBJECTEXTEND

stmt level    source

   1          #include <math.h>
   2          #include "struct.h"
   3          #include <stdio.h>
   4          #include <w77e58.h>
   5          
   6          #define tuning_address 0xc0  //调谐器地址
   7          
   8          #define lo1_1 0x00  //lo1n
   9          #define sel_lo1a 0x01  //sel-lo1a
  10          #define logc_cntl 0x02 //lo2gc -lo1gc
  11          
  12          #define control1 0x06 //adon
  13          #define control2 0x07 //adon
  14          #define status 0x0e     //状态检查
  15          #define tun_a_d 0x0f
  16          #define DEBUG 1
  17          
  18          sbit power_sw=P1^4;//电源开关
  19          
  20          extern unsigned char i2c_read_a(unsigned char slave,
  21                                                      unsigned char address);//单字节读 
  22           extern void write_b(unsigned char slave, unsigned char address, unsigned char fb);
  23           extern void write_a(unsigned char slave,unsigned char address,
  24                                      unsigned char fb[],unsigned char sun);
  25          extern void delay1(unsigned int i);
  26          extern void daya1(unsigned long i);
  27          void tuning_start();//调谐器初始化
  28          void tuning_freq(tv ch);//调到频道
  29          void calculate_desired();
  30          void avoid_spurs();//避开假信号
  31          bit  is_spurin_band();//假信号检查
  32          void select_vco();//以flo1的频率初步选择vco1
  33          void calculate_lon();//步骤3.4 计算lo1n  lo1a  lo2i  lo2n  lo2a  NUM  fnon
  34          void  write_registers();//写寄存器
  35          bit  check_lo_lock();//检查LO-PLL锁定
  36          bit optimize_vco();//优化VCO
  37          
  38          
  39          
  40          
  41          
  42          
  43           float  rf_freq;//当前使用频道中心频率
  44           float fif2;//第2中频
  45           #define fif1 1090    //第一中频
  46           #define fref 5.25   //时钟基准
  47           float f_ifbw_width;//第2中频带宽
  48           float fstep;//最小调谐步骤大小
  49           
  50          /**********************/
  51          //计算值中间
  52          unsigned char lo1n;//第1本振数值
  53          unsigned char lo1a;//第1本振预分频比例因子
  54          
  55          unsigned int lo2i;
C51 COMPILER V7.01  TUNING                                                                 08/17/2003 17:24:40 PAGE 2   

  56          
  57          unsigned char lo2n;
  58          unsigned char lo2a;
  59          
  60          unsigned int num;
  61          unsigned int step;
  62          
  63          unsigned char fnon;
  64          
  65          
  66          unsigned char sel;//最优VCO1选择
  67          unsigned char lo1gc;
  68          unsigned char lo2gc;
  69          unsigned char xogc;//振荡器环路增益控制
  70          
  71          /*****************/
  72          //
  73           float flo1_desired;// 计算想得到的第1本振频率
  74          //flo1_desired=Frf+Fif  中心频率+第1中频        // Fif-第1中频   Frf -输入中心频率
  75          unsigned int lo1i;//第1本振的PLL整数分频系数
  76          //lo1i=floor(flo1_desired/fref+1/2)           //ferf -5.25Mhz
  77           float flo1;//实际的VCO1的值
  78          //flo1=lo1i*fref
  79           float flo2_desired;//计算想得到的第2本振频率
  80          //flo2_desired=flo1-Frf-fif2             
  81          //float ftest;//假信号干涉计算
  82          //ftest=(n1*flo1)+(n2*flo2_desired)
  83          //(|(|ftest|)-fif2|)<fifbw/2
  84          
  85          
  86          
  87          
  88          
  89          void tuning_start()//调谐器初始化
  90          {
  91   1      unsigned char xok;
  92   1      unsigned char fop;
  93   1      dl: write_b(tuning_address,lo1_1,0x1a); 
  94   1      write_b(tuning_address,logc_cntl,0xff);
  95   1      write_b(tuning_address,control1,0xe4);
  96   1      write_b(tuning_address,control2,0x0f);
  97   1      delay1(50000);
  98   1          do
  99   1           {
 100   2             xok=i2c_read_a(tuning_address,status);//步骤A
 101   2               if(xok&0x01)   
 102   2                   return;
 103   2              else {
 104   3                      fop=i2c_read_a(tuning_address,control2);//步骤B
 105   3                      xogc=fop&0x07;
 106   3                      if(xogc==0x03)
 107   3                           goto dl;
 108   3                      else {
 109   4                              write_b(tuning_address,control2,((xogc-1)&0x07)|(fop&0xf8));//步骤C
 110   4                              delay1(40000);       //步骤D               
 111   4                             }
 112   3                      }
 113   2              }
 114   1      while(1);//步骤E
 115   1      }
 116          
 117          
C51 COMPILER V7.01  TUNING                                                                 08/17/2003 17:24:40 PAGE 3   

 118           void tuning_freq(tv ch)//调到频道
 119           {
 120   1      lp:
 121   1          rf_freq=ch.rf;   
 122   1          fif2=ch.f_if2;
 123   1          f_ifbw_width=ch.fif_bw;
 124   1          fstep=ch.f_step;
 125   1      
 126   1         #if(DEBUG)
 127   1            printf("中心频率=%f,第2中频=%f,带宽=%f,步骤=%f\n",rf_freq,fif2,f_ifbw_width,fstep);
 128   1            #endif
 129   1          calculate_desired();//步骤3.1- 计算flo1和flo2频率
 130   1          avoid_spurs();//步骤3.2 -避开假信号
 131   1          select_vco();//步骤3.3  -最优vco1选择
 132   1          calculate_lon();//步骤3.4  -计算lo1n  lo1a  lo2i  lo2n  lo2a  NUM  fnon
 133   1          write_registers();//步骤3.5  -写寄存器  
 134   1          if(check_lo_lock())//步骤3.6 -检查LO-PLL锁定  
 135   1                  {
 136   2                    if(optimize_vco())//步骤3.7 -优化VCO
 137   2                         {
 138   3                             power_sw=1;               
 139   3                             daya1(500000);
 140   3                             power_sw=0;    
 141   3                             daya1(500000);
 142   3                           tuning_start();//重新初始化
 143   3                           daya1(300000);
 144   3                           goto  lp;
 145   3                           }
 146   2                    if(check_lo_lock())//检查LO-PLL锁定  
 147   2                          write_b(tuning_address,0x02,0x20);//步骤3.8  -写LO控制寄存器-02
 148   2                    else 
 149   2                         { power_sw=1;               
 150   3                             daya1(500000);
 151   3                             power_sw=0;    
 152   3                             daya1(500000);
 153   3                           tuning_start();//重新初始化
 154   3                           daya1(300000);
 155   3                           goto  lp;
 156   3                         }   
 157   2                  }
 158   1          else   
 159   1                 {        power_sw=1;               
 160   2                           daya1(500000);
 161   2                           power_sw=0;    
 162   2                           daya1(500000);
 163   2                           tuning_start();//重新初始化
 164   2                           daya1(300000);
 165   2                           goto  lp;
 166   2                 } 
 167   1       }
 168          
 169          void calculate_desired()//步骤3.1- 计算flo1和flo2频率
 170          {
 171   1      
 172   1       float as;
 173   1      
 174   1        flo1_desired= rf_freq +fif1;
 175   1        as=(flo1_desired/fref)+(1/2); 
 176   1        lo1i=(unsigned int)as; 
 177   1        flo1=lo1i*fref;
 178   1        flo2_desired=flo1- rf_freq-fif2;
 179   1      
C51 COMPILER V7.01  TUNING                                                                 08/17/2003 17:24:40 PAGE 4   

 180   1      }
 181          
 182          
 183           void avoid_spurs()//步骤3.2 -避开假信号
 184           {
 185   1        unsigned char n_lo1adjust;//n次 lo1调整
 186   1        
 187   1         n_lo1adjust=1;
 188   1         do
 189   1         {
 190   2         if(n_lo1adjust>=3)
 191   2             return;       
 192   2         if(is_spurin_band())
 193   2            {
 194   3              if(flo1<flo1_desired)        
 195   3                 lo1i=lo1i+n_lo1adjust;         
 196   3              else   lo1i=lo1i-n_lo1adjust;

⌨️ 快捷键说明

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