|
根據(jù)網(wǎng)友提供的:《德國開源項目:A_TransistorTester晶體管測試儀的中文注釋C源碼》經(jīng)過幾個星期天的努力,改為STC芯片,對電路進行了簡化,經(jīng)簡單測試效果良好,精度未仔細(xì)調(diào)整,現(xiàn)公布改造和移植原碼,大家一起制造白菜價測試儀。
超簡單電路,看程序和圖片即可正確連接電路。單片機型號: STC8H1K16
制作出來的實物圖如下:
51hei圖片20220914103614.jpg (858.44 KB, 下載次數(shù): 91)
下載附件
2022-9-14 10:45 上傳
51hei圖片20220914103623.jpg (1.66 MB, 下載次數(shù): 84)
下載附件
2022-9-14 10:45 上傳
51hei圖片20220914103630.jpg (1.8 MB, 下載次數(shù): 77)
下載附件
2022-9-14 10:46 上傳
51hei圖片20220914103650.jpg (1.52 MB, 下載次數(shù): 77)
下載附件
2022-9-14 10:46 上傳
51hei圖片20220914103655.jpg (1.82 MB, 下載次數(shù): 82)
下載附件
2022-9-14 10:46 上傳
51hei圖片20220914103542.jpg (1.78 MB, 下載次數(shù): 89)
下載附件
2022-9-14 10:47 上傳
51hei圖片20220914103637.jpg (1.67 MB, 下載次數(shù): 80)
下載附件
2022-9-14 10:47 上傳
51hei圖片20220914103643.jpg (1.67 MB, 下載次數(shù): 82)
下載附件
2022-9-14 10:47 上傳
51hei圖片20220914103702.jpg (1.7 MB, 下載次數(shù): 79)
下載附件
2022-9-14 10:47 上傳
51hei圖片20220914103709.jpg (1.79 MB, 下載次數(shù): 86)
下載附件
2022-9-14 10:48 上傳
51hei圖片20220914103721.jpg (990.69 KB, 下載次數(shù): 87)
下載附件
2022-9-14 10:49 上傳
電路圖.jpg (54.93 KB, 下載次數(shù): 88)
下載附件
2022-9-14 10:44 上傳
51hei圖片20220914103715.jpg (1.94 MB, 下載次數(shù): 75)
下載附件
2022-9-14 10:41 上傳
單片機源程序如下:- //neu2010.01.02版Mega8基礎(chǔ)版(起源于約2009年。需配合Markus F.電路圖,
- //中文注釋翻譯:itkw: autopccopy @ guangzhou 2022.04.22 AVR單片機價格昂貴,強烈建議移植到STC單片機)
- //程序移植:rz123456,非常喜歡STC,功能強大、使用方便、價格便宜。
- //刪除了一部分不需要的,原程序中AVR的硬件程序。OLED程序為廠家提供。
- //本AVR例程不支持小容量芯片,需Mega8或Mega328起。使用WinAVR-20100110 編譯, PROGISP 1.72+USBIAP工具下載
- #include <STC8G.h>
- #include <stdlib.h>
- #include <string.h>
- #include "oled.h"
- #include <math.h>
- #define uint8_t unsigned char
- #define uint16_t unsigned int
- #define uint32_t unsigned long int
- #define int16_t signed int
- //三組測試電阻的阻值:R_L為680歐,R_H為470K
- //如要修改,請輸入以歐姆為單位的電阻值定義(特別注意:此三組電阻須配對為阻值相近,否則誤差較大)
- //#define R_L_VAL 680 //R_L; 標(biāo)準(zhǔn)值 680歐
- //#define R_H_VAL 470000UL //R_H; 標(biāo)準(zhǔn)值 470K
- #define R_L_VAL 510 //510歐
- #define R_H_VAL 510000UL //510K
- //在程序中計算必要的電阻值
- #define RH_RL_RATIO (R_H_VAL/R_L_VAL)//高低電阻比
- #define R_H_PER (R_H_VAL/100) //高電阻/100的值
- //注意:N和P溝道增強型E-MOSFET柵極電容計算系數(shù):取決于AVR的制造公差,在必要時進行調(diào)整
- //(注:其他改進型有插入基準(zhǔn)元件進行自動校準(zhǔn)功能)
- //#define N_GATE_CAPACITY_FACTOR 387 //N溝道系數(shù)
- //#define P_GATE_CAPACITY_FACTOR 142 //P溝道系數(shù)
- #define N_GATE_CAPACITY_FACTOR 18 //N溝道系數(shù)
- #define P_GATE_CAPACITY_FACTOR 18
- //電容器的電容計算系數(shù):取決于 AVR 的制造公差,在必要時進行調(diào)整
- //總測量范圍約為 0.2nF 至 1000uF。
- //#define Hr_LowCAPACITY_FACTOR 94 //使用 470k 高電阻測量(小電容)系數(shù)
- #define Hr_LowCAPACITY_FACTOR 21
- //#define Lr_HighCAPACITY_FACTOR 283 //使用 680 低電阻測量(高電容)系數(shù)
- #define Lr_HighCAPACITY_FACTOR 18
- void ADC_Init();
- void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TriPin);
- void ReadCapacity(uint8_t HighPin, uint8_t LowPin);
- void DischargePin(uint8_t PinToDischarge, uint8_t DischargeDirection);
- uint16_t ReadADC(u8 addr); //ADC讀取
- void GetGateThresholdVoltage(void); //取柵極開啟閾值電壓
- void _delay_ms(unsigned int ms);
- //端口C: PC0-PC2為測試腳TP1-TP3為,同時PB0-PB5分別連接680、470K三組測試電阻
- //請不要更改 TP1、TP2和TP3 的定義!
- //端口B: PB0-PB5分別連接680、470K連續(xù)三組測試電阻
- //#define R_DDR DDRB //數(shù)據(jù)方向寄存器, 1:輸出/0:輸入
- //#define R_PORT PORTB //6個測試電阻接PORTB,1:上拉電阻使能
- //
- ////以下注釋為方便理解本程序:
- ////DDRxn控制引腳方向:當(dāng)DDRxn為1時,Pxn為輸出;當(dāng)DDRxn為0時,Pxn為輸入。
- ////PORTxn在PCn為輸入時,1為上拉電阻至VCC;否則引腳懸空。PCn為輸出時,1為輸出高電平;否則輸出低電平。
- ////PINxn的值為Pxn引腳的電平。不論如何配置DDxn,都可以通過讀取PINxn來獲得引腳電平。如果給PINxn寫入1,PORTxn的值會翻轉(zhuǎn)。
- //
- //#define ADC_DDR DDRC //數(shù)據(jù)方向寄存器: 1:輸出/0:輸入
- //#define ADC_PORT PORTC //數(shù)據(jù)寄存器 : 1: 輸入:上拉電阻使能 或 輸出:高電平
- //#define ADC_PIN PINC //引腳寄存器 : 輸出時引腳的實際值
- //#define TP1 PC0 //0
- //#define TP2 PC1 //1
- //#define TP3 PC2 //2
- #define R_DDR P2M0 // 這個還要加 P2M1= ~P2M0;
- #define R_PORT P2
- #define ADC_DDR P1M0 //這個 入=0 出=1 還要加P1M1 = ~P1M0; //設(shè)置 P1.0~P1.7 為雙向口模式
- #define ADC_PORT P1 //設(shè)置
- #define ADC_PIN P1
- u8 TP1=0;
- u8 TP2=1;
- u8 TP3=2;
-
- sbit RST_PIN=P0^1; //測試按鈕,按下為低電平
- //元件屬性碼(與返回碼PartFound匹配)
- #define PART_NONE 0 //無或故障
- #define PART_DIODE 1 //二極管
- #define PART_TRANSISTOR 2 //三極管
- #define PART_FET 3 //FET
- #define PART_TRIAC 4 //單向可控硅
- #define PART_THYRISTOR 5 //雙向可控硅
- #define PART_RESISTOR 6 //電阻
- #define PART_CAPACITOR 7 //電容
- //三極管子類型碼
- #define PART_MODE_NPN 1 //NPN三極管
- #define PART_MODE_PNP 2 //PNP三極管
- //場效應(yīng)管子類型碼(與PartMode返回碼匹配。大屬性碼PartFound為PART_FET: 3)
- #define PART_MODE_N_E_MOS 1 //N溝道增強型E-MOSFET
- #define PART_MODE_P_E_MOS 2 //P溝道增強型E-MOSFET
- #define PART_MODE_N_D_MOS 3 //N溝道耗盡型D-MOSFET
- #define PART_MODE_P_D_MOS 4 //P溝道耗盡型D-MOSFET
- #define PART_MODE_N_JFET 5 //N溝道JFET
- #define PART_MODE_P_JFET 6 //P溝道JFET
- //二極管結(jié)構(gòu)體
- struct Diode //聲明有3個成員的結(jié)構(gòu)體,標(biāo)簽被命名為Diode(結(jié)構(gòu)體將不同的數(shù)據(jù)類型整合為一個有機整體,方便數(shù)據(jù)管理,增加代碼的可讀性)
- {
- uint8_t Anode; //陽極引腳序號
- uint8_t Cathode; //陰極
- int16_t Voltage; //二極管導(dǎo)通電壓降
- };
- struct Diode diodes[6]; //用Diode標(biāo)簽的結(jié)構(gòu)體,另外聲明了變量diodes數(shù)組
- uint8_t NumOfDiodes; //存在的二極管個數(shù)
- uint8_t b,c,e; //b,c,e引腳序號,配合顯示引腳號(取值0-2)
- //三極管的測量
- uint8_t PartReady; //測量的輪次數(shù)
- uint8_t PartFound, tmpPartFound; //返回的元件屬性碼
- uint8_t PartMode; //返回的元件子類型碼
- uint32_t u32_hfe; //u32值,用于直流放大系數(shù)、電阻值等
- uint16_t ADCval[2]; //ADC測量值
- uint16_t ADCuBE[2]; //ADC測量: 基極-發(fā)射極BE
- //電阻和電容測量
- uint8_t ra, rb; //電阻引腳序號,配合顯示引腳號(取值0-2)
- uint16_t rv[2]; //電阻兩端的電壓降
- uint16_t rADCmax[2]; //可實現(xiàn)的最大ADC值(小于1023,因為測量電阻時LowPin上的電壓高于零)
- uint8_t ca, cb; //電容引腳序號,配合顯示引腳號(取值0-2)
- uint32_t cv; //電容容量值
- uint8_t tmpVAL, tmpVAL2; //2個通用u8臨時變量
- uint16_t ADCv[4]; //ADC的測量值
- char chrVAL[8]; //字符串1
- char chrVAL2[6]; //字符串2
- uint32_t chrVAL2_cv;
- uint32_t chrVAL_cv;
- uint8_t itkw_tmp1; //僅用于對調(diào)引腳序號的臨時變量
- //============================主程序開始============================
- int main(void)
- {
- P0M0 = 0x08; //設(shè)置 P0.0~P0.7 為雙向口模式
- P0M1 = 0x00;
- P3M0 = 0xC0; //設(shè)置 P3.0~P3.7 為雙向口模式 C0=P3.6/7輸出oled電源
- P3M1 = 0x00;
- P0PU = 0x02; //上拉電阻P0.1
- P0=0X02; //測試按鈕
- P3=0X40; //P3.5 OLED+電源
-
- OLED_Init();//初始化OLED
- OLED_ColorTurn(0);//0正常顯示,1 反色顯示
- OLED_DisplayTurn(1);//0正常顯示 1 屏幕翻轉(zhuǎn)顯示
- ADC_Init();
- //EA = 1; //允許全局中斷
- //運行期間再次按下啟動按鈕時的入口點,復(fù)位變量后開始
- start:
- // wdt_enable(WDTO_2S); //看門狗開啟
- PartFound = PART_NONE; //返回屬性碼為0
- tmpPartFound = PART_NONE; //返回屬性碼為0
- NumOfDiodes = 0; //二極管數(shù)量
- PartReady = 0; //測量的輪次數(shù)
- PartMode = 0; //返回子類型碼
- ca = 0; //電容引腳序號a
- cb = 0; //電容引腳序舃
- // lcd_clear(); //清屏
- OLED_Clear();
- //開始測試
- // lcd_eep_string(Testrunning); //顯示:Testrunning..
- OLED_ShowString(0,0,"Testrunning...",16);
- OLED_ShowChinese(0,2,3,16);//測試中
- OLED_ShowChinese(16,2,4,16);//
- OLED_ShowChinese(32,2,5,16);//
- OLED_ShowString(48,2,"......",16);
- //測量3個引腳的所有6種組合
- CheckPins(TP1, TP2, TP3); //PC0,PC1,PC2
- CheckPins(TP1, TP3, TP2);
- CheckPins(TP2, TP1, TP3);
- CheckPins(TP2, TP3, TP1);
- CheckPins(TP3, TP1, TP2);
- CheckPins(TP3, TP2, TP1);
- //若屬性碼為空或電阻或二極管,則再單獨測量電容器(需先放電,否則可能無法測量)
- if((PartFound == PART_NONE) || (PartFound == PART_RESISTOR) || (PartFound == PART_DIODE))
- {
- R_PORT = 0;
- R_DDR = (1<<(TP1*2)) | (1<<(TP2*2)) | (1<<(TP3*2)); //電阻引腳R_H為輸出模式接地
- P2M1 = ~P2M0;
- _delay_ms(50);
- R_DDR = 0; //電阻引腳為輸入模式
- P2M1 = ~P2M0;
- //測量所有6個引腳組合中的電容器
- ReadCapacity(TP1, TP2);
- ReadCapacity(TP1, TP3);
- ReadCapacity(TP2, TP1);
- ReadCapacity(TP2, TP3);
- ReadCapacity(TP3, TP1);
- ReadCapacity(TP3, TP2);
- }
-
- GetGateThresholdVoltage(); //取柵極開啟閾值電壓
- // lcd_clear();
- OLED_Clear();
- //測量完成,現(xiàn)在評估如下
-
- if(PartFound == PART_DIODE)//***二極管
- {
- if(NumOfDiodes == 1)
- {
- //標(biāo)準(zhǔn)二極管
- // lcd_eep_string(Diode);
- OLED_ShowChinese(0,0,16,16);//
- OLED_ShowChinese(16,0,18,16);//
- OLED_ShowChinese(32,0,19,16);//
- OLED_ShowString(50,0,"Diode",16);
- // lcd_eep_string(AK); //"A,K="
- OLED_ShowString(0,2,"A,K=",16);
- //lcd_data(diodes[0].Anode + 49);
- OLED_ShowChar(40,2,(diodes[0].Anode + 49),16);
- OLED_ShowChinese(48,2,8,16);//二極管
- //lcd_data(diodes[0].Cathode + 49);
- OLED_ShowChar(64,2,(diodes[0].Cathode + 49),16);
- // Line2();
- //lcd_eep_string(Uf); //“Uf =”
- OLED_ShowString(0,4,"Uf =",16);
- //lcd_string(itoa(diodes[0].Voltage, chrVAL, 10)); //顯示二極管導(dǎo)通電壓降
- OLED_ShowNum(40,4,(diodes[0].Voltage),4, 16);
- //lcd_eep_string(mV);
- OLED_ShowString(72,4,"mV",16);
- goto end;
- }
- else if(NumOfDiodes == 2)
- {
- //雙二極管
- if(diodes[0].Anode == diodes[1].Anode)
- {
- //lcd_eep_string(DualDiode); //共陽極雙二極管
- OLED_ShowChinese(0,0,20,16);//
-
- OLED_ShowChinese(16,0,16,16);//
- OLED_ShowChinese(32,0,18,16);//
- OLED_ShowChinese(48,0,19,16);//
- //OLED_ShowString(0,0,"DualDiode",16);
- //lcd_string("CA");
- OLED_ShowString(72,0,"CA",16);
- //Line2();
- //lcd_eep_string(AK1K2);//陽極,陰極1,陰極2=
- OLED_ShowString(0,2,"AK1K2",16);
- //lcd_data(diodes[0].Anode + 49);
- OLED_ShowChar(88,2,(diodes[0].Anode + 49),16);
- //lcd_data(diodes[0].Cathode + 49);
- OLED_ShowChar(98,2,(diodes[0].Cathode + 49),16);
- //lcd_data(diodes[1].Cathode + 49);
- OLED_ShowChar(108,2,(diodes[1].Cathode + 49),16);
-
- OLED_ShowChar(40,4,(diodes[0].Anode + 49),16);
- OLED_ShowChinese(48,4,8,16);//二極管
- OLED_ShowChar(64,4,(diodes[0].Cathode + 49),16);
- OLED_ShowChar(40,6,(diodes[0].Anode + 49),16);
- OLED_ShowChinese(48,6,8,16);//二極管
- OLED_ShowChar(64,6,(diodes[1].Cathode + 49),16);
- goto end;
- }
- else if(diodes[0].Cathode == diodes[1].Cathode)
- {
- //lcd_eep_string(DualDiode); //共陰極雙二極管
- OLED_ShowChinese(0,0,20,16);//
-
- OLED_ShowChinese(16,0,16,16);//
- OLED_ShowChinese(32,0,18,16);//
- OLED_ShowChinese(48,0,19,16);//
- //lcd_string("CC");
- OLED_ShowString(72,0,"CC",16);
- //Line2();
- //lcd_string("K,A1,A2=");
- OLED_ShowString(0,2,"K,A1,A2=",16);
- //lcd_data(diodes[0].Cathode + 49);
- OLED_ShowChar(88,2,(diodes[0].Cathode + 49),16);
- //lcd_data(diodes[0].Anode + 49);
- OLED_ShowChar(98,2,(diodes[0].Anode + 49),16);
- //lcd_data(diodes[1].Anode + 49);
- OLED_ShowChar(108,2,(diodes[1].Anode + 49),16);
- goto end;
- }
- else if ((diodes[0].Cathode == diodes[1].Anode) && (diodes[1].Cathode == diodes[0].Anode))
- {
- //lcd_eep_string(TwoDiodes); //反向并聯(lián)2個二極管。(注:此處原程序沒有顯示引腳序號)
- OLED_ShowString(0,0,"TwoDiodes",16);
- //Line2();
- //lcd_eep_string(Antiparallel);
- OLED_ShowString(0,2,"Antiparallel",16);
-
- OLED_ShowChar(0,4,'2',16);
- OLED_ShowChinese(8,4,10,16);// 2個二極管
- OLED_ShowChinese(26,4,16,16);//
- OLED_ShowChinese(42,4,18,16);//
- OLED_ShowChinese(58,4,19,16);//
- goto end;
- }
- }
- else if(NumOfDiodes == 3) //2個二極管串聯(lián);將被認(rèn)為是3個二極管
- {
- b = 3;
- c = 3;
- //為此,必須有2個陰極和2個陽極匹配。
- //這是因為這些二極管被認(rèn)為是2個獨立的二極管,并且也被認(rèn)為是一個“大”二極管。
- if((diodes[0].Anode == diodes[1].Anode) || (diodes[0].Anode == diodes[2].Anode)) b = diodes[0].Anode;
- if(diodes[1].Anode == diodes[2].Anode) b = diodes[1].Anode;
- if((diodes[0].Cathode == diodes[1].Cathode) || (diodes[0].Cathode == diodes[2].Cathode)) c = diodes[0].Cathode;
- if(diodes[1].Cathode == diodes[2].Cathode) c = diodes[1].Cathode;
- if((b<3) && (c<3))
- {
- //lcd_eep_string(TwoDiodes); //2個串聯(lián)二極管
- OLED_ShowString(0,0,"TwoDiodes",16);
- //Line2();
- //lcd_eep_string(sAK); //串聯(lián)陽極及陰極=
- OLED_ShowString(0,2,"sAK",16);
- //lcd_data(b + 49);
- OLED_ShowChar(30,2,(b + 49),16);
- //lcd_data(c + 49);
- OLED_ShowChar(40,2,(c + 49),16);
-
- OLED_ShowChar(0,4,'2',16);
- OLED_ShowChinese(8,4,10,16);// 2個二極管
- OLED_ShowChinese(26,4,16,16);//
- OLED_ShowChinese(42,4,18,16);//
- OLED_ShowChinese(58,4,19,16);//
- goto end;
- }
- }
- }
- else if (PartFound == PART_TRANSISTOR) //***三極管
- {
- if(PartReady == 0) //如果未進行過第二次測試(例如在帶有保護二極管的三極管的情況下)
- {
- ADCval[1] = ADCval[0];
- ADCuBE[1] = ADCuBE[0];
- }
-
- if((ADCval[0]>ADCval[1])) //如果在第一次測試期間放大系數(shù)較高,則更新數(shù)據(jù),并對調(diào)c和e極。
- {
- ADCval[1] = ADCval[0];
- ADCuBE[1] = ADCuBE[0];
- itkw_tmp1 = c;
- c = e;
- e = itkw_tmp1;
- }
- OLED_ShowChinese(26,0,17,16);//三極管
- OLED_ShowChinese(42,0,18,16);//
- OLED_ShowChinese(58,0,19,16);//
- if(PartMode == PART_MODE_NPN) //顯示NPN或PNP類型
- {
- //lcd_eep_string(NPN);
- OLED_ShowString(0,2,"NPN",16);
- OLED_ShowChinese(74,2,22,16);//<
- }
- else
- {
- //lcd_eep_string(PNP);
- OLED_ShowString(0,2,"PNP",16);
- OLED_ShowChinese(74,2,21,16);//>
- }
- //lcd_eep_string(BCE); //BCE=
- OLED_ShowString(50,2,"BCE",16);
- //lcd_data(b + 49); //依次顯示引腳序號(ascii 49 是字符"1", b,c,e取值范圍:0-2)
- OLED_ShowChar(90,2,(b + 49),16);
- //lcd_data(c + 49);
- OLED_ShowChar(98,2,(c + 49),16);
- //lcd_data(e + 49);
- OLED_ShowChar(106,2,(e + 49),16);
- //Line2();
- //計算 直流放大系數(shù) hFE = 發(fā)射極電流/基極電流
- u32_hfe = ADCval[1];
- u32_hfe *= RH_RL_RATIO; //高低電阻比
- if(ADCuBE[1] < 11) ADCuBE[1] = 11;
- u32_hfe /= ADCuBE[1];
- ADCval[1] = (uint16_t)u32_hfe;
- //lcd_eep_string(hfeSTR); //“hFE=”
- OLED_ShowString(0,4,"hFE=",16);
- //lcd_string(utoa(ADCval[1], chrVAL, 10));
- OLED_ShowNum(32,4,(ADCval[1]),4, 16);
- // SetCursor(2,7); //光標(biāo)在第2行,字符7
- if(NumOfDiodes > 2) //帶保護二極管的三極管
- {
- //lcd_data(LCD_CHAR_DIODE); //顯示二極管符號
- OLED_ShowChinese(64,0,8,16);//
- }
- else
- {
- //lcd_data(' ');
- OLED_ShowString(64,4," ",16);
- }
- for (c=0;c<NumOfDiodes;c++)
- {
- 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)))
- {
- //lcd_eep_string(Uf); //“Uf=”
- OLED_ShowString(8,6,"Uf=",16);
- //lcd_string(itoa(diodes[c].Voltage, chrVAL, 10));
- OLED_ShowNum(32,6,(diodes[c].Voltage),4, 16);
- //lcd_data('m'); //應(yīng)是mV的意思..
- OLED_ShowString(64,6,"mV",16);
- goto end;
- }
- }
- goto end;
- }
- else if (PartFound == PART_FET) //JFET 或 MOSFET
- {
- if(PartMode&1) //判斷子類型碼為單數(shù)是N型,否則為P型(...)
- {
- //lcd_data('N'); //N型
- OLED_ShowString(0,0,"N",16);
- }
- else
- {
- //lcd_data('P'); //P型
- OLED_ShowString(0,0,"P",16);
- }
-
- //if((PartMode==PART_MODE_N_E_MOS) || (PART_MODE_P_E_MOS))
- if(PartMode < 3) //E-MOSFET:1、2(與下面對應(yīng))
- {
- //lcd_eep_string(emode); //“-E”
- OLED_ShowString(8,0,"-E",16);
- //lcd_eep_string(mosfet); //“-MOS”
- OLED_ShowString(24,0,"-MOS",16);
- }
- else if((PartMode==PART_MODE_N_D_MOS) || (PartMode==PART_MODE_P_D_MOS)) //耗盡型D-MOSFET:3、4
- {
- //lcd_eep_string(dmode); //“-D”
- OLED_ShowString(8,0,"-D",16);
- //lcd_eep_string(mosfet); //“-MOS”
- OLED_ShowString(24,0,"-MOS",16);
- }
- else //JFET:5、6
- {
- // lcd_eep_string(jfet); //“-JFET”
- OLED_ShowString(24,0,"-JFET",16);
- }
- //增強型E-MOSFET 則測量 柵極電容
- if(PartMode < 3) //E-MOSFET:1、2
- {
- // lcd_eep_string(GateCap); //“C=”
- OLED_ShowString(50,4,"C=",16);
- //tmpVAL = strlen(chrVAL2);//chrVAL2_cv
- //tmpVAL2 = tmpVAL;
- // if(tmpVAL>4) tmpVAL = 4; //對于 >100nF 的電容,不要指定最后一個小數(shù)位(否則它不適合 LCD)(顯示4位長度)
- //lcd_show_format_cap(chrVAL2, tmpVAL, tmpVAL2);
- OLED_ShowNum(66,4,chrVAL2_cv,4, 16);
- //lcd_data('n');
- OLED_ShowString(116,4,"p",16);
- }
- //Line2();
- //lcd_eep_string(gds); //“GDS=” (注:此處與三極管的三個極分別顯示的方式不同)
- OLED_ShowString(0,2,"GDS=",16);
- //lcd_data(b + 49);
- OLED_ShowChar(38,2,(b + 49),16);
- //lcd_data(c + 49);
- OLED_ShowChar(46,2,(c + 49),16);
- //lcd_data(e + 49);
- OLED_ShowChar(54,2,(e + 49),16);
- if((PartMode < 3) && (NumOfDiodes > 0)) //增強型E-MOSFET及帶保護二極管的
- {
- //lcd_data(LCD_CHAR_DIODE); //顯示二極管符號
- OLED_ShowString(0,4,"DIODE",16);
- }
- else
- {
- //lcd_data(' '); //空格
- OLED_ShowString(0,4," ",16);
- }
-
- if(PartMode < 3) //增強型E-MOSFET
- {
- //lcd_eep_string(vt); //Vt=
- OLED_ShowString(0,6,"Vt=",16);
- //lcd_string(chrVAL); //顯示柵極閾值電壓
- OLED_ShowNum(24,6,chrVAL_cv,4, 16);
- //lcd_data('m');
- OLED_ShowString(100,6,"mV",16);
- }
- goto end;
- }
- else if (PartFound == PART_THYRISTOR) //單向可控硅
- {
- // lcd_eep_string(Thyristor);
- OLED_ShowString(0,0,"Thyristor",16);
- // Line2();
- // lcd_string("GAK=");
- OLED_ShowString(0,2,"GAK=",16);
- // lcd_data(b + 49);
- OLED_ShowChar(30,2,(b + 49),16);
- // lcd_data(c + 49);
- OLED_ShowChar(38,2,(c + 49),16);
- // lcd_data(e + 49);
- OLED_ShowChar(46,2,(e + 49),16);
- goto end;
- }
- else if (PartFound == PART_TRIAC) //三端雙向可控硅
- {
- //lcd_eep_string(Triac);
- OLED_ShowString(50,0,"Triac",16);
- //Line2();
- //lcd_eep_string(GA1A2); //注:已改為統(tǒng)一顯示
- OLED_ShowString(0,2,"G A1 A2",16);
- // lcd_data(b + 49);
- OLED_ShowChar(0,4,(b + 49),16);
- // lcd_data(e + 49);
- OLED_ShowChar(16,4,(e + 49),16);
- // lcd_data(c + 49);
- OLED_ShowChar(40,4,(c + 49),16);
- goto end;
- }
- else if(PartFound == PART_RESISTOR) //電阻
- {
- // lcd_eep_string(Resistor); //顯示:Resistor
- OLED_ShowChinese(0,0,0,16);//電
- OLED_ShowChinese(16,0,1,16);//阻
- OLED_ShowString(40,0,"Resistor",16);
- // lcd_data(ra + 49); //顯示引腳序號
- OLED_ShowChar(30,2,(ra + 49),16);
- // lcd_data('-');
- //OLED_ShowChar(46,2,('-'),16);
- OLED_ShowChinese(38,2,6,16);//電zhu
- // lcd_data(rb + 49);
- OLED_ShowChar(54,2,(rb + 49),16);
- // Line2();
- // lcd_string ("R = ");
- OLED_ShowString(30,4,"R =",16);
- if(rv[0]>512) //檢查測試電阻兩端的電壓與中值512相差有多遠(yuǎn)
- {
- ADCval[0] = (rv[0]-512);
- }
- else
- {
- ADCval[0] = (512-rv[0]);
- }
-
- if(rv[1]>512)
- {
- ADCval[1] = (rv[1]-512);
- }
- else
- {
- ADCval[1] = (512-rv[1]);
- }
-
- if(ADCval[0] > ADCval[1])
- {
- rADCmax[0] = rADCmax[1];
- rv[0] = rv[1]; //使用更接近512的結(jié)果(準(zhǔn)確度更高)
- rv[1] = R_H_PER; //470k電阻(數(shù)值除100)
- }
- else
- {
- rv[1] = R_L_VAL; //680R測試電阻
- }
-
- if(rv[0]==0) rv[0] = 1;
- u32_hfe = (uint32_t)((uint32_t)((uint32_t)rv[1]*(uint32_t)rv[0]) / (uint32_t)((uint32_t)rADCmax[0]-(uint32_t)rv[0]));
- //計算電阻
- if(rv[1]==R_H_PER) //470k電阻
- {
- OLED_ShowNum(54,4,u32_hfe/10,5, 16);
- OLED_ShowChar(102,4,('K'),16);
- }
- else
- {
- OLED_ShowNum(54,4,u32_hfe,5, 16);
- OLED_ShowChinese(102,4,7,16);////顯示Ω
- //OLED_ShowChar(102,4,32+95,16);//顯示Ω
- }
- // ultoa(u32_hfe,chrVAL,10); //轉(zhuǎn)換一個無符號長整型數(shù)為字符串,10進制
- // if(rv[1]==R_H_PER) //470k電阻
- // {
- // ra = strlen(chrVAL); //ra字符串長度,必須顯示逗號
- // for (rb=0;rb<ra;rb++)
- // {
- // lcd_data(chrVAL[rb]);
- // if(rb==(ra-2)) lcd_data('.'); //逗號
- // }
- // lcd_data ('k'); //如果使用470k 電阻,則顯示單位為千歐
- // }
- // else
- // {
- // lcd_string(chrVAL);
- // }
- // lcd_data(LCD_CHAR_OMEGA); //顯示歐米茄符號代表歐姆
- goto end;
- }
- else
- if(PartFound == PART_CAPACITOR) //電容
- {
- // lcd_eep_string(Capacitor); //顯示Capacitor
- OLED_ShowChinese(0,0,0,16);//電
- OLED_ShowChinese(16,0,2,16);//容
- OLED_ShowString(40,0,"Capacitor",16);
- // lcd_data(ca + 49); //顯示引腳序號
- OLED_ShowChar(0,2,(ca + 49),16);
- // lcd_data('-');
- OLED_ShowChar(16,2,('-'),16);
- // lcd_data(cb + 49);
- OLED_ShowChar(32,2,(cb + 49),16);
- // Line2();
- tmpVAL2 = 'n';
- // if(cv > 99999) //到達(dá)1uF則改為微法顯示:u。
- // {
- // cv /= 1000;
- // tmpVAL2 = LCD_CHAR_U;
- // }
- OLED_ShowNum(0,4,cv,9, 16);
- OLED_ShowString(108,4,"pF",16);
- OLED_ShowNum(0,6,cv/1000,6, 16);
- OLED_ShowString(48,6,"nF",16);
- OLED_ShowNum(64,6,cv/1000000,4, 16);
- OLED_ShowString(108,6,"uF",16);
- // ultoa(cv, chrVAL, 10);
- // tmpVAL = strlen(chrVAL);
- // lcd_show_format_cap(chrVAL, tmpVAL, tmpVAL);
- // lcd_data(tmpVAL2); //顯示: n或u
- // lcd_data('F');
-
- goto end;
- }
-
- if(NumOfDiodes == 0) //未找到二極管
- {
- OLED_ShowChinese(0,2,9,16);//
- OLED_ShowChinese(16,2,10,16);//
- OLED_ShowChinese(32,2,11,16);//
- OLED_ShowChinese(48,2,12,16);//
- OLED_ShowChinese(64,2,13,16);//
- OLED_ShowChinese(80,2,14,16);//
- OLED_ShowChinese(96,2,14,16);//
- OLED_ShowChinese(112,2,14,16);//
- OLED_ShowChinese(48,4,8,16);//
- OLED_ShowChinese(32,4,6,16);//
- OLED_ShowChinese(16,4,15,16);//
- }
- else
- {
- OLED_ShowChinese(0,2,9,16);//
- OLED_ShowChinese(16,2,10,16);//
- OLED_ShowChinese(32,2,11,16);//
- OLED_ShowChinese(48,2,12,16);//
- OLED_ShowChinese(64,2,13,16);//
- OLED_ShowChinese(80,2,14,16);//
- OLED_ShowChinese(96,2,14,16);//
- OLED_ShowChinese(112,2,14,16);//
- OLED_ShowChar(0,6,NumOfDiodes + 48,16);
- // lcd_data(LCD_CHAR_DIODE); //二極管符號
- OLED_ShowChinese(16,6,8,16);//二極管符號
- }
- end:
- while(1) //無限循環(huán)(本程序自動關(guān)機功能已省略)
- {
- if(RST_PIN==0)//PD7按鈕按下為低電平,跳回到起點并進行新的測試
- {
- goto start;
- }
- }
- return 0;
- }
- void CheckPins(uint8_t HighPin, uint8_t LowPin, uint8_t TriPin) //調(diào)用方式:CheckPins(TP1, TP2, TP3);(共6個組合)PC口
- {
- //用于測試具有指定引腳分配的元件屬性
- //HighPin:最初設(shè)置為高電平的引腳:連接到 Vcc
- //LowPin: 最初設(shè)置為低電平的引腳: 通過 R_L 連接到 GND
- //TriPin: 最初設(shè)置為開路的引腳 : 高阻狀態(tài)(三態(tài)腳)
- //在測試的過程中,TriPin會進行循環(huán)高低電平切換。
-
- //注:以下是否重復(fù)定義了變量???
- uint16_t ADCv[6];
- uint8_t tmpVAL, tmpVAL2;
- u8 i,j;
- // wdt_reset();
- //LowPin通過 R_L 連接到 GND 1<<8 把1向左移8位
- tmpVAL = (LowPin*2);
- R_DDR = (1<<tmpVAL);
- // P2M1 = ~P2M0;
- P2M1=~P2M0;
- // OLED_ShowNum(0,6,P2M0,4, 16);
- R_PORT = 0;
- // while(!RX1_Cnt); //等待輸入
- // Print(0xcc);
- // RX1_Cnt=0; //復(fù)位
- ADC_DDR = (1<<HighPin);
- P1M1 = ~P1M0;
- ADC_PORT= (1<<HighPin); //HighPin連接在 Vcc
- _delay_ms(5);
- //對于某些 MOSFET,柵極(TriPin)必須先放電
- //N通道:
- DischargePin(TriPin,0);
- //測量LowPin上的電壓,元件是否在測試座上鎖定?
- ADCv[0] = ReadADC(LowPin);
- // OLED_ShowNum(60,6,ADCv[0],4, 16);
- // while(!RX1_Cnt); //等待輸入
- // Print(0xdd);
- // RX1_Cnt=0; //復(fù)位
- if(ADCv[0] < 20) goto next;
- //否則:為 P 通道放電(柵極接正)
- DischargePin(TriPin,1);
- //再測量LowPin上的電壓
- ADCv[0] = ReadADC(LowPin);
- next:
- if(ADCv[0] < 20) //如果元件在HighPin和LowPin 之間沒有連續(xù)性
- {
- tmpVAL2 = (TriPin*2);
- R_DDR |= (1<<tmpVAL2); //三態(tài)引腳通過 R_L 接地,以測試 pnp
- P2M1 = ~P2M0;
- _delay_ms(2);
- ADCv[0] = ReadADC(LowPin); //測量電壓
- if(ADCv[0] > 700)
- {
- //元件傳導(dǎo) => pnp 三極管或類似的。
- //測量兩個方向的增益
-
- R_DDR = (1<<tmpVAL); //三態(tài)引腳(基極)高阻抗
- P2M1 = ~P2M0;
- tmpVAL2++;
- R_DDR |= (1<<tmpVAL2); //三態(tài)引腳(基極)通過 R_H 接地
- P2M1 = ~P2M0;
- _delay_ms(10);
- ADCv[0] = ReadADC(LowPin); //測量LowPin(假定為集電極)的電壓。
- ADCv[2] = ReadADC(TriPin); //測量三態(tài)引腳(基極)電壓
- R_DDR = (1<<tmpVAL); //三態(tài)引腳(基極)高阻抗
- P2M1 = ~P2M0;
- //三態(tài)引腳(基極)高阻抗
- //檢查測試是否已經(jīng)運行過
- if((PartFound == PART_TRANSISTOR) || (PartFound == PART_FET)) PartReady = 1; //將PartReady置1(第2輪)
- ADCval[PartReady] = ADCv[0]; //登記到n輪的結(jié)果
- ADCuBE[PartReady] = ADCv[2];
- if(ADCv[2] > 200)
- {
- if(PartFound != PART_THYRISTOR) //若非雙向可控硅
- {
- PartFound = PART_TRANSISTOR;
- PartMode = PART_MODE_PNP; //則為PNP 三極管(基極被“拉高”)
- }
- }
- else
- {
- if(PartFound != PART_THYRISTOR) //若非雙向可控硅
- {
- PartFound = PART_FET;
- PartMode = PART_MODE_P_E_MOS; //則為P溝道 MOSFET(基極/柵極未“上拉”)
- }
- }
- if(PartFound != PART_THYRISTOR) //若非雙向可控硅
- {
- b = TriPin;
- c = LowPin;
- e = HighPin;
- }
- }
- //三態(tài)腳TriPin(假定為基數(shù))到正極,以測試 npn
- ADC_PORT = 0; //LowPin到地
- tmpVAL = (TriPin*2);
- tmpVAL2 = (HighPin*2);
- R_DDR = (1<<tmpVAL) | (1<<tmpVAL2); //HighPin和三態(tài)引腳輸出
- P2M1 = ~P2M0;
- R_PORT = (1<<tmpVAL) | (1<<tmpVAL2); //HighPin和三態(tài)引腳通過 R_L 到 Vcc
- ADC_DDR = (1<<LowPin); //LowPin輸出
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
Keil代碼下載:
Keil代碼.7z
(66.69 KB, 下載次數(shù): 455)
2022-9-14 16:26 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|