標題: 電子元件測試儀制作,STC單片機+OLED+6只電阻,AVR-Transistortester移植改造版 [打印本頁]

作者: rz12345    時間: 2022-9-14 11:05
標題: 電子元件測試儀制作,STC單片機+OLED+6只電阻,AVR-Transistortester移植改造版
根據(jù)網(wǎng)友提供的:《德國開源項目:A_TransistorTester晶體管測試儀的中文注釋C源碼》經(jīng)過幾個星期天的努力,改為STC芯片,對電路進行了簡化,經(jīng)簡單測試效果良好,精度未仔細調(diào)整,現(xiàn)公布改造和移植原碼,大家一起制造白菜價測試儀。

超簡單電路,看程序和圖片即可正確連接電路。單片機型號: STC8H1K16
制作出來的實物圖如下:


























單片機源程序如下:
  1. //neu2010.01.02版Mega8基礎(chǔ)版(起源于約2009年。需配合Markus F.電路圖,
  2. //中文注釋翻譯:itkw: autopccopy @ guangzhou 2022.04.22 AVR單片機價格昂貴,強烈建議移植到STC單片機)
  3. //程序移植:rz123456,非常喜歡STC,功能強大、使用方便、價格便宜。
  4. //刪除了一部分不需要的,原程序中AVR的硬件程序。OLED程序為廠家提供。

  5. //本AVR例程不支持小容量芯片,需Mega8或Mega328起。使用WinAVR-20100110 編譯, PROGISP 1.72+USBIAP工具下載



  6. #include <STC8G.h>

  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "oled.h"
  10. #include <math.h>

  11. #define  uint8_t unsigned char
  12. #define  uint16_t unsigned int
  13. #define  uint32_t unsigned long int
  14. #define  int16_t  signed int


  15. //三組測試電阻的阻值:R_L為680歐,R_H為470K
  16. //如要修改,請輸入以歐姆為單位的電阻值定義(特別注意:此三組電阻須配對為阻值相近,否則誤差較大)
  17. //#define R_L_VAL                680              //R_L; 標準值 680歐
  18. //#define R_H_VAL                470000UL         //R_H; 標準值 470K
  19. #define R_L_VAL                510              //510歐
  20. #define R_H_VAL                510000UL         //510K
  21. //在程序中計算必要的電阻值
  22. #define RH_RL_RATIO            (R_H_VAL/R_L_VAL)//高低電阻比
  23. #define R_H_PER                (R_H_VAL/100)    //高電阻/100的值

  24. //注意:N和P溝道增強型E-MOSFET柵極電容計算系數(shù):取決于AVR的制造公差,在必要時進行調(diào)整
  25. //(注:其他改進型有插入基準元件進行自動校準功能)
  26. //#define N_GATE_CAPACITY_FACTOR 387              //N溝道系數(shù)
  27. //#define P_GATE_CAPACITY_FACTOR 142              //P溝道系數(shù)
  28. #define N_GATE_CAPACITY_FACTOR 18              //N溝道系數(shù)
  29. #define P_GATE_CAPACITY_FACTOR 18   
  30. //電容器的電容計算系數(shù):取決于 AVR 的制造公差,在必要時進行調(diào)整
  31. //總測量范圍約為 0.2nF 至 1000uF。
  32. //#define Hr_LowCAPACITY_FACTOR  94               //使用 470k 高電阻測量(小電容)系數(shù)
  33. #define Hr_LowCAPACITY_FACTOR  21
  34. //#define Lr_HighCAPACITY_FACTOR 283              //使用 680  低電阻測量(高電容)系數(shù)
  35. #define Lr_HighCAPACITY_FACTOR 18

  36. void ADC_Init();
  37. void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TriPin);
  38. void ReadCapacity(uint8_t HighPin, uint8_t LowPin);
  39. void DischargePin(uint8_t PinToDischarge, uint8_t DischargeDirection);
  40. uint16_t ReadADC(u8 addr);                  //ADC讀取
  41. void GetGateThresholdVoltage(void);             //取柵極開啟閾值電壓
  42. void _delay_ms(unsigned int ms);

  43. //端口C: PC0-PC2為測試腳TP1-TP3為,同時PB0-PB5分別連接680、470K三組測試電阻
  44. //請不要更改 TP1、TP2和TP3 的定義!

  45. //端口B: PB0-PB5分別連接680、470K連續(xù)三組測試電阻
  46. //#define R_DDR             DDRB     //數(shù)據(jù)方向寄存器,    1:輸出/0:輸入
  47. //#define R_PORT            PORTB    //6個測試電阻接PORTB,1:上拉電阻使能
  48. //
  49. ////以下注釋為方便理解本程序:
  50. ////DDRxn控制引腳方向:當DDRxn為1時,Pxn為輸出;當DDRxn為0時,Pxn為輸入。
  51. ////PORTxn在PCn為輸入時,1為上拉電阻至VCC;否則引腳懸空。PCn為輸出時,1為輸出高電平;否則輸出低電平。
  52. ////PINxn的值為Pxn引腳的電平。不論如何配置DDxn,都可以通過讀取PINxn來獲得引腳電平。如果給PINxn寫入1,PORTxn的值會翻轉(zhuǎn)。
  53. //
  54. //#define ADC_DDR           DDRC     //數(shù)據(jù)方向寄存器: 1:輸出/0:輸入
  55. //#define ADC_PORT          PORTC    //數(shù)據(jù)寄存器    : 1: 輸入:上拉電阻使能 或 輸出:高電平
  56. //#define ADC_PIN           PINC     //引腳寄存器    : 輸出時引腳的實際值
  57. //#define TP1               PC0      //0
  58. //#define TP2               PC1      //1
  59. //#define TP3               PC2      //2
  60. #define     R_DDR       P2M0 // 這個還要加  P2M1= ~P2M0;
  61. #define     R_PORT      P2

  62. #define     ADC_DDR     P1M0 //這個 入=0  出=1   還要加P1M1 = ~P1M0; //設(shè)置 P1.0~P1.7 為雙向口模式
  63. #define     ADC_PORT    P1 //設(shè)置
  64. #define     ADC_PIN     P1

  65. u8   TP1=0;
  66. u8   TP2=1;
  67. u8   TP3=2;
  68.      
  69. sbit        RST_PIN=P0^1;        //測試按鈕,按下為低電平


  70. //元件屬性碼(與返回碼PartFound匹配)
  71. #define PART_NONE         0        //無或故障
  72. #define PART_DIODE        1        //二極管
  73. #define PART_TRANSISTOR   2        //三極管
  74. #define PART_FET          3        //FET
  75. #define PART_TRIAC        4        //單向可控硅
  76. #define PART_THYRISTOR    5        //雙向可控硅
  77. #define PART_RESISTOR     6        //電阻
  78. #define PART_CAPACITOR    7        //電容

  79. //三極管子類型碼
  80. #define PART_MODE_NPN     1        //NPN三極管
  81. #define PART_MODE_PNP     2        //PNP三極管

  82. //場效應(yīng)管子類型碼(與PartMode返回碼匹配。大屬性碼PartFound為PART_FET: 3)
  83. #define PART_MODE_N_E_MOS 1        //N溝道增強型E-MOSFET
  84. #define PART_MODE_P_E_MOS 2        //P溝道增強型E-MOSFET
  85. #define PART_MODE_N_D_MOS 3        //N溝道耗盡型D-MOSFET
  86. #define PART_MODE_P_D_MOS 4        //P溝道耗盡型D-MOSFET
  87. #define PART_MODE_N_JFET  5        //N溝道JFET
  88. #define PART_MODE_P_JFET  6        //P溝道JFET

  89. //二極管結(jié)構(gòu)體
  90. struct Diode                       //聲明有3個成員的結(jié)構(gòu)體,標簽被命名為Diode(結(jié)構(gòu)體將不同的數(shù)據(jù)類型整合為一個有機整體,方便數(shù)據(jù)管理,增加代碼的可讀性)
  91. {
  92.   uint8_t Anode;                   //陽極引腳序號
  93.   uint8_t Cathode;                 //陰極
  94.   int16_t Voltage;                 //二極管導(dǎo)通電壓降
  95. };
  96. struct Diode diodes[6];            //用Diode標簽的結(jié)構(gòu)體,另外聲明了變量diodes數(shù)組

  97. uint8_t   NumOfDiodes;             //存在的二極管個數(shù)
  98. uint8_t   b,c,e;                   //b,c,e引腳序號,配合顯示引腳號(取值0-2)

  99. //三極管的測量
  100. uint8_t   PartReady;               //測量的輪次數(shù)
  101. uint8_t   PartFound, tmpPartFound; //返回的元件屬性碼
  102. uint8_t   PartMode;                //返回的元件子類型碼

  103. uint32_t  u32_hfe;                 //u32值,用于直流放大系數(shù)、電阻值等
  104. uint16_t  ADCval[2];               //ADC測量值
  105. uint16_t  ADCuBE[2];               //ADC測量: 基極-發(fā)射極BE

  106. //電阻和電容測量
  107. uint8_t   ra, rb;                  //電阻引腳序號,配合顯示引腳號(取值0-2)
  108. uint16_t  rv[2];                   //電阻兩端的電壓降
  109. uint16_t  rADCmax[2];              //可實現(xiàn)的最大ADC值(小于1023,因為測量電阻時LowPin上的電壓高于零)
  110. uint8_t   ca, cb;                  //電容引腳序號,配合顯示引腳號(取值0-2)
  111. uint32_t  cv;                      //電容容量值

  112. uint8_t   tmpVAL, tmpVAL2;         //2個通用u8臨時變量
  113. uint16_t  ADCv[4];                 //ADC的測量值
  114. char      chrVAL[8];               //字符串1
  115. char      chrVAL2[6];              //字符串2
  116. uint32_t  chrVAL2_cv;
  117. uint32_t  chrVAL_cv;
  118. uint8_t   itkw_tmp1;               //僅用于對調(diào)引腳序號的臨時變量


  119. //============================主程序開始============================
  120. int main(void)
  121. {
  122. P0M0 = 0x08; //設(shè)置 P0.0~P0.7 為雙向口模式
  123. P0M1 = 0x00;
  124. P3M0 = 0xC0; //設(shè)置 P3.0~P3.7 為雙向口模式 C0=P3.6/7輸出oled電源
  125. P3M1 = 0x00;
  126. P0PU = 0x02; //上拉電阻P0.1

  127. P0=0X02;         //測試按鈕

  128. P3=0X40;  //P3.5  OLED+電源
  129.    
  130.         OLED_Init();//初始化OLED
  131.     OLED_ColorTurn(0);//0正常顯示,1 反色顯示
  132.     OLED_DisplayTurn(1);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示

  133.    ADC_Init();

  134. //EA = 1;     //允許全局中斷


  135.   //運行期間再次按下啟動按鈕時的入口點,復(fù)位變量后開始
  136.   start:
  137. //  wdt_enable(WDTO_2S);             //看門狗開啟
  138.   PartFound    = PART_NONE;        //返回屬性碼為0
  139.   tmpPartFound = PART_NONE;        //返回屬性碼為0
  140.   NumOfDiodes  = 0;                //二極管數(shù)量
  141.   PartReady    = 0;                //測量的輪次數(shù)
  142.   PartMode     = 0;                //返回子類型碼
  143.   ca           = 0;                //電容引腳序號a
  144.   cb           = 0;                //電容引腳序舃

  145. //  lcd_clear(); //清屏
  146.   OLED_Clear();


  147.   //開始測試
  148. //  lcd_eep_string(Testrunning);     //顯示:Testrunning..
  149.   OLED_ShowString(0,0,"Testrunning...",16);
  150.   OLED_ShowChinese(0,2,3,16);//測試中
  151.         OLED_ShowChinese(16,2,4,16);//
  152.         OLED_ShowChinese(32,2,5,16);//
  153.         OLED_ShowString(48,2,"......",16);

  154.   //測量3個引腳的所有6種組合
  155.   CheckPins(TP1, TP2, TP3);        //PC0,PC1,PC2
  156.   CheckPins(TP1, TP3, TP2);
  157.   CheckPins(TP2, TP1, TP3);
  158.   CheckPins(TP2, TP3, TP1);
  159.   CheckPins(TP3, TP1, TP2);
  160.   CheckPins(TP3, TP2, TP1);

  161.   //若屬性碼為空或電阻或二極管,則再單獨測量電容器(需先放電,否則可能無法測量)
  162.   if((PartFound == PART_NONE) || (PartFound == PART_RESISTOR) || (PartFound == PART_DIODE))
  163.   {
  164.     R_PORT = 0;
  165.     R_DDR = (1<<(TP1*2)) | (1<<(TP2*2)) | (1<<(TP3*2));  //電阻引腳R_H為輸出模式接地
  166.     P2M1 = ~P2M0;
  167.         _delay_ms(50);
  168.     R_DDR = 0; //電阻引腳為輸入模式
  169.         P2M1 = ~P2M0;
  170.     //測量所有6個引腳組合中的電容器
  171.     ReadCapacity(TP1, TP2);
  172.     ReadCapacity(TP1, TP3);
  173.     ReadCapacity(TP2, TP1);
  174.     ReadCapacity(TP2, TP3);
  175.     ReadCapacity(TP3, TP1);
  176.     ReadCapacity(TP3, TP2);
  177.   }

  178.   GetGateThresholdVoltage();       //取柵極開啟閾值電壓
  179. //  lcd_clear();
  180.   OLED_Clear();
  181.   //測量完成,現(xiàn)在評估如下

  182.   
  183.   if(PartFound == PART_DIODE)//***二極管
  184.   {
  185.     if(NumOfDiodes == 1)
  186.     {
  187.       //標準二極管
  188.      // lcd_eep_string(Diode);
  189.                 OLED_ShowChinese(0,0,16,16);//
  190.                 OLED_ShowChinese(16,0,18,16);//
  191.                 OLED_ShowChinese(32,0,19,16);//
  192.         OLED_ShowString(50,0,"Diode",16);
  193.      // lcd_eep_string(AK);          //"A,K="
  194.         OLED_ShowString(0,2,"A,K=",16);
  195.       //lcd_data(diodes[0].Anode   + 49);
  196.         OLED_ShowChar(40,2,(diodes[0].Anode   + 49),16);
  197.                OLED_ShowChinese(48,2,8,16);//二極管
  198.           //lcd_data(diodes[0].Cathode + 49);

  199.         OLED_ShowChar(64,2,(diodes[0].Cathode   + 49),16);
  200.      // Line2();
  201.       //lcd_eep_string(Uf);          //“Uf =”
  202.         OLED_ShowString(0,4,"Uf =",16);
  203.       //lcd_string(itoa(diodes[0].Voltage, chrVAL, 10)); //顯示二極管導(dǎo)通電壓降
  204.         OLED_ShowNum(40,4,(diodes[0].Voltage),4, 16);
  205.       //lcd_eep_string(mV);
  206.          OLED_ShowString(72,4,"mV",16);
  207.       goto end;
  208.     }
  209.     else if(NumOfDiodes == 2)
  210.     {
  211.       //雙二極管
  212.       if(diodes[0].Anode == diodes[1].Anode)
  213.       {
  214.         //lcd_eep_string(DualDiode); //共陽極雙二極管
  215.          OLED_ShowChinese(0,0,20,16);//
  216.                
  217.                 OLED_ShowChinese(16,0,16,16);//
  218.                 OLED_ShowChinese(32,0,18,16);//
  219.                 OLED_ShowChinese(48,0,19,16);//

  220.                 //OLED_ShowString(0,0,"DualDiode",16);
  221.         //lcd_string("CA");
  222.         OLED_ShowString(72,0,"CA",16);
  223.         //Line2();   
  224.         //lcd_eep_string(AK1K2);//陽極,陰極1,陰極2=
  225.         OLED_ShowString(0,2,"AK1K2",16);
  226.         //lcd_data(diodes[0].Anode   + 49);
  227.         OLED_ShowChar(88,2,(diodes[0].Anode   + 49),16);
  228.         //lcd_data(diodes[0].Cathode + 49);
  229.         OLED_ShowChar(98,2,(diodes[0].Cathode   + 49),16);
  230.         //lcd_data(diodes[1].Cathode + 49);
  231.         OLED_ShowChar(108,2,(diodes[1].Cathode   + 49),16);
  232.                
  233.                 OLED_ShowChar(40,4,(diodes[0].Anode   + 49),16);
  234.                 OLED_ShowChinese(48,4,8,16);//二極管
  235.                 OLED_ShowChar(64,4,(diodes[0].Cathode   + 49),16);
  236.                 OLED_ShowChar(40,6,(diodes[0].Anode   + 49),16);
  237.                 OLED_ShowChinese(48,6,8,16);//二極管
  238.                 OLED_ShowChar(64,6,(diodes[1].Cathode   + 49),16);
  239.         goto end;
  240.       }
  241.       else if(diodes[0].Cathode == diodes[1].Cathode)
  242.       {
  243.         //lcd_eep_string(DualDiode); //共陰極雙二極管
  244.         OLED_ShowChinese(0,0,20,16);//
  245.                
  246.                 OLED_ShowChinese(16,0,16,16);//
  247.                 OLED_ShowChinese(32,0,18,16);//
  248.                 OLED_ShowChinese(48,0,19,16);//
  249.         //lcd_string("CC");
  250.         OLED_ShowString(72,0,"CC",16);
  251.         //Line2();   
  252.         //lcd_string("K,A1,A2=");
  253.         OLED_ShowString(0,2,"K,A1,A2=",16);
  254.         //lcd_data(diodes[0].Cathode + 49);
  255.         OLED_ShowChar(88,2,(diodes[0].Cathode   + 49),16);
  256.         //lcd_data(diodes[0].Anode   + 49);
  257.         OLED_ShowChar(98,2,(diodes[0].Anode   + 49),16);
  258.         //lcd_data(diodes[1].Anode   + 49);
  259.         OLED_ShowChar(108,2,(diodes[1].Anode   + 49),16);
  260.         goto end;
  261.       }
  262.       else if ((diodes[0].Cathode == diodes[1].Anode) && (diodes[1].Cathode == diodes[0].Anode))
  263.       {
  264.         //lcd_eep_string(TwoDiodes); //反向并聯(lián)2個二極管。(注:此處原程序沒有顯示引腳序號)
  265.         OLED_ShowString(0,0,"TwoDiodes",16);
  266.         //Line2();   
  267.         //lcd_eep_string(Antiparallel);
  268.         OLED_ShowString(0,2,"Antiparallel",16);
  269.                
  270.                 OLED_ShowChar(0,4,'2',16);
  271.                 OLED_ShowChinese(8,4,10,16);//        2個二極管
  272.                 OLED_ShowChinese(26,4,16,16);//
  273.                 OLED_ShowChinese(42,4,18,16);//
  274.                 OLED_ShowChinese(58,4,19,16);//
  275.         goto end;
  276.       }
  277.     }
  278.     else if(NumOfDiodes == 3)           //2個二極管串聯(lián);將被認為是3個二極管
  279.     {
  280.       b = 3;
  281.       c = 3;
  282.       //為此,必須有2個陰極和2個陽極匹配。
  283.       //這是因為這些二極管被認為是2個獨立的二極管,并且也被認為是一個“大”二極管。
  284.       if((diodes[0].Anode   == diodes[1].Anode)   || (diodes[0].Anode   == diodes[2].Anode))   b = diodes[0].Anode;
  285.       if(diodes[1].Anode    == diodes[2].Anode)                                                b = diodes[1].Anode;
  286.       if((diodes[0].Cathode == diodes[1].Cathode) || (diodes[0].Cathode == diodes[2].Cathode)) c = diodes[0].Cathode;
  287.       if(diodes[1].Cathode  == diodes[2].Cathode)                                              c = diodes[1].Cathode;
  288.       if((b<3) && (c<3))
  289.       {
  290.         //lcd_eep_string(TwoDiodes); //2個串聯(lián)二極管
  291.         OLED_ShowString(0,0,"TwoDiodes",16);
  292.         //Line2();   
  293.         //lcd_eep_string(sAK);       //串聯(lián)陽極及陰極=
  294.         OLED_ShowString(0,2,"sAK",16);
  295.         //lcd_data(b + 49);
  296.         OLED_ShowChar(30,2,(b + 49),16);
  297.         //lcd_data(c + 49);
  298.         OLED_ShowChar(40,2,(c + 49),16);
  299.                
  300.                 OLED_ShowChar(0,4,'2',16);
  301.                 OLED_ShowChinese(8,4,10,16);//        2個二極管
  302.                 OLED_ShowChinese(26,4,16,16);//
  303.                 OLED_ShowChinese(42,4,18,16);//
  304.                 OLED_ShowChinese(58,4,19,16);//
  305.         goto end;
  306.       }
  307.     }
  308.   }
  309.   else if (PartFound == PART_TRANSISTOR)  //***三極管  
  310.   {
  311.     if(PartReady == 0)             //如果未進行過第二次測試(例如在帶有保護二極管的三極管的情況下)
  312.     {
  313.       ADCval[1] = ADCval[0];
  314.       ADCuBE[1] = ADCuBE[0];
  315.     }

  316.     if((ADCval[0]>ADCval[1]))            //如果在第一次測試期間放大系數(shù)較高,則更新數(shù)據(jù),并對調(diào)c和e極。
  317.     {
  318.       ADCval[1] = ADCval[0];
  319.       ADCuBE[1] = ADCuBE[0];
  320.       itkw_tmp1 = c;
  321.       c         = e;
  322.       e         = itkw_tmp1;
  323.     }
  324.                  OLED_ShowChinese(26,0,17,16);//三極管
  325.                 OLED_ShowChinese(42,0,18,16);//
  326.                 OLED_ShowChinese(58,0,19,16);//
  327.     if(PartMode == PART_MODE_NPN)  //顯示NPN或PNP類型
  328.     {
  329.       //lcd_eep_string(NPN);
  330.       OLED_ShowString(0,2,"NPN",16);
  331.           OLED_ShowChinese(74,2,22,16);//<
  332.     }
  333.     else
  334.     {
  335.       //lcd_eep_string(PNP);
  336.       OLED_ShowString(0,2,"PNP",16);
  337.          OLED_ShowChinese(74,2,21,16);//>
  338.     }

  339.     //lcd_eep_string(BCE);           //BCE=
  340.     OLED_ShowString(50,2,"BCE",16);
  341.     //lcd_data(b + 49);              //依次顯示引腳序號(ascii 49 是字符"1", b,c,e取值范圍:0-2)
  342.     OLED_ShowChar(90,2,(b + 49),16);
  343.     //lcd_data(c + 49);
  344.     OLED_ShowChar(98,2,(c + 49),16);
  345.     //lcd_data(e + 49);
  346.     OLED_ShowChar(106,2,(e + 49),16);
  347.     //Line2();
  348.     //計算 直流放大系數(shù) hFE = 發(fā)射極電流/基極電流
  349.     u32_hfe   = ADCval[1];
  350.     u32_hfe  *= RH_RL_RATIO;          //高低電阻比

  351.     if(ADCuBE[1] < 11) ADCuBE[1] = 11;

  352.     u32_hfe  /= ADCuBE[1];
  353.     ADCval[1] = (uint16_t)u32_hfe;

  354.     //lcd_eep_string(hfeSTR);        //“hFE=”
  355.     OLED_ShowString(0,4,"hFE=",16);
  356.     //lcd_string(utoa(ADCval[1], chrVAL, 10));
  357.    OLED_ShowNum(32,4,(ADCval[1]),4, 16);

  358. //    SetCursor(2,7);                //光標在第2行,字符7
  359.     if(NumOfDiodes > 2)            //帶保護二極管的三極管
  360.     {
  361.       //lcd_data(LCD_CHAR_DIODE);    //顯示二極管符號
  362.       OLED_ShowChinese(64,0,8,16);//
  363.     }
  364.     else
  365.     {
  366.       //lcd_data(' ');
  367.       OLED_ShowString(64,4,"  ",16);
  368.     }

  369.     for (c=0;c<NumOfDiodes;c++)
  370.     {
  371.       if(((diodes[c].Cathode == e) && (diodes[c].Anode   == b) && (PartMode == PART_MODE_NPN))   ||   ((diodes[c].Anode   == e) && (diodes[c].Cathode == b) && (PartMode == PART_MODE_PNP)))
  372.       {
  373.         //lcd_eep_string(Uf);        //“Uf=”
  374.         OLED_ShowString(8,6,"Uf=",16);
  375.         //lcd_string(itoa(diodes[c].Voltage, chrVAL, 10));
  376.         OLED_ShowNum(32,6,(diodes[c].Voltage),4, 16);
  377.         //lcd_data('m');             //應(yīng)是mV的意思..
  378.          OLED_ShowString(64,6,"mV",16);
  379.         goto end;
  380.       }
  381.     }
  382.     goto end;
  383.   }
  384.   else if (PartFound == PART_FET)       //JFET 或 MOSFET
  385.   {
  386.     if(PartMode&1)                 //判斷子類型碼為單數(shù)是N型,否則為P型(...)
  387.     {
  388.       //lcd_data('N');               //N型
  389.       OLED_ShowString(0,0,"N",16);
  390.     }
  391.     else
  392.     {
  393.       //lcd_data('P');               //P型
  394.       OLED_ShowString(0,0,"P",16);
  395.     }
  396.    
  397.   //if((PartMode==PART_MODE_N_E_MOS) || (PART_MODE_P_E_MOS))
  398.     if(PartMode < 3)                                                    //E-MOSFET:1、2(與下面對應(yīng))
  399.     {
  400.       //lcd_eep_string(emode);       //“-E”
  401.       OLED_ShowString(8,0,"-E",16);
  402.       //lcd_eep_string(mosfet);      //“-MOS”
  403.       OLED_ShowString(24,0,"-MOS",16);
  404.     }
  405.     else if((PartMode==PART_MODE_N_D_MOS) || (PartMode==PART_MODE_P_D_MOS))  //耗盡型D-MOSFET:3、4
  406.     {
  407.       //lcd_eep_string(dmode);       //“-D”
  408.       OLED_ShowString(8,0,"-D",16);
  409.       //lcd_eep_string(mosfet);      //“-MOS”
  410.       OLED_ShowString(24,0,"-MOS",16);
  411.     }
  412.     else                                                                //JFET:5、6
  413.     {
  414. //      lcd_eep_string(jfet);        //“-JFET”
  415.        OLED_ShowString(24,0,"-JFET",16);
  416.     }

  417.     //增強型E-MOSFET 則測量 柵極電容
  418.     if(PartMode < 3)               //E-MOSFET:1、2
  419.     {
  420. //      lcd_eep_string(GateCap);     //“C=”
  421.       OLED_ShowString(50,4,"C=",16);
  422.       //tmpVAL = strlen(chrVAL2);//chrVAL2_cv
  423.       //tmpVAL2 = tmpVAL;
  424. //      if(tmpVAL>4) tmpVAL = 4;     //對于 >100nF 的電容,不要指定最后一個小數(shù)位(否則它不適合 LCD)(顯示4位長度)
  425.       //lcd_show_format_cap(chrVAL2, tmpVAL, tmpVAL2);
  426.                         OLED_ShowNum(66,4,chrVAL2_cv,4, 16);
  427.       //lcd_data('n');
  428.       OLED_ShowString(116,4,"p",16);
  429.     }
  430.     //Line2();
  431.     //lcd_eep_string(gds);           //“GDS=” (注:此處與三極管的三個極分別顯示的方式不同)
  432.     OLED_ShowString(0,2,"GDS=",16);
  433.     //lcd_data(b + 49);
  434.     OLED_ShowChar(38,2,(b + 49),16);
  435.     //lcd_data(c + 49);
  436.     OLED_ShowChar(46,2,(c + 49),16);
  437.     //lcd_data(e + 49);
  438.     OLED_ShowChar(54,2,(e + 49),16);
  439.     if((PartMode < 3) && (NumOfDiodes > 0)) //增強型E-MOSFET及帶保護二極管的
  440.     {
  441.       //lcd_data(LCD_CHAR_DIODE);    //顯示二極管符號
  442.       OLED_ShowString(0,4,"DIODE",16);
  443.     }
  444.     else
  445.     {
  446.       //lcd_data(' ');               //空格
  447.       OLED_ShowString(0,4,"  ",16);
  448.     }
  449.    
  450.     if(PartMode < 3)               //增強型E-MOSFET
  451.     {
  452.       //lcd_eep_string(vt);          //Vt=
  453.       OLED_ShowString(0,6,"Vt=",16);
  454.       //lcd_string(chrVAL);          //顯示柵極閾值電壓
  455.       OLED_ShowNum(24,6,chrVAL_cv,4, 16);
  456.       //lcd_data('m');
  457.       OLED_ShowString(100,6,"mV",16);
  458.     }
  459.     goto end;
  460.   }
  461.   else if (PartFound == PART_THYRISTOR) //單向可控硅
  462.   {
  463. //    lcd_eep_string(Thyristor);
  464.         OLED_ShowString(0,0,"Thyristor",16);
  465. //    Line2();
  466. //    lcd_string("GAK=");
  467.         OLED_ShowString(0,2,"GAK=",16);
  468. //    lcd_data(b + 49);
  469.         OLED_ShowChar(30,2,(b + 49),16);
  470. //    lcd_data(c + 49);
  471.         OLED_ShowChar(38,2,(c + 49),16);
  472. //    lcd_data(e + 49);
  473.         OLED_ShowChar(46,2,(e + 49),16);
  474.     goto end;
  475.   }
  476.   else if (PartFound == PART_TRIAC)     //三端雙向可控硅
  477.   {
  478.     //lcd_eep_string(Triac);
  479.         OLED_ShowString(50,0,"Triac",16);
  480.     //Line2();
  481.     //lcd_eep_string(GA1A2);         //注:已改為統(tǒng)一顯示
  482.         OLED_ShowString(0,2,"G A1 A2",16);
  483. //   lcd_data(b + 49);
  484.         OLED_ShowChar(0,4,(b + 49),16);
  485. //    lcd_data(e + 49);
  486.         OLED_ShowChar(16,4,(e + 49),16);
  487. //    lcd_data(c + 49);
  488.         OLED_ShowChar(40,4,(c + 49),16);
  489.     goto end;
  490.   }
  491.   else if(PartFound == PART_RESISTOR)   //電阻
  492.   {
  493. //    lcd_eep_string(Resistor);      //顯示:Resistor
  494.         OLED_ShowChinese(0,0,0,16);//電
  495.         OLED_ShowChinese(16,0,1,16);//阻
  496.         OLED_ShowString(40,0,"Resistor",16);
  497. //    lcd_data(ra + 49);             //顯示引腳序號
  498.         OLED_ShowChar(30,2,(ra + 49),16);
  499. //    lcd_data('-');
  500.         //OLED_ShowChar(46,2,('-'),16);
  501.         OLED_ShowChinese(38,2,6,16);//電zhu
  502. //    lcd_data(rb + 49);
  503.         OLED_ShowChar(54,2,(rb + 49),16);
  504. //    Line2();
  505. //    lcd_string ("R = ");
  506.         OLED_ShowString(30,4,"R =",16);
  507.     if(rv[0]>512)                  //檢查測試電阻兩端的電壓與中值512相差有多遠
  508.     {
  509.       ADCval[0] = (rv[0]-512);
  510.     }
  511.     else
  512.     {
  513.       ADCval[0] = (512-rv[0]);
  514.     }
  515.    
  516.     if(rv[1]>512)
  517.     {
  518.       ADCval[1] = (rv[1]-512);
  519.     }
  520.     else
  521.     {
  522.       ADCval[1] = (512-rv[1]);
  523.     }
  524.    
  525.     if(ADCval[0] > ADCval[1])
  526.     {
  527.       rADCmax[0] = rADCmax[1];
  528.       rv[0] = rv[1];               //使用更接近512的結(jié)果(準確度更高)
  529.       rv[1] = R_H_PER;             //470k電阻(數(shù)值除100)
  530.     }
  531.     else
  532.     {
  533.       rv[1] = R_L_VAL;             //680R測試電阻
  534.     }
  535.    
  536.     if(rv[0]==0) rv[0] = 1;
  537.    u32_hfe = (uint32_t)((uint32_t)((uint32_t)rv[1]*(uint32_t)rv[0]) / (uint32_t)((uint32_t)rADCmax[0]-(uint32_t)rv[0]));

  538. //計算電阻
  539.           if(rv[1]==R_H_PER)             //470k電阻
  540.     {
  541.            OLED_ShowNum(54,4,u32_hfe/10,5, 16);
  542.           OLED_ShowChar(102,4,('K'),16);
  543.          }
  544.          else
  545.          {
  546.           OLED_ShowNum(54,4,u32_hfe,5, 16);
  547.           OLED_ShowChinese(102,4,7,16);////顯示Ω
  548.           //OLED_ShowChar(102,4,32+95,16);//顯示Ω
  549.          }
  550. //    ultoa(u32_hfe,chrVAL,10);      //轉(zhuǎn)換一個無符號長整型數(shù)為字符串,10進制
  551. //    if(rv[1]==R_H_PER)             //470k電阻
  552. //    {
  553. //      ra = strlen(chrVAL);         //ra字符串長度,必須顯示逗號
  554. //      for (rb=0;rb<ra;rb++)
  555. //      {
  556. //        lcd_data(chrVAL[rb]);
  557. //        if(rb==(ra-2)) lcd_data('.');  //逗號
  558. //      }
  559. //      lcd_data ('k');              //如果使用470k 電阻,則顯示單位為千歐
  560. //    }
  561. //    else
  562. //    {
  563. //      lcd_string(chrVAL);
  564. //    }
  565. //    lcd_data(LCD_CHAR_OMEGA);      //顯示歐米茄符號代表歐姆
  566.     goto end;
  567.   }
  568.   else
  569.   if(PartFound == PART_CAPACITOR)  //電容
  570.   {
  571. //    lcd_eep_string(Capacitor);     //顯示Capacitor
  572.         OLED_ShowChinese(0,0,0,16);//電
  573.         OLED_ShowChinese(16,0,2,16);//容
  574.         OLED_ShowString(40,0,"Capacitor",16);
  575. //    lcd_data(ca + 49);             //顯示引腳序號
  576.         OLED_ShowChar(0,2,(ca + 49),16);
  577. //    lcd_data('-');
  578.         OLED_ShowChar(16,2,('-'),16);
  579. //    lcd_data(cb + 49);
  580.         OLED_ShowChar(32,2,(cb + 49),16);
  581. //    Line2();
  582.     tmpVAL2 = 'n';
  583. //    if(cv > 99999)                 //到達1uF則改為微法顯示:u。
  584. //    {
  585. //      cv /= 1000;
  586. //      tmpVAL2 = LCD_CHAR_U;
  587. //    }
  588.                 OLED_ShowNum(0,4,cv,9, 16);
  589.                 OLED_ShowString(108,4,"pF",16);
  590.                 OLED_ShowNum(0,6,cv/1000,6, 16);
  591.                 OLED_ShowString(48,6,"nF",16);
  592.                 OLED_ShowNum(64,6,cv/1000000,4, 16);
  593.                 OLED_ShowString(108,6,"uF",16);
  594. //    ultoa(cv, chrVAL, 10);
  595. //    tmpVAL = strlen(chrVAL);
  596. //    lcd_show_format_cap(chrVAL, tmpVAL, tmpVAL);
  597. //    lcd_data(tmpVAL2); //顯示: n或u
  598. //    lcd_data('F');
  599.                

  600.     goto end;
  601.   }
  602.   
  603.   if(NumOfDiodes == 0)             //未找到二極管
  604.   {
  605.                 OLED_ShowChinese(0,2,9,16);//
  606.                 OLED_ShowChinese(16,2,10,16);//
  607.                 OLED_ShowChinese(32,2,11,16);//
  608.                 OLED_ShowChinese(48,2,12,16);//
  609.                 OLED_ShowChinese(64,2,13,16);//
  610.                 OLED_ShowChinese(80,2,14,16);//
  611.                 OLED_ShowChinese(96,2,14,16);//
  612.                 OLED_ShowChinese(112,2,14,16);//
  613.                 OLED_ShowChinese(48,4,8,16);//
  614.                 OLED_ShowChinese(32,4,6,16);//
  615.                 OLED_ShowChinese(16,4,15,16);//
  616.   }
  617.   else
  618.   {
  619.                 OLED_ShowChinese(0,2,9,16);//
  620.                 OLED_ShowChinese(16,2,10,16);//
  621.                 OLED_ShowChinese(32,2,11,16);//
  622.                 OLED_ShowChinese(48,2,12,16);//
  623.                 OLED_ShowChinese(64,2,13,16);//
  624.                 OLED_ShowChinese(80,2,14,16);//
  625.                 OLED_ShowChinese(96,2,14,16);//
  626.                 OLED_ShowChinese(112,2,14,16);//
  627.         OLED_ShowChar(0,6,NumOfDiodes + 48,16);
  628. //    lcd_data(LCD_CHAR_DIODE);      //二極管符號
  629.         OLED_ShowChinese(16,6,8,16);//二極管符號

  630.   }

  631.   end:

  632.   while(1) //無限循環(huán)(本程序自動關(guān)機功能已省略)
  633.   {
  634.     if(RST_PIN==0)//PD7按鈕按下為低電平,跳回到起點并進行新的測試
  635.     {
  636.       goto start;
  637.     }
  638.   }
  639.   return 0;
  640. }

  641. void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TriPin)  //調(diào)用方式:CheckPins(TP1, TP2, TP3);(共6個組合)PC口
  642. {
  643.   //用于測試具有指定引腳分配的元件屬性
  644.   //HighPin:最初設(shè)置為高電平的引腳:連接到 Vcc
  645.   //LowPin: 最初設(shè)置為低電平的引腳: 通過 R_L 連接到 GND
  646.   //TriPin: 最初設(shè)置為開路的引腳  : 高阻狀態(tài)(三態(tài)腳)
  647.   //在測試的過程中,TriPin會進行循環(huán)高低電平切換。

  648.   //注:以下是否重復(fù)定義了變量???
  649.   uint16_t ADCv[6];
  650.   uint8_t  tmpVAL, tmpVAL2;
  651.   u8 i,j;
  652. //  wdt_reset();

  653.   //LowPin通過 R_L 連接到 GND         1<<8 把1向左移8位
  654.   tmpVAL  = (LowPin*2);
  655.   R_DDR   = (1<<tmpVAL);
  656. //  P2M1 = ~P2M0;
  657.   P2M1=~P2M0;
  658. //  OLED_ShowNum(0,6,P2M0,4, 16);

  659.   R_PORT  = 0;
  660. //                  while(!RX1_Cnt);  //等待輸入
  661. //             Print(0xcc);
  662. //             RX1_Cnt=0;      //復(fù)位
  663.   ADC_DDR = (1<<HighPin);
  664.   P1M1 = ~P1M0;
  665.   ADC_PORT= (1<<HighPin);  //HighPin連接在 Vcc
  666.   _delay_ms(5);

  667.   //對于某些 MOSFET,柵極(TriPin)必須先放電
  668.   //N通道:
  669.   DischargePin(TriPin,0);
  670.   //測量LowPin上的電壓,元件是否在測試座上鎖定?
  671.   ADCv[0] = ReadADC(LowPin);
  672. //  OLED_ShowNum(60,6,ADCv[0],4, 16);            
  673. //          while(!RX1_Cnt);  //等待輸入
  674. //             Print(0xdd);
  675. //             RX1_Cnt=0;      //復(fù)位
  676.   if(ADCv[0] < 20) goto next;
  677.   //否則:為 P 通道放電(柵極接正)
  678.   DischargePin(TriPin,1);
  679.   //再測量LowPin上的電壓
  680.   ADCv[0] = ReadADC(LowPin);

  681.   next:
  682.   if(ADCv[0] < 20)                 //如果元件在HighPin和LowPin 之間沒有連續(xù)性
  683.   {
  684.     tmpVAL2   = (TriPin*2);
  685.     R_DDR    |= (1<<tmpVAL2);      //三態(tài)引腳通過 R_L 接地,以測試 pnp
  686.     P2M1 = ~P2M0;
  687.         _delay_ms(2);
  688.     ADCv[0]   = ReadADC(LowPin);   //測量電壓

  689.     if(ADCv[0] > 700)
  690.     {
  691.       //元件傳導(dǎo) => pnp 三極管或類似的。
  692.       //測量兩個方向的增益
  693.       
  694.           R_DDR   = (1<<tmpVAL);       //三態(tài)引腳(基極)高阻抗
  695.       P2M1 = ~P2M0;
  696.           tmpVAL2++;
  697.       R_DDR  |= (1<<tmpVAL2);      //三態(tài)引腳(基極)通過 R_H 接地
  698.       P2M1 = ~P2M0;
  699.           _delay_ms(10);
  700.       ADCv[0] = ReadADC(LowPin);   //測量LowPin(假定為集電極)的電壓。
  701.       ADCv[2] = ReadADC(TriPin);   //測量三態(tài)引腳(基極)電壓
  702.       R_DDR   = (1<<tmpVAL);       //三態(tài)引腳(基極)高阻抗
  703.           P2M1 = ~P2M0;
  704.       //三態(tài)引腳(基極)高阻抗
  705.       //檢查測試是否已經(jīng)運行過
  706.       if((PartFound == PART_TRANSISTOR) || (PartFound == PART_FET)) PartReady = 1; //將PartReady置1(第2輪)

  707.       ADCval[PartReady] = ADCv[0];         //登記到n輪的結(jié)果
  708.       ADCuBE[PartReady] = ADCv[2];

  709.       if(ADCv[2] > 200)
  710.       {
  711.         if(PartFound != PART_THYRISTOR)    //若非雙向可控硅
  712.         {
  713.           PartFound = PART_TRANSISTOR;
  714.           PartMode  = PART_MODE_PNP;       //則為PNP 三極管(基極被“拉高”)
  715.         }
  716.       }
  717.       else
  718.       {
  719.         if(PartFound != PART_THYRISTOR)    //若非雙向可控硅
  720.         {
  721.           PartFound = PART_FET;
  722.           PartMode  = PART_MODE_P_E_MOS;   //則為P溝道 MOSFET(基極/柵極未“上拉”)
  723.         }
  724.       }

  725.       if(PartFound != PART_THYRISTOR)      //若非雙向可控硅
  726.       {
  727.         b = TriPin;
  728.         c = LowPin;
  729.         e = HighPin;
  730.       }
  731.     }

  732.     //三態(tài)腳TriPin(假定為基數(shù))到正極,以測試 npn
  733.     ADC_PORT = 0;                          //LowPin到地
  734.     tmpVAL   = (TriPin*2);
  735.     tmpVAL2  = (HighPin*2);
  736.     R_DDR    = (1<<tmpVAL) | (1<<tmpVAL2); //HighPin和三態(tài)引腳輸出
  737.     P2M1 = ~P2M0;
  738.         R_PORT   = (1<<tmpVAL) | (1<<tmpVAL2); //HighPin和三態(tài)引腳通過 R_L 到 Vcc
  739.     ADC_DDR  = (1<<LowPin);                //LowPin輸出
  740. ……………………

  741. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

Keil代碼下載:
Keil代碼.7z (66.69 KB, 下載次數(shù): 455)

作者: SURUBU1976    時間: 2022-9-14 17:10
太強大了!請問OLED是什么型號?
作者: rz12345    時間: 2022-9-14 18:45
12864屏0.96寸OLED顯示屏,4針,IIC。
作者: smartphone    時間: 2022-9-14 19:10
感謝樓主 這個可以搞一下
作者: fj51hei    時間: 2022-9-14 20:56
感謝樓主 這個可以搞一下
作者: youlinys    時間: 2022-9-14 22:41
厲害喲,值得量產(chǎn)。
作者: hp34401a    時間: 2022-9-14 22:47
非常強好!強烈支持LZ! 100個贊。! 58
作者: zjhchp    時間: 2022-9-15 06:55
非常好強! 這個可以搞一搞!
作者: SURUBU1976    時間: 2022-9-15 07:51
rz12345 發(fā)表于 2022-9-14 18:45
12864屏0.96寸OLED顯示屏,4針,IIC。

芯片型號 如 sd1330 這樣.謝謝
作者: Mengcheng    時間: 2022-9-15 08:02
挺強,可以做一做。
作者: rz12345    時間: 2022-9-15 09:00
12864屏0.96寸OLED顯示屏,4針,IIC。 sd1306,某寶搜,一大堆
作者: STC莊偉    時間: 2022-9-15 09:10
實力派。√珡姶
作者: zydl123    時間: 2022-9-15 10:05
STC8H1K16要另外買,其他型號手上有
作者: perseverance51    時間: 2022-9-15 10:22
需要注意的是通過STC-ISP燒錄時,時鐘源選擇內(nèi)部,頻率為8MHz,設(shè)置其他頻率燒錄后,屏幕只會在啟動的時候顯示閃爍一下就會一直黑屏,需要設(shè)置為8MHz才能正常顯示。
作者: zydl123    時間: 2022-9-15 11:15
無Makefile文件?
作者: perseverance51    時間: 2022-9-15 11:30
perseverance51 發(fā)表于 2022-9-15 10:22
需要注意的是通過STC-ISP燒錄時,時鐘源選擇內(nèi)部,頻率為8MHz,設(shè)置其他頻率燒錄后,屏幕只會在啟動的時候 ...

根據(jù)程序附上原理圖 ,經(jīng)測試,很難測準確。
作者: SURUBU1976    時間: 2022-9-15 11:53
樓主發(fā)上來的與樓主的圖有區(qū)別  有個警告的,可能有兩個板本
作者: rz12345    時間: 2022-9-15 16:08
我用的是11.0592M,沒問題的,不能上8M,以前我遇到過,是個別OLED體質(zhì)問題。構(gòu)思了很久,充分利用STC的管腳功能,才把電路結(jié)構(gòu)做到這么簡單,難道都沒發(fā)現(xiàn),我只用了3根線
作者: 騰飛的龍    時間: 2022-9-15 16:37
樓主您好 板子和程序引腳不對應(yīng)啊。你得OLED焊的不對應(yīng) 再就是按鍵程序是P0.1
作者: SURUBU1976    時間: 2022-9-15 16:43
樓主大神,移植成功.給我們上上課說說原理
作者: smartphone    時間: 2022-9-15 17:16
樓主大神 手頭沒有STC8H單片機,目前這個情況又發(fā)不了貨,可以用STC8A8K64S4A12嗎?
作者: cooleaf    時間: 2022-9-15 17:20
這個非常強大呀! 可以開模搞一套件啦!!
作者: zxq9781    時間: 2022-9-15 21:35
多謝開源分享, 能在加個電感測量嗎
作者: STC莊偉    時間: 2022-9-16 08:38
大神 幫把這個晶體管測量儀器,移植到 STC-屠龍刀-STC32G12K128核心功能實驗板,
作者: STC莊偉    時間: 2022-9-16 09:48
大神辛苦了,幫用  屠龍刀三-STC32G12K128核心功能實驗板去改 或 開天斧三-STC8H8K64U核心功能實驗板去改 !   STC將提供贊助
作者: 1206375049    時間: 2022-9-16 10:22
感謝大神開源分享, 可以加個電感測量嗎?
作者: rz12345    時間: 2022-9-16 10:41
電路圖的按鍵畫跳位了,不過實物照片是對的


作者: Mengcheng    時間: 2022-9-16 10:51
可以試試這個項目
作者: 黑色蒲公英    時間: 2022-9-16 16:13
rz12345 發(fā)表于 2022-9-16 10:41
電路圖的按鍵畫跳位了,不過實物照片是對的

我換用STC8H8K64U,發(fā)現(xiàn)測不測都一樣,都是顯示毛瑟管
作者: SURUBU1976    時間: 2022-9-16 16:54
rz12345 發(fā)表于 2022-9-15 09:00
12864屏0.96寸OLED顯示屏,4針,IIC。 sd1306,某寶搜,一大堆

謝謝樓主大伽
作者: duyes    時間: 2022-9-16 17:58
這個簡單是簡單,但是準不準啊?
作者: wkman    時間: 2022-9-17 10:13
perseverance51 發(fā)表于 2022-9-15 11:30
根據(jù)程序附上原理圖,經(jīng)測試,很難測準確。

測 三極管、MosFet 之類的準確性,沒多大意義。。。重要的  LCR測試功能就太強大了,

眾所周知,小容量(體積)的C、L都是沒有標簽的,一旦拆封貼上,很難分析參數(shù),有這個小玩意真好玩!
作者: smartphone    時間: 2022-9-17 12:18
wkman 發(fā)表于 2022-9-17 10:13
測 三極管、MosFet 之類的準確性,沒多大意義。。。重要的  LCR測試功能就太強大了,

眾所周知 ...

網(wǎng)上有開源的電橋鑷子
作者: heizj    時間: 2022-9-18 12:38
正好在找這方面資料 ,謝謝分享了
作者: smartphone    時間: 2022-9-24 12:37
也準備學一個

51hei截圖20220924123403.png (44.3 KB, 下載次數(shù): 185)

51hei截圖20220924123403.png

作者: lifjt    時間: 2022-9-25 00:19
感謝開源,福利大家。
作者: WFX777888    時間: 2022-9-25 05:56
感謝開源,福利大家
作者: Dxiaofeng    時間: 2022-9-25 19:13
這是利用p2口的pwm功能嗎
作者: lifjt    時間: 2022-9-25 19:32
請問一下樓主,這個供電是用3.3V嗎?
作者: lifjt    時間: 2022-9-25 21:41
這樣單鋰電經(jīng)過LDO到3.3V供單片機能正常工作嗎?



作者: raymondau    時間: 2022-9-26 00:04
樓主如果弄個7567或7565之類驅(qū)動的12864屏,成本能更低點,做到白菜價

作者: rz12345    時間: 2022-9-26 09:05
STC用3.3v沒問題,大概理解了一下這個電路和程序,測量與電壓基本沒關(guān)系,用3.3也行。不過測試時用5V,比3.3V要好一點。
作者: lifjt    時間: 2022-9-26 10:39
rz12345 發(fā)表于 2022-9-26 09:05
STC用3.3v沒問題,大概理解了一下這個電路和程序,測量與電壓基本沒關(guān)系,用3.3也行。不過測試時用5V,比3. ...

謝謝樓主回復(fù),那就不用升壓了,免得干擾。我也看了一下它用的內(nèi)部帶隙基準1.19V,應(yīng)該是問題不大,拿不太準,所以問問大神。
作者: smartphone    時間: 2022-9-26 23:18
這是什么問題呢?一直只顯示這樣。

IMG20220926231652.jpg (3.88 MB, 下載次數(shù): 676)

IMG20220926231652.jpg

作者: rz12345    時間: 2022-9-27 10:01
這是什么問題呢?一直只顯示這樣。


按照圖接線很簡單,三根線,一根跳線,附件里面有HEX文件,直接下載一下,看看可以不
作者: 1006ab1006    時間: 2022-9-30 15:40
請問樓主怎么校準電容改程序里面參數(shù),仿了一個,我用的是470k680歐,到程序把你對應(yīng)電阻那一行引用了,把510K那一行注釋掉,但是測電容完全不準,測電阻到是很準,220uf測到幾千uf了
作者: rz12345    時間: 2022-10-1 08:16
程序開頭有電容測量的系數(shù),可以調(diào)整的。
作者: 黑色蒲公英    時間: 2022-10-2 14:44
rz12345 發(fā)表于 2022-10-1 08:16
程序開頭有電容測量的系數(shù),可以調(diào)整的。

改到STC8H8K64U是不是很麻煩?我改不了
作者: rz12345    時間: 2022-10-2 18:24
很簡單的
  1. //電容器的電容計算系數(shù):取決于 AVR 的制造公差,在必要時進行調(diào)整
  2. //總測量范圍約為 0.2nF 至 1000uF。
  3. //#define Hr_LowCAPACITY_FACTOR  94               //使用 470k 高電阻測量(小電容)系數(shù)
  4. #define Hr_LowCAPACITY_FACTOR  21
  5. //#define Lr_HighCAPACITY_FACTOR 283              //使用 680  低電阻測量(高電容)系數(shù)
  6. #define Lr_HighCAPACITY_FACTOR 18
復(fù)制代碼

作者: ecjd    時間: 2022-10-4 23:37
好貼,值得收藏哈!
作者: steven66    時間: 2022-10-5 09:26

建議改一下測電容的顯示程序,  只顯示 pF nF 或 uF 感覺好點.
作者: smartphone    時間: 2022-10-5 18:59
steven66 發(fā)表于 2022-10-5 09:26
建議改一下測電容的顯示程序,  只顯示 pF nF 或 uF 感覺好點.

這有同感
作者: smartphone    時間: 2022-10-24 08:17
樓主 請問測試按鍵腳pcb畫在了P0.0口,能有辦法解決嗎?在主程序里面改到P0.0就閃屏..
作者: smartphone    時間: 2022-10-26 16:53
為啥除二極管和mos管之外都是顯示成電容呢?
作者: rz12345    時間: 2022-10-27 15:10
改到P0.0后閃,估計是管腳上拉電阻沒有設(shè)置
作者: smartphone    時間: 2022-10-30 11:06
rz12345 發(fā)表于 2022-10-27 15:10
改到P0.0后閃,估計是管腳上拉電阻沒有設(shè)置

怎么不能測量電阻了呢
作者: 9527001    時間: 2022-10-30 11:42
求教,我MCU用的STC8H3k64S2,固件就是作者原版的,測量結(jié)束就顯示這個界面,

IMG_20221029_175320.jpg (452.54 KB, 下載次數(shù): 677)

IMG_20221029_175320.jpg

作者: smartphone    時間: 2022-10-30 22:10
9527001 發(fā)表于 2022-10-30 11:42
求教,我MCU用的STC8H3k64S2,固件就是作者原版的,測量結(jié)束就顯示這個界面,

未識別的器件吧,我測試只能測量二極管和mos管,而且mos管管腳還是隨機確定的,其它都顯示電容,而且容量離譜,咱也不會搞固件,只能暫時放棄,還是用M644那個。不過這個確實簡單便宜。
作者: 小白艾世雄    時間: 2022-11-4 09:37
感謝樓主分享!最近關(guān)注數(shù)字電源,看帖回帖賺金子。
作者: mingzhenri    時間: 2022-12-2 05:33
太強大了,也想做一個
作者: mingzhenri    時間: 2022-12-2 05:41
這個可以做一個,樓主強大!
作者: rkf6666    時間: 2022-12-5 21:54
也想做一個
作者: ylzzx0    時間: 2022-12-15 07:35
非常感謝共享
作者: wjq1n    時間: 2022-12-26 16:53
9527001 發(fā)表于 2022-10-30 11:42
求教,我MCU用的STC8H3k64S2,固件就是作者原版的,測量結(jié)束就顯示這個界面,

還會提問了
作者: skyrusher    時間: 2023-1-3 21:04
用更少腳數(shù)的貌似也可以?
作者: 大漠游民    時間: 2023-1-6 11:10

非常感謝共享。!
作者: zm_l0840    時間: 2023-1-15 10:49
謝謝樓主,真實有效,要是加一個電感檢測會更強大啦

4fcdd71805f71c9105f30d70b65ad1a.jpg (168.36 KB, 下載次數(shù): 675)

4fcdd71805f71c9105f30d70b65ad1a.jpg

2478e3d0e9173ca75abb1d0f8778d27.jpg (162.37 KB, 下載次數(shù): 684)

2478e3d0e9173ca75abb1d0f8778d27.jpg

作者: mansiontiger    時間: 2023-1-15 23:07
實力派!太強大
作者: shpshcn    時間: 2023-2-26 15:51
請教,STC8H1K16怎樣燒錄程序,我用與燒STC12C5A60S2一樣,但不成功?
作者: shpshcn    時間: 2023-2-26 15:54
請教:燒錄STC8H1K16與STC12C5A60S2一樣嗎?我怎么沒成功。
作者: wturbot    時間: 2023-2-26 18:31
看起來,這個好玩
作者: shpshcn    時間: 2023-3-8 17:27
shpshcn 發(fā)表于 2023-2-26 15:51
請教,STC8H1K16怎樣燒錄程序,我用與燒STC12C5A60S2一樣,但不成功?

已燒錄成功。
作者: shpshcn    時間: 2023-3-8 17:27
shpshcn 發(fā)表于 2023-2-26 15:54
請教:燒錄STC8H1K16與STC12C5A60S2一樣嗎?我怎么沒成功。

已燒錄成功。
作者: zm_l0840    時間: 2023-3-10 15:04
建議電阻用680歐和470K的,三個阻值盡可能一樣。還有判斷電容時不要添加電阻(下圖)
作者: zm_l0840    時間: 2023-3-10 15:07

作者: shpshcn    時間: 2023-3-11 11:28
shpshcn 發(fā)表于 2023-2-26 15:54
請教:燒錄STC8H1K16與STC12C5A60S2一樣嗎?我怎么沒成功。

改造下載線后已成功。
作者: WFX777888    時間: 2023-3-22 16:14
感謝樓主 這個可以搞一下
作者: zm_l0840    時間: 2023-5-31 14:15
這個設(shè)備立了大功。兩天沒有修好的自激電源,原來是hFE=1!

89059d88cb582a5ddfa3ea5c3547c86.jpg (229.74 KB, 下載次數(shù): 638)

89059d88cb582a5ddfa3ea5c3547c86.jpg

作者: dzj4321    時間: 2023-5-31 16:30
神器啊!發(fā)現(xiàn)晚了!
作者: bscx    時間: 2023-10-20 09:35
有沒有可以測試51單片機其串口、SPI接口、EEPROM進行周期性測試(1分鐘1次),并采集記錄51單片機開發(fā)板的電壓和電流(可擴展溫度、濕度采集),存儲在此款測試儀上,要求測試儀至少可以存儲1周的測試數(shù)據(jù)(有時間戳,年月日時分),測試儀具備上電自檢功能(主要判斷自身是否正常工作,如測試存儲模塊是否正常等)。
作者: bscx    時間: 2023-10-20 09:36
這個可以測51單片機的串口、SPI連接口之類的嘛?

作者: zh68a11    時間: 2023-10-30 22:07
支持國產(chǎn)芯片,謝謝樓主。
作者: 一寸木頭    時間: 2024-3-18 15:03
lifjt 發(fā)表于 2022-9-25 21:41
這樣單鋰電經(jīng)過LDO到3.3V供單片機能正常工作嗎?

哥,你的PCB畫的太好看了可以分享一下嗎

作者: 一寸木頭    時間: 2024-3-18 15:27
zm_l0840 發(fā)表于 2023-3-10 15:04
建議電阻用680歐和470K的,三個阻值盡可能一樣。還有判斷電容時不要添加電阻(下圖)

為什么

作者: shoppingx    時間: 2024-3-28 17:17
這個用來對照原程序看省事很多。
簡化版的問題是把測電容內(nèi)阻和測電感的部分都去掉了,
感覺可以再簡化下,只留下兩個腳測電容和電阻,
但要加一個預(yù)先測電容兩端電壓的功能,會比原版實用。
作者: shoppingx    時間: 2024-4-4 18:20
shoppingx 發(fā)表于 2024-3-28 17:17
這個用來對照原程序看省事很多。
簡化版的問題是把測電容內(nèi)阻和測電感的部分都去掉了,
感覺可以再簡化下 ...

做了一個試了試。

一開始沒給3.3v降壓芯片接濾波電容,連電腦USB供電時會出現(xiàn)每次測量結(jié)果無法重復(fù)的現(xiàn)象:測1k歐電阻有時顯示為40uf電容,有時顯示為二極管,有時找不到器件。
換充電寶供電后測電阻電容均可重復(fù)。接了0.1uf和10uf濾波電容后用電腦USB供電也沒問題了。
不知道和其他回帖的類似現(xiàn)象是否同一原因造成。

用了680歐和470k歐的貼片電阻,在程序里相應(yīng)改了R_L_VAL和R_H_VAL值,測電阻誤差很。ê蛿(shù)字萬用表相對照)。把Hr_LowCAPACITY_FACTOR 和Lr_HighCAPACITY_FACTOR均改為4后測電容誤差減小到可接受(20pF測得30pF,10uF測得10.5uF,680uF測得740uF)。

沒測其他器件,這樣用來做備用表也夠了。
作者: shoppingx    時間: 2024-4-6 20:47
shoppingx 發(fā)表于 2024-4-4 18:20
做了一個試了試。

一開始沒給3.3v降壓芯片接濾波電容,連電腦USB供電時會出現(xiàn)每次測量結(jié)果無法重復(fù)的 ...

試圖加上測電容內(nèi)阻ESR和測電感的部分,
發(fā)現(xiàn)這里的程序可能是從ttester 0.99版或更早版本改寫而來,
1.00版有了測電感的子函數(shù),1.01版有了測ESR的子函數(shù),1.07版有了測電容高頻損耗的子函數(shù)
1.10版一下子多了蠻多其他子函數(shù)。。。
市面上的T4表似乎是1.07版或之后的。
參照1.07版把測電感和測電容內(nèi)阻的部分加上去似乎也不會把固件變大多少,
可能STC8h1k16還夠用。
作者: xjlfh    時間: 2024-5-2 19:12
shoppingx 發(fā)表于 2024-4-4 18:20
做了一個試了試。

一開始沒給3.3v降壓芯片接濾波電容,連電腦USB供電時會出現(xiàn)每次測量結(jié)果無法重復(fù)的 ...

我也下載了一個仿制成功,但不知咋回事我想把里面的電阻換為680歐和470K,焊接完成后打開程序想修改一下程序重新編譯,卻發(fā)現(xiàn)編譯不過去,彈出下面這個截圖畫面,用原程序試編譯也是一直發(fā)現(xiàn)Hex文件一直是下載下來的那個沒有任何變化,不知道你的事咋樣搞定的,能幫我看一下嗎?我用的是STC8H1K16,和樓主一樣也是采用在轉(zhuǎn)接板上搞的,目前用的是510歐,沒有510K電阻用了2只1M的并聯(lián)的,測試三極管二極管可控硅都可以顯示管腳和類型,測電解電容數(shù)值比實際值大一倍左右,電阻沒有測試過。


作者: zh68a11    時間: 2025-2-1 12:47
支持國產(chǎn)芯片,謝謝樓主。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1