|
楼主 |
发表于 2011-5-24 08:20:53
|
显示全部楼层
这里是程序代码:由bascom编写:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portb.7 , Db6 = Protb.6 , Db7 = Portb.5 , Rs = Protd.6 , E = Portd.5
Config Lcd = 16 * 2
Config Timer1 = Counter , Edge = Falling '配置T/C1为计数
Config Timer2 = Timer , Prescale = 64 '配置T/C2定时
Config Int1 = Falling
Config Timer0 = Timer , Prescale = 8
On Ovf0 Tim0_isr
On Int1 T1_isr
On Ovf2 Tim2_isr
Enable Ovf2
On Ovf1 Tim1_isr
Enable Ovf1
Enable Interrupts
Tcnt2 = &H83
Start Timer2
Counter1 = 0
Start Counter1
Dim F1 As Long , F2 As Long , Fx As Long , Tc1 As Long , Te 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 J As Bit , I As Byte , K As Bit , M As Bit , Vl As Byte , Tc As Byte , Fa As Byte
'///////端口初始化//////////
Ddrc.0 = 1
Ddrc.1 = 1
Ddrc.2 = 0
Ddrc.3 = 1
Ddrc.4 = 1
Ddrc.5 = 1
Ddrd.7 = 1
Portd.7 = 1
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
Portc.4 = 0
Portc.5 = 1
Waitms 20
Portc.4 = 1
Portc.5 = 0
J = 1
K = 1
M = 1
I = 1
Tc1 = 0
Cls
Cursor Off
'////////////////////////////////主程///////////////////////////////
Do
'///////////////按键处理程序段///////////////
If Pinc.2 = 0 Then '选择键
Waitms 40
If Pinc.2 = 0 Then
Incr I
Bitwait Pinc.2 , Set '防抖动处理
End If
End If
Select Case I
Case 1 '校准程序段
If J = 1 Then
Lcd " L_C_F meter "
Lowerline
Lcd " wait plise "
Waitms 1500
Portc.0 = 0 '接入标准电容C2
Waitms 1500
Ca1 = F1 * F1
Ca2 = F2 * F2
C1 = Ca1 - Ca2
C1 = Ca2 / C1
C1 = C1 * 1200 '1200是标准电容C2
L1 = 3.1416 * 3.1416
L1 = L1 * 4
L1 = L1 * Ca1
L1 = L1 * C1
L1 = 1 / L1
L1 = L1 * 1000000000000000000 '单位uH
Portc.0 = 1 '断开标准电容C2
End If
J = 0
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 2 '电容测量程序段
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 3 '电感测量程序段
Vf = Str(f1)
Vf = Format(vf , " ")
If F1 < 50 Then
Vf = " 0"
End If
Locate 1 , 7
Lcd "F=" ; Vf ; "Hz"
Portd.7 = 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 4 '频率测量程序段
Portc.3 = 0
Portc.5 = 1
Waitms 20
Portc.5 = 0
Locate 1 , 1
Lcd "TestF [0-35MHz]"
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 5 '电解电容测量程序段 (<500uf)
Portd.7 = 1
If K = 1 Then
Disable Ovf1
Disable Ovf2
Enable Int1
Enable Ovf0
Locate 1 , 1
Lcd "TestCE [<500uF]"
Locate 2 , 1
Lcd " CEx= "
End If
K = 0
Portc.1 = 0 '开始充电
Start Timer0 '开始计时
Case 6 '电解电容测量程序段(>500uf)
If M = 1 Then
Portc.0 = 0
Locate 1 , 1
Lcd "TestCE [>500uF]"
Locate 2 , 1
Lcd " CEx= "
End If
M = 0
Portc.1 = 0 '开始充电
Start Timer0 '开始计时
Case 7
I = 2 '返回到电容测量
Enable Ovf1
Enable Ovf2
Disable Int1
Disable Ovf0
Portc.0 = 1
Portc.3 = 1
K = 1
M = 1
End Select
Loop
End
'/////计数溢出中断/////
Tim1_isr:
Incr Tc1
Return
'/////定时中断/////
Tim2_isr:
Tcnt2 = &H83 '定时器T2初值
Incr Tc
If Tc = 250 Then
Stop Counter1
Portc.4 = 0 '关闭闸门
Tc1 = Tc1 * 65535
Fx = Counter1
Fa = Pina
Portc.5 = 1 '74LS393清零
Counter1 = 0 '清零计数值
Fx = Fx * 256
Fx = Fx + Fa
Fx = Fx + Tc1
Fx = Fx * 4
If Portc.0 = 1 Then F1 = Fx Else F2 = Fx
Portc.5 = 0 '74LS393开启
Start Counter1
Portc.4 = 1 '打开闸门
Tc = 0
Tc1 = 0
End If
Return
'/////定时中断,测电解电容/////
Tim0_isr:
Incr Te '定时器0中断次数
Return
'/////外部中断,测电解电容/////
T1_isr:
Stop Timer0
Te = Te * 256
Te = Te + Tcnt0
Te = Te / 2 '时间/充电电阻=被测电容
V1 = Str(te)
Vl = Len(v1)
If Portc.0 = 1 Then '充电电阻R9接入,<500uF
Select Case Vl
Case 2
V1 = "NO"
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 Portc.0 = 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
Portc.1 = 1 '开始放电
If Portc.0 = 1 And Te > 10 Then Waitms 100
If Portc.0 = 0 And Te > 10 Then Waitms 500
Tcnt0 = 0 '定时计数器清零
Te = 0 '定时中断次数清零
Return |
|