📄 w2b.asm
字号:
;71H和R7动态延时 78H:
;7CH接收的高位地址
;7DH接收的低位地址
;R2,R3 CALL DELAY
;R4,R5 初始化指示灯闪动的次数
;R6 小延时参数
;R7 擦除次数
;R0 16字节指针
ORG 0000H
LJMP START
ORG 0030H
START:
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
acall init ; clr p3.4
MOV 20H,#00 ;清位存储区
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
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 ;计算机是收到必发
CJNE A,#6BH,AGRD
LJMP START ;比较出错,让其退出。
AGRD:
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 P0,#0FFH
; ACALL DELAY
MOV A,P0
cjne a,#0FFH,erase ;空了吗?
MOV A,#5DH;
ACALL SEND;
AJMP start;
erase: inc 71h
mov r7,71h
cjne r7,#09,EE51 ;再擦
MOV A,#5EH;
ACALL SEND;
AJMP START;
;---------------------------------
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
CJNE A,#6BH,AGRD1
LJMP START ;比较出错,让其退出。
AGRD1:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -