📄 w2a.asm
字号:
;71H和R7动态延时 78H:
;7CH接收的高位地址
;7DH接收的低位地址
;R2,R3 CALL DELAY
;R4,R5 初始化指示灯闪动的次数
;R6 小延时参数
;R7 擦除次数
;R0 16字节指针
ORG 0000H
AJMP START
ORG 0030H
START:
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
acall init ; clr p3.4
MOV 20H,#00 ;位地址:00~07
ANL PCON,#7FH ;SMOD=0,OTHER=RESET
MOV SCON,#70h ;串口方式0
MOV TMOD,#21h ;T0定时,T1计数
MOV TL1,#0FDH ;波特率,9600,4800,2400,1200
MOV TH1,#0FDH ; 0FDH,0FAH,0F4H,0E8H
MOV IE,#00000000B ;EA - ET2 ES ET1 EX1 ET0 EX0
SETB TR1 ;启动定时器1,波特率
MOV R0,#0 ;数据指针
MOV R7,#02 ;acall delay 的次数
mov dph,#0 ;mov dptr,#0
mov dpl,#0
CLR F0 ;89s51与89c51工作标志
MAIN: jnb RI,$ ;等待接收串口数据
CLR RI
MOV A,SBUF
CJNE A,#01H,N01
AJMP R2864 ;=R2764
N01: CJNE A,#04H,N04
AJMP R89S51
N04: CJNE A,#05H,N05
AJMP R8951
N05: CJNE A,#06H,N06
AJMP R8952
N06: CJNE A,#07H,N07
AJMP R2051
N07: CJNE A,#08H,N08
AJMP R89S53
N08: CJNE A,#11H,N11
AJMP W2764
N11: CJNE A,#12H,N12
AJMP W2864
N12: CJNE A,#14H,N14
AJMP W89S51
N14: CJNE A,#15H,N15
AJMP W8951
N15: CJNE A,#16H,N16
AJMP W8952 ;大小由发送的长度控制
N16: CJNE A,#17H,N17
AJMP W2051
N17: CJNE A,#18H,N18
AJMP W89s53
N18: CJNE A,#24H,N24
AJMP E89S51
N24: CJNE A,#25H,N25
AJMP E8951
N25: CJNE A,#26H,N26
AJMP E8952
N26: CJNE A,#27H,N27
AJMP E2051
N27: CJNE A,#28H,N28
AJMP E89s53
N28: AJMP 0000
;89s51 要求p25->p33为0,做为地址线,它就是0。89s53是A13,控制没要求。
R89S53: MOV 7DH,#40H ;16K
AJMP R895X
R89S52:
R8952: MOV 7DH,#20H ;4K
AJMP R895x
R89S51:
R8951: MOV 7DH,#10H ;8K
R895x: ACALL R89CW ;控制:读是电平,写是下沿p33
R895y: MOV P1,DPL
MOV P2,DPH
MOV A,P0
ACALL SEND ;发送的同时inc DPTR
mov A,#0
cjne a, dpl,R895Y ;一次发送256个
acall read ;计算机是收到必发
MOV A,7DH
CJNE A,DPH,R895X
LJMP START
R89CW:
SETB P3.5 ;Vpp=5v
SETB P3.2 ;去掉高压
; CLR P2.6 ;在送地址的时候,P2口 这两位就是0.
; CLR P2.7 ;读控制信号 P2.6,P2.7,P3.6,P3.7,/PROG(30)
SETB P3.6 ; L , L , H , H , H
SETB P3.7 ;
SETB P3.3 ;ALE/PROG=5V
MOV P0,#0FFH
RET
;---------------------------------------------
W89S53: SETB 00H ; 20H.0 ;控制字无p33,但A13=p25. 其控制与89c51和89s8251类似
sjmp w8951
w89s52:
W89S51: SETB F0 ;S51和s52相同
W8952:
W8951: ACALL E895 ;擦除IC 写8951和8952
mov a,#5Ah ;要高位
ACALL receive ;先发再收
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
;
W895x: mov a,#5Ch ;要数据
ACALL RECEIVE16 ;接收数据
MOV R0,#50H;
W89a: ;CLR P2.7 ;读控制
MOV A,@R0
cjne A,#0FFH,WORK
SJMP OK
WORK:
SETB P3.3 ;ALE/P=H 每次写完,就应该是1。
SETB P3.5 ;EA/VP=5V
SETB P3.6 ;
SETB P3.7 ;
MOV P0,A ;data ;ACALL XDY
MOV P1,DPL ;低地址
MOV P2,DPH ;高地址
JB 00H,Y89S53 ;复位时为0,89s53的p25是地址A13,不能置
SETB P2.5 ;接入p33, S51要,c51和s53没要求
Y89S53: ;写控制信号 P26 P27 p33 P36 P37 Vpp p26做为地址,就是0.
SETB P2.7 ;ENABLE L H H H H 12v
CLR P3.2 ;Vpp=12v
nop ;准备写
CLR P3.3 ;ALE/PROG=L 下沿锁存,写开始
nop ;~\/~ acall delay ;写过程
SETB P3.3 ;ALE/P=H 停止写
nop;
JB F0, AUTO
ACALL DELAY ;延时方式
SJMP AAA
AUTO: JNB P3.4,$ ;增加判断,保证写入; SETB P3.5
AAA: SETB P3.2 ;Vpp=5V
clr p2.5
CLR P2.7 ;可以读了 读是电平控制
MOV P0,#0FFH ;准备读
MOV B,P0 ;读
CJNE A,B,W89a ;比较,不等继续写
OK: INC R0
INC DPTR ;地址加1
CJNE R0,#60H,W89a
MOV A,7CH ;取结束地址
CJNE A,DPH,W895X ;不等转W895x
MOV A,7DH
CJNE A,DPL,W895X
MOV A,#5DH ;送结束信号
ACALL SEND
LJMP START
;--------------------------------
E2051: mov 71H,#02; 延时
EE20:
ACALL INIT2051 ;初始化2051
ACALL E205 ;擦除IC
MOV P1,#0
MOV P2,#0
ACALL W20CW ;发读控制字
MOV A,P0
cjne a,#0FFh,EEE20 ;空了吗?
MOV A,#5DH; ;发ok!信息
ACALL SEND;
AJMP start;
EEE20: inc 71h
mov r7,71h
cjne r7,#09,EE20 ;再擦
MOV A,#5EH; ;发不可擦信息
ACALL SEND;
AJMP START;
;--------------------------------
E89S51: SETB F0
E89S52: SETB F0
E89S53: SETB F0
E8951:
E8952: mov 71H,#03 ;延时
EE51: ACALL E895 ;擦除
ACALL R89CW ;读控制字
MOV P1,#0 ;送地址
MOV P2,#0
MOV A,P0 ;读数据
cjne A,#0FFH,erase ;空了吗?
MOV A,#5DH;
ACALL SEND;
AJMP 0000H;
erase: inc 71h
mov r7,71h
cjne r7,#09,EE51 ;再擦
MOV A,#5EH;
ACALL SEND;
AJMP 0000H;
;---------------------------------
E895: SETB P3.3 ;擦除控制字 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
SETB P3.5 ; HLH , H , L , L , L ,12v
SETB P2.5 ;P2.5接P2.5和P3.3 89s51 要求
SETB P2.6
CLR P2.7
CLR P3.6
CLR P3.7 ;acall xdy
CLR P3.2 ;Vpp=12v
nop
CLR P3.3 ;脉冲L
nop ;~\/~
nop
;SETB P3.3
JB F0, xy
xx: ACALL DELAY ;延时方式
djnz r7,xx
SETB P3.3
sjmp Eback
xy: SETB P3.3 ;脉冲H ;acall xdy
JNB P3.4, $ ;判脉冲方式
Eback: SETB P3.2 ;去掉高压5V
RET
;---------------------------------------------
INIT2051:CLR P3.5 ;上电(RST L->H )
SETB P3.2 ;
CLR P2.6 ;XTAL1=0
ACALL DELAY ;10ms
SETB P3.5
RET
;---------------------------------------------
R2051: ACALL INIT2051
A2051: ACALL R20CW
MOV A,P0
ACALL SEND
SETB P2.6 ;地址加1
CLR P2.6 ;XTAL1
mov A,#0
cjne a, dpl,A2051 ;一次发送256个
acall read
MOV A,DPH
CJNE A,#08,A2051 ;2K
LJMP START
;---------------------------------------------
R20CW:SETB P3.5 ;读控制信号 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
SETB P3.2 ; H , H , L , L , H , H
SETB P2.2 ; O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.3
CLR P2.4
SETB P2.5
SETB P2.0
MOV P0,#0FFH
RET
;---------------------------------------------
W2051: ACALL INIT2051 ;初始化2051
ACALL E205 ;擦除IC
mov a,#5Ah ;要高位
ACALL receive
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
WW20: mov a,#5Ch ;要数据
ACALL RECEIVE16 ;
mov R0,#50H
W20a:
MOV A,@R0
MOV P0,A
CJNE A,#0FFH,WORK1
SJMP OK1
WORK1:
ACALL W20CW ;写控制字
ACALL DELAY ;写过程
; jnb p2.1,$ ; SETB P2.2 ;/P=H
ACALL R20CW ;读控制字
mov P0,#0ffh
MOV B,P0
CJNE A,B,W20A ;校验
OK1: SETB P2.6 ;地址加1
CLR P2.6 ;XTAL1
INC R0
INC DPTR ;计数器加1
CJNE R0,#60H,W20A ;页内写
MOV A,DPH
CJNE A,7CH,WW20 ;再去接收
MOV A,DPL
CJNE A,7DH,WW20
MOV A,#5DH ;送结束信号
ACALL SEND
LJMP START
;---------------------------------------------
W20CW: SETB P3.5 ;写控制信号 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
CLR P3.2 ; 12V, H->L->H , L , H , H , H
SETB P2.2 ; O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.2 ;/PROG=L
CLR P2.3
SETB P2.4
SETB P2.5
SETB P2.0
RET
;---------------------------------------------
E205: SETB P3.5 ;擦除控制字 RST,P3.2/PROG,P3.3,P3.4,P3.5,P3.7
CLR P3.2 ; 12v, H->L->H , H , L , L , L
SETB P2.2 ;/PROG=H O2, P2.2 ,P2.3,P2.4,P2.5,P2.0
CLR P2.2 ;/PROG=L
SETB P2.3
CLR P2.4
CLR P2.5
CLR P2.0
xxx: ACALL DELAY
djnz r7,xxx
; ACALL DELAY ;延时10ms
SETB P2.2 ;/PROG=H
RET
;---------------------------------
SEND: MOV SBUF,A ;发送数据
JNB TI,$
CLR TI
INC DPTR ;地址加1
RET
;
RECEIVE: MOV SBUF,A; #5AH
JNB TI,$
CLR TI
READ: JNB RI,$
CLR RI
MOV A,SBUF ;接收数据
RET
RECEIVE16: MOV SBUF,A; #5AH
JNB TI,$
CLR TI
mov R0,#50H
READ16: JNB RI,$
CLR RI
MOV A,SBUF ;接收数据
MOV @R0,A
INC R0
CJNE R0,#60H,READ16;
RET
;--------------------------------
DELAY: MOV R2,#0AH ;延时10ms
DEL1: MOV R3,#80H
DEL2: NOP
DJNZ R3,DEL2
DJNZ R2,DEL1
RET
xdy: MOV R6,#05H
DJNZ r6,$ ;delay 48T
ret
ydy: MOV R6,#64H
DJNZ r6,$ ;delay 48T
ret
init:mov r5,#10H ;闪动次数
inix: mov r4,#10H
dly: call delay
djnz r4,dly
cpl p3.4
djnz r5,inix;
setb p3.4
ret
;===========================================
R2864: MOV P1,DPL
MOV P2,DPH
ACALL R64CW
MOV A,P0
LCALL SEND
MOV A,#0
CJNE A,DPL,R2864 ;相当于一次接收256字节
ACALL READ ;接收值无用,准备发送下一组数据。
MOV A,DPH
CJNE A,#20H,R2864 ;8K
LJMP 0000H
;-----------------------------------
W2864: SETB F0 ;RESET F0=0
W2764: mov a,#5Ah ;要高位
ACALL receive ;先发再收
mov 7ch,a ;高位
mov a,#5Bh ;要低位
acall receive
mov 7dh,a ;低位
W64x: mov a,#5CH ;要数据
ACALL RECEIVE16 ;接收数据
MOV R0,#50H ;缓冲区 50-5F
V264: MOV A,@R0 ;取数据
MOV P1,DPL ;送地址
MOV P2,DPH
LCALL R64CW ;发读控制字
MOV P0,#0FFH
MOV B,P0 ;读
CJNE A,B,W2x64 ;不等才写
AJMP A64 ;相等跳过
W2x64: MOV P0,A
ACALL W64CW ;写状态,并锁存数据
acall delay ;
ACALL R64CW ;发读控制字
acall ydy ;
MOV P0,#0FFH
MOV B,P0 ;读
CJNE A,B,W2x64 ;不等再写
;
A64: INC DPTR ;地址加1
INC R0 ;数据区指针加1
CJNE R0,#60H,V264 ;要完成16个数据的写入
MOV A,DPH
CJNE A,7CH,W64x ;8K
MOV A,DPL
CJNE A,7DH,W64x ;请求发送下16个数据
MOV A,#5DH ;结束标志
LCALL SEND
LJMP 0000H
;
R64CW: CLR P3.7 ;-CS
SETB P2.6 ;2764:-PRG 2864:-WE
CLR P3.3 ;-OE=0 ; SETB P2.7 ;Vpp=5V
SETB P3.2 ;关闭高压 ; SETB P3.5 ;没用
RET
W64CW: ;SETB P2.7 ;1脚 Vpp 准备送电压
SETB P3.3 ;-OE=H; SETB P3.5 ;有反向2极管引入1脚。这里没什么用.
SETB P3.2 ;关闭高压
CLR P3.7 ;-CS=0
JB F0,NH ;2864不用12V
CLR P3.2 ;Vpp=12V (原是P33)
NH: CLR P2.6 ;2764:-PGM=0, 2864:-WE 写控制信号
RET
END;
;-------------------------------------------------
; 2764 2864A 8951
; P32 ┌──┬──┐ ┌──┬──┐ ┌──┬──┐
; P35 Vpp│1 28│+5V NC│1 28│+5V P1.0 ┤1 40├ VCC
; A12│2 P26 27│-PGM A12│2 27│-WE P1.1 ┤2 39├ P0.0
; A7│3 26│NC A7│3 26│NC P1.2 ┤3 38├ P0.1
; A6│4 25│A8 A6│4 25│A8 P1.3 ┤4 37├ P0.2
; A5│5 24│A9 A5│5 24│A9 P1.4 ┤5 36├ P0.3
; A4│6 23│A11 A4│6 23│A11 P1.5 ┤6 35├ P0.4
; A3│7 P33 22│-OE A3│7 22│-OE P1.6 ┤7 34├ P0.5
; A2│8 21│A10 A2│8 21│A10 P1.7 ┤8 33├ P0.6
; A1│9 P37 20│-CS A1│9 20│-CS RST ┤9 5V 32├ P0.7
; A0│10 19│D7 A0│10 19│D7 RXD P3.0 ┤10 (P32)31├ -EA/VP
; D0│11 18│D6 D0│11 18│D6 TXD P3.1 ┤11 P33 30├ ALE/-PRG
; D1│12 17│D5 D1│12 17│D5 -INT0 P3.2 ┤12 接地29├ -PSEN
; D2│13 16│D4 D2│13 16│D4 -INT1 P3.3 ┤13 28├ P2.7
; 地│14 15│D3 地│14 15│D3 T0 P3.4 ┤14 27├ P2.6
; └─────┘ └─────┘ T1 P3.5 ┤15 26├ P2.5
; -WR P3.6 ┤16 25├ P2.4
; 读:-CE=0 -OE=0 -WE=H -RD P3.7 ┤17 24├ P2.3
; 写:-CE=0 -OE=H -WE=0 XTAL2 ┤18 out 23├ P2.2
; 2764: VPP=12V~13V VCC=5.75~6.5 XTAL1 ┤19 in 22├ P2.1
; 2864: 脚1 空 区别只是无高压 VSS ┤20 21├ P2.0
; └─────┘
;================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -