📄 progm.lst
字号:
209 1 df(flag,66,UiBuffer[2],0);
210 1 df(flag,74,21,0);
211 1 df(flag,78,UiBuffer[3],0);
212 1 df(flag,86,10,0);
213 1 }
214
215 void ds_erro1()//显示接线错误,无电流
216 {
217 1 lcd_init();
218 1 dh(5,4,32,0);
219 1 dh(5,20,33,0);
220 1 dh(5,36,34,0);
221 1 dh(5,52,35,0);
222 1 dh(5,68,37,0);
223 1 dh(5,76,36,0);
224 1 dh(5,92,7,0);
225 1 dh(5,108,20,0);
226 1 }
227
228
229 void cedianliu()//测试电路回路,功能:用于故障判断
230 {
231 1 uint dd,ff;
232 1 float uiDianliu;
233 1 dd= Read2543(0);
234 1 /*A/D读出电流值除以放大倍数还原原信号,再除以标准电阻得出电流,这里
235 1 将A/D数单位0.00061035,放大10倍,是为了去掉小数点,精确到小数点后一位*/
236 1 ff=Read2543(0);
237 1 ff=Read2543(0);
238 1 uiDianliu = (float)(ff* 0.0122/(VB*RB)*DIANLIUXIAO);
239 1 //uiDianliu = (uint)( Read2543(0)* 0.0061035/(VB*RB));
240 1 if((uiDianliu<850)|(uiDianliu>2500))//电流小于85A,或大于250A,提示接线错误
241 1 {
C51 COMPILER V7.06 PROGM 03/05/2009 08:55:15 PAGE 5
242 2 ds_erro1();//若结果异常,显示故障
243 2 SELC = 1;
244 2 while(1);
245 2 }
246 1 else
247 1 {
248 2 div_i_shuzi(uiDianliu);//分离转化为BCD数
249 2 showdianliu(4); //显示电流值,行x=4
250 2 }
251 1 }
252
253 void ds_erro2()//仪器故障
254 {
255 1 lcd_init();
256 1 dh(2,16,11,0);
257 1 dh(2,32,38,0);
258 1 dh(2,48,39,0);
259 1 dh(2,64,40,0);
260 1 dh(2,80,41,0);
261 1 dh(2,96,37,0);
262 1
263 1 dh(5,4,25,0);
264 1 dh(5,20,42,0);
265 1 dh(5,36,43,0);
266 1 dh(5,52,44,0);
267 1 dh(5,68,45,0);
268 1 dh(5,84,46,0);
269 1 dh(5,100,47,0);
270 1 df(5,116,22,0);
271 1 }
272
273 void liangcheng()//选择电压回路的量程
274 {
275 1 uint dushu;
276 1 AV1=AV2=0;//放大倍数为1,最小倍数
277 1 dushu=Read2543(1);
278 1 dushu=Read2543(1);
279 1 if(dushu>3768)//大于2.3V,满量程2.5V
280 1 {
281 2 ds_erro2();//仪器故障
282 2 SELC=1;
283 2 while(1);
284 2 }
285 1 else
286 1 {
287 2 AV2=1;//放大10倍
288 2 delay1ms(200);
289 2 dushu=Read2543(1);
290 2 dushu=Read2543(1);
291 2 if(dushu>3276)//大于4V,满量程5V
292 2 {
293 3 AV2=0;
294 3 VX=1.0;
295 3 xiao=DIANZUXIAO1;//确定该档位的修正因子
296 3 return;
297 3 }
298 2 else
299 2 {
300 3 AV1=1;//放大100倍
301 3 delay1ms(200);
302 3 dushu=Read2543(1);
303 3 dushu=Read2543(1);
C51 COMPILER V7.06 PROGM 03/05/2009 08:55:15 PAGE 6
304 3 if(dushu>3276)//大于4V,满量程5V
305 3 {
306 4 AV1=0;
307 4 VX=10.0;
308 4 xiao=DIANZUXIAO2;//确定该档位的修正因子
309 4 return;
310 4 }
311 3 else
312 3 {
313 4 VX=100.0;
314 4 xiao=DIANZUXIAO3;//确定该档位的修正因子
315 4 return;
316 4 }
317 3 }
318 2 }
319 1
320 1 }
321
322 /*将浮点数分离成整数和小数,并将小数扩大一千倍*/
323 void div_zhengshu_xiaoshu(float fdshu)
324 {
325 1 float fx,fz,ftm;
326 1 ftm = fdshu;
327 1 fx=modf(ftm, &fz);
328 1 iZHENGSHU=(long)fz;
329 1 fx=fx*1000;
330 1 iXIAOSHU=(long)fx;
331 1 }
332
333 void showdianzu(float Rtemp)//浮点分离电阻值
334 {
335 1 float Result;
336 1 uint shu_zhen,shu_xiao;
337 1 Result=Rtemp;
338 1 /*将浮点数分离成整数和小数,并将小数扩大一千倍*/
339 1 div_zhengshu_xiaoshu(Result);
340 1 shu_zhen=iZHENGSHU;//整数
341 1 shu_xiao=iXIAOSHU;//小数点后三位被放大1000,成为整数
342 1 if(shu_zhen<10)//小于10,小数点后三位数
343 1 {
344 2 dian_bit=3;
345 2 UiBuffer[4] = shu_zhen;
346 2 UiBuffer[5] = mod_100(&shu_xiao);
347 2 UiBuffer[6] = mod_10(&shu_xiao);
348 2 UiBuffer[7] = shu_xiao;
349 2 }
350 1 else if(shu_zhen<100)//小于100,小数点后2位数
351 1 {
352 2 dian_bit=2;
353 2 UiBuffer[4] = mod_10(&shu_zhen);
354 2 UiBuffer[5] = shu_zhen;
355 2 UiBuffer[6] = mod_100(&shu_xiao);
356 2 UiBuffer[7] = mod_10(&shu_xiao);
357 2 }
358 1 else //大于100,小数点后1位数
359 1 {
360 2 if(shu_zhen>999)//大于1000,无小数点
361 2 {
362 3 dian_bit=0;
363 3 UiBuffer[4] = mod_1000(&shu_zhen);
364 3 UiBuffer[5] = mod_100(&shu_zhen);
365 3 UiBuffer[6] = mod_10(&shu_zhen);
C51 COMPILER V7.06 PROGM 03/05/2009 08:55:15 PAGE 7
366 3 UiBuffer[7] = shu_zhen;
367 3 }
368 2 else
369 2 {
370 3 dian_bit=1;
371 3 UiBuffer[4] = mod_100(&shu_zhen);
372 3 UiBuffer[5] = mod_10(&shu_zhen);
373 3 UiBuffer[6] = shu_zhen;
374 3 UiBuffer[7] = mod_100(&shu_xiao);
375 3 }
376 2 }
377 1 xsdianzu(6);//显示行x=6
378 1 }
379
380 //测试电阻
381 void ceshidianzu()
382 {
383 1 uchar ucmp=30;
384 1 uint ucItmp;
385 1 float fRx=0.0 , K=0.0,fv=0.0, fi=0.0,rtmp=0.0,ucceshi=0.0 ;
386 1 K = VB*RB/VX ;
387 1 ucceshi=30.0;
388 1 while(ucmp--)
389 1 {
390 2 ucItmp=Read2543(1);
391 2 ucItmp=Read2543(1);
392 2 fv= (float)ucItmp;
393 2 ucItmp=Read2543(0);
394 2 ucItmp=Read2543(0);
395 2 fi= (float)ucItmp ;
396 2 rtmp=fv/fi ; //电压回路电流回路比值
397 2 fRx = fRx + rtmp; //送数到结果缓冲区,共计30次的累加和
398 2 }
399 1 //结果=比值的平均值 * K * 衰减倍数 * 校正因子
400 1 fRx = fRx/ucceshi*K*SHUAIJIAN*DIANLIUXIAO*1000000.0*xiao ;
401 1 showdianzu(fRx);//浮点分离测试数据
402 1 }
403
404 //测试结果
405 void showceshijieguo()
406 {
407 1 lcd_init();
408 1 dh(0,0,9,0);
409 1 dh(0,16,10,0);
410 1 dh(0,32,23,0);
411 1 dh(0,48,24,0);
412 1 df(0,64,17,0);
413 1 showdianliu(3);
414 1 xsdianzu(5);
415 1 }
416
417 uchar idata ch1[8]={0xb2,0xe2,0xca,0xd4,0xbd,0xe1,0xb9,0xfb};//测试结果
418 //uchar idata ch2[5]={0xb5,0xe7,0xd7,0xe8,0x3a};//电阻
419 //uchar idata ch3[5]={0xb5,0xe7,0xc1,0xf7,0x3a};//电流
420 uchar idata ch4[5]={0xcf,0xb5,0xcd,0xb3,0x3a};//系统:
421 uchar idata daRTmpBuf[7] = {0,0,0,0,0,0xa9,0xab};//前5个字节为电阻4位数+1个小数点,后2个字节为mΩ
422 uchar idata daiTmpBuf[6] = {0,0,0,0x2e,0,0x41};//前5个字节为电流4位数(含小数点后一位),后1个字节为A
423 void daima() // 转换打印代码
424 {
425 1 uchar i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -