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

📄 nmr.lst

📁 TLV2544程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -