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

📄 e51p.asm

📁 AT89S51芯片的日渐流行
💻 ASM
📖 第 1 页 / 共 2 页
字号:
            ACALL   SET_VPP5
LOCK_BIT3_C51:
            MOV     A,RX4
            CJNE    A,#0FFH,LOCK_BIT_C51_RET
            SETB    PROG
            SETB    BUSY
            CLR     P2.7
            SETB    P2.6
            CLR     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_BIT_C51_RET:
            ACALL   MODE_C51
            MOV     TX0,RX0
            MOV     TX1,RX1
            MOV     TX2,RX2
            MOV     TX3,RX3
            MOV     TX4,RX4
            ACALL   TX_PC
            AJMP    WAIT_COMM


READ_SIGN_C51:
            MOV      ADDRESS_H,#00H
            MOV      ADDRESS_L,#30H
            ACALL    _READ_SIGN_C51
            MOV      TX2,RET0
            MOV      ADDRESS_L,#31H
            ACALL    _READ_SIGN_C51
            MOV      TX3,RET0
            MOV      ADDRESS_L,#32H
            ACALL    _READ_SIGN_C51
            MOV      TX4,RET0
READ_SIGN_C51_RET:
            ACALL    MODE_C51
            ACALL    TX_PC
            AJMP     WAIT_COMM

_READ_SIGN_C51:
            SETB    RST
            ACALL   SET_VPP5       ;设置成读SIGN状态 P3.6=L P3.7=L
            SETB    PROG           ;                 P2.7=L P2.6=L
            CLR     P3.6
            CLR     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,#0FH
            DJNZ    R0,$
            MOV     A,P0
            MOV     RET0,A
            RET

ERASE_C51:
            SETB    PROG
            SETB    P2.6
            CLR     P2.7
            CLR     P3.7
            CLR     P3.6
            ACALL   SET_VPP12
            MOV     R0,#02H
            ACALL   DELAY
            CLR     PROG
            MOV     R0,#10H
            ACALL   DELAY
            SETB    PROG
            ACALL   MODE_C51
            ACALL   TX_PC
            AJMP    WAIT_COMM

VPP_5V:     ACALL   SET_VPP5
            ACALL   TX_PC
            AJMP    WAIT_COMM
VPP_12V:    ACALL   SET_VPP12
            ACALL   TX_PC
            AJMP    WAIT_COMM

SET_VPP12:  SETB    VPP_12
            JNB     F_VPP,WAIT_VPP12
            RET
WAIT_VPP12: MOV     R0,WAIT_VOL
            DJNZ    R0,$
            SETB    F_VPP
            RET
SET_VPP5:   CLR     VPP_12
            JB      F_VPP,WAIT_VPP5
            RET
WAIT_VPP5:  MOV     R0,WAIT_VOL
            DJNZ    R0,$
            CLR     F_VPP
            RET

MODE_C51:   ACALL   SET_VPP5
            SETB    RST
            SETB    PROG
            MOV     P0,#0FFH
            SETB    P3.6
            SETB    P3.7
            CLR     P2.7
            CLR     P2.6
            MOV     P2,#00000000B
            MOV     P1,#0FFH
            RET

INC_ADDRESS:MOV     R0,ADDRESS_L
            MOV     R1,ADDRESS_H
            CJNE    R0,#0FFH,INC_LADDR
INC_HADDR:  MOV     R0,#00H
            INC     R1
            SJMP    RET_ADDR
INC_LADDR:  INC     R0
RET_ADDR:   MOV     ADDRESS_L,R0
            MOV     ADDRESS_H,R1
            RET
;------------------------------------------------------------
;           FOR     AT89S51
;------------------------------------------------------------
ERASE_S51:  ACALL  READY_PROG
            MOV    SOUT1,#10101100B
            MOV    SOUT2,#10000000B
            ACALL  SCK_INSTRUC
            MOV    R0,#255
            ACALL  DELAY
            MOV    R0,#255
            ACALL  DELAY
            ACALL  MODE_S51
            ACALL  TX_PC
            AJMP   WAIT_COMM

INIT_WRITE_S51:
            MOV      ADDRESS_L,#00H
            MOV      ADDRESS_H,#00H
            ACALL    READY_PROG
            ACALL    TX_PC
            AJMP     WAIT_COMM

WRITE_S51:  MOV     _R0,#RX2
            MOV     _R1,#TX2
WRITE_16BYTES_S51:
            MOV     R0,_R0
            MOV     PARAM0,@R0
            ACALL   _WRITE_S51
            MOV     R1,_R1
            MOV     @R1,RET0
            MOV     A,RET0
            CJNE    A,PARAM0,WRITE_S51_RES_ERROR
            INC     _R0
            INC     _R1
            ACALL   INC_ADDRESS
            MOV     R0,_R0
            CJNE    R0,#RX17+1,WRITE_16BYTES_S51
WRITE_S51_RES:
            MOV      SBUF,#00H
            CLR      TI
            JNB      TI,$
            CLR      TI
            AJMP     WAIT_COMM
WRITE_S51_RES_ERROR:
            MOV      SBUF,#0FFH
            CLR      TI
            JNB      TI,$
            CLR      TI
            ACALL    MODE_S51
            AJMP     WAIT_COMM
_WRITE_S51:
            MOV      SOUT1,#01000000B
            MOV      SOUT2,ADDRESS_H
            MOV      SOUT3,ADDRESS_L
            MOV      SOUT4,PARAM0
            ACALL    SCK_INSTRUC
            MOV      RET0,PARAM0
            MOV      R0,#1
            ACALL    DELAY
            RET

READ_S51:   MOV     _R1,#TX2
READ_16BYTES_S51:
            ACALL   _READ_S51
            MOV     R1,_R1
            MOV     @R1,RET0
            INC     _R1
            ACALL   INC_ADDRESS
            MOV     R1,_R1
            CJNE    R1,#TX17+1,READ_16BYTES_S51
            ACALL   TX_PC
READ_NEXT_S51:
            CLR     RI
            JNB     RI,$;   检查接收的一个字节,查询是否结束
            MOV     A,SBUF
            CJNE    A,#01H,READ_S51;01表示结束
            ACALL   MODE_S51
            AJMP    WAIT_COMM

_READ_S51:  MOV     SOUT1,#00100000B
            MOV     SOUT2,ADDRESS_H
            MOV     SOUT3,ADDRESS_L
            MOV     SOUT4,#00
            ACALL   SCK_INSTRUC
            MOV     RET0,SIN4
            RET

LOCK_BIT_S51:
            ACALL  READY_PROG
            MOV    SOUT1,#10101100B
            MOV    SOUT2,#11100000B
            MOV    SOUT3,#00000000B
            MOV    SOUT4,#00000000B
LOCK_BIT1_S51:
            MOV    A,RX2
            CJNE   A,#0FFH,LOCK_BIT2_S51
            MOV    SOUT2,#11100001B
            ACALL  SCK_INSTRUC
            MOV    R0,#1
            ACALL  DELAY
LOCK_BIT2_S51:
            MOV    A,RX3
            CJNE   A,#0FFH,LOCK_BIT3_S51
            MOV    SOUT2,#11100010B
            ACALL  SCK_INSTRUC
            MOV    R0,#1
            ACALL  DELAY
LOCK_BIT3_S51:
            MOV    A,RX4
            CJNE   A,#0FFH,_LOCK_BIT_S51
            MOV    SOUT2,#11100011B
            ACALL  SCK_INSTRUC
            MOV    R0,#1
            ACALL  DELAY
_LOCK_BIT_S51:
            ACALL  MODE_S51
            ACALL  TX_PC
            AJMP   WAIT_COMM

