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

📄 w2b.asm

📁 单片机编程的一款好软件
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;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 + -