|
楼主 |
发表于 2009-9-5 17:51:41
|
显示全部楼层
程序已经更新如下:
$regfile = "m16def.dat"
$crystal = 16000000
Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Portb.6 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portd.2 , Rs = Portd.3
Config Lcd = 16 * 4
Config Timer2 = Timer , Async = On , Prescale = 256
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
Config Aci = Off
Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Shi As Long , Fen As Long , Miao As Long , X As String * 2 , Y As String * 2 , Z As String * 2 '定时变量声明
Dim W As Word , V_adc As Word , V_dc As Long , A_dc As Long , Uv1 As String * 5 , A_adc As Word , Uv As String * 5 , Ua As String * 5 'adc变量声明
Dim J As Long , J1 As Long , J2 As Long
Dim I As Word , A As Long
Dim M1 As String * 4 , M2 As String * 2 , M3 As String * 2
Dim C As Long , C1 As Long , C2 As Long , C3 As Long , C4 As Long , Ah As String * 4
Dim V_key As Word , S As Word , S1 As Word , S2 As Word , S3 As Word , S4 As Word , S5 As Word '按键变量声明
On Ovf2 Zd
Enable Ovf2
Enable Interrupts
Start Timer1
Stop Timer2
Timer2 = 0
Ddrb.3 = 1 '蜂鸣器初始化
Ddrc.0 = 1 '充电LED初始化
Ddrc.1 = 1 '放电LED初始化
Portb.3 = 0
Ddrd.6 = 1
Portc.0 = 0
Portc.1 = 0
M1 = "STOP"
W = 0
J = 0
J1 = 0
J2 = 0
A_dc = 0
A_adc = 0
V_key = 0
V_adc = 0
V_dc = 0
S1 = 0
S2 = 0
S3 = 0
S4 = 0
S5 = 0
S = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "Cd and Fd please"
Locate 2 , 1
Lcd M1 ; " key S1_S5"
Locate 3 , 1
Lcd "S1 to Cd/Fd"
Sound Portb.3 , 100 , 1000
'*********主程序********
Do
Start Adc
V_key = Getadc(3) '取按键值
If V_key < 950 And M1 = "STOP" Then '判断按键按下
Waitms 30
If V_key < 950 Then
Incr S
If S > 7 Then
S = 1 '按键防抖
Select Case V_key
Case 0 To 40
If S5 = 0 Then 's1按下(Cd/Fd)
Incr S1
If S1 > 2 Then S1 = 1
If S1 = 1 Then
M2 = "Cd"
Elseif S1 = 2 Then
M2 = "Fd"
End If
Locate 1 , 1
Lcd M2 ; "_ "
Locate 3 , 1
Lcd "S2 to Li/Nq"
Elseif S5 <> 0 Then
V_adc = Getadc(0)
If V_adc > 0 Then
If M2 = "Cd" Then
Ddrd.5 = 1
Pwm1a = W
Elseif M2 = "Fd" Then
Pwm1a = 0
Portd.6 = 1
End If
M1 = "OPEN"
Start Timer2
Timer2 = 128
Locate 2 , 1
Lcd M1
Else
Sound Portb.3 , 100 , 1000
End If
End If
Case 350 To 370 's2 按下(Li/NQ)
If S1 <> 0 Then
Incr S2
If S2 > 2 Then S2 = 1
If S2 = 1 Then
M3 = "Li"
Elseif S2 = 2 Then
M3 = "Nq"
End If
Locate 1 , 4
Lcd M3 ; "_"
Locate 3 , 1
Lcd "S3 to BTn + "
End If
Case 610 To 620 's3按下(电池节数选择)
If S2 <> 0 Then
Incr S3
Incr J
If J > 7 Then J = 1
Select Case J
Case 1
If M3 = "Li" Then
J1 = 300
J2 = 420
Elseif M3 = "Nq" Then
J1 = 100
J2 = 145
End If
Case 2
J1 = 200
J2 = 290
Case 3
J1 = 300
J2 = 435
Case 4
J1 = 400
J2 = 580
Case 5
J1 = 500
J2 = 725
Case 6
J1 = 600
J2 = 870
Case 7
J1 = 700
J2 = 1015
End Select
Locate 1 , 7
Lcd J ; "n_"
Locate 3 , 1
Lcd "S4 to BTc + "
End If
Case 740 To 750 's4按下(电池容量选择)
If S3 <> 0 Then
Incr S4
C = C + 50
If C > 1500 Then C = 50
Ah = Str(c)
Ah = Format(ah , " ")
Locate 1 , 10
Lcd Ah ; "mah"
Locate 3 , 1
Lcd "S5 to Quick/Slow"
End If
Case 810 To 820 'S5按下(充/放电快慢转换)
If S4 <> 0 Then
Incr S5
If S5 > 2 Then S5 = 1
If S5 = 1 Then
If M2 = "Cd" Then
If M3 = "Li" Then W = 120
If M3 = "Nq" Then W = 50
A = C / 2
Locate 4 , 1
Lcd "S1 to Quick " ; M2
Elseif M2 = "Fd" Then
A = 300
Locate 4 , 1
Lcd "s1 to 300mah " ; M2
End If
Elseif S5 = 2 Then
If M2 = "Cd" Then
A = C / 10
W = 10
Locate 4 , 1
Lcd "S1 to SLow " ; M2 ; " "
Elseif M2 = "Fd" Then
A = 300
Locate 4 , 1
Lcd "S1 to 300mah " ; M2 ; " "
End If
End If
End If
End Select
End If
End If
End If
If M1 = "OPEN" And M2 = "Fd" Then '放电检测
Portc.0 = 1
Waitms 100
Portc.0 = 0
Waitms 100
A_dc = Getadc(2)
V_dc = Getadc(0)
A_dc = A_dc * 2560
A_dc = A_dc / 1023
Ua = Str(a_dc)
Ua = Format(ua , "0.000")
V_dc = V_dc * 2560
V_dc = V_dc / 1023
Uv = Str(v_dc)
Uv = Format(uv , " 0.00")
If V_dc < J1 Then
Portd.6 = 0
Portc.0 = 1
Gosub Bb
Locate 2 , 1
Lcd M1
End If
Elseif M1 = "OPEN" And M2 = "Cd" Then '充电检测
Portc.1 = 1
Waitms 100
For I = 1 To 30
A_adc = Getadc(1)
A_dc = A_dc + A_adc
Next I
A_dc = A_dc / 30
A_dc = A_dc * 2560
A_dc = A_dc / 1023
Ua = Str(a_dc)
Ua = Format(ua , "0.000")
Portc.1 = 0
Waitms 100
If M3 = "Li" Then '锂电检测
If Shi < 3 Then
If Fen > 2 And V_dc < 420 Then
If A_dc < A And W < 1023 Then Incr W
End If
Else
Pwm1a = 0
Portc.1 = 1
Gosub Bb
End If
Elseif M3 = "Nq" Then '镍、氢检测
If S5 = 1 Then '快充时
If Shi < 3 Then
If Fen > 2 And V_dc < J2 Then
If A_dc < A And W < 1023 Then Incr W
Elseif V_dc > J2 Then
Sound Portb.3 , 100 , 1000
A = C / 100 '转涓流
W = 5
End If
Else
Pwm1a = 0
Portc.1 = 1
Gosub Bb
End If
Elseif S5 = 2 Then '标准充电
If Shi < 15 And V_dc < J2 Then
If A_dc < A And W < 1023 Then Incr W
Else
Sound Portb.3 , 100 , 1000
A = C / 100
W = 5
End If
End If
End If
End If
Loop
End
Zd:
Timer2 = 128 'T2装入初值
If Miao < 59 Then
Miao = Miao + 1 '秒计时
Elseif Fen < 59 Then
Miao = 0
Fen = Fen + 1 '分计时
Elseif Shi < 23 Then
Miao = 0
Fen = 0
Shi = Shi + 1 '小时计时
End If
X = Str(shi)
Y = Str(fen)
Z = Str(miao)
X = Format(x , "00")
Y = Format(y , "00")
Z = Format(z , "00")
If M1 = "OPEN" And M2 = "Cd" Then
Pwm1a = 0
Waitms 10
V_dc = Getadc(0)
Pwm1a = W
V_dc = V_dc * 2560
V_dc = V_dc / 1023
If M3 = "Li" Then
If V_dc > 420 Then
If W > 0 Then Decr W
End If
End If
Uv = Str(v_dc)
Uv = Format(uv , " 0.00")
Locate 3 , 10
Lcd " "
Elseif M1 = "OPEN" And M2 = "Fd" Then
C1 = 300 * Shi
C2 = 300 * Fen
C2 = C2 / 60
C3 = 300 * Miao
C3 = C3 / 3600
C4 = C1 + C2
C4 = C4 + C3
Ah = Str(c4)
Ah = Format(ah , " ")
Locate 3 , 10
Lcd Ah ; "mah"
End If
Gosub Xi
Return
Xi:
Locate 2 , 6
Lcd "Ti:" ; X ; ":" ; Y ; ":" ; Z '显示计时时间
Locate 4 , 1
Lcd "U:" ; Uv ; "V" ; " " '显示电池端电压值
Locate 3 , 1 '电流显示
Lcd "I:" ; Ua ; "A" ; " "
Return
Bb: '报警
For I = 1 To 6
Sound Portb.3 , 100 , 1000
Waitms 100
Next I
Stop Timer2
Timer2 = 0
M1 = "STOP"
Gosub Xi
Return |
|