?? isp_mcu.asm
字號(hào):
;******************************************************************************
; W78E516B單片機(jī)的ISP在線下載的MCU端源程序(ASM51)
;******************************************************************************
;設(shè)計(jì)人:田伯運(yùn)
;e-mail:tianboyun@163.com
;版本號(hào): 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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -