用QB写了一个简单版本的89s51编程器程序,功能单一

(擦除芯片,写程序ROM,读在ROM中读一个字节)

以供大家参考,以前在网上到一个vb的版本的参考,里面很多错误,写了很久都不行

最近才发现,郁闷,找工作更郁闷,所以写程序取乐

参考资料

http://www.hoker.cn/hoker/qbzone/industry/page_1.htm

http://www.mcustudy.com/mcu/Easy_51Pro_v20.rar    中的 74HC245 电路图

DECLARE SUB probyte (address AS INTEGER, byte AS INTEGER)
DECLARE FUNCTION readpro! (address AS INTEGER)
DECLARE FUNCTION readbyte! ()
DECLARE SUB writebyte (wbyte AS INTEGER)
DECLARE SUB delayms (i AS INTEGER)
DECLARE SUB delayus (i AS INTEGER)
DECLARE SUB Enpro ()
DECLARE SUB ErsRom ()
CONST waittime = 5
DIM i1 AS INTEGER
DIM i2 AS INTEGER
DIM st1 AS STRING * 1

CLS

OUT &H37A, 3   'RST低电平
CALL delayms (10)

CALL Enpro    '输入编程使能信号(RST高电平在它里面)

CALL ErsRom    '擦除芯片内容

IF COMMAND$ = "" THEN  '检测有没有运行参数,没有就要求输入文件名
INPUT "FileName"; f$
ELSE
f$ = COMMAND$
END IF

OPEN f$ FOR BINARY AS #1 '打开BIN文件
WHILE EOF(1) = 0
  i1 = i1 + 1
  GET #1, i1, st1
  i2 = ASC(st1)

CALL   probyte i1 - 1, i2  '写字节,参数1为地址,参数2为数据

  PRINT HEX$(i2) + " ";
WEND
CLOSE #1
CALL delayms (10)
PRINT

PRINT HEX$(readpro(0))  '输出芯片ROM空间中第一个字节的数据

OUT &H37A, 3   'RST低电平
SLEEP

'上面的是主程序

SUB delayms (i AS INTEGER) '毫秒的延时程序,具体的延时数值每台电脑各有不同,本参数根据我的电脑而定 ^_^
DIM d1 AS INTEGER
DIM d2 AS LONG
FOR d1 = 1 TO i
  FOR d2 = 0 TO 16000
  NEXT d2
NEXT d1
END SUB

SUB delayus (i AS INTEGER) '微秒的延时程序,具体的延时数值每台电脑各有不同,本参数根据我的电脑而定 ^_^
DIM d1 AS INTEGER
DIM d2 AS LONG
FOR d1 = 1 TO i
  FOR d2 = 0 TO 50
  NEXT d2
NEXT d1
END SUB

SUB Enpro   '编程使能程序
OUT &H37A, 7   'RST高电平,P17 P15 低电平   
CALL delayms (12)
CALL writebyte &HAC   '输入四字节的使能信号
CALL writebyte &H53
CALL writebyte &H0
CALL writebyte &H0
CALL delayms (1000)
END SUB

SUB ErsRom   '擦除子程序
CALL writebyte &HAC   '输入四字节的芯片擦除信号
CALL writebyte &H80
CALL writebyte &H0
CALL writebyte &H0
CALL delayms (1000)   '芯片擦除后,必须延时足够的时间等待擦除完毕
END SUB

SUB probyte (address AS INTEGER, byte AS INTEGER) '写ROM单个字节子程序,参数1为在ROM中的地址,参数2为数据
CALL writebyte &H40
CALL writebyte &HFF AND (address \ 256)
CALL writebyte address AND &HFF
CALL writebyte byte
CALL delayms (1)
END SUB

FUNCTION readpro (address AS INTEGER)   '读ROM中单个字节的子程序,参数为地址
CALL writebyte &H20
CALL writebyte &HFF AND (address \ 256)
CALL writebyte address AND &HFF
readpro = readbyte()
END FUNCTION

FUNCTION readbyte     '读操作的时钟信号     
DIM i1 AS INTEGER
DIM i2 AS INTEGER
DIM i3 AS INTEGER
OUT &H37A, 7
CALL delayus (waittime)
FOR i1 = 7 TO 0 STEP -1
   OUT &H37A, 7
   CALL    delayus (waittime)
   OUT &H37A, 6
   i3 = i3 * 2
   CALL delayus (1)
   i2 = INP(&H379) AND 8
   IF (i2 <> 0) THEN
        i3 = i3 + 1
   END IF
   CALL delayus (waittime)
   OUT &H37A, 7
NEXT i1
readbyte = i3
END FUNCTION

SUB writebyte (wbyte AS INTEGER)   '写操作的时钟信号
DIM i1 AS INTEGER
OUT &H37A, 7
CALL delayus (waittime)
FOR i1 = 7 TO 0 STEP -1
  IF (wbyte AND 2 ^ i1) = 2 ^ i1 THEN
   OUT &H37A, 5
   CALL delayus (waittime)
   OUT &H37A, 4
   CALL delayus (waittime)
   OUT &H37A, 5
  ELSE
   OUT &H37A, 7
   CALL delayus (waittime)
   OUT &H37A, 6
   CALL delayus (waittime)
   OUT &H37A, 7
  END IF
NEXT i1
END SUB

'采用打印机并行口的37AH做RST P17 P15 的输入口
'37AH的第0位接P17,第0位是反相的,当第0位置1 输出低电平,
'第1位接P15,第1位是反相的,当第1位置1 输出低电平,
'第2位接RST,第2位是同相的,当第2位置1 输出高电平,
'379H的第3位接P16负责读取单片机的输出信号,

'华南农业大学 01机制1 ljxh401