⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module2.bas

📁 目前只支持 s51
💻 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 + -