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

📄 counter.asm

📁 本程序为集中抄表系统中低压电力线载波数据采集器程序源代码
💻 ASM
字号:
;--------------------------------------
;计度器增加程序
;--------------------------------------
METER_COUNTER_INC_1_16:
			MOV	R7,#1                                   ;
METER_COUNTER_INC:
		        CPL     WATCH_DOG                               ;清看门狗
			MOV     A,#RAM_PULSE_COMPENSATE_0		;R6脉冲补偿数地址
                        ADD	A,R7
			DEC	A
			MOV	R6,A
                  	MOV     A,#RAM_TO_0DOT1_FLAG_0			;R5满0.1度电标志地址
                        ADD	A,R7
			DEC	A
			MOV	R5,A
                     	MOV	A,#RAM_PULSES1_0			;R4脉冲存储地址
			ADD	A,R7
			DEC	A
			MOV	R4,A
                 	MOV	A,#RAM_RESOLUTION_0			;R3分辨率地址
			ADD	A,R7
			DEC	A
			MOV	R3,A
                	MOV	A,#RAM_COUNTER_DECIMAL_0		;R2计度器小数部分地址
			ADD	A,R7
			DEC	A
			MOV	R2,A
                   	MOV	A,#RAM_0DOT01_COUNTER_0			;R1计度器0.01计数器地址
			ADD	A,R7
			DEC	A
			MOV	R1,A
                	MOV	R0,06H
			MOV	A,@R0
                 	CJNE    A,#00H,REPAR_PULSE			;补偿数不为0需要补偿
                        AJMP    COUNT_ENERGY				;补偿数为0不需要补偿
REPAR_PULSE:
      			MOV	R0,05H
			MOV	A,@R0
        		CJNE    A,#55H,COUNT_ENERGY			;满0.1度电否?
         		MOV	R0,04H
			MOV	A,@R0
         		CLR     C
         		MOV	R0,06H
			MOV	A,@R0
			MOV	B,A
			MOV	R0,04H
			MOV	A,@R0
			SUBB	A,B
                    	JNC	COMPENSATE_DEC_BEG
			LJMP	NO_COUNTER_INC
COMPENSATE_DEC_BEG:
   			MOV	R0,06H
			MOV	B,@R0
COMPENSATE_DEC:
               		MOV	R0,04H
			DEC	@R0
           	        CPL     WATCH_DOG                                    ;清看门狗
			DJNZ	B,COMPENSATE_DEC						;--
              		MOV	B,R7
			PUSH	01H
			MOV	R1,#0
			MOV	R0,#0
			SETB	C
CTER_PUL_SET_CON:
			MOV	A,R0
			RLC	A
			MOV	R0,A
			MOV	A,R1
			RLC	A
			MOV	R1,A
			DJNZ	B,CTER_PUL_SET_CON
			MOV	A,R1
			ORL	RAM_TO_C04_AGA_8_15,A
			MOV	A,R0
			ORL	RAM_TO_C04_AGA_0_7,A
			POP	01H
                 	MOV	R0,05H
			MOV	@R0,#00H
COUNT_ENERGY:													;--计算电量
		        CPL     WATCH_DOG                                    ;清看门狗
			MOV	R0,03H
			MOV	A,@R0
             		JNZ	CMP_PULSE								;--分辩率不为0才能进行电量计算
                        CLR     EA                                           ;关中断
                        SJMP    $                                            ;分辩率为0内部RAM已乱须重新复位
CMP_PULSE:
     			MOV	R0,04H
			MOV	A,@R0
     			MOV	R0,03H
			MOV	B,@R0
			CJNE	A,B,PULSE_NOT_EQUAL
     			SJMP	DEC_RESOLUTION				;--RAM 中脉冲记数=分辩率
PULSE_NOT_EQUAL:										;--
     			JNC	DEC_RESOLUTION				;--RAM 中脉冲记数<分辩率,电量不增加
			LJMP	NO_COUNTER_INC				;--RAM 中脉冲记数<分辩率,电量不增加
DEC_RESOLUTION: 	NOP						;--RAM 中脉冲记数>分辩率
                        NOP
PULSE_DEC:
                        MOV	R0,04H
                        DEC	@R0
  			DJNZ	B,PULSE_DEC				;--
   		       	MOV	R0,02H
			INC	@R0
                	INC	@R1
               		MOV	A,@R1
               		CLR     C
                        SUBB    A,#10
                        JC      DECIMAL_COMPUTE					;--0.01度电计数器值<10转
                	MOV	@R1,#00H
                 	MOV	R0,05H
			MOV	@R0,#55H
DECIMAL_COMPUTE:
        		MOV	R0,02H
			MOV	A,@R0
                        CLR     C
                        SUBB    A,#100
                        JC      NO_COUNTER_INC1                  ;计度器整数部分+1 ?
                  	MOV	R0,02H
			MOV	@R0,#00H
                        LCALL   COUNTER_INTEGER_INC             ;计度器整数部分存入24C04
NO_COUNTER_INC1:
;//04-03-31 存储小数位
                MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_COUNTER_DECIMAL_0                 ;当前电量小数存储器地址
		MOV	DPL,A
                MOV	R0,02H
		MOV	B,@R0
		LCALL	WR_C04_1BYTE

		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_0DOT01_COUNTER_0                 ;存0.01度电计数器
		MOV	DPL,A
                MOV	R0,01H
		MOV	B,@R0
		LCALL	WR_C04_1BYTE

		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_TO_0DOT1_FLAG_0                 ;存0.1度电到标志
		MOV	DPL,A
                MOV	R0,05H
		MOV	B,@R0
		LCALL	WR_C04_1BYTE
                AJMP   METER_COUNTER_INC

NO_COUNTER_INC:
		MOV	DPH,#C04_ADDR_L
		MOV	A,R7
		DEC	A
		ADD	A,#C04_PULSES1_0                ;存当前脉冲数
		MOV	DPL,A
                MOV	R0,04H
		MOV	B,@R0
		LCALL	WR_C04_1BYTE
SAVE_OVER:
			CPL	WATCH_DOG
			INC	R7
			MOV	A,R7
                      	CJNE	A,#17,TO_NEXT_COUNTER_INC
			SJMP	COUNTER_INC_EXIT
TO_NEXT_COUNTER_INC:
                        CLR     C
                        SUBB    A,#17
                        JNC     COUNTER_INC_EXIT
TO_NEXT_COUNTER_INC1:
			LJMP	METER_COUNTER_INC
COUNTER_INC_EXIT:
                        MOV R7,#00H
      			RET
;--------------------------------------
;计度器整数部分+1
;入口:R7(通道数=1-16)
;占用:R0,A,R1,R2,DPTR,B
;--------------------------------------
COUNTER_INTEGER_INC:
                MOV     R0,#PUBLIC_COUNTER_INTEGER_0              ;当前电量整数位首地址
                MOV	A,R7
		DEC	A
		MOV	B,#3
		MUL	AB
		ADD	A,#C04_COUNTER_INTEGER_0                   ;当前表当前电量的整数首字节
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_L                            ;存储器低位
		LCALL	RD_C04_1BYTE
                MOV	@R0,B                                      ;第一字节送发送缓冲区
                INC     R0
                INC     DPL                                        ;下一字节
                LCALL	RD_C04_1BYTE
		MOV	@R0,B                                      ;第二字节送发送缓冲区
                INC     R0
                INC     DPL                                        ;下一字节
                LCALL	RD_C04_1BYTE
		MOV	@R0,B                                      ;第三字节送发送缓冲区
;计算整数+1
             ;   CLR     C
                MOV     R0,#PUBLIC_COUNTER_INTEGER_0               ;当前电量整数位首地址
                MOV     A,@R0
                ADD     A,#01H                                     ;整数加1
                MOV	@R0,A
     		INC	R0
		MOV	A,@R0
     		ADDC    A,#00H
     		MOV	@R0,A
     		INC	R0
		MOV	A,@R0
    		ADDC    A,#00H
        	MOV	@R0,A
;-------------------------------检测到满度否
           	MOV	A,R7
CMP_CYCLE1:
		CJNE	A,#1,CMP_CYCLE2
            	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_1_2
		MOV	R1,#METER_CYCLE_1_1
		MOV	B,#METER_CYCLE_1_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE2:	CJNE	A,#2,CMP_CYCLE3
    		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_2_2
		MOV	R1,#METER_CYCLE_2_1
		MOV	B,#METER_CYCLE_2_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE3:	CJNE	A,#3,CMP_CYCLE4
       		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_3_2
		MOV	R1,#METER_CYCLE_3_1
		MOV	B,#METER_CYCLE_3_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE4:	CJNE	A,#4,CMP_CYCLE5
         	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_4_2
		MOV	R1,#METER_CYCLE_4_1
		MOV	B,#METER_CYCLE_4_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE5:	CJNE	A,#5,CMP_CYCLE6
  		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_5_2
		MOV	R1,#METER_CYCLE_5_1
		MOV	B,#METER_CYCLE_5_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE6:	CJNE	A,#6,CMP_CYCLE7
 		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_6_2
		MOV	R1,#METER_CYCLE_6_1
		MOV	B,#METER_CYCLE_6_0
		LCALL	CMP_CYCLE
		POP	02H
  	        POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE7:	CJNE	A,#7,CMP_CYCLE8
     		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_7_2
		MOV	R1,#METER_CYCLE_7_1
		MOV	B,#METER_CYCLE_7_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE8:	CJNE	A,#8,CMP_CYCLE9
             	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_8_2
		MOV	R1,#METER_CYCLE_8_1
		MOV	B,#METER_CYCLE_8_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE9:	CJNE	A,#9,CMP_CYCLE10
     		PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_9_2
		MOV	R1,#METER_CYCLE_9_1
		MOV	B,#METER_CYCLE_9_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE10:	CJNE	A,#10,CMP_CYCLE11
          	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_10_2
		MOV	R1,#METER_CYCLE_10_1
		MOV	B,#METER_CYCLE_10_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE11:	CJNE	A,#11,CMP_CYCLE12
               	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_11_2
		MOV	R1,#METER_CYCLE_11_1
		MOV	B,#METER_CYCLE_11_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE12:	CJNE	A,#12,CMP_CYCLE13
             	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_12_2
		MOV	R1,#METER_CYCLE_12_1
		MOV	B,#METER_CYCLE_12_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE13:	CJNE	A,#13,CMP_CYCLE14
              	PUSH	01H
		PUSH	02H
		MOV     R2,#METER_CYCLE_13_2
		MOV	R1,#METER_CYCLE_13_1
		MOV	B,#METER_CYCLE_13_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE14:	CJNE	A,#14,CMP_CYCLE15
              	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_14_2
		MOV	R1,#METER_CYCLE_14_1
		MOV	B,#METER_CYCLE_14_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE15:	CJNE	A,#15,CMP_CYCLE16
               	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_15_2
		MOV	R1,#METER_CYCLE_15_1
		MOV	B,#METER_CYCLE_15_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
		LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE16:	CJNE	A,#16,CMP_CYCLE17
              	PUSH	01H
		PUSH	02H
		MOV	R2,#METER_CYCLE_16_2
		MOV	R1,#METER_CYCLE_16_1
		MOV	B,#METER_CYCLE_16_0
		LCALL	CMP_CYCLE
		POP	02H
		POP	01H
                LJMP    WRITE_COUNTER_INTEGER
CMP_CYCLE17:	RET
;///2004-03-26,存储当前电量整数
WRITE_COUNTER_INTEGER:

                MOV     R0,#PUBLIC_COUNTER_INTEGER_0              ;当前电量整数位首地址
                MOV	A,R7
		DEC	A
		MOV	B,#3
		MUL	AB
		ADD	A,#C04_COUNTER_INTEGER_0                   ;当前表当前电量的整数首字节
		MOV	DPL,A
                MOV	DPH,#C04_ADDR_L                            ;存储器低位
                MOV	B,@R0
                INC     R0
		LCALL	WR_C04_1BYTE                               ;第1字节写入存储器
                MOV     B,@R0
                INC     R0
                MOV	DPH,#C04_ADDR_L                            ;存储器低位
                INC     DPL                                        ;
                LCALL	WR_C04_1BYTE                               ;第2字节写入存储器
		MOV	B,@R0
                INC     DPL
                MOV	DPH,#C04_ADDR_L                            ;存储器低位
		LCALL	WR_C04_1BYTE                               ;第3字节写入存储器
                RET
;-------------------------------------------------------------
;--计度器的满刻度比较程序
;----------------------------------
;--入口:R0(#RAM_COUNTER_INTEGER+2),R2(#METER_CYCLE_2),
;--     R1(#METER_CYCLE_1),B(#METER_CYCLE_0)
;--占用:A
;-------------------------------------------------------------
CMP_CYCLE:
		MOV	A,@R0
		CJNE	A,02H,CMP_100000_2
          	SJMP	CMP_100000_1
CMP_100000_2:	JC	SAVE_INTEGER_210
CMP_100000_2_OUT:
		CLR	A
		MOV	@R0,A                    ;当前电量清0,与电表计度器示值一致
		DEC	R0
		MOV	@R0,A
		DEC	R0
		MOV	@R0,A
          	SJMP	SAVE_INTEGER_210
CMP_100000_1:
       		DEC	R0
		MOV	A,@R0
       		CJNE	A,01H,CMP_100000_1_0
      		SJMP	CMP_100000_0
CMP_100000_1_0:	JC	SAVE_INTEGER_210
CMP_100000_1_OUT:
          	INC	R0
            	SJMP	CMP_100000_2_OUT
CMP_100000_0:
           	DEC	R0
		MOV	A,@R0
           	CJNE	A,B,CMP_100000_0_0
          	INC	R0
		INC	R0
          	SJMP	CMP_100000_2_OUT
CMP_100000_0_0:	JC	SAVE_INTEGER_210
        	INC	R0
		INC	R0
       		SJMP	CMP_100000_2_OUT
SAVE_INTEGER_210:
          	RET

⌨️ 快捷键说明

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