数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 216|回复: 18

[综合] 四位高精度电压电流毫欧表(AVR),电压精度媲美4位FLUKE万用表

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式
本帖最后由 mxpro 于 2025-9-13 12:06 编辑

使用STC8H1K08T的四位高精度电压电流毫欧表(AVR),也可以使用STC8H8K64U。
使用电阻网络自动切换电压量程,无需电位器完全软件修正校准量程。
使用显示窗口技术,电压精度可以跟4位FLUKE万用表媲美吧,电压分辨率可以达到1mv步进。
使用串口向外发送电压电流电阻测量值,可外接串口屏作高档表头。

原理图使用嘉立创EDA打开

AVR SCH


AVR 实物图


AVR3D图


自制的电压基准


10V实测


30V实测


55V实测


76.4V实测




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +90 收起 理由
不长叶子的树 + 90

查看全部打赏

 楼主| 发表于 5 小时前 | 显示全部楼层
源代码,喝了太多聪明水,毫欧表功能还没能加入,源代码就被国家大佬盗过并修改过,仅供参考吧

  1. /*-----------------------------------------------
  2.   AVmeter STC8H1K08T RES 2K22*4--2K5--10K
  3.   Oscilator:24Mhz
  4. ------------------------------------------------*/

  5. #include <STC8H.H>
  6. #define uint unsigned int
  7. #define uchar unsigned char  
  8. #define iRefValue (*(unsigned int idata*)0xef)
  9. #define eRefValue (*(unsigned int volatile xdata *)0xfde7)

  10. #define UID0        0xF8  
  11. #define UID1        0x40
  12. #define UID2        0xC4
  13. #define UID3        0x97
  14. #define UID4        0x09
  15. #define UID5        0x5C
  16. #define UID6        0x7D

  17. #define chRefV2K2D  11
  18. #define chRefV2K2C  10
  19. #define chRefV2K2B  9
  20. #define chRefV2K2A  8
  21. #define chRefV4400  7
  22. #define chRefV3570  6
  23. #define chRefV2750  5
  24. #define chRefV2350  4
  25. #define chRefV1730  3
  26. #define chRefV1340  2
  27. #define chRefVA620  1

  28. #define constVoltDivider  2300                //100*(R1+R2)/R2=100*(100+4.4)/4.7=2234
  29. #define constAVResL       2100                //4v4:2k1-13k  5v0:2k5-18k
  30. #define constAVResH       13000
  31. #define constVRefineTurn  10470               //VRefineTurn/100=95.30% 9770 9720  9545
  32. //#define constHVFineTurn   1000               

  33. #define constARANGE       10000               //5000ma
  34. #define constAFineTurn    10000               //AFineTurn/100=100.00% 10000 10716
  35. #define constHICFullADC   1595.0              //5A:1478(4V4);10A:1595(5V)/1565(4V4);20A:???
  36. #define constResFullADC   780                 //10mR,10A   
  37. #define constATurnStep    50                  //100% +/- 0.5%
  38. #define constADCNoise     5

  39. #define UseOldRef      0                      //OldRef:2k5-24k/12k/10k  NewRef:2k1-13k
  40. #define CheckFullADC   0
  41. #define CheckChipID    0
  42. #define CheckKey       0
  43. #define ShowEEROM      0

  44. #define UseIdleMode    0
  45. #define AVmeterUseHIC  1
  46. #define ShowRefVolt    1
  47. #define ThreeLEDVer    0
  48. #define TxThreeDigi    0
  49. #define LDOIs3V3       0
  50. #define LDOIs3V6       0
  51. #define LDOIs5V        0                      //Normal is 4V4

  52. #define AVmeterIsLCM   0
  53. #define AVmeterIsOLED  0
  54. #define AVmeterIsmR    0

  55. struct
  56.    {uchar ParamValid;
  57.     uchar ResZero;
  58.     uint  HicZero;
  59.     uint  VoltDivider;
  60.         uint  AFineTurn;
  61.     uint  VRefineTurn;
  62.    } idata HwParam _at_ 0xf0;
  63. uchar idata ParamBuf[10] _at_ 0xf0;
  64. uchar idata UIDbuf[7],Vchar[8],Achar[8],Rchar[8],Echar[11];

  65. uchar bdata DispFlag,IAPTick,KeyTick,KeyPressTime,Keybuf,CIDTick;
  66. uchar ASEG1,ASEG2,ASEG3,ASEG4;
  67. uchar VSEG1,VSEG2,VSEG3,VSEG4;
  68. uchar scantick,adccnt,segnum;

  69. uint  Abuf,PreAbuf,Vbuf,BCDbuf,BGVbuf,ADtick,RefVAtick;
  70. uint  RefAVolt,VccVolt,R6k1Volt,Ref1300Volt;
  71. uint  ADCVolt3570,ADCVolt2750,ADCVolt2350,ADCVolt1730,ADCVolt1340,ADCVARef;
  72. unsigned long int LongBuf;
  73. uint  AMPerDigi,mRbuf,Vbuffer[8],Abuffer[8];

  74. #define KeyP1M0      0x9f                //AVR:0x9f   AVmeter:0xcf
  75. sbit    KeyUpPin=P1^6;                   //AVR:P1.6   AVmeter:P1.4
  76. sbit    KeyDownPin=P1^5;                 //AVR:P1.5   AVmeter:P1.5

  77. sbit  KeyUpBit=Keybuf^4;
  78. sbit  KeyDownBit=Keybuf^0;
  79. sbit  IsSacnKey=KeyTick^7;
  80. sbit  IsLongPress=KeyPressTime^7;
  81. sbit  IsCheckID=CIDTick^7;
  82. sbit  IsSaveEEROM=IAPTick^5;
  83. sbit  IsIAPflash=IAPTick^7;

  84. sbit  IsUpKey   =DispFlag^0;
  85. sbit  IsValidADC=DispFlag^1;
  86. sbit  IsRerr    =DispFlag^2;
  87. sbit  IsShowRef =DispFlag^3;
  88. sbit  IsWorking =DispFlag^4;
  89. sbit  IsRstAZero=DispFlag^5;
  90. sbit  IsLCM     =DispFlag^6;
  91. sbit  IsmRFunc  =DispFlag^7;

  92. sbit  SEGA=P3^7;
  93. sbit  SEGB=P3^6;
  94. sbit  SEGC=P3^1;
  95. sbit  SEGD=P3^2;
  96. sbit  SEGE=P3^3;
  97. sbit  SEGF=P1^0;
  98. sbit  SEGG=P1^1;
  99. sbit  SEGDP=P3^0;

  100. sbit  VDIG4=P3^5;
  101. sbit  VDIG3=P1^5;
  102. sbit  VDIG2=P1^4;
  103. sbit  VDIG1=P1^6;

  104. sbit  ADIG4=P3^4;
  105. sbit  ADIG3=P1^3;
  106. sbit  ADIG2=P1^7;
  107. sbit  ADIG1=P5^4;

  108. uchar code SEGTAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  109. uchar code CHARTAB[16]="0123456789ABCDEF";
  110. uchar code EEROM[16] _at_ 0x2000;

  111. uchar BCD2SEG(uchar bcddat)
  112. {
  113. return(SEGTAB[bcddat & 0x0f]);
  114. }


  115. uchar BIN2CHAR(uchar bindat)
  116. {
  117. return(CHARTAB[bindat & 0x0f]);
  118. }

  119. void TurnoffDIG()
  120. {
  121.   VDIG1=1;
  122.   VDIG2=1;
  123.   VDIG3=1;
  124.   VDIG4=1;

  125.   ADIG1=1;
  126.   ADIG2=1;
  127.   ADIG3=1;
  128.   ADIG4=1;
  129. }

  130. void TurnoffSEG()
  131. {
  132.   SEGA=0;
  133.   SEGB=0;
  134.   if(scantick<64) SEGC=1; else SEGC=0;
  135.   SEGD=0;
  136.   SEGE=0;
  137.   SEGF=0;
  138.   SEGG=0;
  139.   SEGDP=0;
  140. }

  141. void delay100us()
  142. {     
  143.       TR1 =0;      //0xffff-0xff38=200*0.5us=0.1ms
  144.           TH1 =0xff;   
  145.           TL1 =0x38;      
  146.           TF1 =0;
  147.       TR1 =1;
  148.           while(~TF1){};
  149.       TF1 =0;
  150.       TR1 =0;  
  151. }

  152. void waken200us()
  153. {     
  154.       TR1  =0;      //0xffff-0xfe70=400*0.5us=200us
  155.           TH1  =0xfe;   
  156.           TL1  =0x70;      
  157.           TF1 =0;
  158.           //ET1 =1;
  159.       TR1 =1;
  160.           //PCON=0x01;
  161.           while(~TF1){};
  162.       TF1 =0;
  163.           ET1 =0;
  164.       TR1 =0;
  165. }

  166. void SelectRef(uchar Channel)
  167. {
  168.         //REF    x    x      x        2K       2K2  2K2  2K2  2K2
  169.     //P3  :SEGA-SEGB-  VDIG4-   ADIG4-----SEGE-SEGD-SEGC-SEGDP   准双向口  推挽输出  高阻输入  开漏输出
  170.         //P3M0:  1    1      1       1/0      1/0  1/0  1/0  1/0        0         1         0         1
  171.     //P3M1:  0    0      0       0/1      0/1  0/1  0/1  0/1        0         0         1         1
  172. switch(Channel)                                                   //  2k5
  173.     {case chRefV4400:             //-----S  S  D 2k1 2k2 2k2 2k2 2k2   5000  P1=0xfc;P54=1;
  174.               P3=0x3f;                //P3:  0  0  1  1   1   1   1   1
  175.                   P3M0=0xff;P3M1=0x00;    //P3M0:1  1  1  1   1   1   1   1
  176.                                           //P3M1:0  0  0  0   0   0   0   0
  177.               break;      

  178.      case chRefV3570:             //-----S  S  D 2k1 2k2 2k2 2k2 2k2   3892  P1=0xfc;P54=1;
  179.               P3=0x3e;                //P3:  0  0  1  1   1   1   1   0
  180.                   P3M0=0xff;P3M1=0x00;    //P3M0:1  1  1  1   1   1   1   1
  181.                                           //P3M1:0  0  0  0   0   0   0   0
  182.               break;               

  183.      case chRefV2750:             //-----S  S  D 2k1 2k2 2k2 2k2 2k2   3112  P1=0xfc;P54=1;
  184.               P3=0x3c;                //P3:  0  0  1  1   1   1   0   0
  185.                   P3M0=0xff;P3M1=0x03;    //P3M0:1  1  1  1   1   1   1   1
  186.                                           //P3M1:0  0  0  0   0   0   1   1
  187.               break;                  

  188.      case chRefV2350:             //-----S  S  D 2k1 2k2 2k2 2k2 2k2   2556  P1=0xfc;P54=1;
  189.               LDO3V3:
  190.               P3=0x3c;                //P3:  0  0  1  1   1   z   0   0
  191.                   P3M0=0xfb;P3M1=0x07;          //P3M0:1  1  1  1   1   0   1   1
  192.                                           //P3M1:0  0  0  0   0   1   1   1
  193.               break;                                 

  194.      case chRefV1730:             //-----S  S  D 2k1 2k2 2k2 2k2 2k2   1982  P1=0xfc;P54=1;
  195.               if(LDOIs3V3) goto LDO3V3;
  196.                   LDO_3V6:
  197.               P3=0x3c;                //P3:  0  0  1  1   z   z   0   0
  198.                   P3M0=0xf3;P3M1=0x0f;          //P3M0:1  1  1  1   0   0   1   1
  199.                                           //P3M1:0  0  0  0   1   1   1   1
  200.               break;                                                                    

  201.      case chRefV1340:
  202.           if(LDOIs3V3)      
  203.             {                        //-----S  S  D 2k1/2k5 2k2 2k2 2k2 2k2   1333  P1=0xfc;P54=1;
  204.                  P3=0x38;                //P3:  0  0  1    1     1   0   0   0
  205.                      P3M0=0xff;P3M1=0x07;    //P3M0:1  1  1    1     1   1   1   1
  206.                                              //P3M1:0  0  0    0     0   1   1   1
  207.             } else {                        //-----S  S  D 2k1 2k2 2k2 2k2 2k2   1333  P1=0xfc;P54=1;
  208.                         P3=0x38;                //P3:  0  0  1  1   z   0   0   0
  209.                             P3M0=0xf7;P3M1=0x0f;    //P3M0:1  1  1  1   0   1   1   1
  210.                                                     //P3M1:0  0  0  0   1   1   1   1
  211.                    }
  212.           if(LDOIs3V6) goto LDO_3V6;
  213.                   if(LDOIs5V)
  214.              {                       //-----S  S  D 2k1 2k68 2k68 2k68 2k68   1333  P1=0xfc;P54=1;
  215.                   P3=0x30;               //P3:  0  0  1  1   0    0    0    0
  216.                       P3M0=0xff;P3M1=0x0f;   //P3M0:1  1  1  1   1    1    1    1
  217.                                              //P3M1:0  0  0  0   1    1    1    1
  218.              }
  219.               break;                                 

  220.      case chRefVA620:            
  221.               if(UseOldRef)
  222.                 {                     //-----S  S  D 2k5 2k2 2k2 2k2 2k2   515  P1=0xfc;P54=1;
  223.                  P3=0x30;             //P3:  0  0  1  1   0   0   0   0
  224.              P3M0=0xff;P3M1=0x1f; //P3M0:1  1  1  1   1   1   1   1
  225.              P3PU=0x10;           //P3M1:0  0  0  1   1   1   1   1
  226.                         } else {                     //-----S  S  D 2k1 2k2 2k2 2k2 2k2   515  P1=0xfc;P54=1;
  227.                         P3=0x2f;             //P3:  0  0  1  0   z   z   z   z
  228.                     P3M0=0xf0;P3M1=0x0f; //P3M0:1  1  1  1   0   0   0   0
  229.                                          //P3M1:0  0  0  0   1   1   1   1
  230.                                    }
  231.               break;         
  232.     if(UseOldRef)
  233.      {
  234.      case chRefV2K2A:             //-----S  S  D 2k5 2k2 2k2 2k2 2k2  P1=0xfc;P54=1;
  235.               P3=0x30;                //P3:  0  0  1  1   z   z   z   0   
  236.                   P3M0=0xf1;P3M1=0x1f;    //P3M0:1  1  1  1   0   0   0   1
  237.                   P3PU=0x10;              //P3M1:0  0  0  1   1   1   1   1
  238.               break;

  239.      case chRefV2K2B:             //-----S  S  D 2k5 2k2 2k2 2k2 2k2  P1=0xfc;P54=1;
  240.               P3=0x30;                //P3:  0  0  1  1   z   z   0   z   
  241.                   P3M0=0xf2;P3M1=0x1f;    //P3M0:1  1  1  1   0   0   1   0
  242.                   P3PU=0x10;              //P3M1:0  0  0  1   1   1   1   1
  243.               break;

  244.      case chRefV2K2C:             //-----S  S  D 2k5 2k2 2k2 2k2 2k2  P1=0xfc;P54=1;
  245.               P3=0x30;                //P3:  0  0  1  1   z   0   z   z   
  246.                   P3M0=0xf4;P3M1=0x1f;    //P3M0:1  1  1  1   0   1   0   0
  247.                   P3PU=0x10;              //P3M1:0  0  0  1   1   1   1   1
  248.               break;

  249.      case chRefV2K2D:             //-----S  S  D 3k9 2k2 2k2 2k2 2k2  P1=0xfc;P54=1;
  250.               P3=0x30;                //P3:  0  0  1  1   0   z   z   z   
  251.                   P3M0=0xf8;P3M1=0x1f;    //P3M0:1  1  1  1   1   0   0   0
  252.                   P3PU=0x10;              //P3M1:0  0  0  1   1   1   1   1
  253.               break;
  254.      }
  255.      default:;
  256.    }
  257. }

  258. #define     MD3U16                  (*(unsigned int volatile xdata *)0xfcf0)  
  259. //#define     MD2                     (*(unsigned char volatile xdata *)0xfcf1)
  260. #define     MD1U16                  (*(unsigned int volatile xdata *)0xfcf2)
  261. //#define     MD0                     (*(unsigned char volatile xdata *)0xfcf3)
  262. #define     MD5U16                  (*(unsigned int volatile xdata *)0xfcf4)
  263. //#define     MD4                     (*(unsigned char volatile xdata *)0xfcf5)

  264. //32位除法  被除数:MD3U16:MD1U16 除数:MD5U16  商:MD3U16:MD1U16      余数:MD5U16
  265. //16位除法  被除数:MD1U16        除数:MD5U16  商:MD1U16             余数:MD5U16
  266. //16位乘法  被乘数:MD1U16        乘数:MD5U16  积:MD3U16:MD1U16

  267. void LoadCurrent()
  268. {
  269.     //P1  :ADIG2-VDIG1-VDIG3-VDIG2-------ADIG3-  NU-SEGG/Current-SEGF/Volt                准双向口  推挽输出  高阻输入  开漏输出
  270.         //P1M0:  1     1     1     1          1      1      1/0        1/0      0xff/0xfc         0         1         0         1  
  271.     //P1M1:  0     0     0     0          0      0      0/1        0/1      0x00/0x03         0         0         1         1
  272.     P_SW2|=0x80;       //使能访问XSFR
  273.     //P1M0  =0xff;       //设置P1.1为ADC口:ADC1:current;ADC0:Volt  1 1 1 1  1 1 0 1
  274.     //P1M1  =0x00;       //                                          0 0 0 0  0 0 1 0
  275.         //SEGG=0;
  276.         ADC_CONTR=0x81;    //使能ADC模块,并选择ADC1
  277.         ADCTIM=0x27;       //设置ADC内部时序:1+2+16  0-0-1---0-1-1-1-1
  278.     ADCCFG=0x27;       //设置ADC时钟为系统时钟/2/2,转换结果右对齐--ADCCFG:x-x-RESFMT-x-S3-S2-S1-S0 Fadc=SYSCLK/2/(SPEED+1)
  279.     ADCEXCFG =0x05;    //设置ADC转换4次并取平均值:(1+2+16+12)*10*2=620*16=410us  ADCEXCFG:x-x-0-0-0--1-0-0
  280.     //ADCEXCFG =0x06;  //设置ADC转换8次并取平均值:(1+2+32+12)*32*8=12000=500us  ADCEXCFG:x-x-0-0-0--1-0-0

  281.         ADC_CONTR|=0x40;   //启动AD转换
  282.         adccnt=4;
  283.         if(EADC) PCON=0x01;
  284.           else {while(!(ADC_CONTR & 0x20));//查询ADC完成标记                 
  285.                 ADC_CONTR=0x81;            //清除ADC完成标记
  286.            }
  287.     P1M0  =0xfd;       //设置P1.1为ADC口:ADC1:current;ADC0:Volt  1 1 1 1  1 1 0 1
  288.     P1M1  =0x02;       //                                          0 0 0 0  0 0 1 0

  289.         //delay100us();
  290.     //delay100us();
  291.         //if(AVmeterUseHIC) delay100us();
  292.         if(UseIdleMode) waken200us();
  293.           else {delay100us();delay100us();}

  294.     Abuf=0;
  295.         while(adccnt--)
  296.       {ADC_CONTR|=0x40;                  //启动AD转换
  297.            F0=0;
  298.            if(EADC) PCON=0x01;
  299.              else {while(!(ADC_CONTR & 0x20));       //查询ADC完成标记                 
  300.                    ADC_CONTR=0x81;                   //清除ADC完成标记
  301.                           }
  302.            Abuf+=(ADC_RES<<8)| ADC_RESL;     //读取ADC结果
  303.            }
  304.    Abuf>>=2;
  305.    ADC_CONTR=0x8f;
  306. }

  307. void LoadVolt()
  308. {
  309.     P_SW2|=0x80;       //使能访问XSFR
  310.     //P1M0  =0xfe;       //设置P1.0为ADC口:ADC0:Volt  1 1 1 1   1 1 1 0
  311.     //P1M1  =0x01;       //                            0 0 0 0   0 0 0 1
  312.         ADC_CONTR=0x80;    //使能ADC模块,并选择ADC0---ADC_PWR--ADC_START--ADC_FLAG--ADC_EPWMT-------ADCCHS3..0
  313.         ADCTIM=0x27;       //设置ADC内部时序:1+2+32  0-0-1---0-1-1-1-1
  314.     ADCCFG=0x27;       //设置ADC时钟为系统时钟/2/16,转换结果右对齐--ADCCFG:x-x-RESFMT-x-S3-S2-S1-S0 Fadc=SYSCLK/2/(SPEED+1)
  315.     ADCEXCFG=0x05;     //设置ADC转换4次并取平均值:(1+2+32+12)*32*2=12000=500us
  316.     //ADCEXCFG =0x06;  //设置ADC转换8次并取平均值:(1+2+32+12)*32*16=24000=1000us

  317.     ADC_CONTR|=0x40;   //启动AD转换
  318.         adccnt=4;
  319.         if(EADC) PCON=0x01;
  320.           else {while(!(ADC_CONTR & 0x20));//查询ADC完成标记                 
  321.                 ADC_CONTR=0x80;            //清除ADC完成标记
  322.                    }
  323.     P1M0  =0xfe;       //设置P1.0为ADC口:ADC0:Volt  1 1 1 1   1 1 1 0
  324.     P1M1  =0x01;       //  

  325.         if(UseIdleMode) waken200us();
  326.           else {delay100us();delay100us();}

  327.     Vbuf=0;
  328.         while(adccnt--)
  329.       {ADC_CONTR|=0x40;                  //启动AD转换
  330.            F0=0;
  331.                    if(EADC) PCON=0x01;
  332.               else {while(!(ADC_CONTR & 0x20));       //查询ADC完成标记                 
  333.                     ADC_CONTR=0x80;                   //清除ADC完成标记
  334.                            }
  335.            Vbuf+=(ADC_RES<<8)| ADC_RESL;     //读取ADC结果
  336.            }
  337.    Vbuf>>=2;   
  338.    ADC_CONTR=0x8f;
  339. }

  340. void LoadBGVolt()
  341. {
  342.     P_SW2|=0x80;       //使能访问XSFR
  343.         ADC_CONTR=0x8f;    //使能ADC模块,并选择ADC15
  344.         ADCTIM=0x3f;       //设置ADC内部时序:1+2+32
  345.     ADCCFG=0x2f;       //设置ADC时钟为系统时钟/2/16,转换结果右对齐:000000bb,bbbbbbbb
  346.     ADCEXCFG=0x06;     //设置ADC转换8次并取平均值:(1+2+32+12)*32*4=24000=1000us

  347.     ADC_CONTR|=0x40;                  //启动AD转换
  348.         F0=0;
  349.         if(EADC) PCON=0x01;
  350.           else {while(!(ADC_CONTR & 0x20));       //查询ADC完成标记                 
  351.             ADC_CONTR=0x8f;                   //清除ADC完成标记
  352.                    }
  353.         BGVbuf=(ADC_RES<<8)| ADC_RESL;    //读取ADC结果
  354. }

  355. //[V]n[:]vvvvv[0x0A]--8
  356. //[A]n[:]aaaaa[0x0A]--8
  357. //[R]n[:]rrrrr[0x0A]--8
  358. //[E]n[:]eeeeeeee[0x0A]--11:密钥,n=3:3led; n=4:4led; n=5:5led volt meter;
  359. //E1:sharemod[0x0A]--3led share mode
  360. //Vchar[8],Achar[8],Rchar[8],Echar[11];
  361. void InitTxBuf()
  362. {
  363.   //Vchar[0]='V';
  364.   Vchar[1]='0';
  365.   //Vchar[2]=':';
  366.   Vchar[3]='0';
  367.   Vchar[4]='.';
  368.   Vchar[5]='0';
  369.   Vchar[6]='0';
  370.   Vchar[7]='0';

  371.   //Achar[0]='A';
  372.   Achar[1]='0';
  373.   //Achar[2]=':';
  374.   Achar[3]='0';
  375.   Achar[4]='.';
  376.   Achar[5]='0';
  377.   Achar[6]='0';
  378.   Achar[7]='0';

  379.   //Rchar[0]='R';
  380.   Rchar[1]='0';
  381.   //Rchar[2]=':';
  382.   Rchar[3]='0';
  383.   Rchar[4]='.';
  384.   Rchar[5]='0';
  385.   Rchar[6]='0';
  386.   Rchar[7]='0';

  387.   //Echar[0]='E';
  388.   //if(ThreeLEDVer) Echar[1]='3';else Echar[1]='4';
  389.   //Echar[2]=':';
  390. }

  391. void TxCharBuf()
  392. {
  393.   if(IsRerr) {scantick+=0x40;scantick&=0xc0;return;}
  394.   SEGD=SEGE=SEGDP=1;
  395.   segnum++;
  396.   TI=0;
  397.   switch(scantick)
  398.   {
  399.     case 0x00:break;
  400.     case 0x01:SBUF=0x0a;break;

  401.     case 0x02:SBUF='E';break;
  402.     case 0x03:if(ThreeLEDVer) SBUF='3';else SBUF='4';break;//SBUF=Echar[1];
  403.     case 0x04:SBUF=':';break;
  404.     case 0x05:SBUF=Echar[3];break;
  405.     case 0x06:SBUF=Echar[4];break;
  406.     case 0x07:SBUF=Echar[5];break;
  407.     case 0x08:SBUF=Echar[6];break;
  408.     case 0x09:SBUF=Echar[7];break;
  409.     case 0x0a:SBUF=Echar[8];break;
  410.     case 0x0b:SBUF=Echar[9];break;
  411.     case 0x0c:SBUF=Echar[10];break;
  412.     case 0x0d:SBUF=0x0a;break;

  413.     case 0x0e:SBUF='V';break;
  414.     case 0x0f:SBUF=Vchar[1];break;
  415.     case 0x10:SBUF=':';break;
  416.     case 0x11:SBUF=Vchar[3];break;
  417.     case 0x12:SBUF=Vchar[4];break;
  418.     case 0x13:SBUF=Vchar[5];break;
  419.     case 0x14:SBUF=Vchar[6];break;
  420.     case 0x15:SBUF=Vchar[7];break;
  421.     case 0x16:SBUF=0x0a;break;

  422.     case 0x17:SBUF='A';break;
  423.     case 0x18:SBUF=Achar[1];break;
  424.     case 0x19:SBUF=':';break;
  425.     case 0x1a:SBUF=Achar[3];break;
  426.     case 0x1b:SBUF=Achar[4];break;
  427.     case 0x1c:SBUF=Achar[5];break;
  428.     case 0x1d:SBUF=Achar[6];;break;//
  429.     case 0x1e:SBUF=Achar[7];break;
  430.     case 0x1f:SBUF=0x0a;break;

  431.     case 0x20:SBUF='R';break;
  432.     case 0x21:SBUF=Rchar[1];break;
  433.     case 0x22:SBUF=':';break;
  434.     case 0x23:SBUF=Rchar[3];break;
  435.     case 0x24:SBUF=Rchar[4];break;
  436.     case 0x25:SBUF=Rchar[5];break;
  437.     case 0x26:SBUF=Rchar[6];break;
  438.     case 0x27:SBUF=Rchar[7];break;
  439.     case 0x28:SBUF=0x0a;break;

  440.         case 0x29:SBUF='C';break;
  441.         case 0x2a:SBUF='I';break;
  442.         case 0x2b:SBUF='D';break;
  443.         case 0x2c:SBUF=':';break;
  444.         case 0x2d:SBUF=CHARTAB[CHIPID0>>4];break;
  445.         case 0x2e:SBUF=CHARTAB[CHIPID0&0x0f];break;
  446.         case 0x2f:SBUF=CHARTAB[CHIPID1>>4];break;  
  447.         case 0x30:SBUF=CHARTAB[CHIPID1&0x0f];break;
  448.         case 0x31:SBUF=CHARTAB[CHIPID2>>4];break;  
  449.         case 0x32:SBUF=CHARTAB[CHIPID2&0x0f];break;
  450.         case 0x33:SBUF=CHARTAB[CHIPID3>>4];break;  
  451.         case 0x34:SBUF=CHARTAB[CHIPID3&0x0f];break;
  452.         case 0x35:SBUF=CHARTAB[CHIPID4>>4];break;  
  453.         case 0x36:SBUF=CHARTAB[CHIPID4&0x0f];break;
  454.         case 0x37:SBUF=CHARTAB[CHIPID5>>4];break;  
  455.         case 0x38:SBUF=CHARTAB[CHIPID5&0x0f];break;
  456.         case 0x39:SBUF=CHARTAB[CHIPID6>>4];break;  
  457.         case 0x3a:SBUF=CHARTAB[CHIPID6&0x0f];break;
  458.         case 0x3b:if(ShowEEROM) SBUF=CHARTAB[EEROM[0]>>4];else SBUF=CHARTAB[CHIPID7>>4];break;  
  459.         case 0x3c:if(ShowEEROM) SBUF=CHARTAB[EEROM[0]&0x0f];else SBUF=CHARTAB[CHIPID7&0x0f];break;   
  460.         case 0x3d:if(ShowEEROM) SBUF=CHARTAB[HwParam.ResZero>>4];else SBUF=CHARTAB[CHIPID8>>4];break;   
  461.         case 0x3e:if(ShowEEROM) SBUF=CHARTAB[HwParam.ResZero&0x0f];else SBUF=CHARTAB[CHIPID8&0x0f];break;   
  462.     case 0x3f:SBUF=0x0a;break;
  463.            default:segnum=0;
  464.   }
  465. }

  466. void scanseg()
  467. {
  468.      if(scantick<64) {TxCharBuf();return;}
  469.      switch(scantick & 0x3f)
  470.          { //VSEG1
  471.            case 0x00:
  472.           if(VSEG1&0x01) {SEGA=1;VDIG1=0;segnum++;}
  473.                break;
  474.        case 0x01:
  475.           if(VSEG1&0x02) {SEGB=1;VDIG1=0;segnum++;}
  476.                break;
  477.        case 0x02:
  478.           if(VSEG1&0x04) {SEGC=1;VDIG1=0;segnum++;}
  479.                break;
  480.            case 0x03:
  481.           if(VSEG1&0x08) {SEGD=1;VDIG1=0;segnum++;}
  482.                break;
  483.        case 0x04:
  484.           if(VSEG1&0x10) {SEGE=1;VDIG1=0;segnum++;}
  485.                break;
  486.            case 0x05:
  487.           if(VSEG1&0x20) {SEGF=1;VDIG1=0;segnum++;}
  488.                break;
  489.            case 0x06:
  490.           if(VSEG1&0x40) {SEGG=1;VDIG1=0;segnum++;}
  491.                break;
  492.        case 0x07:segnum=0x5a;break;
  493.        //VSEG2
  494.        case 0x08:
  495.           if(VSEG2&0x01) {SEGA=1;VDIG2=0;segnum++;}
  496.                break;
  497.        case 0x09:
  498.           if(VSEG2&0x02) {SEGB=1;VDIG2=0;segnum++;}
  499.                break;
  500.        case 0x0a:
  501.           if(VSEG2&0x04) {SEGC=1;VDIG2=0;segnum++;}
  502.                break;
  503.            case 0x0b:
  504.           if(VSEG2&0x08) {SEGD=1;VDIG2=0;segnum++;}
  505.                break;
  506.        case 0x0c:
  507.           if(VSEG2&0x10) {SEGE=1;VDIG2=0;segnum++;}
  508.                break;
  509.            case 0x0d:
  510.           if(VSEG2&0x20) {SEGF=1;VDIG2=0;segnum++;}
  511.                break;
  512.            case 0x0e:
  513.           if(VSEG2&0x40) {SEGG=1;VDIG2=0;segnum++;}
  514.                break;
  515.        case 0x0f:
  516.           if(VSEG2&0x80) {SEGDP=1;VDIG2=0;segnum++;}
  517.                break;
  518.        //VSEG3
  519.        case 0x10:
  520.           if(VSEG3&0x01) {SEGA=1;VDIG3=0;segnum++;}
  521.                break;
  522.        case 0x11:
  523.           if(VSEG3&0x02) {SEGB=1;VDIG3=0;segnum++;}
  524.                break;
  525.        case 0x12:
  526.           if(VSEG3&0x04) {SEGC=1;VDIG3=0;segnum++;}
  527.                break;
  528.            case 0x13:
  529.           if(VSEG3&0x08) {SEGD=1;VDIG3=0;segnum++;}
  530.                break;
  531.        case 0x14:
  532.           if(VSEG3&0x10) {SEGE=1;VDIG3=0;segnum++;}
  533.                break;
  534.            case 0x15:
  535.           if(VSEG3&0x20) {SEGF=1;VDIG3=0;segnum++;}
  536.                break;
  537.            case 0x16:
  538.           if(VSEG3&0x40) {SEGG=1;VDIG3=0;segnum++;}
  539.                break;
  540.        case 0x17:
  541.           if(VSEG3&0x80) {SEGDP=1;VDIG3=0;segnum++;}
  542.                break;
  543.        //VSEG4
  544.        case 0x18:
  545.           if(VSEG4&0x01) {SEGA=1;VDIG4=0;segnum++;}
  546.                break;
  547.        case 0x19:
  548.           if(VSEG4&0x02) {SEGB=1;VDIG4=0;segnum++;}
  549.                break;
  550.        case 0x1a:
  551.           if(VSEG4&0x04) {SEGC=1;VDIG4=0;segnum++;}
  552.                break;
  553.            case 0x1b:
  554.           if(VSEG4&0x08) {SEGD=1;VDIG4=0;segnum++;}
  555.                break;
  556.        case 0x1c:
  557.           if(VSEG4&0x10) {SEGE=1;VDIG4=0;segnum++;}
  558.                break;
  559.            case 0x1d:
  560.           if(VSEG4&0x20) {SEGF=1;VDIG4=0;segnum++;}
  561.                break;
  562.            case 0x1e:
  563.           if(VSEG4&0x40) {SEGG=1;VDIG4=0;segnum++;}
  564.                break;
  565.        case 0x1f:
  566.           if(VSEG4&0x80) {SEGDP=1;VDIG4=0;segnum++;}
  567.                break;


  568.        //ASEG1
  569.            case 0x20:
  570.           if(ASEG1&0x01) {SEGA=1;ADIG1=0;segnum++;}
  571.                break;
  572.        case 0x21:
  573.           if(ASEG1&0x02) {SEGB=1;ADIG1=0;segnum++;}
  574.                break;
  575.        case 0x22:
  576.           if(ASEG1&0x04) {SEGC=1;ADIG1=0;segnum++;}
  577.                break;
  578.            case 0x23:
  579.           if(ASEG1&0x08) {SEGD=1;ADIG1=0;segnum++;}
  580.                break;
  581.        case 0x24:
  582.           if(ASEG1&0x10) {SEGE=1;ADIG1=0;segnum++;}
  583.                break;
  584.            case 0x25:
  585.           if(ASEG1&0x20) {SEGF=1;ADIG1=0;segnum++;}
  586.                break;
  587.            case 0x26:
  588.           if(ASEG1&0x40) {SEGG=1;ADIG1=0;segnum++;}
  589.                break;
  590.        case 0x27:segnum=0x5a;break;
  591.        //ASEG2
  592.        case 0x28:
  593.           if(ASEG2&0x01) {SEGA=1;ADIG2=0;segnum++;}
  594.                break;
  595.        case 0x29:
  596.           if(ASEG2&0x02) {SEGB=1;ADIG2=0;segnum++;}
  597.                break;
  598.        case 0x2a:
  599.           if(ASEG2&0x04) {SEGC=1;ADIG2=0;segnum++;}
  600.                break;
  601.            case 0x2b:
  602.           if(ASEG2&0x08) {SEGD=1;ADIG2=0;segnum++;}
  603.                break;
  604.        case 0x2c:
  605.           if(ASEG2&0x10) {SEGE=1;ADIG2=0;segnum++;}
  606.                break;
  607.            case 0x2d:
  608.           if(ASEG2&0x20) {SEGF=1;ADIG2=0;segnum++;}
  609.                break;
  610.            case 0x2e:
  611.           if(ASEG2&0x40) {SEGG=1;ADIG2=0;segnum++;}
  612.                break;
  613.        case 0x2f:
  614.           if(ASEG2&0x80) {SEGDP=1;ADIG2=0;segnum++;}
  615.                break;
  616.        //ASEG3
  617.        case 0x30:
  618.           if(ASEG3&0x01) {SEGA=1;ADIG3=0;segnum++;}
  619.                break;
  620.        case 0x31:
  621.           if(ASEG3&0x02) {SEGB=1;ADIG3=0;segnum++;}
  622.                break;
  623.        case 0x32:
  624.           if(ASEG3&0x04) {SEGC=1;ADIG3=0;segnum++;}
  625.                break;
  626.            case 0x33:
  627.           if(ASEG3&0x08) {SEGD=1;ADIG3=0;segnum++;}
  628.                break;
  629.        case 0x34:
  630.           if(ASEG3&0x10) {SEGE=1;ADIG3=0;segnum++;}
  631.                break;
  632.            case 0x35:
  633.           if(ASEG3&0x20) {SEGF=1;ADIG3=0;segnum++;}
  634.                break;
  635.            case 0x36:
  636.           if(ASEG3&0x40) {SEGG=1;ADIG3=0;segnum++;}
  637.                break;
  638.        case 0x37:
  639.           if(ASEG3&0x80) {SEGDP=1;ADIG3=0;segnum++;}
  640.                break;
  641.        //ASEG4
  642.        case 0x38:
  643.           if(ASEG4&0x01) {SEGA=1;ADIG4=0;segnum++;}
  644.                break;
  645.        case 0x39:
  646.           if(ASEG4&0x02) {SEGB=1;ADIG4=0;segnum++;}
  647.                break;
  648.        case 0x3a:
  649.           if(ASEG4&0x04) {SEGC=1;ADIG4=0;segnum++;}
  650.                break;
  651.            case 0x3b:
  652.           if(ASEG4&0x08) {SEGD=1;ADIG4=0;segnum++;}
  653.                break;
  654.        case 0x3c:
  655.           if(ASEG4&0x10) {SEGE=1;ADIG4=0;segnum++;}
  656.                break;
  657.            case 0x3d:
  658.           if(ASEG4&0x20) {SEGF=1;ADIG4=0;segnum++;}
  659.                break;
  660.            case 0x3e:
  661.           if(ASEG4&0x40) {SEGG=1;ADIG4=0;segnum++;}
  662.                break;
  663.        case 0x3f:
  664.           if(ASEG4&0x80) {SEGDP=1;ADIG4=0;segnum++;}
  665.                break;
  666.                     default:;
  667.      }
  668. if(~IsSaveEEROM)
  669.    if(~IsIAPflash){ADIG4=ADIG3=ADIG2=ADIG1=1;}
  670. if(ThreeLEDVer) ADIG1=VDIG1=1;
  671. }

  672. void FormatBCDbuf()
  673. {   
  674.     if(BCDbuf<10) return;
  675.     MD1U16=BCDbuf;
  676.     MD5U16=1000;
  677.         ARCON=5<<5;                       //4:16*16位; 5:16/16位 6:32/16位
  678.         OPCON=0x01;                       //启动计算
  679.         while(OPCON&0x01!=0);             //等待计算完成
  680.     BCDbuf=MD0;

  681.     MD1U16=MD5U16;
  682.     MD5U16=100;
  683.         ARCON=5<<5;                       //4:16*16位; 5:16/16位 6:32/16位
  684.         OPCON=0x01;                       //启动计算
  685.         while(OPCON&0x01!=0);             //等待计算完成
  686.     BCDbuf=(BCDbuf<<4)| MD0;

  687.     MD1U16=MD5U16;
  688.     MD5U16=10;
  689.         ARCON=5<<5;                       //4:16*16位; 5:16/16位 6:32/16位
  690.         OPCON=0x01;                       //启动计算
  691.         while(OPCON&0x01!=0);             //等待计算完成
  692.     BCDbuf=(BCDbuf<<4)| MD0;
  693.     BCDbuf=(BCDbuf<<4)| MD4;      
  694. }

  695. void VMulRef()//BCDbuf=2238*RefValue/1000*Vbuf/BGVbuf; 75v-105v
  696. {   
  697.     MD1U16=eRefValue;
  698.     MD5U16=HwParam.VoltDivider;//22.38
  699.         ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  700.         OPCON=0x01;                       //启动计算
  701.         while(OPCON&0x01!=0);             //等待计算完成
  702.     MD5U16=1000;
  703.     ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  704.         OPCON=0x01;                       //启动计算
  705.         while(OPCON&0x01!=0);             //等待计算完成

  706.     MD5U16=Vbuf;
  707.         ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  708.         OPCON=0x01;                       //启动计算
  709.         while(OPCON&0x01!=0);             //等待计算完成
  710.     MD5U16=BGVbuf;
  711.     ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  712.         OPCON=0x01;                       //启动计算
  713.         while(OPCON&0x01!=0);             //等待计算完成
  714.     BCDbuf=MD1U16;
  715. }


  716. void AMulDig()
  717. {   if(AVmeterUseHIC)
  718.       {MD1U16=Abuf;
  719.        MD5U16=constARANGE/constHICFullADC*1000;   //5000/1478=33.83 3383; HICPerDigi=ARANGE/1478.0*1000;
  720.            ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  721.            OPCON=0x01;                       //启动计算
  722.            while(OPCON&0x01!=0);             //等待计算完成
  723.        MD5U16=1000;
  724.        ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  725.            OPCON=0x01;                       //启动计算
  726.            while(OPCON&0x01!=0);             //等待计算完成
  727.        //BCDbuf=MD1U16;                    
  728.            } else {MD1U16=Abuf;
  729.                MD5U16=AMPerDigi;                 //
  730.                    ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  731.                    OPCON=0x01;                       //启动计算
  732.                    while(OPCON&0x01!=0);             //等待计算完成
  733.                MD5U16=100;
  734.                ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  735.                    OPCON=0x01;                       //启动计算
  736.                    while(OPCON&0x01!=0);             //等待计算完成
  737.                //BCDbuf=MD1U16;
  738.                            }
  739.        MD5U16=HwParam.AFineTurn;         //BCDbuf=BCDbuf*AFineTurn/10000
  740.            ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  741.            OPCON=0x01;                       //启动计算
  742.            while(OPCON&0x01!=0);             //等待计算完成  BCDbuf=BCDbuf*AFineTurn
  743.        MD5U16=10000;
  744.        ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  745.            OPCON=0x01;                       //启动计算
  746.            while(OPCON&0x01!=0);             //等待计算完成
  747.        BCDbuf=MD1U16;
  748. }

  749. void BCDbufDiv10()
  750. {   
  751.     MD1U16=BCDbuf;
  752.     MD5U16=10;
  753.     ARCON=5<<5;                       //5:16/16位:MD1U16/MD5U16
  754.         OPCON=0x01;                       //启动计算
  755.         while(OPCON&0x01!=0);             //等待计算完成
  756.     BCDbuf=MD1U16;
  757. }

  758. void Flashoff()
  759. {
  760.         ADIG4 =1;
  761.         SEGC  =0;
  762.     SEGD  =0;
  763.     SEGE  =0;  
  764.     SEGDP =0;
  765. }

  766. void GetChnVolt(uchar RefChannal)
  767. {
  768.     SelectRef(RefChannal);
  769.     //delay100us();
  770.         //delay100us();
  771.     if(UseIdleMode) waken200us();
  772.           else {delay100us();delay100us();}
  773.         LoadBGVolt();
  774.         Flashoff();
  775.     MD1U16=eRefValue;                 //Vccbuf=4096*RefValue/BGVbuf
  776.     MD5U16=4096;
  777.         ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  778.         OPCON=0x01;                       //启动计算
  779.         while(OPCON&0x01!=0);             //等待计算完成
  780.     MD5U16=BGVbuf;
  781.     ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  782.         OPCON=0x01;                       //启动计算
  783.         while(OPCON&0x01!=0);             //等待计算完成
  784.     //Vbuf=MD1U16;
  785. }

  786. void CalcChnADC()
  787. {
  788.     //MD1U16=ADCVoltvvvv;               //Vccbuf=4096*RefValue/BGVbuf
  789.     MD5U16=4096;
  790.         ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  791.         OPCON=0x01;                       //启动计算
  792.         while(OPCON&0x01!=0);             //等待计算完成
  793.     MD5U16=VccVolt;
  794.     ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  795.         OPCON=0x01;                       //启动计算
  796.     while(OPCON&0x01!=0);             //等待计算完成
  797. }

  798. void LoadEEROM()
  799. {
  800. adccnt=10;
  801. while(adccnt--) ParamBuf[adccnt-1]=EEROM[adccnt-1];
  802. if(HwParam.ParamValid!=0x5a)
  803.    {HwParam.ResZero=constADCNoise;
  804.     HwParam.HicZero=2045;
  805.         HwParam.VoltDivider=constVoltDivider;
  806.         HwParam.AFineTurn=constAFineTurn;
  807.     HwParam.VRefineTurn=constVRefineTurn;
  808.         return;
  809.    }
  810. if(HwParam.ResZero>8) HwParam.ResZero=constADCNoise;
  811. if((HwParam.HicZero<2030)|(HwParam.HicZero>2066))
  812.     HwParam.HicZero=2045;
  813. if((HwParam.VoltDivider<2100)|(HwParam.VoltDivider>2300))
  814.    HwParam.VoltDivider=constVoltDivider;
  815. if((HwParam.AFineTurn<8000)|(HwParam.AFineTurn>12000))
  816.    HwParam.AFineTurn=constAFineTurn;
  817. if((HwParam.VRefineTurn<9000)|(HwParam.VRefineTurn>11000))
  818.    HwParam.VRefineTurn=constVRefineTurn;
  819. }

  820. void SaveEEROM()
  821. {
  822.   //Erase Block
  823.   IAP_CONTR=0x80;
  824.   IAP_ADDRH=0x00;
  825.   IAP_ADDRL=0x00;
  826.   IAP_TPS=24;
  827.   IAP_CMD=3;
  828.   IAP_TRIG=0x5a;
  829.   IAP_TRIG=0xa5;
  830.   //Write param
  831.   HwParam.ParamValid=0x5a;
  832.   while(IAP_ADDRL<10)
  833.     {IAP_DATA=ParamBuf[IAP_ADDRL];
  834.      IAP_CMD=2;
  835.      IAP_TRIG=0x5a;
  836.      IAP_TRIG=0xa5;
  837.          IAP_ADDRL++;
  838.         }
  839.   //Disable EEROM
  840.   IAP_CONTR=0;
  841.   IAP_CMD=0;
  842.   IAP_TRIG=0;
  843.   IAP_ADDRH=0x80;
  844.   IAP_ADDRL=0x00;
  845.   IsRstAZero=0;
  846. }

  847. void ResetAZero()  //2030-2066
  848. {
  849. if(AVmeterUseHIC) SelectRef(chRefV4400);
  850.    else SelectRef(chRefVA620);
  851. Vbuf=0;
  852. segnum=16;
  853. while(segnum--)
  854.    {LoadCurrent();
  855.     Vbuf+=Abuf;
  856.    }
  857. Vbuf=Vbuf>>4;
  858. if(AVmeterUseHIC) {if((Vbuf>2030)&(Vbuf<2066)) {HwParam.HicZero=Vbuf;HwParam.ResZero=constADCNoise;IAPTick=0;IsRstAZero=1;}}
  859.    else {if(Vbuf<8) HwParam.ResZero=Vbuf;IAPTick=0;IsRstAZero=1;}
  860. }

  861. void Timer0_Routine(void) interrupt 1
  862. {

  863. }

  864. void Timer1_Routine(void) interrupt 3  
  865. {

  866. }

  867. void ADC_Routine(void) interrupt 5
  868. {
  869. ADC_CONTR&=0xdf;
  870. }

  871. void main()
  872. {
  873.     //P1  :ADIG2-VDIG1-VDIG3-VDIG2-------ADIG3-  NU-SEGG/Current-SEGF/Volt
  874.         //P1M0:  1     1     1     1          1      1      1/0        1/0      0xff/0xfc   
  875.     //P1M1:  0     0     0     0          0      0      0/1        0/1      0x00/0x03   

  876.         //REF    x    x      x        R        R    R    R    R
  877.     //P3  :SEGA-SEGB-  VDIG4-   ADIG4-----SEGE-SEGD-SEGC-SEGDP   LED /RefV50-RefVA-RefV26-RefV18-RefV14-RefV11
  878.         //P3M0:  1    1     1         1/0      1/0  1/0  1/0  1/0    0xff/0xe0  -0xf0 -0xe8  -0xec  -0xee  -0xef     
  879.     //P3M1:  0    0     0         0/1      0/1  0/1  0/1  0/1    0x00/0x1f  -0x1f -0x17  -0x13  -0x11  -0x10

  880.     //P5  :x-x-x-ADIG1  x-x-x-x
  881.         //P3M0:1 1 1  1     1 1 1 1                                0xff
  882.     //P3M1:0 0 0  0     0 0 0 0                                0x00

  883.     //Flashoff();
  884.         P_SW1 =0x00;      //RXD/P3.0,TXD/P3.1
  885.     P_SW2|=0x80;      //使能访问XSFR
  886.     TMOD  =0x00;      //T0 mode=0:16bit reload
  887.         TH0   =0xff;      //65536-24Mhz/12/1000
  888.         TL0   =0x38;      //0xffff-0xff38=200*0.5us=0.1ms
  889.         TR0   =1;
  890.     P1M0  =0xff;
  891.     P1M1  =0x00;
  892.         P1DR  =0xff;      //增强驱动能力

  893.     P3M0  =0xff;
  894.     P3M1  =0x00;
  895.     P3DR  =0xff;      //增强驱动能力

  896.     P5M0  =0xff;
  897.     P5M1  =0x00;
  898.           P5DR  =0xff;      //增强驱动能力

  899.         //IE=0xa2;          //EA-ELVD-EADC-ES----ET1-EX1-ET0-EX0
  900.         //                  //1   0    1   0      0   0   1   0

  901.         //PCON  =IDEL;      //0x01:进入空闲模式
  902.         //PCON  =PD;        //0x02:进入掉电模式
  903.         //WKTCL =0xff;      //设定掉电唤醒时钟约为1秒
  904.         //WKTCH =0x87;
  905.         //PCON  =0x02;      //进入掉电模式

  906.         SCON  =0x40;        //SM0-SM1-SM2-REN----TB8-RB8-TI-RI
  907.                             // 0   1   0   0      0   0   0  0
  908.         T2L   =0xcc;        //65536-24000000/115200bps/4=0xffcc  
  909.         T2H   =0xff;        //65536-24000000/57600bps/4=0xff98
  910.         AUXR  =0x15;        //T0x12-T1x12-UART_M0x6-T2R-----T2_C/T-T2x12-EXTRAM-S1ST2  启动定时器,选择T2为波特率发生器  
  911.                             //  0     0      0       1         0     1     0      1
  912.         InitTxBuf();
  913.         LoadEEROM();        //init param
  914.         GetChnVolt(chRefV4400);
  915.         if(HwParam.ParamValid!=0x5a) ResetAZero();
  916.     P3M0  =0xff;
  917.     P3M1  =0x00;
  918.         TurnoffSEG();
  919.         TurnoffDIG();
  920.         SEGC=0;

  921.         if(CheckChipID)
  922.           {UIDbuf[0]=UID0;
  923.            UIDbuf[1]=UID1;
  924.            UIDbuf[2]=UID2;
  925.            UIDbuf[3]=UID3;
  926.            UIDbuf[4]=UID4;
  927.            UIDbuf[5]=UID5;
  928.            UIDbuf[6]=UID6;
  929.       }

  930.         DispFlag  =0x00;
  931.     KeyTick   =0x00;
  932.         CIDTick   =0x00;
  933.         Keybuf    =0xff;
  934.     IAPTick   =0xa0;
  935.         KeyPressTime=0x00;
  936.         PreAbuf  =0x00;
  937.         ADtick   =3000;
  938.         RefVAtick=200;

  939.         //P1  :ADIG2-VDIG1-VDIG3-VDIG2-------ADIG3-  NU-SEGG/Current-SEGF/Volt
  940.     //P1  :ADIG2--up+---down-VDIG2+-------ADIG3-  NU-SEGG/Current-SEGF/Volt       准双向口  推挽输出  高阻输入  开漏输出
  941.         //P1M0:  1     0     0     1           1      1      1        1                  0         1         0         1  
  942.     //P1M1:  0     0     0     0           0      0      0        0                  0         0         1         1
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 小时前 | 显示全部楼层
  1. while(1)
  2.         { if(UseIdleMode)
  3.             {TF0=0;
  4.                  ADC_CONTR=0x8f;
  5.              IE=0xa2;     //EA-ELVD-EADC-ES----ET1-EX1-ET0-EX0
  6.                           //1   0    1   0      0   0   1   0
  7.          PCON=0x01;
  8.                  } else {while(~TF0){}TF0=0;}  //systick=100us

  9.           TurnoffSEG();
  10.           TurnoffDIG();
  11.           //IsLCM=AVmeterIsLCM;
  12.           //IsmRFunc=AVmeterIsmR;

  13.           KeyTick++;
  14.           if(IsSacnKey)                  
  15.              {if(scantick<64) goto scanseg;
  16.                   IsSacnKey=0;
  17.           P1M0=KeyP1M0;        //P1.6/P1.4:key+  P1.5:key-
  18.           P1NCS=0xff;
  19.                   TurnoffSEG();
  20.               TurnoffDIG();
  21.           Keybuf<<=1;
  22.                   KeyDownBit=KeyDownPin;
  23.           KeyUpBit=KeyUpPin;
  24.           P1M0=0xff;
  25.                   if(CheckKey)
  26.                         {
  27.              BCDbuf=HwParam.AFineTurn;
  28.                          FormatBCDbuf();
  29.                  VSEG1=BCD2SEG(BCDbuf & 0x0f);
  30.              VSEG2=BCD2SEG((BCDbuf>>4) & 0x0f);
  31.              VSEG3=BCD2SEG((BCDbuf>>8) & 0x0f);
  32.                  VSEG4=BCD2SEG((BCDbuf>>12)& 0x0f);
  33.                         }
  34.                   if((Keybuf&0xf0)==0x00) {IsUpKey=1;
  35.                                            if(~IsLongPress) {KeyPressTime++;
  36.                                                      if(IsLongPress) ResetAZero();
  37.                                                                                                          }
  38.                                           }        
  39.                          else if(IsUpKey)
  40.                      {if(~IsLongPress) {HwParam.AFineTurn+=constATurnStep;IAPTick=0;}
  41.                                           KeyPressTime=0;
  42.                       IsUpKey=0;
  43.                                          }

  44.                   if((Keybuf&0x0f)==0x00) {if(~IsLongPress) KeyPressTime++;}
  45.                          else if((Keybuf==0xff)&(KeyPressTime!=0))
  46.                                             {KeyPressTime=0;
  47.                                                  HwParam.AFineTurn-=constATurnStep;
  48.                          IAPTick=0;
  49.                                                  }
  50.                  }

  51.       scanseg:
  52.           segnum=0;
  53.           ADtick++;
  54.           Vbuf=0;
  55.       while(segnum==0){scanseg();scantick++;if((Vbuf++)>=64) break;}
  56.           if(segnum!=0x5a) continue;

  57.       if(ADtick<3000) continue;
  58.           ADtick-=3000;
  59.       RefVAtick++;

  60.           if(~IsSaveEEROM)
  61.             {IAPTick+=0x41;
  62.                  if(IsSaveEEROM) {SaveEEROM();IAPTick=0xa0;}
  63.                 }

  64.       if(CheckChipID)
  65.             {if(~IsCheckID)
  66.                if(++CIDTick>=128)
  67.                       if((UIDbuf[0]!=UID0)|(UIDbuf[1]!=UID1)|(UIDbuf[2]!=UID2)|(UIDbuf[3]!=UID3)|
  68.                              (UIDbuf[4]!=UID4)|(UIDbuf[5]!=UID5)|(UIDbuf[6]!=UID6)) goto DispRerr;
  69.         }

  70.       if(RefVAtick>200)
  71.              {RefVAtick-=200;
  72.                   GetChnVolt(chRefV4400);   
  73.           VccVolt=MD1U16;
  74.           GetChnVolt(chRefV4400);
  75.           VccVolt+=MD1U16;
  76.           GetChnVolt(chRefV4400);
  77.           VccVolt+=MD1U16;
  78.           GetChnVolt(chRefV4400);
  79.           VccVolt=(VccVolt+MD1U16)>>2;

  80.           GetChnVolt(chRefV1340);  
  81.                   Ref1300Volt=MD1U16;   
  82.           CalcChnADC();
  83.           ADCVolt1340=MD1U16-40;

  84.           if(~IsValidADC)
  85.             {GetChnVolt(chRefV3570);
  86.              CalcChnADC();
  87.              ADCVolt3570=MD1U16-40;

  88.              GetChnVolt(chRefV2750);
  89.              CalcChnADC();
  90.              ADCVolt2750=MD1U16-40;

  91.              GetChnVolt(chRefV2350);
  92.              CalcChnADC();
  93.              ADCVolt2350=MD1U16-40;

  94.              GetChnVolt(chRefV1730);
  95.              CalcChnADC();
  96.              ADCVolt1730=MD1U16-40;

  97.                          IsValidADC=1;
  98.                         }

  99.           if(UseOldRef)
  100.            {GetChnVolt(chRefV2K2A);
  101.             RefAVolt=MD1U16;     
  102.             GetChnVolt(chRefV2K2B);
  103.             RefAVolt+=MD1U16;
  104.             GetChnVolt(chRefV2K2C);
  105.             RefAVolt+=MD1U16;
  106.             GetChnVolt(chRefV2K2D);
  107.             RefAVolt+=MD1U16;
  108.             RefAVolt>>=2;
  109.                     R6k1Volt=VccVolt-RefAVolt;

  110.             MD1U16=RefAVolt;                  //VccVolt=3104mv,RefAVolt=1896mv
  111.             MD5U16=10000;                     //
  112.                 ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  113.                 OPCON=0x01;                       //启动计算
  114.                 while(OPCON&0x01!=0);             //等待计算完成  MD3U16:MD1U16=RefAVolt*10000=18960000
  115.             MD5U16=R6k1Volt;              
  116.             ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  117.                 OPCON=0x01;                       //启动计算
  118.                 while(OPCON&0x01!=0);             //等待计算完成 MD1U16=RefAVolt*10000/R6k1Volt=18960000/3104=6108
  119.                     Vbuf=MD1U16;
  120.             MD1U16=Vbuf+40000;                //MD1U16=Vbuf+40000=6108+40000=46108
  121.             MD5U16=100;                       //
  122.                 ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  123.                 OPCON=0x01;                       //启动计算
  124.                 while(OPCON&0x01!=0);             //等待计算完成  MD3U16:MD1U16=MD1U16*100=46108*100=4610800
  125.             MD5U16=Vbuf+10000;                //MD5U16=Vbuf+10000=6108+10000=16108
  126.             ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  127.                 OPCON=0x01;                       //启动计算
  128.                 while(OPCON&0x01!=0);             //等待计算完成  MD1U16=MD3U16:MD1U16/MD5U16=4610800/16108=286
  129.             Vbuf=MD1U16;                      //Vbuf=MD1U16=286
  130.             MD1U16=RefAVolt;                  //MD1U16=RefAVolt=1896mv
  131.             MD5U16=100;
  132.                 ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  133.                 OPCON=0x01;                       //启动计算
  134.                 while(OPCON&0x01!=0);             //等待计算完成  MD3U16:MD1U16=MD5U16*MD1U16=1896*100=189600
  135.             MD5U16=Vbuf;                      //MD5U16=Vbuf=286
  136.             ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  137.                 OPCON=0x01;                       //启动计算
  138.                 while(OPCON&0x01!=0);             //等待计算完成  MD1U16=MD3U16:MD1U16/MD5U16=189600/286=662
  139.             //RefAVolt=MD1U16;                //RefAVolt=MD1U16=662  
  140.             MD5U16=HwParam.VRefineTurn;       //RefAVolt=RefAVolt*RefineTurn=651*10000=6510000
  141.                 ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  142.                 OPCON=0x01;                       //启动计算
  143.                 while(OPCON&0x01!=0);             //等待计算完成  RefAVolt=RefAVolt*RefineTurn=651*10000=6510000
  144.             MD5U16=10000;
  145.             ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  146.                 OPCON=0x01;                       //启动计算
  147.                 while(OPCON&0x01!=0);             //等待计算完成
  148.             RefAVolt=MD1U16;                  //RefAVolt=RefAVolt*RefineTurn/10000=651*10000/10000=6510000/10000=651
  149.                    } else {                           
  150.                    MD1U16=constAVResL*10000.0/(constAVResL+constAVResH)+0.5;//RefAVolt=constAVResL*10000.0/(constAVResL+constAVResH)*VccVolt=2100/(2100+13000)*VccVolt            
  151.                    MD5U16=VccVolt;            
  152.                        ARCON=4<<5;                //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  153.                        OPCON=0x01;                //启动计算
  154.                        while(OPCON&0x01!=0);      //等待计算完成  MD3U16:MD1U16
  155.                    MD5U16=10000;
  156.                    ARCON=6<<5;                //6:32/16位:MD3U16:MD1U16/MD5U16
  157.                        OPCON=0x01;                //启动计算
  158.                        while(OPCON&0x01!=0);      //等待计算完成
  159.                    //RefAVolt=MD1U16;         //RefAVolt=2100/(2100+13000)*VccVolt=2100/(2100+13000)*4400=612
  160.                    MD5U16=HwParam.VRefineTurn;//RefAVolt=RefAVolt*VRefineTurn/10000=612*10000/10000=6120000/10000=612
  161.                        ARCON=4<<5;               
  162.                        OPCON=0x01;                  
  163.                        while(OPCON&0x01!=0);      
  164.                    MD5U16=10000;
  165.                    ARCON=6<<5;           
  166.                        OPCON=0x01;            
  167.                        while(OPCON&0x01!=0);         
  168.                    RefAVolt=MD1U16;                  
  169.                           }

  170.                   MD3U16=constARANGE*100.0/65536;   //MD3U16=ARANGE*100/65536=10000*100/65536=0x0f
  171.           MD1U16=constARANGE*100;           //MD1U16=ARANGE*100=10000*100=0xA120
  172.           MD5U16=constResFullADC;           //MD5U16=620  ADC100mv
  173.               ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  174.               OPCON=0x01;                       //启动计算
  175.               while(OPCON&0x01!=0);             //等待计算完成
  176.           AMPerDigi=MD1U16;                 //RefAVolt=RefAVolt*AFineTurn/10000=651*10000/10000=6510000/10000=651

  177.                   MD3U16=950000.0*4096/constVoltDivider/65536;  
  178.           MD1U16=950000.0*4096/constVoltDivider;
  179.           MD5U16=VccVolt;                   //950000.0/constVoltDivider*4096/VccVolt  5V:338--4V4:384--3V6:348--3V3:380
  180.               ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  181.               OPCON=0x01;                       //启动计算
  182.               while(OPCON&0x01!=0);             //等待计算完成
  183.           ADCVARef=MD1U16;               

  184.                   if(CheckChipID)
  185.                     {if((UIDbuf[0]!=UID0)|(UIDbuf[1]!=UID1)|(UIDbuf[2]!=UID2)|(UIDbuf[3]!=UID3)|
  186.                             (UIDbuf[4]!=UID4)|(UIDbuf[5]!=UID5)|(UIDbuf[6]!=UID6)) goto DispRerr;
  187.                     }
  188.                   if(IsShowRef){IsWorking=1;IsShowRef=0;}
  189.                   if((RefAVolt<570)|(RefAVolt>700)|(Ref1300Volt<=eRefValue))      
  190.                     { DispRerr:
  191.                           VSEG4=0x77;
  192.                           VSEG3=0x79;
  193.                           VSEG2=0x50;
  194.                           VSEG1=0x50;
  195.               BCDbuf=eRefValue;
  196.                   FormatBCDbuf();
  197.                   ASEG1=BCD2SEG(BCDbuf & 0x0f);
  198.               ASEG2=BCD2SEG((BCDbuf>>4) & 0x0f);
  199.               ASEG3=BCD2SEG((BCDbuf>>8) & 0x0f);
  200.                   ASEG4=BCD2SEG((BCDbuf>>12)& 0x0f);
  201.               IsRerr=1;
  202.                           IsShowRef=0;
  203.                           IsWorking=0;
  204.                         }  else  {IsRerr=0;
  205.                                   if(~IsWorking)
  206.                                      {IsShowRef=ShowRefVolt;
  207.                                               IsWorking=1;
  208.                                                   if(ShowRefVolt) RefVAtick=190; else RefVAtick=196;
  209.                                                  }
  210.                                          }
  211.                   goto ResetPort;
  212.         }
  213.           if(AVmeterUseHIC) {SelectRef(chRefV4400);
  214.                             LoadCurrent();
  215.                             SelectRef(chRefV4400);//Flashoff();
  216.                                         if(CheckFullADC) {BCDbuf=Abuf;goto DispBcdABuf;}
  217.                           else {if(Abuf>HwParam.HicZero) Abuf-=HwParam.HicZero;else Abuf=HwParam.HicZero-Abuf;}
  218.                                         }  else {SelectRef(chRefVA620);
  219.                                      LoadCurrent();
  220.                                      SelectRef(chRefV4400);//Flashoff();
  221.                                                          if(CheckFullADC) {BCDbuf=Abuf;goto DispBcdABuf;}
  222.                                                         }
  223.       Vbuf=Abuf;
  224.       if((Abuf>>1)>=PreAbuf) Abuf=PreAbuf;
  225.           PreAbuf=Vbuf;
  226.           if(Abuf<6) Abuf=0;
  227.           if(Abuf<=HwParam.ResZero) Abuf=0;  
  228.          else if(AVmeterUseHIC) {if(Abuf<480) {Abuf-=5;if(Abuf>0x8000) Abuf=0;}}
  229.           //if(CheckFullADC) BCDbuf=Abuf; else
  230.           AMulDig();

  231.           if(BCDbuf>32767) BCDbuf=32767;
  232.       Abuffer[7]=Abuffer[6];
  233.           Abuffer[6]=Abuffer[5];
  234.           Abuffer[5]=Abuffer[4];
  235.           Abuffer[4]=Abuffer[3];
  236.           Abuffer[3]=Abuffer[2];
  237.       Abuffer[2]=Abuffer[1];
  238.           Abuffer[1]=Abuffer[0];
  239.           Abuffer[0]=BCDbuf;
  240.           LongBuf=Abuffer[0]+Abuffer[1]+Abuffer[2]+Abuffer[3]+Abuffer[4]+Abuffer[5]+Abuffer[6]+Abuffer[7];
  241.       Vbuf=LongBuf>>3;
  242.           MD1U16=BCDbuf;
  243.       MD5U16=100;              
  244.           ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  245.           OPCON=0x01;                       //启动计算
  246.       while(OPCON&0x01!=0);             //等待计算完成
  247.       MD5U16=Vbuf;
  248.       ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  249.           OPCON=0x01;                       //启动计算
  250.           while(OPCON&0x01!=0);             //等待计算完成
  251.           if((MD0>95)&(MD0<105)) BCDbuf=Vbuf;
  252.          else Abuffer[0]=Abuffer[1]=Abuffer[2]=Abuffer[3]=Abuffer[4]=Abuffer[5]=Abuffer[6]=Abuffer[7]=BCDbuf;

  253.       if(IsRerr) goto ResetPort;
  254.           if(ThreeLEDVer&TxThreeDigi) BCDbuf+=5;   
  255.           if(BCDbuf>9999) {BCDbuf+=5;BCDbufDiv10();} else Abuf=0;
  256.       if(IsShowRef) BCDbuf=Ref1300Volt;
  257.       DispBcdABuf:
  258.           FormatBCDbuf();                          //maxA:32.77
  259.           if(ThreeLEDVer&TxThreeDigi) ASEG1=0x00;else ASEG1=BCD2SEG(BCDbuf & 0x0f);      
  260.       ASEG2=BCD2SEG((BCDbuf>>4) & 0x0f);
  261.       ASEG3=BCD2SEG((BCDbuf>>8) & 0x0f);
  262.           ASEG4=BCD2SEG((BCDbuf>>12)& 0x0f);
  263.           if(IsShowRef) F0=1;
  264.             else if(Abuf) ASEG3|=0x80;else ASEG4|=0x80;

  265.           Achar[1]='1';
  266.           Achar[3]=BIN2CHAR((BCDbuf>>12)& 0x0f);
  267.       if(Abuf) {Achar[5]='.';Achar[4]=BIN2CHAR((BCDbuf>>8) & 0x0f);}
  268.          else {Achar[4]='.';Achar[5]=BIN2CHAR((BCDbuf>>8) & 0x0f);}
  269.       Achar[6]=BIN2CHAR((BCDbuf>>4) & 0x0f);
  270.           if(ThreeLEDVer&TxThreeDigi) Achar[7]='0'; else Achar[7]=BIN2CHAR(BCDbuf & 0x0f);  
  271.       Echar[3]=ASEG4^0xa3;
  272.       Echar[4]=ASEG3^0xa4;
  273.       Echar[5]=ASEG2^0xa5;
  274.       if(ThreeLEDVer) Echar[6]=0xff;else Echar[6]=ASEG1^0xa6;

  275.           if(IsRstAZero) {ASEG4|=0x80;ASEG3|=0x80;ASEG2|=0x80;}


  276.           //5000mv-3640mv-2780mv-2315mv-1810mv--1340mv-620mv
  277.           //      -3100  -2452  -2093  -1728   -1091  -416
  278.           if(CheckKey) goto ResetPort;
  279.       if(IsRerr) goto ResetPort;
  280.       if(IsShowRef){BCDbuf=RefAVolt*10;Vbuf=0;goto DispBcdVbuf;}

  281.           SelectRef(chRefV4400);
  282.       LoadVolt();
  283.           LoadBGVolt();
  284.           segnum=1;
  285.           if(Vbuf>ADCVolt3570)
  286.                {VMulRef();//BCDbuf=2234*RefValue/1000*Vbuf/BGVbuf; 75v-105v
  287.                     Abuf=BCDbuf;
  288.                     LoadVolt();
  289.                     VMulRef();
  290.             BCDbuf=(BCDbuf+Abuf)>>1;

  291.                 /*MD1U16=BCDbuf;
  292.             MD5U16=constHVFineTurn;              
  293.                 ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  294.                 OPCON=0x01;                       //启动计算
  295.             while(OPCON&0x01!=0);             //等待计算完成
  296.             MD5U16=1000;
  297.             ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  298.                 OPCON=0x01;                       //启动计算
  299.                 while(OPCON&0x01!=0);             //等待计算完成 =Vbuf*RefAVolt/100*2060/4096
  300.             BCDbuf=MD1U16;*/

  301.             if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  302.                         Vchar[1]=BIN2CHAR(chRefV4400);
  303.                    }
  304.                   else if(Vbuf>ADCVolt2750){SelectRef(chRefV3570);//2350 60v-75v
  305.                                     LoadVolt();
  306.                                         LoadBGVolt();
  307.                                                                 Flashoff();
  308.                                                                 VMulRef();
  309.                                     if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  310.                                                                         Vchar[1]=BIN2CHAR(chRefV3570);
  311.                                            }
  312.                            else if(Vbuf>ADCVolt2350){SelectRef(chRefV2750);//2000 51v-60v
  313.                                          LoadVolt();
  314.                                              LoadBGVolt();
  315.                                                                          Flashoff();
  316.                                                                          VMulRef();
  317.                                          if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  318.                                                                                  Vchar[1]=BIN2CHAR(chRefV2750);
  319.                                                 }
  320.                    else if(Vbuf>ADCVolt1730){SelectRef(chRefV2350);//1600 41v-51v
  321.                                              LoadVolt();
  322.                                                  LoadBGVolt();
  323.                                                                                  Flashoff();
  324.                                                                                  VMulRef();
  325.                                              if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  326.                                                                                          Vchar[1]=BIN2CHAR(chRefV2350);
  327.                                             }
  328.                          else if(Vbuf>ADCVolt1340){SelectRef(chRefV1730);//1000 25.6v-35v
  329.                                                    LoadVolt();
  330.                                                        LoadBGVolt();
  331.                                                                                            Flashoff();
  332.                                                                                        VMulRef();
  333.                                                    if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  334.                                                                                                    Vchar[1]=BIN2CHAR(chRefV1730);
  335.                                                           }
  336.                              else if(Vbuf>ADCVARef){SelectRef(chRefV1340);//370:9v-25.6v
  337.                                                                                             LoadVolt();
  338.                                                         LoadBGVolt();
  339.                                                                                                     Flashoff();
  340.                                                                                         VMulRef();
  341.                                                                                                     if(BCDbuf<=999) goto Show4DigiVolt;
  342.                                                     if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  343.                                                                                                     Vchar[1]=BIN2CHAR(chRefV1340);
  344.                                                            }
  345.                                 else {Show4DigiVolt:
  346.                                       SelectRef(chRefVA620); //0-9v    //U=Vbuf*RefAVolt/100*ResPerVolt/4096
  347.                                       LoadVolt();
  348.                                                                           Flashoff();
  349.                                                                           MD1U16=Vbuf;                      //MD3U16:MD1U16=Vbuf*RefAVolt
  350.                                       MD5U16=RefAVolt;                  //
  351.                                           ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  352.                                           OPCON=0x01;                       //启动计算
  353.                                           while(OPCON&0x01!=0);             //等待计算完成 =RefAVolt*Vbuf
  354.                                       MD5U16=100;
  355.                                       ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  356.                                           OPCON=0x01;                       //启动计算
  357.                                           while(OPCON&0x01!=0);             //等待计算完成 =RefAVolt*Vbuf/100
  358.                                       MD5U16=HwParam.VoltDivider;
  359.                                           ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  360.                                           OPCON=0x01;                       //启动计算
  361.                                       while(OPCON&0x01!=0);             //等待计算完成 =RefAVolt*Vbuf/100*206
  362.                                       MD5U16=4096;
  363.                                       ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  364.                                           OPCON=0x01;                       //启动计算
  365.                                           while(OPCON&0x01!=0);             //等待计算完成 =Vbuf*RefAVolt/100*2060/4096
  366.                                       BCDbuf=MD1U16;
  367.                                       if(BCDbuf>9999) BCDbufDiv10(); else segnum=0;
  368.                                                                           Vchar[1]=BIN2CHAR(chRefVA620);
  369.                                               }
  370.       if(BCDbuf<15) BCDbuf=0;
  371.       Vbuffer[7]=Vbuffer[6];
  372.           Vbuffer[6]=Vbuffer[5];
  373.           Vbuffer[5]=Vbuffer[4];
  374.           Vbuffer[4]=Vbuffer[3];
  375.           Vbuffer[3]=Vbuffer[2];
  376.       Vbuffer[2]=Vbuffer[1];
  377.           Vbuffer[1]=Vbuffer[0];
  378.           Vbuffer[0]=BCDbuf;
  379.           LongBuf=Vbuffer[0]+Vbuffer[1]+Vbuffer[2]+Vbuffer[3]+Vbuffer[4]+Vbuffer[5]+Vbuffer[6]+Vbuffer[7];
  380.       Abuf=LongBuf>>3;
  381.           MD1U16=BCDbuf;
  382.       MD5U16=100;              
  383.           ARCON=4<<5;                       //4:16*16位; 5:16/16位 6:32/16位----16位乘法  被乘数:MD1U16 乘数:MD5U16  积:MD3U16:MD1U16
  384.           OPCON=0x01;                       //启动计算
  385.       while(OPCON&0x01!=0);             //等待计算完成
  386.       MD5U16=Abuf;
  387.       ARCON=6<<5;                       //6:32/16位:MD3U16:MD1U16/MD5U16
  388.           OPCON=0x01;                       //启动计算
  389.           while(OPCON&0x01!=0);             //等待计算完成 =Vbuf*RefAVolt/100*2060/4096
  390.           if((MD0>95)&(MD0<105)) BCDbuf=Abuf;
  391.          else Vbuffer[0]=Vbuffer[1]=Vbuffer[2]=Vbuffer[3]=Vbuffer[4]=Vbuffer[5]=Vbuffer[6]=Vbuffer[7]=BCDbuf;

  392.           DispBcdVbuf:
  393.       if(ThreeLEDVer&TxThreeDigi)
  394.              {BCDbuf+=5;  
  395.           if(segnum==0) if(BCDbuf>9999) {BCDbufDiv10();segnum=1;}
  396.           if(segnum==1) if(BCDbuf>9999) {BCDbufDiv10();segnum=2;}
  397.                  }
  398.       FormatBCDbuf();
  399.           if(ThreeLEDVer) VSEG1=0x00;else VSEG1=BCD2SEG(BCDbuf & 0x0f);  
  400.       VSEG2=BCD2SEG((BCDbuf>>4) & 0x0f);
  401.       VSEG3=BCD2SEG((BCDbuf>>8) & 0x0f);
  402.           VSEG4=BCD2SEG((BCDbuf>>12)& 0x0f);
  403.           if(IsShowRef) VSEG1=0x54;
  404.             else switch(segnum)
  405.                        {case 0:VSEG4|=0x80;break;
  406.                             case 1:VSEG3|=0x80;break;
  407.                 case 2:if(ThreeLEDVer==0) VSEG2|=0x80;break;
  408.                 default:;
  409.                            }

  410.           Vchar[3]=BIN2CHAR((BCDbuf>>12)& 0x0f);
  411.       switch(segnum)
  412.             {case 0:Vchar[4]='.';
  413.                         Vchar[5]=BIN2CHAR((BCDbuf>>8) & 0x0f);
  414.                 Vchar[6]=BIN2CHAR((BCDbuf>>4) & 0x0f);
  415.                         break;
  416.                  case 1:Vchar[4]=BIN2CHAR((BCDbuf>>8) & 0x0f);
  417.                         Vchar[5]='.';
  418.                 Vchar[6]=BIN2CHAR((BCDbuf>>4) & 0x0f);
  419.                         break;
  420.          case 2:Vchar[4]=BIN2CHAR((BCDbuf>>8) & 0x0f);
  421.                         Vchar[5]=BIN2CHAR((BCDbuf>>4) & 0x0f);
  422.                 Vchar[6]='.';
  423.                         break;
  424.          default:;
  425.                 }
  426.           if(ThreeLEDVer&TxThreeDigi) Vchar[7]='0';else Vchar[7]=BIN2CHAR(BCDbuf & 0x0f);

  427.           Echar[7]=VSEG4^0xa7;
  428.       Echar[8]=VSEG3^0xa8;
  429.           Echar[9]=VSEG2^0xa9;
  430.       if(ThreeLEDVer) Echar[10]=0xff;else Echar[10]=VSEG1^0xaa;

  431.           ResetPort:
  432.       P1M0  =0xff;
  433.       P1M1  =0x00;
  434.       P3M0  =0xff;
  435.       P3M1  =0x00;
  436.           //P3PU  =0x00;
  437.       TF0=0;
  438.         }
  439. }

复制代码
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
不知道STC ADC的线性好不好
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
你是技术大佬。佩服
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
没看到与福禄克对比啊
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
只有羡慕的份
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
你也是个大佬
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
马斯克看到了估计要来挖人
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
没有看见测毫欧呀
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
看不懂,但感觉很牛A的样子...


二○二五年九月十三日
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
你把聪明水挂网上卖一定能发大财。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
动手能力强的永远会走在前头
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
不懂就问,聪明水是啥,那段话不明白。
回复 支持 反对

使用道具 举报

发表于 2 小时前 来自手机浏览器 | 显示全部楼层
很完美  源代码一起放那个压缩包就好了  这代码直接复制粘贴一起就能用吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
lf1286 发表于 2025-9-13 11:47
不懂就问,聪明水是啥,那段话不明白。

以前能玩技术,喝过聪明水就玩不了技术了
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
数码管体积大了,搞个OLED
回复 支持 反对

使用道具 举报

发表于 半小时前 | 显示全部楼层
高精度样本电阻的比例法?
回复 支持 反对

使用道具 举报

 楼主| 发表于 半小时前 | 显示全部楼层
亚历山大 发表于 2025-9-13 14:02
数码管体积大了,搞个OLED

预留有LCM排线位啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-13 15:08 , Processed in 0.124801 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表