📄 main.lst
字号:
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\main.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE .\main.c DEBUG OBJECTEXTEND
stmt level source
1 /***************************************
2 RLC测试仪
3 ***************************************/
4 #include<stdio.h>
5 #include<reg52.h>
6 #include<math.h>
7 #include<string.h>
8 #include"tdp.h"
9 #define FUN_PORT P2
10 #define T_STOP TCON&=~0X50
11 #define T_RUN TCON|=0X50
12 #define PRINTF(x) LCD_puts(ftos(x))
13 #define PUTS(s) LCD_puts(s)
14 #define PUTCHAR(c) w_dat(c)
15 #define GOTO(x,y) LCD_gotoxy(x,y)
16 #define R_MAX 3e6
17 #define L_MAX 1
18 #define C_MAX 1
19 #define T_MAX 3
20 //#define SOFT
21 bit JIAOZHUN; //校准模式标志位
22 uchar function; //正在使用的功能代号
23 uchar THH0; //T0计数扩展单元
24 uchar THH1;
25 LONG_CHAR Time;
26 LONG_CHAR Count;
27 bit have_cy; //有采样值标志位
28 uchar liangcheng; //量程号
29 uchar code count_chuzhi[]= //各量程计数初值
30 {//THH0,TH0,TL0,TH1,TL1
31 0x1f,0x3c,0xb0,0x00,0x00,
32 0x00,0x00,0x00,(65536-20)>>8,65536-20,
33 0x00,0x00,0x00,0xff,0xff
34 };
35 float Tin,Tout;
36 uchar fun_addr[]={0x08,0xE0,0x11};//RLC
37 sbit key =P3^3;
38 sbit LED=P0^1;
39 void R_disp(float r)
40 {
41 1 if (JIAOZHUN) //较准
42 1 {
43 2 GOTO(0,0);
44 2 PUTS("T=");
45 2 PRINTF(Tout);
46 2 PUTS("s ");
47 2 PRINTF(Tin);
48 2 PUTS("s ");
49 2 }
50 1 else
51 1 {
52 2 GOTO(0,0);
53 2 PUTS("-------R--------");
54 2 }
55 1 GOTO(1,0);
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 2
56 1 PUTS(" Rx=");
57 1 if(r<R_MAX)
58 1 {
59 2 PRINTF(r);
60 2 PUTS("\1 \0025% ");
61 2 }
62 1 else
63 1 PUTS("OVER ");
64 1 }
65
66 void L_disp(float l)
67 {
68 1 if (JIAOZHUN) //较准
69 1 {
70 2 GOTO(0,0);
71 2 PUTS("T=");
72 2 PRINTF(Tout*Tout);
73 2 PUTS("s ");
74 2 PRINTF(Tin*Tin);
75 2 PUTS("s ");
76 2 }
77 1 else
78 1 {
79 2 GOTO(0,0);
80 2 PUTS("-------L--------");
81 2 }
82 1 GOTO(1,0);
83 1 PUTS(" Lx=");
84 1 if(l<L_MAX)
85 1 {
86 2 PRINTF(l);
87 2 PUTS("H \0025% ");
88 2 }
89 1 else
90 1 PUTS("OVER ");
91 1 }
92
93 void C_disp(float c)
94 {
95 1 if (JIAOZHUN) //较准
96 1 {
97 2 GOTO(0,0);
98 2 PUTS("T=");
99 2 PRINTF(Tout);
100 2 PUTS("s ");
101 2 PRINTF(Tin);
102 2 PUTS("s ");
103 2 }
104 1 else
105 1 {
106 2 GOTO(0,0);
107 2 PUTS("-------C--------");
108 2 }
109 1 GOTO(1,0);
110 1 PUTS(" Cx=");
111 1 if(c<C_MAX)
112 1 {
113 2 PRINTF(c);
114 2 PUTS("F \0025% ");
115 2 }
116 1 else
117 1 PUTS("OVER ");
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 3
118 1 }
119
120 float R_value(float T)
121 {
122 1 float code tab[][2]=
123 1 {//Ti,Ri; 按Ti升序排列
124 1 12.85e-6,0,
125 1 12.91e-6,10,
126 1 13.82e-6,100,
127 1 14.20e-6,120,
128 1 15.20e-6,220,
129 1 18.20e-6,400,
130 1 18.28e-6,470,
131 1 19.38e-6,560,
132 1 20.85e-6,610,
133 1 25.06e-6,1e3,
134 1 80.42e-6,5.1e3,
135 1 149.5e-6,10e3,
136 1 284.2e-6,20e3,
137 1 424.7e-6,30e3,
138 1 // 649.7e-6,41e3,
139 1 592.4e-6,43e3,
140 1 701.9e-6,51e3,
141 1 946.6e-6,68e3,
142 1 1.362e-3,100e3,
143 1 1.608e-3,120e3,
144 1 2.048e-3,150e3,
145 1 7.490e-3,560e3,
146 1 12.51e-3,1e6,
147 1 15.89e-3,1.2e6,
148 1 25.01e-3,2e6
149 1 };
150 1 float rx;
151 1 char i;
152 1 if(T<T_MAX)
153 1 {
154 2 for(i=0;i<sizeof(tab)/8-2;i++)
155 2 {
156 3 if(T<tab[i+1][0])break;
157 3 }
158 2 rx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
159 2 }
160 1 else rx=R_MAX; //rx=INF
161 1 if(rx<0) rx=0;
162 1 return rx;
163 1 }
164
165 float L_value(float T)
166 {
167 1 float code tab[][2]=
168 1 {//Ti*Ti,Li; 按Ti*Ti升序排列
169 1 43.76e-12,5.6e-6,
170 1 70.55e-12,10e-6,
171 1 649.7e-12,100e-6,
172 1 6.076e-9,1e-3
173 1 };
174 1 float lx;
175 1 char i;
176 1 T*=T;
177 1 if(T<T_MAX*T_MAX)
178 1 {
179 2 for(i=0;i<sizeof(tab)/8-2;i++)
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 4
180 2 {
181 3 if(T<tab[i+1][0])break;
182 3 }
183 2 lx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
184 2 }
185 1 else lx=L_MAX;
186 1 return lx;
187 1 }
188
189 float C_value(float T)
190 {
191 1 float code tab[][2]=
192 1 {//Ti,Ci; 按Ti升序排列
193 1 4.578e-6,0,
194 1 4.657e-6,5e-12,
195 1 4.736e-6,10e-12,
196 1 4.911e-6,22e-12,
197 1 5.031e-6,30e-12,
198 1 5.065e-6,33e-12,
199 1 6.045e-6,100e-12,
200 1 7.311e-6,200e-12,
201 1 10.27e-6,470e-12,
202 1 15.88e-6,1e-9,
203 1 18.89e-6,1.5e-9,
204 1 48.03e-6,4.7e-9,
205 1 88.70e-6,6.8e-9,
206 1 111.6e-6,10e-9,
207 1 239.0e-6,20e-9,
208 1 395.7e-6,47e-9,
209 1 980.0e-6,100e-9
210 1 };
211 1 float cx;
212 1 char i;
213 1 if(T<T_MAX)
214 1 {
215 2 for(i=0;i<sizeof(tab)/8-2;i++)
216 2 {
217 3 if(T<tab[i+1][0])break;
218 3 }
219 2 cx=tab[i][1]+(tab[i+1][1]-tab[i][1])*(T-tab[i][0])/(tab[i+1][0]-tab[i][0]);
220 2 }
221 1 else cx=C_MAX;
222 1 if(cx<0) cx=0;
223 1 return cx;
224 1 }
225 /*数值滤波函数*/
226 float shuzhilvbo(float in)
227 { static float out;
228 1 float x;
229 1 x=fover(in)?1:fabs(in-out)/in;
230 1 if(fover(x)||x>0.005) out=in;
231 1 // else if(x>0.001) out=0.95*out+0.05*in;
232 1 return out;
233 1 }
234 /*脉冲周计算函数*/
235 float puls_cycle(void)
236 {
237 1 float t;
238 1 if(Count.l!=0)
239 1 {
240 2 t=65536e-6*8;
241 2 t=t/Count.l;
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 5
242 2 }
243 1 else t=T_MAX;
244 1 have_cy=0;
245 1 return t;
246 1 }
247 void t0_int() interrupt 1 using 1
248 {
249 1 if((++THH0&0x7)==0)
250 1 {
251 2 T_STOP;
252 2 if(!have_cy)
253 2 {
254 3 //保存计数值
255 3 Count.c[0]=0;
256 3 Count.c[1]=THH1;
257 3 Count.c[2]=TH1;
258 3 Count.c[3]=TL1;
259 3 have_cy=1;
260 3 // LED=!LED;
261 3 }
262 2 THH0=0;
263 2 TH0=0;
264 2 TL0=0;
265 2 THH1=0;
266 2 TH1=0;
267 2 TL1=0;
268 2 T_RUN;
269 2 }
270 1 }
271
272 void ex1_int() interrupt 2 using 1
273 {
274 1 int i;
275 1 EX1=0;
276 1 for(i=0;i<2000;i++);
277 1 if(!key)
278 1 {
279 2 if(++function==3)function=0;
280 2 FUN_PORT=fun_addr[function];
281 2 have_cy=1;
282 2 }
283 1 IE1=0;
284 1 EX1=1;
285 1 }
286
287 void t1_int() interrupt 3 using 1
288 {
289 1 THH1++;
290 1 /* uchar code *p;
291 1 T_STOP;
292 1 if(!have_cy)
293 1 {
294 1 time.c[0]=0x00;
295 1 time.c[1]=THH0&0xc0; //保存采样值
296 1 time.c[2]=TH0;
297 1 time.c[3]=TL0;
298 1 count.c[0]=TH1;
299 1 count.c[1]=TL1;
300 1 have_cy=1;
301 1 }
302 1
303 1 //重装计数初值
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 6
304 1 p=count_chuzhi+5*liangcheng;
305 1 THH0=*p++;
306 1 TH0=*p++;
307 1 TL0=*p++;
308 1 TH1=*p++;
309 1 TL1=*p;
310 1
311 1 T_RUN; */
312 1 }
313
314 void init()
315 {
316 1 #ifdef SOFT
TMOD=0X20;
SCON=0X52;
TH1=0XF3;
TR1=1;
#else
322 1 TMOD=0X51; //T1计数T0计时
323 1 TR0=1;
324 1 TR1=1;
325 1 ET0=1;
326 1 ET1=1;
327 1 IT1=1; //init1边延触发
328 1 EX1=1;
329 1 EA=1;
330 1 FUN_PORT=fun_addr[0];
331 1 JIAOZHUN=!key;
332 1 #endif
333 1 }
334 main()
335 {
336 1 float x;
337 1 LCD_init();
338 1 init();
339 1 while(1)
340 1 {
341 2 if(have_cy)
342 2 {
343 3 Tin=puls_cycle(); //计算脉冲周期
344 3 Tout=shuzhilvbo(Tin); //数值滤波
345 3 // printf("%f",Tin);
346 3 switch(function)
347 3 {
348 4 case 0:
349 4 x=R_value(Tout);
350 4 R_disp(x);
351 4 break;
352 4 case 1:
353 4 x=L_value(Tout);
354 4 L_disp(x);
355 4 break;
356 4 case 2:
357 4 x=C_value(Tout);
358 4 C_disp(x);
359 4 break;
360 4 }
361 3 }
362 2 }
363 1
364 1 }
C51 COMPILER V6.12 MAIN 06/28/2007 13:08:17 PAGE 7
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2248 ----
CONSTANT SIZE = 507 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 27 55
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -