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

📄 isp_mcu.asm

📁 Isp_w78e516_MCU.zip:-----W78E516B单片机的ISP在线下载的MCU端源程序(2500.A.D公司的X51.EXE)
💻 ASM
字号:
;******************************************************************************
;                         W78E516B单片机的ISP在线下载的MCU端源程序(ASM51)
;******************************************************************************
;设计人:田伯运
;e-mail:tianboyun@163.com
;版本号: V1.0
;编译软件:2500.A.D公司的X51.EXE
;******************************************************************************

         .chip 8052
         .ramchk OFF

;------------------------------------------------------------------------------
;definition for connecting to PC

DTR             EQU  AAh
DSR             EQU  BBh
RTS             EQU  CCh
CTS             EQU  DDh
OK              EQU  EEh
FAIL            EQU  FFh
ESC             EQU  27
;
;------------------------------------------------------------------------------

CHPENR          REG  F6h
SFRAL           REG  C4h
SFRAH           REG  C5h
SFRFD           REG  C6h
SFRCN           REG  C7h
CHPCON          REG  BFh

data            REG  30h
file_end_addrH  REG  31h
file_end_addrL  REG  32h
retL            REG  33h
retH            REG  34h
idle_time       REG  35h
TH0e            REG  36h
TL0e            REG  37h
TH0p            REG  38h
TL0p            REG  39h

chk_PC_flag     REG  20h.0

;?#############################################################################
         ORG    0000h
         JMP    start
         ORG    000Bh
         JMP    TF0_isr
start:
         MOV    SP,#7Fh
         CALL   connect_to_PC
start2:
         CALL   receive_data_from_PC2     ;make sure to enter ISP mode
         MOV    A,data                    ;
         CJNE   A,#5Ah,not_ISP            ;
         CALL   receive_data_from_PC2     ;
         MOV    A,data                    ;
         CJNE   A,#A5h,not_ISP            ;
         CALL   receive_data_from_PC2     ;
         MOV    A,data                    ;
         CJNE   A,#55h,not_ISP            ;
         CALL   receive_data_from_PC2     ;
         MOV    A,data                    ;
         CJNE   A,#AAh,not_ISP            ;
         JMP    ISP_mode
not_ISP:
         JMP    start
;
ISP_mode:
         MOV    CHPENR,#87h          ;enable CHPCON write attribute
         MOV    CHPENR,#59h          ;

         CALL   receive_data_from_PC2
         MOV    A,data
         CJNE   A,#'1',select_LDROM
 select_APROM:
         MOV    A,CHPCON
         JNB    A.7,illegal_select   ;CHPCON.7 should be 1, boot from 4K LDROM
         MOV    CHPCON,#03h          ;enable ISP, 64K APROM is re-programmed
         JMP    ISP_start
 select_LDROM:
         MOV    A,CHPCON
         JB     A.7,illegal_select   ;CHPCON.7 should be 0, boot from 64K APROM
         MOV    CHPCON,#01h          ;enable ISP, 4K LDROM is re-programmed
         JMP    ISP_start

illegal_select:
         MOV    data,#FAIL
         CALL   send_data_to_PC2
         JMP    start
;
ISP_start:
         MOV    data,#OK
         CALL   send_data_to_PC2

         CALL   receive_data_from_PC2
         MOV    file_end_addrL,data  ;file_end_addrL
         CALL   receive_data_from_PC2
         MOV    file_end_addrH,data  ;file_end_addrH

         MOV    IE,#10000010b        ;enable TF0 interrupt
         MOV    TMOD,#00100001b      ;Timer0: mode1, 16-bit timer for ISP
                                     ;Timer1: mode2, 8-bit auto-reload UART
;
;------------------------------------------------------------------------------
; Erase
;------------------------------------------------------------------------------
         MOV    A,CHPCON
         JB     A.1,erase_APROM
erase_LDROM:
         MOV    SFRCN,#62h           ;Erase 4K LDROM
         JMP    do_erase
erase_APROM:
         MOV    SFRCN,#22h           ;Erase 64K APROM
   do_erase:
;
erase:
         MOV    TH0,TH0e             ;Tpwe=15ms/(12/11.0592us)=13824
         MOV    TL0,TL0e             ;
         SETB   TR0                  ;
         MOV    PCON,#01h            ;enter idle mode
erase_ok:
;
;------------------------------------------------------------------------------
; Program
;------------------------------------------------------------------------------
         MOV    A,CHPCON
         JB     A.1,program_APROM
program_LDROM:
         MOV    SFRCN,#61h           ;Program 4K LDROM
         JMP    do_program
program_APROM:
         MOV    SFRCN,#21h           ;Program 64K APROM
   do_program:
;
         MOV    DPTR,#0000h
program:
         MOV    data,#OK
         CALL   send_data_to_PC2
         CALL   receive_data_from_PC2

         MOV    SFRAH,DPH            ;
         MOV    SFRAL,DPL            ;
         MOV    SFRFD,data           ;

         MOV    TH0,TH0p             ;Tpwp=50us/(12/11.0592us)=46
         MOV    TL0,TL0p             ;
         SETB   TR0                  ;
         MOV    PCON,#01h            ;enter idle mode

         MOV    A,DPH
         CJNE   A,file_end_addrH,inc_addrP
         MOV    A,DPL
         CJNE   A,file_end_addrL,inc_addrP
         JMP    program_ok
inc_addrP:
         INC    DPL
         MOV    A,DPL
         CJNE   A,#00h,program
         INC    DPH
         JMP    program
program_ok:
         MOV    data,#5Ah            ;tell PC: program complete!
         CALL   send_data_to_PC2     ;
;
;------------------------------------------------------------------------------
; Verify
;------------------------------------------------------------------------------
         MOV    A,CHPCON
         JB     A.1,verify_APROM
verify_LDROM:
         MOV    SFRCN,#40h           ;Verify 4K LDROM
         JMP    do_verify
verify_APROM:
         MOV    SFRCN,#00h           ;Verify 64K APROM
   do_verify:
;
         MOV    DPTR,#0000h
verify:
         CALL   receive_data_from_PC2

         MOV    SFRAH,DPH            ;
         MOV    SFRAL,DPL            ;

         MOV    TH0,#>(65536-46)     ;Tpwr=50us/(12/11.0592us)=46
         MOV    TL0,#<(65536-46)     ;
         SETB   TR0                  ;
         MOV    PCON,#01h            ;enter idle mode

         MOV    A,SFRFD
         CJNE   A,data,verify_err

         MOV    data,#OK
         CALL   send_data_to_PC2

         MOV    A,DPH
         CJNE   A,file_end_addrH,inc_addrV
         MOV    A,DPL
         CJNE   A,file_end_addrL,inc_addrV
         JMP    verify_ok
inc_addrV:
         INC    DPL
         MOV    A,DPL
         CJNE   A,#00h,verify
         INC    DPH
         JMP    verify
verify_ok:
         MOV    data,#A5h            ;tell PC: Verify complete!
         CALL   send_data_to_PC2     ;
         JMP    $
verify_err:
         MOV    data,#FAIL
         CALL   send_data_to_PC2
         JMP    start
;
;------------------------------------------------------------------------------
TF0_isr:
         JB     chk_PC_flag,TF0_isr_2
         CLR    TR0
         RETI
;
TF0_isr_2:
         DEC    idle_time
         MOV    A,idle_time
         JZ     time_out
         RETI
 time_out:
         MOV    SP,#7Fh
         CALL   disable_idle_chk
         MOV    A,#<exit             ;where to go if time out
         PUSH   A                    ;
         MOV    A,#>exit             ;
         PUSH   A                    ;
         RETI
;------------------------------------------------------------------------------
;
;******************************************************************************
; To connect to PC
;******************************************************************************
connect_to_PC:
         SETB   chk_PC_flag
 ;
 chk_11_0592MHz:
         CALL   init_UART_115200a
         MOV    idle_time,#14        ;wait 1sec to check if connect to PC?
       ; MOV    retL,#<chk_18_4320MHz
       ; MOV    retH,#>chk_18_4320MHz
         MOV    retL,#<chk_22_1184MHz
         MOV    retH,#>chk_22_1184MHz
         JMP    chk_connect_to_PC
 ;
 chk_18_4320MHz:
         CALL   init_UART_115200b
         MOV    idle_time,#23        ;wait 1sec to check if connect to PC?
         MOV    retL,#<chk_22_1184MHz
         MOV    retH,#>chk_22_1184MHz
         JMP    chk_connect_to_PC
 ;
 chk_22_1184MHz:
         CALL   init_UART_115200c
         MOV    idle_time,#28        ;wait 1sec to check if connect to PC?
       ; MOV    retL,#<chk_36_8640MHz
       ; MOV    retH,#>chk_36_8640MHz
         MOV    retL,#<chk_11_0592MHz
         MOV    retH,#>chk_11_0592MHz
         JMP    chk_connect_to_PC
 ;
 chk_36_8640MHz:
         CALL   init_UART_115200d
         MOV    idle_time,#47        ;wait 1sec to check if connect to PC?
         MOV    retL,#<chk_40_5504MHz
         MOV    retH,#>chk_40_5504MHz
         JMP    chk_connect_to_PC
 ;
 chk_40_5504MHz:
         CALL   init_UART_115200e
         MOV    idle_time,#52        ;wait 1sec to check if connect to PC?
         MOV    retL,#<chk_11_0592MHz
         MOV    retH,#>chk_11_0592MHz
         JMP    chk_connect_to_PC
;
chk_connect_to_PC:
         CALL   enable_idle_chk      ;
 wait_5A_from_PC:
         CALL   send_DSR_to_PC
         JBC    RI,data_rcvd
         JMP    wait_5A_from_PC
 data_rcvd:
         MOV    A,SBUF
         CJNE   A,#5Ah,wait_5A_from_PC

         MOV    data,#A5h
         CALL   send_data_to_PC

         CALL   disable_idle_chk     ;
         CLR    chk_PC_flag          ;
         JMP    start2
 exit:
         CLR    REN                  ;disable reception
         PUSH   retL                 ;where to go if time out
         PUSH   retH                 ;
         RET
;
;;;
;set Baudrate using Timer2, fosc=11.0592 MHz
;BaudRate=fosc/2/(65536-RCAP2H,L)/16

init_UART_115200a: ;@11.0592MHz
         MOV    TH0e,#>(65536-13824) ;Tpwe=15ms/(12/11.0592us)=13824
         MOV    TL0e,#<(65536-13824) ;
         MOV    TH0p,#>(65536-46)    ;Tpwp=50us/(12/11.0592us)=46
         MOV    TL0p,#<(65536-46)    ;

         MOV    SCON,#01010000b      ;Serial port mode 1: 8-bit UART
         MOV    T2CON,#00110000b     ;Timer2: B.R.G. mode
         CLR    TR2
         MOV    RCAP2H,#>(65536-3)   ;Baudrate=115200 bps, @11.0592MHz
         MOV    RCAP2L,#<(65536-3)   ;
         SETB   TR2
         RET
;
init_UART_115200b: ;@18.4320MHz
         MOV    TH0e,#>(65536-23040) ;Tpwe=15ms for ISP
         MOV    TL0e,#<(65536-23040) ;
         MOV    TH0p,#>(65536-77)    ;Tpwp=50us for ISP
         MOV    TL0p,#<(65536-77)    ;

         MOV    SCON,#01010000b      ;Serial port mode 1: 8-bit UART
         MOV    T2CON,#00110000b     ;Timer2: B.R.G. mode
         CLR    TR2
         MOV    RCAP2H,#>(65536-5)   ;Baudrate=115200 bps, @18.4320MHz
         MOV    RCAP2L,#<(65536-5)   ;
         SETB   TR2
         RET
;
init_UART_115200c: ;@22.1184MHz
         MOV    TH0e,#>(65536-27648) ;Tpwe=15ms for ISP
         MOV    TL0e,#<(65536-27648) ;
         MOV    TH0p,#>(65536-92)    ;Tpwp=50us for ISP
         MOV    TL0p,#<(65536-92)    ;

         MOV    SCON,#01010000b      ;Serial port mode 1: 8-bit UART
         MOV    T2CON,#00110000b     ;Timer2: B.R.G. mode
         CLR    TR2
         MOV    RCAP2H,#>(65536-6)   ;Baudrate=115200 bps, @22.1184MHz
         MOV    RCAP2L,#<(65536-6)   ;
         SETB   TR2
         RET
;
init_UART_115200d: ;@36.8640MHz
         MOV    TH0e,#>(65536-46080) ;Tpwe=15ms for ISP
         MOV    TL0e,#<(65536-46080) ;
         MOV    TH0p,#>(65536-154)   ;Tpwp=50us for ISP
         MOV    TL0p,#<(65536-154)   ;

         MOV    SCON,#01010000b      ;Serial port mode 1: 8-bit UART
         MOV    T2CON,#00110000b     ;Timer2: B.R.G. mode
         CLR    TR2
         MOV    RCAP2H,#>(65536-10)  ;Baudrate=115200 bps, @36.8640MHz
         MOV    RCAP2L,#<(65536-10)  ;
         SETB   TR2
         RET
;
init_UART_115200e: ;@40.5504MHz
         MOV    TH0e,#>(65536-50688) ;Tpwe=15ms for ISP
         MOV    TL0e,#<(65536-50688) ;
         MOV    TH0p,#>(65536-169)   ;Tpwp=50us for ISP
         MOV    TL0p,#<(65536-169)   ;

         MOV    SCON,#01010000b      ;Serial port mode 1: 8-bit UART
         MOV    T2CON,#00110000b     ;Timer2: B.R.G. mode
         CLR    TR2
         MOV    RCAP2H,#>(65536-11)  ;Baudrate=115200 bps, @40.5504MHz
         MOV    RCAP2L,#<(65536-11)  ;
         SETB   TR2
         RET
;
;;;
enable_idle_chk:
         MOV    TMOD,#00100001b      ;Timer1: mode2, 8-bit auto-reload
                                     ;Timer0: mode1, 16-bit timer
         MOV    TH0,#0               ;65536*12/11.0592us=71.5ms/intrpt.
         MOV    TL0,#0               ;
         SETB   TR0                  ;
         SETB   ET0                  ;enable TF0 interrupt
         SETB   EA                   ;
         RET
;
disable_idle_chk:
         CLR    ET0                  ;disable TF0 interrupt
         CLR    EA                   ;
         CLR    TR0                  ;turn off Timer0
         RET
;------------------------------------------------------------------------------
send_data_to_PC:
         CALL   wait_RTS_from_PC     ;wait, until PC is ready to receive data
         MOV    SBUF,data            ;send data to PC
         JNB    TI,$
         CLR    TI
         RET
;
send_data_to_PC2:
         MOV    SBUF,data            ;send data to PC
         JNB    TI,$
         CLR    TI
         RET
;------------------------------------------------------------------------------
receive_data_from_PC:
         CALL   send_DSR_to_PC       ;tell PC: 8051 is ready to receive data
         JNB    RI,$                 ;receive data from PC
         CLR    RI
         MOV    data,SBUF
         RET
;
receive_data_from_PC2:
         JNB    RI,$                 ;receive data from PC
         CLR    RI
         MOV    data,SBUF
         RET
;------------------------------------------------------------------------------
wait_DTR_from_PC:
         JNB    RI,$
         CLR    RI
         MOV    A,SBUF
         CJNE   A,#DTR,wait_DTR_from_PC
         RET
;------------------------------------------------------------------------------
wait_RTS_from_PC:
         JNB    RI,$
         CLR    RI
         MOV    A,SBUF
         CJNE   A,#RTS,wait_RTS_from_PC
         RET
;------------------------------------------------------------------------------
send_DSR_to_PC:
         MOV    SBUF,#DSR
         JNB    TI,$
         CLR    TI
         RET
;------------------------------------------------------------------------------
send_CTS_to_PC:
         MOV    SBUF,#CTS
         JNB    TI,$
         CLR    TI
         RET
;******************************************************************************
;
         END

⌨️ 快捷键说明

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