📄 e51p.asm
字号:
;波特率28800
;for at89c51系列
;增加AT89S51串行编程功能
;删除了烧at89c2051系列芯片的代码
VPP EQU P3.2;接三极管,vpp电压控制
VPP_12 EQU P3.2;5-12V CONTROL FOR 89C51
RST EQU P3.5;
PROG EQU P3.3;编程脉冲控制
BUSY EQU P3.4;
MOSI EQU P1.5
MISO EQU P1.6
SCK EQU P1.7
F_VPP EQU 00H ;vpp电压标志
F_RST EQU 01H ;RST电压标志
F_RXALL EQU 02H
TX0 EQU 30H;
TX1 EQU 31H;
TX2 EQU 32H;发送缓存
TX3 EQU 33H;30-41 18BYTES BUFFER
TX4 EQU 34H
TX17 EQU 41H
RX0 EQU 42H;42-53 18BYTES BUFFER
RX1 EQU 43H;
RX2 EQU 44H;
RX3 EQU 45H;接收缓存
RX4 EQU 46H
RX17 EQU 53H
ADDRESS_L EQU 10H;
ADDRESS_H EQU 11H;
PARAM0 EQU 12H
PARAM1 EQU 13H
PARAM2 EQU 14H
PARAM3 EQU 15H
RET0 EQU 16H
RET1 EQU 17H
RET2 EQU 18H
RET3 EQU 19H
BITS1 EQU 22H
BITS2 EQU 23H
SOUT EQU 24H
SIN EQU 25H
SOUT1 EQU 26H
SOUT2 EQU 27H
SOUT3 EQU 28H
SOUT4 EQU 29H
SIN1 EQU 2AH
SIN2 EQU 2BH
SIN3 EQU 2CH
SIN4 EQU 2DH
_R0 EQU 08H
_R1 EQU 09H
;RX1表示器件型号:0-C51,1-C52,2-C55,10-S51,11-S52,12-S55
C51 EQU 0H
C52 EQU 1H
C55 EQU 2H
S51 EQU 10H
S52 EQU 11H
S55 EQU 12H
WAIT_VOL EQU 55H;等待电压稳定延时系数
ORG 0000H
SJMP START
ORG 0023H
;SJMP RX_INT
ORG 0030H
START: MOV SP,#60H
MOV WAIT_VOL,#0FH
SETB F_VPP
ACALL SET_VPP5
SETB P3.5; SET AT89C51'S RST=1
MOV R4,#08H
MOV IP,#00H
;SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI
MOV SCON,#11010000B ; 1 1 0 1 0 0 0 0
MOV A,PCON
ANL A,#01111111B ;SMOD=0
;ORL A,#10000000B ;SMOD=1
MOV PCON,A
MOV TCON,#00H
MOV IE,#00H
MOV TH1,#0FFH ;波特率28800*TMOD
MOV TL1,#0FFH
;TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0
MOV TMOD,#00100000B; 0 0 1 0 0 0 0 1
MOV TH0,#0FFH
MOV TL0,#0FFH
SETB TR1
CLR ES ;中断允许
CLR EA ;
CLR RI
CLR RI
CLR TI
ACALL INIT_PIN
TEST_TX: MOV R0,#255 ;检查串口通讯
ACALL DELAY
MOV R0,#255
ACALL DELAY
MOV TX0,#01H
MOV TX1,#'M'
MOV TX2,#'P'
ACALL TX_PC
;RX1表示器件型号:0-C51,1-C52,2-C55,3-S51,4-S52,5-S55
WAIT_COMM: ACALL RX_PC
MOV A,RX0
_TEST_MP: CJNE A,#01H,_ERASE_ROM
AJMP TEST_MP
_ERASE_ROM: CJNE A,#02H,_INIT_WRITE
AJMP ERASE_ROM
_INIT_WRITE:CJNE A,#03H,_WRITE_ROM
AJMP INIT_WRITE
_WRITE_ROM: CJNE A,#04H,_INIT_READ
AJMP WRITE_ROM
_INIT_READ: CJNE A,#05H,_READ_ROM
AJMP INIT_READ
_READ_ROM: CJNE A,#06H,_LOCK_BIT
AJMP WAIT_COMM
_LOCK_BIT: CJNE A,#07H,_READ_SIGN
AJMP LOCK_BIT
_READ_SIGN: CJNE A,#08,WAIT_COMM
AJMP READ_SIGN
AJMP WAIT_COMM
TEST_MP: ACALL INIT_PIN
MOV TX0,RX0
MOV A,RX1
MOV TX1,A
MOV A,RX2
MOV TX2,A
ACALL TX_PC
AJMP WAIT_COMM
ERASE_ROM: MOV A,RX1
MOV TX0,RX0
MOV TX1,RX1
ERASE_ROM_T0:
CJNE A,#C51,ERASE_ROM_T1
AJMP ERASE_C51
ERASE_ROM_T1:
CJNE A,#S51,ERASE_ROM_T2
AJMP ERASE_S51
ERASE_ROM_T2:
AJMP _ERASE_20PINS
_ERASE_C51:
ACALL ERASE_C51
ACALL TX_PC
AJMP WAIT_COMM
_ERASE_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
INIT_WRITE:
MOV A,RX1
MOV TX0,RX0
MOV TX1,RX1
INIT_WRITE_T0:
CJNE A,#C51,INIT_WRITE_T1
AJMP INIT_WRITE_C51
INIT_WRITE_T1:
CJNE A,#S51,INIT_WRITE_T2
AJMP INIT_WRITE_S51
INIT_WRITE_T2:
AJMP _INIT_WRITE_20PINS
_INIT_WRITE_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
WRITE_ROM: MOV A,RX1
WRITE_ROM_T0:
CJNE A,#C51,WRITE_ROM_T1
AJMP WRITE_C51
WRITE_ROM_T1:
CJNE A,#S51,WRITE_ROM_T2
AJMP WRITE_S51
WRITE_ROM_T2:
AJMP _WRITE_20PINS
_WRITE_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
INIT_READ: SETB P3.0
MOV A,RX1
MOV TX0,RX0
MOV TX1,RX1
MOV ADDRESS_L,#00H
MOV ADDRESS_H,#00H
INIT_READ_C51:
CJNE A,#C51,INIT_READ_S51
SJMP INIT_READ_OVER
INIT_READ_S51:
CJNE A,#S51,INIT_READ_OVER
ACALL READY_PROG
INIT_READ_OVER:
ACALL TX_PC
CLR RI
JNB RI,$; 检查接收的一个字节,查询是否结束
MOV A,SBUF
CJNE A,#01H,READ_ROM;01表示结束
AJMP WAIT_COMM
READ_ROM: MOV A,RX1
MOV TX0,#06H
MOV TX1,RX1
READ_ROM_T0:
CJNE A,#C51,READ_ROM_T1
AJMP READ_C51
READ_ROM_T1:
CJNE A,#S51,READ_ROM_T2
AJMP READ_S51
READ_ROM_T2:
AJMP _READ_20PINS
_READ_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
LOCK_BIT: MOV TX1,RX1
MOV TX0,RX0
MOV A,RX1
LOCK_BIT_T0:
CJNE A,#C51,LOCK_BIT_T1
AJMP LOCK_BIT_C51
LOCK_BIT_T1:
CJNE A,#S51,LOCK_BIT_T2
AJMP LOCK_BIT_S51
LOCK_BIT_T2:
AJMP _LOCK_BIT_20PINS
_LOCK_BIT_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
READ_SIGN: MOV TX0,RX0
MOV TX1,RX1
MOV A,RX1
READ_SIGN_T0:
CJNE A,#C51,READ_SIGN_T1
AJMP READ_SIGN_C51
READ_SIGN_T1:
CJNE A,#S51,READ_SIGN_T2
AJMP READ_SIGN_S51
READ_SIGN_T2:
READ_SIGN_20PINS:
ACALL REPORT_INVALID
AJMP WAIT_COMM
;---------------------------------------------------------------
; FOR C51
;---------------------------------------------------------------
WRITE_C51:
MOV _R0,#RX2
MOV _R1,#TX2
WRITE_16BYTES_C51:
MOV R0,_R0
MOV PARAM0,@R0
ACALL _WRITE_C51
MOV R1,_R1
MOV @R1,RET0
MOV A,RET0
CJNE A,PARAM0,WRITE_RES_ERROR
INC _R0
INC _R1
ACALL INC_ADDRESS
MOV R0,_R0
CJNE R0,#RX17+1,WRITE_16BYTES_C51
AJMP WRITE_RES
WRITE_RES: MOV SBUF,#00H
CLR TI
JNB TI,$
CLR TI
AJMP WAIT_COMM
WRITE_RES_ERROR:
MOV SBUF,#0FFH
CLR TI
JNB TI,$
CLR TI
AJMP WAIT_COMM
INIT_WRITE_C51:
ACALL MODE_C51
MOV ADDRESS_L,#00H
MOV ADDRESS_H,#00H
ACALL TX_PC
AJMP WAIT_COMM
READ_C51:
MOV _R1,#TX2
READ_16BYTES_C51:
ACALL _READ_C51
MOV R1,_R1
MOV @R1,RET0
INC _R1
ACALL INC_ADDRESS
MOV R1,_R1
CJNE R1,#TX17+1,READ_16BYTES_C51
ACALL TX_PC
READ_NEXT_C51:
CLR RI
JNB RI,$; 检查接收的一个字节,查询是否结束
MOV A,SBUF
CJNE A,#01H,READ_C51;01表示结束
AJMP WAIT_COMM
_READ_C51:
SETB RST
ACALL SET_VPP5 ;设置成读状态 P3.6=H P3.7=H
SETB PROG ; P2.7=L P2.6=L
SETB P3.6
SETB P3.7
CLR P2.6
CLR P2.7
MOV R0,#0FH
DJNZ R0,$
MOV P1,ADDRESS_L
MOV A,#00111111B
ANL A,ADDRESS_H
MOV P2,A ;高地址
MOV P0,#0FFH ;读先置1
MOV R0,#05H
DJNZ R0,$
MOV A,P0
MOV RET0,A
RET
_WRITE_C51:
SETB PROG
SETB BUSY
SETB P2.7
CLR P2.6
SETB P3.7
SETB P3.6
MOV R0,#05H
DJNZ R0,$
MOV A,#10000000B
ORL A,ADDRESS_H
MOV P2,A
MOV A,ADDRESS_L
MOV P1,A
MOV A,PARAM0
MOV P0,A
MOV R0,#05H
DJNZ R0,$
ACALL SET_VPP12
MOV R0,#05H
DJNZ R0,$
CLR PROG
MOV R0,#05H
DJNZ R0,$
SETB PROG
MOV R0,#05H
DJNZ R0,$
MOV P0,#0FFH
MOV R3,#0FFH
MOV A,#00H
DET_BUSY: DJNZ R3,DET_B
AJMP DET_DATA;超时跳出到数据检测
DET_B: INC A
MOV RET2,A
MOV R0,#05H
DJNZ R0,$
JNB BUSY,DET_BUSY
DET_DATA: MOV R0,#0FFH
MOV P0,#0FFH
ACALL SET_VPP5
CLR P2.7
DET_D: DJNZ R0,DET_D2
AJMP WRITE_ERROR
DET_D2: MOV A,P0
CJNE A,PARAM0,DET_D
WRITE_SUC: MOV A,P0
MOV RET0,A
MOV RET1,#00H
RET
WRITE_ERROR:MOV A,P0
MOV RET0,A
ACALL MODE_C51
MOV RET1,#0FFH
RET
LOCK_BIT_C51:
ACALL MODE_C51
ACALL SET_VPP5
LOCK_BIT1_C51:
MOV A,RX2
CJNE A,#0FFH,LOCK_BIT2_C51
SETB PROG
SETB BUSY
SETB P2.7
SETB P2.6
SETB P3.7
SETB P3.6
MOV R0,#0FH
DJNZ R0,$
ACALL SET_VPP12
MOV R0,#0FH
DJNZ R0,$
CLR PROG
MOV R0,#0FH
DJNZ R0,$
SETB PROG
MOV R0,#0FH
DJNZ R0,$
ACALL SET_VPP5
LOCK_BIT2_C51:
MOV A,RX3
CJNE A,#0FFH,LOCK_BIT3_C51
SETB PROG
SETB BUSY
SETB P2.7
SETB P2.6
CLR P3.7
CLR P3.6
MOV R0,#0FH
DJNZ R0,$
ACALL SET_VPP12
MOV R0,#0FH
DJNZ R0,$
CLR PROG
MOV R0,#0FH
DJNZ R0,$
SETB PROG
MOV R0,#0FH
DJNZ R0,$
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -