|
发表于 2011-9-19 11:02:31
|
显示全部楼层
我在制作中C1、C2采用的是1290p、0.5%精度的聚苯乙烯电容器,如果上面两位朋友制作中电容器采用别的容量,可在程序中修改。
源程序代码附上:
'*************** LCF测量仪程序(BASCOM编译通过 *****************
'*************** MCU采用M16\主频16MHZ *****************
'*************** 2010年8月22日完成 *****************
$regfile = "m8def.dat"
$crystal = 16000000
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portb.5 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Config Timer0 = Counter , Edge = Falling
Config Timer2 = Timer , Prescale = 128
On Ovf0 Tim0_isr
On Ovf2 Tim2_isr
Enable Ovf2
Enable Ovf0
Enable Interrupts
Tcnt2 = &H83
Start Timer2
Counter0 = 0
Start Counter0
Dim F1 As Long , F2 As Long , Tc1 As Long , Te As Long , Fx As Long
Dim C1 As Single , Ca1 As Single , Ca2 As Single , Cx As Single , L1 As Single , Lx As Single , F11 As Single
Dim V1 As String * 11 , V2 As String * 11 , V3 As String * 9 , Vf As String * 6 , Vs As String * 8 , Z1 As String * 2 , Z2 As String * 3
Dim I As Byte , K As Bit , M As Bit
Dim Vl As Byte , Tc As Byte
'**************端口设置*************
Ddrb.0 = 0 'S2按键设置为输入
Portb.0 = 1 '上拉电阻有效
Ddrd.6 = 1 'K2控制端口设置为输出
Ddrd.0 = 1 'K1设置
Portd.6 = 1 'K2断开
Portd.0 = 1 'K1断开
Ddrd.7 = 1 '充电输出端子设定
Portd.7 = 1 '上拉电阻有效
'*************初始化****************
K = 1
I = 1
M = 1
Tc1 = 0
Cls
Cursor Off
'*************按键处理**************
Do
If Pinb.0 = 0 Then
Waitms 40
If Pinb.0 = 0 Then
Incr I
Bitwait Pinb.0 , Set
End If
End If
'************主程序段***************
Select Case I
Case 1 '校准程序段
Lcd " L_C_F meter "
Lowerline
Lcd " wait plise "
Waitms 1500
Portd.6 = 0 '接入标准电容C2
Waitms 1500
Ca1 = F1 * F1
Ca2 = F2 * F2
C1 = Ca1 - Ca2
C1 = Ca2 / C1
C1 = C1 * 1290 '1290是标准电容C2
L1 = 3.1416 * 3.1416
L1 = L1 * 4
L1 = L1 * Ca1
L1 = L1 * C1
L1 = 1 / L1
L1 = L1 * 1000000000000000000 '单位uH
Portd.6 = 1 '断开标准电容C2
Incr I
Case 2
Vf = Str(f1) '显示f1
Vf = Format(vf , " ")
Locate 1 , 7
Lcd "F=" ; Vf ; "Hz"
Locate 1 , 1
Lcd "SetOK "
V1 = Fusing(c1 , "#.#")
V2 = Fusing(l1 , "#.#")
Locate 2 , 1
Lcd V1 ; "pF " ; V2 ; "uH" '显示C1和L1
Case 3 '电容测量程序段
Vf = Str(f1)
Vf = Format(vf , " ")
Locate 1 , 7
Lcd "F=" ; Vf ; "Hz"
F11 = F1 * F1
Cx = Ca1 / F11
Cx = Cx - 1
Cx = Cx * C1
V1 = Fusing(cx , "#.#")
Vl = Len(v1)
Z1 = "pF"
If Vl = 6 Then
V1 = Mid(v1 , 1 , 4)
Z1 = "pF"
Elseif Vl = 7 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "00.00")
Z1 = "nF"
Elseif Vl = 8 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "000.0")
Z1 = "nF"
Elseif Vl = 9 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "0.000")
Z1 = "uF"
End If
Vs = Space(8)
Locate 2 , 1
Lcd " Cx=" ; V1 ; Z1 ; Vs
Locate 1 , 1
Lcd "TestC "
Case 4 '电感测量程序段
Vf = Str(f1)
Vf = Format(vf , " ")
If F1 < 50 Then
Vf = " 0"
End If
Locate 1 , 7
Lcd "F=" ; Vf ; "Hz"
Portd.0 = 0 '输入端切换到测电感
If F1 > 1000 Then
F11 = F1 * F1
Lx = Ca1 / F11
Lx = Lx - 1
Lx = Lx * L1
Else
Lx = 0
End If
V1 = Fusing(lx , "#.##")
Vl = Len(v1)
Z1 = "uH"
If Vl = 6 Then
V1 = Mid(v1 , 1 , 5)
Z1 = "uH"
Elseif Vl = 7 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "0.000")
Z1 = "mH"
Elseif Vl = 8 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "00.00")
Z1 = "mH"
Elseif Vl = 9 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "000.0")
Z1 = "mH"
Elseif Vl = 10 Then
V1 = Mid(v1 , 1 , 4)
V1 = Format(v1 , "0.000")
Z1 = "H "
End If
Vs = Space(8)
Locate 2 , 1
Lcd " Lx=" ; V1 ; Z1 ; Vs
Locate 1 , 1
Lcd "TestL "
Case 5 '电解电容测量程序段 (<500uf)
Portd.6 = 1 '接入2K电阻
If K = 1 Then
Disable Ovf0
Disable Ovf2
Config Timer0 = Timer , Prescale = 8
On Int0 T1_isr
Enable Int0
Enable Ovf0
Te = 0
Locate 1 , 1
Lcd "TestCE [<500uF]"
Locate 2 , 1
Lcd " CEx= "
End If
K = 0
Portd.7 = 0 '开始充电
Start Timer0 '开始计时
Case 6 '电解电容测量程序段(>500uf)
If M = 1 Then
Portd.6 = 0 '接入200欧电阻
Te = 0
Locate 1 , 1
Lcd "TestCE [>500uF]"
Locate 2 , 1
Lcd " CEx= "
End If
M = 0
Portd.7 = 0 '开始充电
Start Timer0 '开始计时
Case 7 '频率测量程序段
Config Timer1 = Counter , Edge = Falling
On Ovf1 Tim1_isr
Enable Ovf1
Enable Ovf2
Disable Int0
Disable Ovf0
Fx = 0
Portd.0 = 1 'K1复位
Portd.6 = 1 'K2复位
Portd.7 = 1 '放电复位
Tcnt2 = &H83
Start Timer2
Counter1 = 0
Start Counter1
Incr I
Case 8
Locate 1 , 1
Lcd "TestFx [0-8MHz]"
V3 = Str(fx)
If Fx < 1000 Then
V3 = Format(v3 , " 0")
Z2 = "Hz "
Elseif Fx > 999 And Fx < 1000000 Then
V3 = Format(v3 , " .000")
Z2 = "KHz"
Elseif Fx > 999999 Then
V3 = Format(v3 , " .000000")
Z2 = "MHz"
End If
Locate 2 , 3
Lcd "F=" ; V3 ; Z2
Case 9
Config Timer0 = Counter , Edge = Falling
Disable Ovf1
Stop Timer2
Enable Ovf0
Tcnt2 = &H83
Start Timer2
Counter0 = 0
Start Counter0
I = 3
K = 1
M = 1
Fx = 0
End Select
Loop
End
'***************计数器1溢出中断*****************
Tim1_isr:
Incr Tc1
Return
'**************定时器2中断*********************
Tim2_isr:
Tcnt2 = &H83 '定时器T2初值
Incr Tc
If Tc = 250 Then
If I = 8 Then
Stop Counter1
Tc1 = Tc1 * 65535
Fx = Counter1
Counter1 = 0
Fx = Tc1 + Fx
Fx = Fx * 4
Start Timer1
Tc1 = 0
Else
Stop Counter0
Te = Te * 256
Fx = Counter0
Counter0 = 0
Fx = Te + Fx
Fx = Fx * 4
If Portd.6 = 1 Then F1 = Fx Else F2 = Fx
Start Counter0
Te = 0
End If
Tc = 0
End If
Return
'****************定时器0中断**************
Tim0_isr:
Incr Te '定时器0中断次数
Return
'***************外部中断******************
T1_isr:
Stop Timer0
Te = Te * 256
Te = Te + Tcnt0
Te = Te / 4 '时间/充电电阻=被测电容
V1 = Str(te)
Vl = Len(v1)
If Portd.6 = 1 Then '充电电阻R9接入,<500uF
Select Case Vl
Case 1
V1 = "NO"
Case 2 '加入这段语句可以测量0.001uf以上的小电容
V1 = Mid(v1 , 1 , 2)
V1 = Format(v1 , "0.000")
Case 3
V1 = Mid(v1 , 1 , 3)
V1 = Format(v1 , "0.000")
Case 4
V1 = Mid(v1 , 1 , 3)
V1 = Format(v1 , "0.00")
Case 5
V1 = Mid(v1 , 1 , 3)
V1 = Format(v1 , "0.0")
Case 6 : V1 = Mid(v1 , 1 , 3)
Case 7 : V1 = " OL "
End Select
Elseif Portd.6 = 0 Then '接入充电电阻R10
Select Case Vl
Case 2
V1 = Mid(v1 , 1 , 2)
V1 = Format(v1 , "0.00")
Case 3
V1 = Mid(v1 , 1 , 3)
V1 = Format(v1 , "0.00")
Case 4 : V1 = Mid(v1 , 1 , 2)
Case 5 : V1 = Mid(v1 , 1 , 3)
Case 6 : V1 = Mid(v1 , 1 , 4)
Case 7 : V1 = Mid(v1 , 1 , 5)
End Select
End If
Vs = Space(7)
If Te > 1 And Te < 10 Then
Locate 2 , 1
Lcd " CEx=" ; "0" ; "uF" ; Vs
End If
If Te > 10 Then
Locate 2 , 1
Lcd " CEx=" ; V1 ; "uF" ; Vs
End If
Portd.7 = 1 '开始放电
If Portd.6 = 1 And Te > 10 Then Waitms 100
If Portd.6 = 0 And Te > 10 Then Waitms 500
Tcnt0 = 0 '定时计数器清零
Te = 0 '定时中断次数清零
Return |
|