📄 nmr.lst
字号:
333 {
334 1 SCON=0x50; TMOD=0x21; PCON=0x80; TR0=0;
-
- 0;
*** WARNING C275 IN LINE 334 OF .\NMR.C: expression with possibly no effect
335 1 TH1=0xff; TL1=0xff; TR1=1; ET0=0; ES=1; EA=1;
336 1 es485=L;
337 1 }
338 void serial(void) interrupt 4 using 1
339 {
340 1 unsigned char data temp,j;
341 1 ES=0;
342 1 j=0;
343 1 RI=0;
344 1 temp=SBUF;
345 1 trstate=L;
346 1 if(temp==BEGIN)
347 1 {
348 2 command[j]=temp;
349 2 j=j+1;
350 2 while((j<20)&(temp!=0x0d))
351 2 {
352 3 while(!RI);
353 3 RI=0;
354 3 temp=SBUF;
355 3 command[j]=temp;
356 3 j=j+1;
357 3 }
358 2 mode=0;n=j;
359 2 bcc();
360 2 if(kk){
361 3 proc_command();
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 7
362 3 }
363 2 else{
364 3 senderrbcc();
365 3 }
366 2 }
367 1 ES=1;
368 1 trstate=H;
369 1 }
370 //数据传送错误返回指令
371 void senderrbcc(void) using 1
372 {
373 1 command[0]=SOH;
374 1 command[1]=NMRTYPE;
375 1 command[2]=EQU;
376 1 //
377 1 command[7]=END;
378 1 command[4]=ERRBCC;
379 1
380 1
381 1 mode=1;n=8;
382 1 bcc();
383 1 sendcommand();
384 1 }
385 //AD写配置寄存器及控制通道,并读取数据
386 unsigned int adrdwr(unsigned int par)
387 {
388 1 unsigned char data i;
389 1 unsigned int idata parp,parp1;
390 1 parp=par;
391 1 parp1=0x00;
392 1 SCLK=L;
393 1 CS=H;
394 1 Delay_10_uS();
395 1 CS=L;
396 1 for(i=0;i<16;i++)
397 1 {
398 2 if((parp&0x8000)==0x8000) {SDI=H;}else {SDI=L;}
399 2 parp=parp<<1;
400 2 SCLK=H;
401 2 Delay_10_uS();
402 2 parp1=parp1<<1;
403 2 if(SDO==H){parp1=parp1|0x0001;}
404 2 SCLK=L;
405 2 Delay_10_uS();
406 2 }
407 1 Delay_10_uS();
408 1 CS=H;
409 1 return (parp1);
410 1 }
411 //写da,中断调用
412 void writeda(unsigned int k) using 1
413 {
414 1 unsigned char data i;
415 1 unsigned int idata dat;
416 1 dat=k;
417 1 FS=L;
418 1 Delay_10_uS();
419 1 for(i=0;i<16;i++)
420 1 {
421 2 DSCLK=H;
422 2 Delay_10_uS();
423 2 if((dat&0x8000)==0x8000)DIN=H;else DIN=L;
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 8
424 2 dat=dat<<1;
425 2 DSCLK=L;
426 2 Delay_10_uS();
427 2 }
428 1 FS=H;
429 1 }
430 //da初始化
431 void dainit(void) using 1
432 {
433 1 DSCLK=L;
434 1 DIN=H;
435 1 FS=H;
436 1 //writeda(0xd002);//内部参考
437 1 writeda(0xd000);
438 1
439 1 }
440 //ad初始化
441 void adinit(void)
442 {
443 1 unsigned int idata command1;
444 1 CS=H;
445 1 SCLK=L;
446 1 CSTART=H;
447 1 SDI=H;
448 1 SDO=H;
449 1 INT=H;
450 1 command1=0xA000; //power up
451 1 command1=adrdwr(command1);
452 1 delay_ms(10);
453 1 command1=0xA000;
454 1 command1=adrdwr(command1);
455 1 delay_ms(10);
456 1 }
457 //ad发送数据
458 void sendadc(void) using 1
459 {
460 1 union u idata kk;
461 1 unsigned char data k,m;
462 1 while(flag==1);
463 1 switch(ch){
464 2 case '0': kk.word=chl0;
465 2 break;
466 2 case '1': kk.word=chl1;
467 2 break;
468 2 case '2': kk.word=chl2;
469 2 break;
470 2 case '3': kk.word=chl3;
471 2 break;
472 2 default: kk.word=chl0;
473 2 break;
474 2 }
475 1 command[0]=SOH;
476 1 command[1]=NMRTYPE; //type号
477 1 command[2]=EQU; //设备号
478 1 //command[3]:功能码[A];command[4]:通道号
479 1 command[5]= OK; //确认命令,选择通道正确,并返回数据
480 1 command[11]=END;
481 1 k=kk.bytes.high;
482 1 m=k;
483 1 k=k>>4;
484 1 k=k&0x0f;
485 1 command[6]=asci[k];
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 9
486 1 k=m;
487 1 k=k&0x0f;
488 1 command[7]=asci[k];
489 1 k=kk.bytes.low;
490 1 m=k;
491 1 k=k>>4;
492 1 k=k&0x0f;
493 1 command[8]=asci[k];
494 1 k=m;
495 1 k=k&0x0f;
496 1 command[9]=asci[k];
497 1 mode=1;n=12;
498 1 bcc();
499 1 sendcommand();
500 1 }
501 //校验
502 void bcc(void) using 1
503 {
504 1 unsigned char data jj,jj1;
505 1 unsigned char idata bcc1,bcc2;
506 1 kk=0;
507 1 if (mode==0x0)
508 1 {
509 2 bcc1=0;
510 2 for(jj=0;jj<n-3;jj++)
511 2 {
512 3 bcc1=bcc1^command[jj];
513 3 }
514 2 jj1=bcc1&0x0f;
515 2 bcc2=asci[jj1];
516 2 bcc1=bcc1>>4;
517 2 jj1=bcc1&0x0f;
518 2 bcc1=asci[jj1];
519 2 if(bcc1==command[jj]&(bcc2==command[jj+1]))
520 2 {
521 3 kk=1;
522 3 }
523 2 else
524 2 {
525 3 kk=0;
526 3 }
527 2 }
528 1 else
529 1 {
530 2 bcc1=0;
531 2 for(jj=0;jj<n-3;jj++)
532 2 {
533 3 bcc1=bcc1^command[jj];
534 3 }
535 2 bcc2=asci[bcc1&0x0f];
536 2 jj=jj+1;
537 2 command[jj]=bcc2;
538 2 bcc1=asci[(bcc1&0xf0)>>4];
539 2 jj=jj-1;
540 2 command[jj]=bcc1;
541 2 kk=1;
542 2 }
543 1 }
544
545 //功能码错误返回子程序
546 void senderrf(void) using 1
547 {
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 10
548 1 command[0]=SOH;
549 1 command[1]=NMRTYPE;
550 1 command[2]=EQU;
551 1 command[4]=command[3];
552 1 command[3]=ERRF;
553 1 command[7]=END;
554 1 mode=1;n=8;
555 1 bcc();
556 1 sendcommand();
557 1 }
558
559 //通道选择错误返回子程序
560 void senderrc(void) using 1
561 {
562 1 command[0]=SOH;
563 1 command[1]=NMRTYPE;
564 1 command[2]=EQU;
565 1 //command[3]:功能码[A];command[4]:通道号
566 1 command[5]=ERRC; //错误命令,选择通道不正确,返回通道号
567 1 command[8]=END;
568 1 mode=1;n=9;
569 1 bcc();
570 1 sendcommand();
571 1 }
572
573 //da输出
574 void daout(void) using 1
575 {
576 1 unsigned char data h,m,l;
577 1 union u idata kk;
578 1 unsigned int idata dat;
579 1
580 1 h=command[4];
581 1 m=command[5];
582 1 l=command[6];
583 1 if(h<0x41){h=h-0x30;}else{h=h-0x41+0xa;}
584 1 if(m<0x41){m=m-0x30;}else{m=m-0x41+0xa;}
585 1 if(l<0x41){l=l-0x30;}else{l=l-0x41+0xa;}
586 1 h=h&0x0f;
587 1 h=h|0x40;
588 1 m=m&0x0f;m=m<<4;
589 1 l=l&0x0f;m=m|l;
590 1 kk.bytes.high=h;
591 1 kk.bytes.low=m;
592 1 dat=kk.word;
593 1 writeda(dat);
594 1 writeda(dat);
595 1 powercon=L;
596 1 //
597 1 command[0]=SOH;
598 1 command[1]=NMRTYPE;
599 1 command[2]=EQU;
600 1 command[7]=command[6]; //DH
601 1 command[6]=command[5]; //DM
602 1 command[5]=command[4]; //DL
603 1 command[4]=OK; //成功标志位:S
604 1 //
605 1 command[10]=END;
606 1 mode=1;n=11;
607 1 bcc();
608 1 sendcommand();
609 1 }
C51 COMPILER V6.12 NMR 06/11/2006 11:23:04 PAGE 11
610
611 void sendequok(void) using 1
612 {
613 1 command[0]=SOH;
614 1 command[1]=NMRTYPE;
615 1 command[2]=EQU;
616 1 command[4]=OK;
617 1 command[7]=END;
618 1 mode=1;n=8;
619 1 bcc();
620 1 sendcommand();
621 1
622 1 }
623
624 //主处理程序
625 void proc_command() using 1
626 {
627 1 if (command[1]==NMRTYPE &command[2]==EQU){//电源模块
628 2 switch(command[3]){
629 3 case AD://ad
630 3 switch(command[4]){
631 4 case CHA0 :
632 4 ch='0';sendadc();break;
633 4 case CHA1 :
634 4 ch='1';sendadc();break;
635 4 case CHA2 :
636 4 ch='2';sendadc();break;
637 4 case CHA3 :
638 4 ch='3';sendadc();break;
639 4 default:senderrc();break;//通道错误返回
640 4 }
641 3 break;
642 3 case DA://da
643 3 daout();
644 3 break;
645 3 case EC://设备检测
646 3 sendequok();
647 3 break;
648 3 case CLOSEDC://关闭高压电源,再次调整电压时,系统自动开启该模块!软件需先写0电压值,在调用此函
-数!
649 3 close();
650 3 break;
651 3 default:senderrf();//功能码错误返回
652 3 break;
653 3 }
654 2 }
655 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2406 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 15
IDATA SIZE = 16 26
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -