📄 tuning.lst
字号:
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 + -