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

📄 dmm.c

📁 数字万用表调试程序
💻 C
字号:
/*the main programe structure*/
#include <stdio.h>
#include <reg51.h>
#include <math.h>

  unsigned char  ge,shi, bai, qian, jiaozhun,cr0,cr1,cr2,cr3,cr4,FSCode=2,RangeCode=3;
  unsigned char  FSCodeM=0,RangeCodeM=0;
  char  RangeM,sp3;
  char  SelectF=0,SelectR=0;/*ControlCode=22;/*31;*/
  int   Y=0,eoc=0,temp=0,i=0,j=0,Rref,Radjust;
  int  Rx=0;
  void  rcm(),dcvm(),readbcd(),zeroc();


  void delay(void)
 {
  ;
 }
  void delay1(void)
  {/*extern int i;*/
   for(j=0;j<3000;j++){;}
  }

  void delay50ms()
  { /*extern int i;   */
   for(j=0;j<5000;j++){;}
  }
  void EOCR()        /*转换结果读取函数*/
  { /*extern int Y; */
LP1: P3|=0X08;/*while(!P3^3); wait EOC,get the ad convertion,*/
     delay();        /*need delay??*/
     sp3=P3;
     sp3&=0X08;
     if(sp3==0) goto LP1; /*test the P3^3 0 or 1*/
     else
  P3&=0X7F;  /*P3.7置零,写控制信号WD有效*/
  P1|=0X0F;  
  delay();
  P1=0X88;  
  delay();
  delay();
  P3=0X80;  
  P1&=0XF7;  
   delay();         /*delay*/  /*Tacc=3.25us*/
   delay();
  P1=0XF0;  /*无效地址7*/
  P1|=0XF0;  /*先对p1高四位数据口置1*/
  delay();
  jiaozhun=P1; 

  P1=0X01;  /*个位寄存器地址=1*/
  P1|=0XF0;  
  delay();
  ge=P1; 

  P1=0X02;  /*十位寄存器地址=2*/
  P1|=0XF0;  /*先对p1高四位数据口置1*/
  delay();
  shi=P1; /*保存十位数据,应右移四位*/

  P1=0X03;  /*百位寄存器地址=3*/
  P1|=0XF0;  /*先对p1高四位数据口置1*/
  delay();
  bai=P1; /*保存百位数据,应右移四位*/

  P1=0X04;  /*千位寄存器地址=4*/
  P1|=0XF0;  
  delay();
  qian=P1; 

  ge>>=4;
  shi>>=4;
  bai>>=4;
  qian>>=4;
  jiaozhun>>=4;
  if(i<50){
  Y=ge;
  Y=Y+shi*10;
  Y=Y+bai*100;
  Y=Y+qian*1000;
        }

  else {
  temp=ge;
  temp=temp+shi*10;
  temp=temp+bai*100;
  temp=temp+qian*1000;
  /*temp=jiaozhun; */
  P1=0X0C;
  P3&=0X77;  /*P3.7置零,写控制信号WD有效*/
  i=0;
  SelectF=0;
   }
  /*y=ge+shi*10+bai*100+qian*1000;*/

  Y=Y-temp;
  if(Y>=6000){Y=Y-10000;} 
  /*Y=Y+55;*/
  /*if(Y>4500&&Y<5000){Y=Y-4932;}  */
  P1=0X08;  
  P3&=0X7F;  
  delay();
  delay();
  P3|=0X80;  

  /*jiaozhun>>=4;*/
  /*Y=Y-jiaozhun; 
  /*P3&=0XF7; /*INT1=0;/*IE1=0;*/

  }

  void WCCF()    
  {
  cr0=cr0*16;  /*根据电路要求左移4位**/
  cr1=cr1*16;
  cr2=cr2*16;
  cr3=cr3*16;
  cr4=cr4*16;
  /*P3|=0X80;
  delay();*/
  P3&=0X7F;  /*P3.7置零,写控制信号WD有效*/
  delay();
  P1|=0X0F;  /*P1.3=1,即RD无效,地址=7wu*/
    /*P1=0X88;  /*HOLD=1,RD无效*/
  delay();
  P1=0X88;  /*HOLD=1,RD无效*/
  delay();
  P1|=0X0F;  /*,RD=1 ,adress=7防止干扰*/
  delay();
  cr0|=0X08;
  P1=cr0;  /*由于电路的要求cr0 之前已经左移4位 对寄存器0写入控制字*/
  delay();
  P1|=0X0F; /*防止不稳定情况*/
  cr1|=0X09;

  P1=cr1;   /*对寄存器1写入控制字*/
  delay();
  P1|=0X0F; 
  cr2|=0X0A;

  P1=cr2;  /*对寄存器2写入控制字*/
  delay();
  P1|=0X0F; /*防止不稳定情况*/
  cr3|=0X0B;

  P1=cr3;  /*对寄存器3写入控制字*/
  delay();
  P1|=0X0F; /*防止不稳定情况*/
  cr4|=0X0C;

  P1=cr4;  /*对寄存器4写入控制字*/
  delay();
  P1|=0X0F; /*完成对寄存器的写入*/
  P1=0X08;  /*HOLD=0,RD无效*/
  delay();
  P3|=0X80;  /*P3.7置1,写控制信号WD无效*/
  /*delay();*/
  }

  void MVF()  /*电压测量函数FSCode=1 or 2*/
  {/*P3=0XF1; 
   FSCodeM=FSCode;
   RangeCodeM=RangeCode;
   cr0=0X00;   
   cr4=0X01;   
   cr1=0X05;   /*filter short and filter on =1*/
   if(FSCode==1){cr3=0X0A;}  /*直流电压测量*/
   else {cr3=0X06;}     /*交流电压测量*/
   switch(RangeCode)
    {case 1:   /*400mv量程*/
      P3=0XF9;        /*400mV量程电压测试前端继电器控制电路可以与电阻测量电路相同*/
      cr1=0X0D;
      cr2=0X00;
      cr3&=0X0D;
      break;
     case 2:  /*4V量程*/
      cr1=0X05; 
      cr2=0X01;
      break;
     case 3:  /*40V量程*/
      cr2=0X02;

      break;
     case 4:  /*400V量程*/
      cr2=0X04;
      break;
     case 5:  /*4000V量程 实际为1000V*/
      cr2=0X08;
      break;
    }

    WCCF(); /*写控制字*/

  }

  void MRF()  /*电阻测量函数FSCode=3*/
  { /*P3=0XF0;        /*前端形成电阻测量电路*/
   FSCodeM=FSCode;
   RangeCodeM=RangeCode;
    cr0=0X00;   /*此处可以进行优化*/
    cr1=0X05;
    cr3=0X09;   /*ohms measurement*/
    cr4=0X01;
   switch(RangeCode)
    {case 1:   /*400 欧姆量程 xxx.x*/
      cr2=0X08;
      Rref=1;   /*参考电压为1k  Rref=0.1*/
      Radjust=20;  /*待调后决定*/
      break;
     case 2:  /*4k 欧姆量程 x.xxx*/
      cr2=0X04;
      Rref=10;    /*参考电压为10k*/
      Radjust=24; /*待调后决定*/
      break;
     case 3:  /*40k欧姆量程 xx.xx*/
      cr2=0X02;
      Rref=10;   /*参考电压为101k*/
      Radjust=6;  /*待调后决定*/
      break;
     case 4:  /*400k欧姆量程 xxx.x*/
      cr2=0X01;
      Rref=10;    /*参考电压为1.11M*/
      Radjust=6;     /*待调后决定*/
      break;
     case 5:  /*4M欧姆量程 x.xxx*/
      cr1=0X0D;
      cr2=0X00;
      Rref=10;  /*参考电压为10M*/
      Radjust=2;  /*待调后决定*/
      break;
     case 6:  /*40M欧姆量程 xx.xx*/
      cr1=0X0F; /*待详查核对*/
      cr2=0X00;
      cr4=0X01;
      Rref=10;
      Radjust=6;  /*待调后决定*/
      break;
     }
      WCCF(); /*写控制字*/

  }

  void MCF()  /*测量电路通断FSCode=4*/
  { /*P3=0XF0;        /*前端形成通断测试电路*/
    FSCodeM=FSCode;
    cr0=0X00;   /*此处可以进行优化*/
    cr1=0X05;
    cr3=0X09;   /*ohms measurement*/
    cr4=0X01;
    cr2=0X08;   /*用400 欧姆量程*/
    Rref=1;    /*参考电压为1k*/
    WCCF();

   /*if(-50<Y<50) /*test continuity, if less than 50 OHM, mesn the circuit is shorten*/
   /*   {cr0=0X06; /*set the information of beeper on*/
    /*   WCCF(); }
  */

  }

  void MDF()  /*测量二极管函数FSCode=5,400mv 输入,VCR_C=1 DIODE_TEST_C=1*/
  {/* P3=0XF5;        /*前端形成二极管测试电路*/
    FSCodeM=FSCode;
    cr0=0X00;   /*此处可以进行优化*/
    cr4=0X01;
    cr1=0X0F; /*除以5的模式*/
    cr2=0X00;
    cr3=0X08;
    WCCF();

  }

 void MIF() /*电流测试函数,对应功能选择码是4(DC) or 5(AC) 先仅设置一个档位*/
 { /*P3=0XF3;        /*前端形成电流测量电路*/
   FSCodeM=FSCode;
   RangeCodeM=RangeCode;
   cr0=0X00;   /*此处可以进行优化*/
   cr4=0X09;
   cr1=0X01; /**/
   cr2=0X00;
   if(FSCode==4){cr3=0X08;}  /*直流电流测量*/
   else {cr3=0X04;}     /*交流电流测量*/
   WCCF();
 }




 main()
 {
/*RESTAR: i=1; */
  /* while(1)         /*endless loop*/
   P3&=0X7F;
  P1=0X68;
  delay();
  P1=0X00;
  delay();

RESTAR:  if(FSCode==1||FSCode==2)
          {P3=0XF0; /*控制继电器,形成电压测试电路*/
LPV1:      MVF();
LPV2:      EOCR(); /*读取转换结果*/
           Y=Y+55;
           Y=Y+0;        /*数据结果处理 待补*/
           if(FSCode==FSCodeM&&RangeCodeM==RangeCode) goto LPV2;
           if(!RangeCodeM==RangeCode) goto LPV1;
         /*else break;  */
           }
   else if(FSCode==3)
          {P3=0XF9;        /*前端形成电阻测量电路*/
           P3=0XE9;
           delay();

LPR1:      MRF();
LPR2:      EOCR(); /*读取转换结果*/
           if(Y>4500&&Y<5500)
              {Y=Y-4952;      /*可以省去,说明输入为空,资料给定值也为49520*/
               Rx=0;
              }
           else{ Y=Y+Radjust;        /*数据结果处理 待补*/
                 if(RangeCodeM==1)
                   {Rx=Y*10;
                   }
                 else{  Rx=Y*Rref;}
                 Rx=Rx/5;  /*转换代码到结果的转换公式*/
               }
           Rx=Rx+0;
           if(FSCode==3&&RangeCodeM==RangeCode) goto LPR2;
           if(!RangeCodeM==RangeCode) goto LPR1;
           /*else break;  */
          }
   else if(FSCode==4||FSCode==5)
          {P3=0XF3;        /*前端形成电流测量电路*/
LPI1:      MIF();
LPI2:      EOCR(); /*读取转换结果*/
                   /*数据结果处理 待补*/
           if(FSCodeM==FSCode&&RangeCodeM==RangeCode) goto LPI2;
           if(!RangeCodeM==RangeCode) goto LPI1;
           /*else break;  */
          }

   else if(FSCode==6)
          {//P3=0XF1;        /*前端形成通断测试电路*/
           //P3=0XE1;

           MCF();
LPC:      EOCR(); /*读取转换结果*/

          Rx=Y+20;    /*校正由于串连PTC而引起的误差。数据结果处理 待补*/
          Rx=Rx*Rref;
          Rx=Rx/5;  /*转换代码到结果的转换公式*/
          if(Rx>-50&&Rx<50) /*test continuity, if less than 50 OHM, mesn the circuit is shorten*/
             {
             P3&=0X7F; /*写控制有效*/
             P1=0X28;  /* beeper on*/
             delay50ms();
             P1=0X08;
             P3|=0X80; /*关写控制*/
             /*cr0=0X06; /*set the information of beeper on*/
             }
           if(Y>4500&&Y<5500)
              {Y=Y-4952;      /*说明输入为空,资料给定值也为49520*/
               Rx=0;
              }
             Rx=Rx+0;
           if(FSCodeM==FSCode) goto LPC;
           /*else break;  */
           }

   else if(FSCode==7)
          {//P3=0XF5;        /*前端形成二极管测试电路*/
           //P3=0XF9;        /*前端形成电阻测量电路,需在电阻模式下完成*/
           MDF();
LPD:       EOCR(); /*读取转换结果*/
                    /*数据结果处理  应该除以2才得到正确结果 待补*/
                Y=Y+0;
            if(FSCode==7) goto LPD;
           /*else break;  */
          }

  else goto RESTAR;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -