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

📄 w1.asm

📁 单片机编程的一款好软件
💻 ASM
字号:
;71H和R7动态延时
;7CH接收的高位地址
;7DH接收的低位地址
;R2,R3 CALL DELAY
;R4,R5 初始化指示灯闪动的次数
;R6  小延时参数
;R0 16字节指针
	 ORG   0000H
	 LJMP  START
	 ORG   0030H
START:   
	 MOV   P0,#0FFH
	 MOV   P1,#0FFH
	 MOV   P2,#0FFH
	 MOV   P3,#0FFH
         acall init
         MOV   20H,#00		   ;用于位
         MOV   70H,#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,#05H,N05   ;R 8951
	 AJMP  R51
N05:	 CJNE  A,#15H,N15   ;W 8951
	 AJMP  F51
N15:	 CJNE  A,#06H,N06   ;R 8952
	 AJMP  R52
N06:	 CJNE  A,#16H,N16   ;W 8952
	 AJMP  F51
N16:	 CJNE  A,#07H,N07   ;R 2051
	 AJMP  R20
N07:	 CJNE  A,#17H,N17   ;W 2051
	 AJMP  W20
N17:	 CJNE  A,#25H,N25   ;E 8951
         AJMP  E51
N25:     CJNE  A,#27H,N27   ;E 2051
         AJMP  E20
N27:     CJNE  A,#01H,N01   ;R2764 2864
         AJMP  R64
N01:     CJNE  A,#11H,N11   ;W2764
         AJMP  W2764
N11:     CJNE  A,#12H,N12   ;W2864
         AJMP  W2864
N12:
         AJMP  0000
;---------------------------------------------
R51:     MOV   7DH,#10H	       ;4K
	 AJMP  R895x
R52:     MOV   7DH,#20H	       ;8K

R895x:   ACALL R89CW
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:	 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
	 SETB  P3.5	     ;Vpp=5v
	 SETB  P3.2	     ;
	 MOV   P0,#0FFH
	 RET
;---------------------------------------------
F51:	 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
	 SETB  P3.5          ;12V
	 CLR   P2.6	     ;写控制信号 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
	 SETB  P3.6	     ;	         P3.3
	 SETB  P3.7          ;
	 MOV   P0,A	     ;data               ;ACALL XDY
         MOV   P1,DPL	     ;低地址
	 MOV   P2,DPH	     ;高地址
	 SETB  P2.7          ;ENABLE      L  ,  L ,  H , H  , H  ,12v   ;ACALL XDY
	 CLR   P3.2          ;Vpp=12v,           ;ACALL XDY
nop                          ;准备写
	 CLR   P3.3          ;ALE/PROG=L  12V
acall delay                  ;写过程
	 SETB  P3.3	     ;ALE/P=H     5V     ;
	 SETB  P3.2	     ;Vpp=5V
;	 JNB P3.4,$	     ;增加判断,保证写入; SETB  P3.5
nop                          ;准备读
	 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
;--------------------------------
E20:   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;

;--------------------------------
E51:  mov 71H,#03;      延时 
EE51: 
      ACALL E895;      擦除
      ACALL R89CW;     读控制字
      MOV   P1,#0
      MOV   P2,#0
      MOV   A,P0
      cjne a,#0FFh,Enext ;空了吗?
       MOV A,#5DH;
       ACALL SEND;
       AJMP start;
Enext: inc 71h
       mov r7,71h
       cjne r7,#09,EE51 ;再擦
       MOV A,#5EH;
       ACALL SEND;
       AJMP START;
;---------------------------------
W89CW: SETB  P3.3     	 ;ALE/P=H
	 CLR   P2.6		 ;写控制信号 /PROG,P2.6,P2.7,P3.6,P3.7,Vpp
	 SETB  P2.7		 ;	       L  ,  L ,  H , H  , H  ,12v
	 SETB  P3.6		 ;
	 SETB  P3.7
	 SETB  P3.5		 ;
	 CLR   P3.2		 ;Vpp=12v
	 CLR   P3.3              ;ALE/PROG=L
	 RET
;-----------------------------------------
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.6	
	 CLR   P2.7
	 CLR   P3.6
	 CLR   P3.7              ;acall xdy
	 CLR   P3.2		 ;Vpp=12v 
NOP; acall xdy
	 CLR   P3.3		 ;脉冲L
xx: ACALL DELAY
djnz r7,xx
	 SETB  P3.3		 ;脉冲H  ;acall xdy
	 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
;---------------------------------------------
R20:   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
;---------------------------------------------
W20:     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
;===========================================
R64:     MOV   P1,DPL
	 MOV   P2,DPH
         ACALL R64CW
	 MOV   A,P0
	 LCALL SEND
         MOV A,#0
         CJNE A,DPL,R64          ;相当于一次接收256字节
         ACALL READ              ;接收值无用,准备发送下一组数据。
	 MOV   A,DPH
	 CJNE  A,#20H,R64	 ;8K
	 LJMP  0000H
;
R64CW:   CLR   P3.7		 ;/CS
	 SETB  P2.6		 ;2764:-PRG  2864:-WE
	 SETB  P3.3		 ;关闭高压
	 SETB  P2.7		 ;Vpp=5V
	 SETB  P3.2		 ;关闭高压
	 CLR   P3.5		 ;/OE=0 
	 RET
;-----------------------------------
W2864:   SETB  F0		 ;RESET F0=0
W2764:   mov a,#5Ah              ;要高位
         ACALL receive           ;先发再收
         mov 7ch,a               ;高位
         mov a,#5Bh              ;要低位
         acall receive
         mov 7dh,a               ;低位
        ACALL W64CW		 ;写状态,并锁存数据
        acall delay             ; 
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
;
W64CW:   SETB  P2.7		 ;1脚 Vpp 准备送电压
	 SETB  P3.3		 ;关闭12V
	 SETB  P3.5		 ;/OE=H 
	 SETB  P3.2		 ;关闭高压
         CLR   P3.7		 ;/CS=0
	 JB    F0,NH		 ;2864不用12V
	 CLR   P3.3		 ;Vpp=12V
 NH:     CLR   P2.6		 ;2764:/PGM=0, 2864:/WE 写控制信号 
	 RET
END;
;-------------------------------------------------
;    	   2764                	    2864A                         8031               
; P27     ┌──┬──┐           ┌──┬──┐                ┌──┬──┐   
; P33  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   P32 22│-OE P35  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/VPP ┤9       32├ P0.7  
;       A0│10      19│D7       A0│10      19│D7     RXD P3.0 ┤10      31├ -EA/VDD
;       D0│11      18│D6       D0│11      18│D6     TXD P3.1 ┤11      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      23├ P2.2      
; 2764: VPP=12V~13V  VCC=5.75~6.5                          XTAL1 ┤19      22├ P2.1     
; 2864: 脚1 空                                               VSS ┤20      21├ P2.0      
;                                                                └─────┘  

⌨️ 快捷键说明

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