📄 从控测试程序.asm
字号:
clr f_30s ; 0.5秒 初始化 =0开蜂鸣器 . =1 关蜂鸣器
; clr line_beep ; 有位数=1 就开蜂鸣器
mov shi_j,#0 ; 让时间位从0开始加 一直加到 add_r
add_7:
jnb f_30s,add_8 ; =0开蜂鸣器 . =1 关蜂鸣器
setb line_beep
sjmp add_9
add_8: clr line_beep ; =0开蜂鸣器 . =1 关蜂鸣器
add_9: mov a,shi_j
cjne a,add_r,add_6
add_6: jc add_7 ;shi_j <add_r 就返回继续加
setb line_beep ; 等于的话 就关蜂鸣器
add_5:
;-----------------------------------------------z 3、测试AT24C16的好坏
;mov a,shi_j ; 时间秒计数单元的随即数
;lcall WriteEEFlag ;向 AT24C16 中写系统初始化标志
LCALL CheckEEFlag ; 判断系统标志 C=0系统真确
JNC at24_1 ;好的话跳走
mov shi_j,#0
clr LINE_BEEP ;蜂鸣器长鸣叫 5秒钟
at24_3: mov a,shi_j
cjne a,#2,at24_2
at24_2: jc at24_3 ;小于5秒蜂鸣器 继续鸣叫。
setb line_beep ;到5秒关蜂鸣器。
at24_1:
mov r1,#16
mov a,#0
maichong:
mov dptr,#pp_buf ;clr 16 pulse
movx @dptr,a
inc dptr
djnz r1,maichong
;---------------MasterRelay OUTPOT RESET--------
mov r1,#16
xx1: mov a,r1
dec a
LCALL MasterRelayOpenRelease ;将主继电器开置0
LCALL MasterRelayCloseRelease ;将主继电器关置0
djnz r1,xx1
mov r1,#16
xx2: mov a,r1
dec a
LCALL slaveRelayOpenRelease ;将主继电器开置0
LCALL slaveRelayCloseRelease ;将主继电器关置0
djnz r1,xx2
;---------------将主继电器的开关都置0-----------
mov shi_j,#0
aaaaa: MOV R1,#16
MN_01:
MOV A,R1
DEC A
mov r5,#5
mov r4,#00
f_1_1: lcall MasterRelayOpenPress;
djnz r4,f_1_1
djnz r5,f_1_1
; mov a,shi_j
; cjne a,100,f_1_1_t
f_1_1_t: ; jc f_1_1
; mov shi_j,#0
; clr c
mov r5,#5
mov r4,#00
f_1_1_1: LCALL MasterRelayOpenRelease ;将主继电器开置0
mov a,shi_j
; cjne a,150,f_1_1_1_t
f_1_1_1_t: ; jc f_1_1_1
djnz r4,f_1_1_1
djnz r5,f_1_1_1
djnz r1,mn_01
;;;;;;;;;;;;;;;
mov r1,#16
MN_01_2:
MOV A,R1
DEC A
mov r5,#5
mov r4,#00
f_1_2: lcall MasterRelayClosePress;
djnz r4,f_1_2
djnz r5,f_1_2
mov r5,#5
mov r4,#00
f_1_2_1: LCALL MasterRelayOpenRelease ;将主继电器开置0
djnz r4,f_1_2_1
djnz r5,f_1_2_1
djnz r1,mn_01_2
;;;;;;;;;;;;;;;
mov r1,#16
mn_01_3 :
mov a,r1
dec a
mov r5,#5
mov r4,#00
f_1_3: lcall SlaveRelayOpenPress
djnz r4,f_1_3
djnz r5,f_1_3
mov r5,#5
mov r4,#00
f_1_3_1: LCALL MasterRelayOpenRelease ;将主继电器开置0
djnz r4,f_1_3_1
djnz r5,f_1_3_1
djnz r1,mn_01_3
;;;;;;;;;;;;;;
mov r1,#16
mn_01_4 :
mov a,r1
dec a
mov r5,#5
mov r4,#00
f_1_4: lcall SlaveRelayClosePress
djnz r4,f_1_4
djnz r5,f_1_4
mov r5,#5
mov r4,#00
f_1_4_1: LCALL MasterRelayOpenRelease ;将主继电器开置0
djnz r4,f_1_4_1
djnz r5,f_1_4_1
djnz r1,mn_01_4
; LCALL MasterRelayOpenRelease ;将主继电器开置0
; LCALL MasterRelayCloseRelease ;将主继电器关置0
; 在INCPOINT 中只要有脉冲就把脉冲pp_buf置为1,160 变为1 pp_buf
; mov r1,#16
;MOV R5,ADDRESS ; R5中存放校验和 从本机地址开始
mov r1,#16
maichongx: mov dptr,#pp_buf ;clr 16 pulse
movx a,@dptr
inc dptr
djnz r1,maichongx
mov a,#14h ;minglingzi
LCALL SendData
mov a,#20 ;comm_length
mov r2,#0
mov r2,a ;r2 chy
LCALL SendData
add a,r2
mov r2,a
MOV A,ADDRESS
LCALL SendData
add a,r2
mov r2,a
mov r1,#16 ;16 pulse buffer
maichong1: mov dptr,#pp_buf ;clr 16 pulse
movx a,@dptr
LCALL SendData
add a,r2
mov r2,a
inc dptr
djnz r1,maichong1
cpl a
add a,#1
LCALL SendData
CLR RS485_TR ; 184设置成接收数据状态
ljmp aaaaa
;---------------内扩SRAM中电表读数初始化0.0 00 AA AA AA--------
LCALL FullPoint
;---------------EEPROM OPERATIONS------------------------------
LCALL CheckEEFlag ; 判断系统标志 C=0系统真确
JNC MNEE_OK
SJMP MNSVR_FALSE
MNEE_OK: LCALL ReadServer ; 判断系统ID =0真确
JZ MNSVR_OK
SJMP MNSVR_FALSE
MNSVR_OK:
MOV A,ADDRESS
CJNE A,ADDR,MNSVR_FALSE ; 判断本从控地址和上次运行时候的地址是否一致
SJMP MN_START
MNSVR_FALSE:
LCALL WriteBegin ; 系统ID读取出错 || 本机地址和上次不一致,则初始化系统参数
MN_START:
MOV TMOD,#11H
MOV TH0,#0B8H
MOV TL0,#03H ; 10MS,22.1184MHZ
SETB TR0
SETB ET0
MOV TH1,#0DCH
MOV TL1,#00H ; 5MS,22.1184MHZ
SETB TR1
SETB PT1
CLR ET1
SETB ET1
MOV SCON,#0F0H
SETB ES
SETB EA
MOV TH2,#0FFH
MOV TL2,#0B8H ; 9600BPS,22.1184MHz
MOV RCAP2H,TH2
MOV RCAP2L,TL2
MOV T2CON,#30H
SETB TR2
ret ;z
; setb FLAG_START;
MN_MN: CPL WDI ; WATCHDOG RESET
LCALL Start ; 检测系统执行标志 判断系统是否运行
LCALL CHECK_PW_CNT ; 检测实时功率保存单元计数有无超时超时将电表当前信息当中的当前功率=0
LCALL RELAYOPTION ; 调用继电器开/关操作子程序
LCALL BIHUANJIANCE ; 闭环检测
LCALL CLEARFLAG ;
JNB F_1M,MN_MN ;1分钟标志 =1时 到一分钟
LCALL SHARELIMITCP ; 分时间段限制电流比较
SJMP MN_MN
;---------------------------------------
; 功能:初始化系统参数
;---------------------------------------
WriteBegin:
MOV CURR_MRY00,#0FFH
MOV CURR_MRY01,#0FFH
MOV CURR_MRY10,#0FFH
MOV CURR_MRY11,#0FFH ; 主继电器当前状态
MOV CTRL_MRY00,#0FFH
MOV CTRL_MRY10,#0FFH
MOV CTRL_MRY01,#0FFH
MOV CTRL_MRY11,#0FFH ; 主继电器存储状态
MOV CURR_SRY00,#0FFH
MOV CURR_SRY01,#0FFH
MOV CURR_SRY10,#0FFH
MOV CURR_SRY11,#0FFH ; 从继电器存储状态
LCALL WriteCurrRelay ; 初始化主继电器和从继电器的状态
; 初始化跳电关断时间
MOV DPTR,#CLOSE_TIME
MOV A,#DEF_CT ;关断时间为3分钟
MOV R7,#16
WTB_0: MOVX @DPTR,A
INC DPTR
DJNZ R7,WTB_0
LCALL WriteCloseTime
; 初始化限制电流
MOV DPTR,#LIMIT_PP
MOV A,#DEF_CURR*LMT_VAL ;30*6=180
MOV R7,#16
WTB_1: MOVX @DPTR,A
INC DPTR
DJNZ R7,WTB_1
LCALL WriteLimitPP
; 初始化多费率时间表
MOV DPTR,#RATE_BUF
MOV A,#0AAH
MOV R7,#81
WTB_2: MOVX @DPTR,A
INC DPTR
DJNZ R7,WTB_2
LCALL WriteRate
; 写系统初始化标志
LCALL WriteEEFlag
; 将EEPROM中的电表读数FF
LCALL RESETPOINT
; 初始化恶意负载的识别功率
MOV R0,#SBLC_LIMIT
MOV R7,#16
MOV A,#SBLC_WD ; 默认软件恶意负载识别功率(12,600W)
WTB_3: MOV @R0,A
INC R0
DJNZ R7,WTB_3
LCALL WriteEEBadcode;
; 初始化功率识别屏蔽区间
LCALL ResetOutCode
;初始化恶意负载识别功能标志 defualt 起用
LCALL ResetBadFlag
;初始化分时间段限制电流
LCALL ResetShareLimit ;64字节的时间段AAH,16字节的电流240
RET
;---------------------------------------------------
Start: ;主写系统ID真确的时候才有可能运行T1
JB FLAG_START,ST_00 ; 判断系统运行标志=1系统运行 只有在写系统ID的时候才=1
RET
ST_00: JB SYS_ERR,SYSTEM_ERR ; 本机存放的系统信息和接收到的系统信息不一致标志
;只有在写系统ID的时候才有可能=1 系统标志出错
AJMP SYSTEM_OK
SYSTEM_ERR: LCALL RESETPOINT ; 系统信息出错,复位电表读数
SYSTEM_OK:
CLR FLAG_START ;运行过一次后将系统运行标志=0下次不在运行到这里
LCALL ReadCurrRelay ; 读取系统断电时候的继电器状态
LCALL ReadCloseTime ; 读取系统过流后的关断时间
LCALL ReadLimitPP ; 读取系统的限制电流
LCALL ReadAllPoint ; 读取电表读数
LCALL ReadEEBadcode ; 读取恶意负载识别功率
LCALL ReadRate ; 读取多费率时间段
LCALL ReadOutCode ; 读取功率识别屏蔽区间
LCALL ReadBadFlag ; 读取恶意负载识别标志
LCALL ReadSHARELIMIT ; 读取分时间段限制电流
SETB BEEP_EN ;beep允许叫标志 =1时允许鸣叫 T1中开系统鸣叫5次
;---------------CURREN MasterRelay RELOADS------------------
;---------------根据主继电器状态 置开、关标志 0F0H开 0E0H关----------
MOV A,CURR_MRY00
CJNE A,CURR_MRY10,STRY_ERR
MOV A,CURR_MRY01
CJNE A,CURR_MRY11,STRY_ERR
SJMP STRY_OK
STRY_ERR:
LCALL ReadCurrRelay
STRY_OK:
MOV A,CURR_MRY00
MOV B,A
SETB C
CLR A
MOV R5,#0
MOV R7,#8
STRY_M01:
RLC A
PUSH ACC
ANL A,B
JZ STRY_M02
MOV A,R5
LCALL OpenMasterRelay
MOV DPTR,#METER_INF ; 电表当前信息首地址
PUSH B ; 电表当前信息,主继电器状态、从继电器状态、当前功率、跳电电流、跳电功率80byte
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A ; 计算指定地址
POP B
MOV A,#10000000B
MOVX @DPTR,A ;80H开
SJMP STRY_M03
STRY_M02:
MOV A,R5
LCALL CloseMasterRelay
PUSH B
MOV DPTR,#METER_INF ; 电表当前信息首地址
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A ; 计算指定地址
POP B
MOV A,#10000011B ;83H关
MOVX @DPTR,A
STRY_M03:
INC R5
POP ACC
CLR C
DJNZ R7,STRY_M01
MOV A,CURR_MRY01
MOV B,A
SETB C
CLR A
MOV R5,#8
MOV R7,#8
STRY_M11:
RLC A
PUSH ACC
ANL A,B
JZ STRY_M12
MOV A,R5
LCALL OpenMasterRelay
PUSH B
MOV DPTR,#METER_INF ; 电表当前信息首地址
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A ; 计算指定地址
POP B
MOV A,#10000000B
MOVX @DPTR,A
SJMP STRY_M13
STRY_M12:
MOV A,R5
LCALL CloseMasterRelay
PUSH B
MOV DPTR,#METER_INF ; 电表当前信息首地址
MOV B,#5
MUL AB
ADD A,DPL
MOV DPL,A
MOV A,B
ADDC A,DPH
MOV DPH,A ; 计算指定地址
POP B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -