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

📄 snt-c485.asm

📁 抄录符合DL/T645-1997的电表
💻 ASM
📖 第 1 页 / 共 4 页
字号:
ECOMM4:		MOV	A,R5			;暂存表地址A3
		MOV	DBADR3,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMM5:		MOV	A,R5			;暂存表地址A2
		MOV	DBADR2,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMM6:		MOV	A,R5			;暂存表地址A1
		MOV	DBADR1,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMM7:		MOV	A,R5			;暂存表地址A0
		MOV	DBADR0,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMM7A:	LJMP	ECOMMF
ECOMM8:		MOV	A,R5			;判控制字
		CJNE	A,#04H,ECOMM7A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMM9:		MOV	A,R5			;判数据长度
		CJNE	A,#04H,ECOMM7A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMMA:		MOV	A,R5			;判数据标识A0H
		CJNE	A,#0A0H,ECOMM7A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMMB:		MOV	A,R5			;判数据标识17H
		CJNE	A,#17H,ECOMM7A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMMC:		MOV	A,R5			;判序列号
		CJNE	A,SERNO,ECOMM7A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMMD:		MOV	A,R5			;判数据
		CJNE	A,#55H,ECOMMDA
		LJMP	ECOMMDB
ECOMMDA:	CJNE	A,#0AAH,ECOMM7A
ECOMMDB:	ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

ECOMME:		MOV	A,R5			;判校验和
		MOV	B,A
		MOV	A,R3
		CJNE	A,B,ECOMM7A
		INC	RECCNT
		LJMP	RETURN

ECOMMF:		MOV	A,R5			;判结束符
		CJNE	A,#16H,ECOMMG
		MOV	R0,#BADD5
		MOV	R1,#DBADR5
		MOV	R2,#6
ECOMMFA:	MOV	A,@R1
		MOV	@R0,A
		INC	R0
		INC	R1
		DJNZ	R2,ECOMMFA
		SETB	DBREAD_F		;置位读表标志
		SETB	REC_COMM		;置收到新命令标志
		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

ECOMMG:		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

		;*********************读表地址部分***************
ECOMMH:		LJMP	GCOMM
FCOMM:		CJNE	A,#05H,ECOMMH
		MOV	A,RECCNT		;读表地址
		CLR	C
		SUBB	A,#03H
		RL	A
		MOV	DPTR,#FCOMM1
		JMP	@A+DPTR

FCOMM1:		AJMP	FCOMM2			;数据长度
		AJMP	FCOMM3			;采集器地址A6
		AJMP	FCOMM4			;采集器地址A5
		AJMP	FCOMM5			;采集器地址A4
		AJMP	FCOMM6			;采集器地址A3
		AJMP	FCOMM7			;采集器地址A2
		AJMP	FCOMM8			;采集器地址A1
		AJMP	FCOMM9			;采集器地址A0
		AJMP	FCOMMA			;校验和
		AJMP	FCOMMB			;结束符16H

FCOMM2:		MOV	A,R5			;判数据长度
		CJNE	A,#07H,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM3:		MOV	A,R5			;判采集器地址A6
		CJNE	A,CK_ADDR6,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM4:		MOV	A,R5			;判采集器地址A5
		CJNE	A,CK_ADDR5,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM5:		MOV	A,R5			;判采集器地址A4
		CJNE	A,CK_ADDR4,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM6:		MOV	A,R5			;判采集器地址A3
		CJNE	A,CK_ADDR3,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN
		LJMP	RETURN

FCOMM7:		MOV	A,R5			;判采集器地址A2
		CJNE	A,CK_ADDR2,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM8:		MOV	A,R5			;判采集器地址A1
		CJNE	A,CK_ADDR1,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMM9:		MOV	A,R5			;判采集器地址A0
		CJNE	A,CK_ADDR0,FCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

FCOMMA:		MOV	A,R5			;判校验和
		MOV	B,A
		MOV	A,R3
		CJNE	A,B,FCOMMC
		INC	RECCNT
		LJMP	RETURN

FCOMMB:		MOV	A,R5			;判结束符
		CJNE	A,#16H,FCOMMC
		SETB	ADDR_READ		;置读表地址标志
		SETB	REC_COMM		;置收到新命令标志
		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

FCOMMC:		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

		;*********************写表地址部分******************
FCOMMD:		LJMP	HCOMM
GCOMM:		CJNE	A,#06H,FCOMMD
		MOV	A,RECCNT		;写表地址
		CLR	C
		SUBB	A,#03H
		MOV	B,A
		RL	A
		ADD	A,B
		MOV	DPTR,#GCOMM1
		JMP	@A+DPTR

GCOMM1:		LJMP	GCOMM2			;数据长度
		LJMP	GCOMM3			;地址A6
		LJMP	GCOMM4			;地址A5
		LJMP	GCOMM5			;地址A4
		LJMP	GCOMM6			;地址A3
		LJMP	GCOMM7			;地址A2
		LJMP	GCOMM8			;地址A1
		LJMP	GCOMM9			;地址A0
		LJMP	GCOMMA			;表地址A5
		LJMP	GCOMMB			;表地址A4
		LJMP	GCOMMC			;表地址A3
		LJMP	GCOMMD			;表地址A2
		LJMP	GCOMME			;表地址A1
		LJMP	GCOMMF			;表地址A0
		LJMP	GCOMMG			;校验和
		LJMP	GCOMMH			;结束符16H

GCOMM1A:	LJMP	GCOMMI
GCOMM2:		MOV	A,R5			;判数据长度
		CJNE	A,#0DH,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM3:		MOV	A,R5			;判采集器地址A6
		CJNE	A,CK_ADDR6,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM4:		MOV	A,R5			;判采集器地址A5
		CJNE	A,CK_ADDR5,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM5:		MOV	A,R5			;判采集器地址A4
		CJNE	A,CK_ADDR4,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM6:		MOV	A,R5			;判采集器地址A3
		CJNE	A,CK_ADDR3,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN
		LJMP	RETURN

GCOMM7:		MOV	A,R5			;判采集器地址A2
		CJNE	A,CK_ADDR2,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM8:		MOV	A,R5			;判采集器地址A1
		CJNE	A,CK_ADDR1,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMM9:		MOV	A,R5			;判采集器地址A0
		CJNE	A,CK_ADDR0,GCOMM1A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMMA:		MOV	A,R5			;暂存表地址A5
		MOV	DBADR5,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMMB:		MOV	A,R5			;暂存表地址A4
		MOV	DBADR4,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

GCOMMC:		MOV	A,R5			;暂存表地址A3
		MOV	DBADR3,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN


GCOMMD:		MOV	A,R5			;暂存表地址A2
		MOV	DBADR2,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN


GCOMME:		MOV	A,R5			;暂存表地址A1
		MOV	DBADR1,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN


GCOMMF:		MOV	A,R5			;暂存表地址A0
		MOV	DBADR0,A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN


GCOMMG:		MOV	A,R5			;判校验和
		MOV	B,A
		MOV	A,R3
		CJNE	A,B,GCOMMI
		INC	RECCNT
		LJMP	RETURN

GCOMMH:		MOV	A,R5			;判结束符
		CJNE	A,#16H,GCOMMI
		MOV	R0,#BADD5
		MOV	R1,#DBADR5
		MOV	R2,#6
GCOMMHA:	MOV	A,@R1
		MOV	@R0,A
		INC	R0
		INC	R1
		DJNZ	R2,GCOMMHA
		SETB	ADDR_WR			;置写表地址标志
		SETB	REC_COMM		;置收到新命令标志
		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

GCOMMI:		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

		;********************抄表命令部分***************

HCOMM:		CJNE	A,#07H,HCOMM2A
		MOV	A,RECCNT		;读表地址
		CLR	C
		SUBB	A,#03H
		RL	A
		MOV	DPTR,#HCOMM1
		JMP	@A+DPTR

HCOMM1:		AJMP	HCOMM2			;数据长度
		AJMP	HCOMM3			;采集器地址A6
		AJMP	HCOMM4			;采集器地址A5
		AJMP	HCOMM5			;采集器地址A4
		AJMP	HCOMM6			;采集器地址A3
		AJMP	HCOMM7			;采集器地址A2
		AJMP	HCOMM8			;采集器地址A1
		AJMP	HCOMM9			;采集器地址A0
		AJMP	HCOMMA			;校验和
		AJMP	HCOMMB			;结束符16H

HCOMM2:		MOV	A,R5			;判数据长度
		CJNE	A,#07H,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN
HCOMM2A:	LJMP	HCOMMC
HCOMM3:		MOV	A,R5			;判采集器地址A6
		CJNE	A,CK_ADDR6,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMM4:		MOV	A,R5			;判采集器地址A5
		CJNE	A,CK_ADDR5,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMM5:		MOV	A,R5			;判采集器地址A4
		CJNE	A,CK_ADDR4,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMM6:		MOV	A,R5			;判采集器地址A3
		CJNE	A,CK_ADDR3,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN
		LJMP	RETURN

HCOMM7:		MOV	A,R5			;判采集器地址A2
		CJNE	A,CK_ADDR2,HCOMM2A
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMM8:		MOV	A,R5			;判采集器地址A1
		CJNE	A,CK_ADDR1,HCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMM9:		MOV	A,R5			;判采集器地址A0
		CJNE	A,CK_ADDR0,HCOMMC
		ADD	A,R3
		MOV	R3,A
		INC	RECCNT
		LJMP	RETURN

HCOMMA:		MOV	A,R5			;判校验和
		MOV	B,A
		MOV	A,R3
		CJNE	A,B,HCOMMC
		INC	RECCNT
		LJMP	RETURN

HCOMMB:		MOV	A,R5			;判结束符
		CJNE	A,#16H,HCOMMC
		SETB	CHAOBIAO		;置抄表标志
		MOV	SENDCNT,#0
		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

HCOMMC:		MOV	COMMTYPE,#0
		MOV	RECCNT,#0
		LJMP	RETURN

RETURN:		POP	TEMP
		POP	PSW
		POP	DPL
		POP	DPH
		POP	B
		POP	ACC
		SETB	ES
		RETI


;*************************************************************
;从24C08A中读1字节子程序
;入口: C,DPTR(地址),出口:A(数据)
;*************************************************************
READ_1:
		SETB	SDA
		SETB	SCL
		LCALL	DELAY
		CLR	    SDA	    ;开始信号
		LCALL	DELAY
		CLR	    C
		MOV	    A,DPH
		RL	    A
		ORL	    A,#SCMD	;为写命令
		LCALL	    SEND
		MOV	    C,SDA
		JC	    READ_1
			    ;判断是否应答,高电平为无应答,低则应答,无应答则复位,从新开始

		MOV	    A,DPL	     ;低字节首地址
		LCALL	    SEND
		LCALL	DELAY
RE_1:		MOV	    C,SDA
		JC	    RE_1	     ;是否应答
		LCALL	DELAY		     ;如果下边的程序不能执行,则加一个时间循环,
		CLR	    SCL		     ;此为写循环周期,需要一定时间
		LCALL	DELAY
		SETB	    SDA
		LCALL	DELAY
		SETB	    SCL
		LCALL	DELAY
		CLR	    SDA		     ;又一个开始信号
		LCALL	DELAY
		MOV	    A,#RCMD
		LCALL	    SEND
		LCALL	DELAY
RE_2:		MOV	    C,SDA
		JC	    RE_2	     ;是否应答
		LCALL	DELAY
		MOV	    A,#0	    ;清A
		CLR	    C		    ;清C
		MOV	    R4,#8	    ;循环次数
RE_3:		SETB	    SCL		    ;开始接收
		LCALL	DELAY
		CLR	    SCL		    ;下降沿输出数据
		LCALL	DELAY
		MOV	    C,SDA
		RLC	    A		    ;将C中数据移到A中
		DJNZ	    R4,RE_3	    ;接收循环(EEPROM输出数据)
		CLR	    SDA
		LCALL	DELAY
		SETB	    SCL
		LCALL	DELAY
		SETB	    SDA		    ;时钟为高电平,SDA由低变高是停止信号
		RET

;*************************************************************
;向24C08A中写1字节子程序
;入口: A,C,DPTR(地址)
;*************************************************************
WRITE_1:	CLR	WRP		;允许写
		PUSH	ACC
WR_0:		LCALL	START		;开始信号
		MOV	A,DPH
		RL	A
		ORL	A,#SCMD		;发写命令(含高2位地址)
		LCALL	SEND
		LCALL	DELAY
WR_1:		MOV	C,SDA		;应答
		JC	WR_0
		MOV	A,DPL		;发低8位地址
		LCALL	SEND
		LCALL	DELAY
WR_2:		MOV	C,SDA		;应答
		JC	WR_2
		POP	ACC
		LCALL	SEND		;发要写数据
		LCALL	DELAY
WR_3:		MOV	C,SDA		;应答
		JC	WR_3
		CLR	SCL
		LCALL	DELAY
		CLR	SDA		;SCL为高,SDA上升沿为停止信号
		LCALL	DELAY
		SETB	SCL
		LCALL	DELAY
		SETB	SDA
		SETB	WRP		;禁止写
		RET

;**********************************************************
;从24C08A中连续读字节子程序
;入口: C,DPTR(地址),R3(字节个数),出口:R0(数据块存储首地址)
;**********************************************************
READ_BL:
		SETB	SDA
		SETB	SCL
		LCALL	DELAY
		CLR	    SDA	    ;开始信号
		LCALL	DELAY
		CLR	    C
		MOV	    A,DPH
		RL	    A
		ORL	    A,#SCMD	;为写命令
		LCALL	    SEND
		MOV	    C,SDA
		JC	    READ_BL
			    ;判断是否应答,高电平为无应答,低则应答,无应答则复位,从新开始

		MOV	    A,DPL	     ;低字节地址
		LCALL	    SEND
		LCALL	DELAY
RE_1B:		MOV	    C,SDA
		JC	    RE_1B	     ;是否应答
		LCALL	DELAY		     ;如果下边的程序不能执行,则加一个时间循环,
RE_4B:		CLR	    SCL		     ;此为写循环周期,需要一定时间
		LCALL	DELAY
		SETB	    SDA
		LCALL	DELAY
		SETB	    SCL
		LCALL	DELAY
		CLR	    SDA		     ;又一个开始信号
		LCALL	DELAY
		MOV	    A,#RCMD
		LCALL	    SEND
		LCALL	DELAY
RE_2B:		MOV	    C,SDA
		JC	    RE_2B	     ;是否应答
		LCALL	DELAY

		MOV	    A,#0	    ;清A
		CLR	    C		    ;清C
		MOV	    R4,#8	    ;循环次数
RE_3B:		SETB	    SCL		    ;开始接收
		LCALL	DELAY
		CLR	    SCL		    ;下降沿输出数据
		LCALL	DELAY
		MOV	    C,SDA
		RLC	    A		    ;将C中数据移到A中
		DJNZ	    R4,RE_3B	    ;接收循环(EEPROM输出数据)
		CLR	    SDA
		LCALL	DELAY
		SETB	    SCL
		LCALL	DELAY
		SETB	    SDA		    ;时钟为高电平,SDA由低变高是停止信号
		MOV	    @R0,A
		INC	    R0
		DJNZ	    R3,RE_4B
		CLR	    SDA
		LCALL	DELAY
		SETB	    SCL
		LCALL	DELAY
		SETB	    SDA		    ;时钟为高电平,SDA由低变高是停止信号
		RET

;**********************************************************
;向24C08A中连续写数据子程序
;入口: C,DPTR(地址),R3(字节个数),R0(数据块存储首地址)
;**********************************************************
WRITE_B:
		CLR	    WRP
		LCALL	    DELAY		       ;
		SETB	    SDA		    ;开始信号
		SETB	    SCL
		LCALL	    DELAY
		CLR	    SDA
		CLR	    C
		MOV	    A,DPH
		RL	    A
		ORL	    A,#SCMD	    ;为写命令
		LCALL	    SEND
		MOV	    C,SDA
		JC	    WRITE_B	    ;是否应答
		MOV	    A,DPL	    ;低字节首地址
		LCALL	    SEND
WR_1B:		MOV	    C,SDA
		JC	    WR_1B	    ;是否应答
WR_2B:
		MOV	    A,@R0	    ;数据
		LCALL	    SEND
WR_3B:		MOV	    C,SDA
		JC	    WR_3B	     ;是否应答
		INC	    R0
		DJNZ	    R3,WR_2B
		LCALL	    DELAY
		CLR	    SCL
		LCALL	    DELAY
		CLR	    SDA
		LCALL	    DELAY
		SETB	    SCL
		LCALL	    DELAY
		SETB	    SDA	;停止信号,SDA由低变高,SCL处于高电平
		SETB	    WRP
		RET

		;***********开始信号
START:
		SETB	SDA
		LCALL	DELAY
		SETB	SCL
		LCALL	DELAY
		CLR	SDA
		RET

		;**************发送1个字节
SEND:
		MOV	R4,#08H
SEND0:
		CLR	SCL
		RLC	A
		MOV	SDA,C
		LCALL	DELAY
		SETB	SCL
		LCALL	DELAY
		DJNZ	R4,SEND0
		CLR	SCL
		LCALL	DELAY
		SETB	SDA
		LCALL	DELAY
		SETB	SCL
		RET

		;****************延时子程序
DELAY:		NOP
		NOP
		NOP
		RET
DELAY_1S:	MOV	YSRES1,#04H	;500MS延时
DEY_1:		MOV	YSRES2,#0E0H
DEY_2:		MOV	YSRES3,#0
DEY_3:		DJNZ	YSRES3,DEY_3
		DJNZ	YSRES2,DEY_2
		DJNZ	YSRES1,DEY_1
		RET

		END

⌨️ 快捷键说明

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