READ_SIGN_S51:
            ACALL  READY_PROG
            MOV    SOUT1,#00101000B
            MOV    SOUT2,#00000000B
            MOV    SOUT3,#00000000B
            ACALL  SCK_INSTRUC
            MOV    TX2,SIN4
            MOV    SOUT1,#00101000B
            MOV    SOUT2,#00000001B
            MOV    SOUT3,#00000000B
            ACALL  SCK_INSTRUC
            MOV    TX3,SIN4
            MOV    SOUT1,#00101000B
            MOV    SOUT2,#00000010B
            MOV    SOUT3,#00000000B
            ACALL  SCK_INSTRUC
            MOV    TX4,SIN4
            ACALL  MODE_S51
            ACALL  TX_PC
            AJMP   WAIT_COMM

MODE_S51:   ACALL  INIT_PIN
            CLR    SCK
            SETB   MISO
            CLR    MOSI
            RET

READY_PROG: ACALL  MODE_S51
            SETB   RST
            MOV    R0,#10
            ACALL  DELAY
            MOV    SOUT1,#10101100B
            MOV    SOUT2,#01010011B
            MOV    SOUT3,#00
            MOV    SOUT4,#00
            ACALL  SCK_INSTRUC
            RET

SCK_INSTRUC:CLR    MOSI
            SETB   MISO
            MOV    SOUT,SOUT1
            ACALL  SCK_BYTE
            MOV    SIN1,SIN
            MOV    SOUT,SOUT2
            ACALL  SCK_BYTE
            MOV    SIN2,SIN
            MOV    SOUT,SOUT3
            ACALL  SCK_BYTE
            MOV    SIN3,SIN
            MOV    SOUT,SOUT4
            ACALL  SCK_BYTE
            MOV    SIN4,SIN
            RET

SCK_BYTE:   CLR    SCK
            MOV    C,SOUT.7
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.7,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.6
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.6,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.5
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.5,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.4
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.4,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.3
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.3,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.2
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.2,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.1
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.1,C
            CLR    SCK
            CLR    SCK
            MOV    C,SOUT.0
            MOV    MOSI,C
            NOP
            SETB   SCK
            NOP
            MOV    C,MISO
            MOV    SIN.0,C
            CLR    SCK
            RET


;------------------------------------------------------------
;           GOBAL SUB PROCESSES
;------------------------------------------------------------
SET_WAIT:   MOV     A,RX1    ;设置电压转换所用的时间WAIT_VOL*2 US
            MOV     WAIT_VOL,A
            MOV     TX1,A
            MOV     TX2,A
            ACALL   TX_PC
            AJMP    WAIT_COMM

TX_PC:      MOV     R0,#TX0
TX_BYTE:    CLR     TI
            MOV     A,@R0
            MOV     SBUF,A
            INC     R0
            JNB     TI,$
            CJNE    R0,#TX17+1,TX_BYTE
            CLR     TI
            RET

RX_PC:      SETB    P3.0
            MOV     R0,#RX0
RX_BYTE:    CLR     RI
            JNB     RI,$
            MOV     A,SBUF
            MOV     @R0,A
            INC     R0
            CJNE    R0,#RX17+1,RX_BYTE
            CLR     RI
            RET

DELAY:      MOV     R1,#0FBH        ;延时R0*MS
            MOV     R2,#0FBH
            DJNZ    R1,$
            DJNZ    R2,$
            DJNZ    R0,DELAY
            RET

INIT_PIN:   CLR     VPP
            CLR     RST
            SETB    BUSY
            SETB    PROG
            MOV     P0,#0FFH
            MOV     P1,#0FFH
            MOV     P2,#0FFH
            SETB    P3.7
            SETB    P3.6
            RET
REPORT_ERROR:
            MOV     TX0,#0FFH
            ACALL   TX_PC
            RET
REPORT_INVALID:
            MOV     TX0,#0F0H
            ACALL   TX_PC
            RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -