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

📄 zhuyin从控测试程序1.asm

📁 一卡通源码程序是我公司的一卡通源码程序,绝对难得
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		POP	ACC
		CLR	C
		DJNZ	R7,STRY_S11
                SETB	ET1                             ;开定时器1
                SETB    F_FLAG                          ; 分时间段限制电流比较标志 =1真确
                RET

        ;********************************************************
	;串口中断处理
	;接收数据格式:地址+命令长度+命令+校验和
	;注意:        命令长度不包括地址
        ;********************************************************
Serial:
	        PUSH	PSW
		PUSH	ACC
		PUSH	B
                PUSH    DPH
                PUSH    DPL

                PUSH    DSP
                PUSH    AUXR1

     		SETB	RS0
		SETB	RS1               ;

                MOV     DSP,#0
                MOV     AUXR1,#0          ;不过

                JNB	RI,SR_EX          ; receive?  not receive reti
		CLR	RI                ; ---receive interrupt

                ;
                MOV HALF_MINUTE,#0        ; 复位计数器
                ;
                                                      ;------------------z  4.1\
                                  clr      line_led   ;通讯上了就点亮   led

		MOV	A,SBUF
                CJNE    A,#0FFH,JI
                LJMP    RECE
JI:
                CJNE	A,ADDRESS,SR_EX   ; compair the address
RECE:
                CLR	SM2               ; 不过

		LCALL	ReceiveData       ; receive the command_length
		JC	SR_EX             ; c=1  fail    c=0 success

		MOV	DPTR,#RD_BUF      ; 串行接收缓冲区 96byte  3a0h--3ffh
		MOVX	@DPTR,A           ; save the command_length
                MOV	R5,A              ; save the counter of receive
		DEC	R5                ; counter=counter-1

SR_00:
                INC	DPTR              ; rd_buf+1
                LCALL	ReceiveData       ; receive the command and checksum
		JC	SR_EX
		MOVX	@DPTR,A           ; save the date
                DJNZ	R5,SR_00          ; do until counter=0

		LCALL	Command           ; 调用命令解析

SR_EX:	        SETB	SM2
		CLR	RS485_TR          ; set 485 receive

                POP     AUXR1
                POP     DSP
                POP     DPL
                POP     DPH
		POP	B
		POP	ACC
		POP	PSW
		RETI

Command:
		MOV	A,#0E0H
		LCALL	CheckJYH          ; check Receive_date_buf
		JZ	CMD_000           ; a=0,success; a=other fail
		RET                       ; check is error,ret

;************************************************************
;功能:读取1电表的读数
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2=电表号
;	BYTE3=时
;	BYTE4=分
;	BYTE5=秒
;	BYTE6=校验和
;从控地址+命令长度+命令字10H+电表号+时+分+秒+校验和
;************************************************************
CMD_000:
		MOV	DPTR,#RD_BUF+1    ; 读电表读数    10H
                MOVX    A,@DPTR
                CJNE	A,#RF_RP,CMD0_1

CMD_0:	        MOV	DPTR,#RD_BUF
                MOVX    A,@DPTR
		CJNE	A,#7,CMD0_0        ; 检查数据包字节数

                MOV	DPTR,#RD_BUF+2
                MOVX    A,@DPTR
                ANL     A,#0F0H
                JZ      CMD0_2             ; 检查电表号是否正常
CMD0_0:
                LJMP    CMD0_EX            ;电表号》16退出

CMD0_1:         AJMP    CMD_1              ;

CMD0_2:
                MOV     R5,ADDRESS          ; R5中存放校验和 从本机地址开始
                MOV     A,ADDRESS
		LCALL	SendData            ;1、发送从控地址

                MOV     DPTR,#RD_BUF+2
                MOVX    A,@DPTR

                PUSH    ACC
                LCALL   SendData
                ADD     A,R5
                MOV     R5,A                ; 2、发送电表号

                MOV     A,#50H              ;高4位=5,电表读数有效
                JNB     ERR_RATE,YES_C1     ;费率表出错标志  =1出错
                ORL     A,#05H              ;低4位=5,分时计费时间表出错
YES_C1:
                LCALL   SendData
                ADD     A,R5
                MOV     R5,A                ;3、发送有电表读数标志 #55

                MOV     DPTR,#POINT_BUF     ; 存放每个电表的电表数,每个电表占用4*4+1个字节,对应4种费率,
				            ; Byte0-3 费率1电表数
				            ; Byte4-7 费率2电表数
				            ; Byte8-11 费率3电表数
				      ; Byte12-15 费率4电表数
                                      ; Byte16 JYH
                POP     ACC           ; 弹出电表号
                MOV     B,#17
                MUL     AB
                ADD     A,DPL
                MOV     DPL,A
                MOV     A,B
                ADDC    A,DPH
                MOV     DPH,A         ;找到相应电表的读数

                MOV     R7,#17
CMD0_00:        MOVX    A,@DPTR
                LCALL   SendData
                ADD     A,R5
                MOV     R5,A
                INC     DPTR
                DJNZ    R7,CMD0_00          ;4、发送17个电表读数

                MOV     A,R5
                CPL     A
                INC     A
                LCALL   SendData            ;5、发送总校验和
                RET


;------------------------------------------------
;           好象没有用到
;------------------------------------------------
NO_CHANGE:
                POP     ACC
                MOV     A,#00H
                JNB     ERR_RATE,NO_C1
                ORL     A,#05H
NO_C1:
                LCALL   SendData
                ADD     A,R5
                MOV     R5,A                ; 发送无电表读数标志 #00

                MOV     R7,#17
CMD0_01:        CLR     A
                LCALL   SendData
                NOP
                NOP
                DJNZ    R7,CMD0_01          ; 发送17个电表读数

                MOV     A,R5
                CPL     A
                INC     A
		LCALL	SendData
CMD0_EX:
 		RET

;*****************************************
;功能:读电表状态
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2=时
;	BYTE3=分
;	BYTE4=秒
;	BYTE5=校验和
;从控地址+命令长度+命令字11H+时+分+秒+校验和
;*****************************************
CMD_1:  CJNE    A,#RF_IN,CMD_2_

        MOV     DPTR,#RD_BUF
        MOVX    A,@DPTR
        CJNE    A,#6,CMD1_EX        ; 判断命令长度

        INC     DPTR;命令字
        INC     DPTR;时
        MOVX    A,@DPTR
        MOV     R1,A
        ANL     A,#0F0H
        SWAP    A
        MOV     B,#10
        MUL     AB
        MOV     B,A
        MOV     A,R1
        ANL     A,#0FH
        ADD     A,B
        MOV     HOUR,A
        INC     DPTR
        MOVX    A,@DPTR
        MOV     R1,A
        ANL     A,#0F0H
        SWAP    A
        MOV     B,#10
        MUL     AB
        MOV     B,A
        MOV     A,R1
        ANL     A,#0FH
        ADD     A,B
        MOV     MINUTE,A            ; 保存时间 取出时、分转化成十进制存储到RAM单元

        JB      FLAG_REQUE,CMD1_0   ;系统信息请求标志  =0时请求
      	MOV	A,#RD_REQUE         ; 请求系统信息
	LCALL	SendData
CMD1_EX:
        RET

CMD_2_:
        LJMP    CMD_2
CMD1_0:
        MOV     R5,#0
        MOV     A,ADDRESS
        LCALL   SendData            ; 发送从控号

        MOV     DPTR,#METER_INF     ; 指向电表当前信息区首地址    主继电器状态/从继电器状态/当前功率/跳电电流/跳电功率
        MOV     R7,#16
CMD1_1:
        MOVX    A,@DPTR
        LCALL   SendData             ; 主继电器状态
        PUSH    ACC
        ANL     A,#11011111B
        MOVX    @DPTR,A
        POP     ACC
        ADD     A,R5
        MOV     R5,A
        INC     DPTR

        MOVX    A,@DPTR
        LCALL   SendData
        ADD     A,R5
        MOV     R5,A                 ; 从继电器状态
        INC     DPTR

        MOVX    A,@DPTR
        LCALL   SendData
        ADD     A,R5                 ; 当前功率
        MOV     R5,A
        INC     DPTR

        MOVX    A,@DPTR
        LCALL   SendData
        ADD     A,R5
        MOV     R5,A                 ; 跳电电流
        INC     DPTR

        MOVX    A,@DPTR
        LCALL   SendData
        ADD     A,R5
        MOV     R5,A                 ; 跳电功率
        INC     DPTR

        DJNZ    R7,CMD1_1           ; 发送80字节电表信息

        MOV     A,R5
        CPL     A
        INC     A
        LCALL   SendData
        ADD     A,R5
        MOV     R5,A                ; 发送电表信息校验和

        ADD     A,ADDRESS
        CPL     A
        INC     A
        LCALL   SendData            ; 发送总校验和
        RET

;**************************
;功能:写某个电表读数
; WRITE A POINT
;	BYTE0=命令长度
;	BYTE1=命令字
;	BYTE2=电表号
;	BYTE3=POINT 0/RATE 0
;	BYTE4=POINT 1/RATE 0
;	BYTE5=POINT 2/RATE 0
;	BYTE6=POINT 3/RATE 0
;	BYTE7=POINT 0/RATE 1
;	BYTE8=POINT 1/RATE 1
;	BYTE9=POINT 2/RATE 1
;	BYTE10=POINT 3/RATE 1
;	BYTE11=POINT 0/RATE 2
;	BYTE12=POINT 1/RATE 2
;	BYTE13=POINT 2/RATE 2
;	BYTE14=POINT 3/RATE 2
;	BYTE15=POINT 0/RATE 3
;	BYTE16=POINT 1/RATE 3
;	BYTE17=POINT 2/RATE 3
;	BYTE18=POINT 3/RATE 3
;       BYTE19=POINT JYH
;       BYTE20=间隔符
;	BYTE21=JYH
;***************************
CMD_2:
        CJNE	A,#RF_WP,CMD2_00
        MOV	DPTR,#RD_BUF
        MOVX    A,@DPTR
        CJNE	A,#22,CMD2_EX              ; 命令长度是否正确

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	ANL	A,#0F0H
	JZ	CMD2_0                     ; 电表号是否合理
CMD2_EX:
        RET

CMD2_00:
        AJMP    CMD_3                      ;
CMD2_0:
        MOV     DPTR,#RD_BUF+3
        MOV     R5,#17
        MOV     R4,#0
CMD2_1:
        MOVX    A,@DPTR
        ADD     A,R4
        MOV     R4,A
        INC     DPTR
        DJNZ    R5,CMD2_1

        JNZ     CMD2_EX                    ; 校验电表读数校验和

CMD2_2:
        MOV	A,#RD_OK
	LCALL	SendData                   ; 回送应答信号

;-------保存电表读数到内存中----------------
        MOV	DPTR,#RD_BUF+3
        MOV     R4,DPL
        MOV     R5,DPH

        MOV	DPTR,#RD_BUF+2
        MOVX    A,@DPTR
	MOV	B,#17
	MUL	AB
        MOV     DPTR,#POINT_BUF
	ADD	A,DPL
        MOV     DPL,A
        MOV     R2,A
        MOV     A,B
        ADDC    A,DPH
        MOV     DPH,A
        MOV     R3,A

	INC	DPTR
        INC     DPTR
	MOVX	A,@DPTR
	CJNE	A,#0AAH,CMD2_5

        MOV     R6,#4
CMD2_3:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        MOV     B,A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	A,@DPTR
	ADD	A,B
	DA	A
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;LSB

	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        MOV     B,A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	A,@DPTR
	ADDC	A,B
	DA	A
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;MSB

	MOV	R7,#2
CMD2_4:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
	ADDC	A,#0
	DA	A
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH          ;HSB

	DJNZ	R7,CMD2_4
        DJNZ    R6,CMD2_3
	SJMP	CMD2_7

CMD2_5:
	MOV     DPL,R2
        MOV     DPH,R3
	MOV	R7,#16
CMD2_6:
	MOV     DPL,R4
        MOV     DPH,R5
	MOVX	A,@DPTR
        INC     DPTR
        MOV     R4,DPL
        MOV     R5,DPH

	MOV     DPL,R2
        MOV     DPH,R3
	MOVX	@DPTR,A
        INC     DPTR
        MOV     R2,DPL
        MOV     R3,DPH

⌨️ 快捷键说明

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