📄 module2.bas
字号:
Attribute VB_Name = "AT89S51"
Option Explicit
Sub StartProgS51() '准备编程
SetPinLogic OE, 0
SetRST 0
SetMOSI 0
SetPinL SCK
DelayUS 100000
SetRST 1
DelayUS 100000
OutBuf(0) = &HAC
OutBuf(1) = &H53
SckBytes 4
End Sub
Sub OverProgS51() '编程结束
SetRST 0
SetMOSI 1
SetSCK 1
End Sub
Sub EraseS51() '全片擦除
' ShowMsg "开始全片擦除"
StartProgS51
DelayUS 100000 '10ms
OutBuf(0) = Val("&H" & Left(ChipEsign, 2)) '&HAC
OutBuf(1) = Val("&H" & Mid(ChipEsign, 3, 2)) ' &H80
SckBytes 4
DelayUS 5000000 '500ms
OverProgS51
' ShowMsg "全片擦除结束"
End Sub
Sub WriteS51(CodeAddr As Integer, Code As Byte) '写代码字节
WriteS CodeAddr, Code, Val("&H" & Left(ChipWSign, 2)) ' &H40
End Sub
Function ReadS51(CodeAddr As Integer) As Byte '读一个单元
ReadS51 = ReadS(CodeAddr, Val("&H" & Left(ChipRSign, 2))) ' &H20)
End Function
Function ReadSignS51() As String '读特征字
Dim pBuf(0 To 2) As Byte
' ShowMsg "开始读特征字"
StartProgS51
ReadSignS51 = ReadSign(&H28, &H0, &H0, &H0) '根据器件手册上规定的命令协议
OverProgS51
' ShowMsg "读特征字完成"
End Function
Function VerifyS51(FileN As String) As Long '校验
Dim i As Integer
Dim ii As Long
Dim FileNum As Integer
Dim LineInBuf As String
Dim CurAddr As Integer
ii = 0
' ShowMsg "开始校验"
Form1.PBar.Value = 0
Form1.PBar.Max = FileCodeLen + 1
FileNum = FreeFile
If FileN = "" Then
ShowMsg "HexFile error!"
VerifyS51 = 9999
Exit Function
End If
StartProgS51
Open FileN For Input As FileNum
Do Until EOF(FileNum)
Line Input #FileNum, LineInBuf
If Val("&H" + Mid$(LineInBuf, 8, 2)) > 1 Then GoTo Loop_Loop '大于01记录类型的记录忽略
If Val("&H" + Mid$(LineInBuf, 2, 2)) <> 0 Then
CurAddr = Val("&H" + Mid$(LineInBuf, 4, 4))
For i = 10 To Len(LineInBuf) - 2 Step 2
If (ReadS51(CurAddr)) <> Val("&H" + Mid$(LineInBuf, i, 2)) Then ii = ii + 1
CurAddr = CurAddr + 1
Form1.PBar.Value = Form1.PBar.Value + 1
Next i
End If
Loop_Loop:
Loop
Exit1:
Close FileNum
OverProgS51
' ShowMsg "校验结束"
VerifyS51 = ii
End Function
Sub LockBitS51(nBit As Integer) '为锁定位
' ShowMsg "开始写锁定位"
If nBit >= 1 Then ' 为锁定位
OutBuf(0) = &HAC '根据编程协议规定
OutBuf(1) = &HE1
SckBytes (4)
DelayUS DelayTime
End If
If nBit >= 2 Then
StartProgS51
OutBuf(0) = &HAC '根据编程协议规定
OutBuf(1) = &HE2
SckBytes 4
DelayUS DelayTime
End If
If nBit = 3 Then
StartProgS51
OutBuf(0) = &HAC '根据编程协议规定
OutBuf(1) = &HE3
SckBytes 4
DelayUS DelayTime
End If
' ShowMsg "写锁定位结束"
End Sub
Function AT89S51Prog(FileN As String) As Boolean
Dim i As Integer
Dim ii As Long
Dim FileNum As Integer
Dim LineInBuf As String
Dim CurAddr As Integer
Dim CRC As Long
' ShowMsg "开始编程"
ii = 1
CurAddr = 0
Form1.PBar.Value = 0
If Dir(FileN) = "" Then
MsgBox "未选择文件或文件不存在!"
GoTo Exit1
End If
FileNum = FreeFile
Open FileN For Input As FileNum
Do Until EOF(FileNum)
Line Input #FileNum, LineInBuf
If Left$(LineInBuf, 1) <> ":" Then
MsgBox "Inter Hex文件有误"
GoTo Exit1
End If
For i = 2 To Val("&H" + Mid$(LineInBuf, 2, 2) + 5) * 2 Step 2 'CRC检查文件
CRC = CRC + Val("&H" + Mid$(LineInBuf, i, 2))
CRC = CRC And &HFF
Next i
If CRC <> 0 Then
MsgBox "文件检查未通过,请重新编译文件!"
GoTo Exit1
End If
If Val("&H" + Mid$(LineInBuf, 8, 2)) > 1 Then GoTo Loop_Loop '大于01记录类型的记录忽略
If Val("&H" + Mid$(LineInBuf, 2, 2)) <> 0 Then
CurAddr = Val("&H" + Mid$(LineInBuf, 4, 4))
For i = 10 To Len(LineInBuf) - 2 Step 2
WriteS51 CurAddr, Val("&H" + Mid$(LineInBuf, i, 2))
CurAddr = CurAddr + 1
Form1.PBar.Value = Form1.PBar.Value + 1
Next i
ii = ii + 1
End If
Loop_Loop:
Loop
Exit1:
Close FileNum
' ShowMsg "编程结束"
End Function
'*****************************************************************
'***************************************************************
';-------------------引用digiboy的文档-使之与硬件无关----------
'[并口地址]
'PTRADD = &H378
'[引脚控制]
'MOSI = 14
'MISO = 15
'SCK = 1
'RST = 16
'LE = 17
'OE = 2
'[锁存控制(LE)]
'Enable = 1
'Disable = 1
'
'[输出控制(OE)]
'Enable = 0
'Disable = 1
';-------------------------------------说明--------------------------------
'; --引脚控制--
'; 你可以定义下载线所使用的并口引脚,只要设置对应的引脚号即可。
'; MOSI:数据串行输出 MISO:串行数据输入 SCK:同步控制时钟
'; RST:复位 LE:器件的锁存允许 OE:器件的输出允许
';' R1,R2:保留为以后扩展用
'; 注意:18-25引脚都接地 2,3,4,5,6,7,8,9为数据口,可读可写;1,14,16,17为控制
'; 口,可读可写;10,11,12,13,15为状态口,只读.
'; 如果引脚=0,表示该引脚无效,不作控制,例如74244的OE=0.
';
'; --锁存控制--
'; 如果器件有LE,例如74373的LE,高电平有效低电平无效.所以可以Enable=1
'; Disable=0,如果Enable=1,Disable=1,表示LE引脚恒为高电平,Enable=0,Disable=0,
'; 表示LE引脚恒为低电平
';
'; --输出控制--
'; 如果器件有OE,例如74373的OE,低电平输出信号,高电平输出高阻.所以可以Enable=0
'; Disable=1.其他原理同上
';-------------------------------------------------------------------------'''
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -