📄 zhuyin从控测试程序1.asm
字号:
;********************************************
;名称:供电系统从控制器源程序(复费率+恶意负载识别)
;日期:2005-03-01
;描述:供电系统下位机源程序
; 使用软件来识别恶意负载
;作者:red_swords
;********************************************
;*******************************************************************************
;恶意负载识别参数设置
;PAR1——判断功率是否下降参数
; FFH—— FEH —— FDH —— FCH —— FBH ——
; 0W—— 50W —— 100W —— 150W —— 200W ——
; 例:当PAR1=FCH,表示当功率下降超过150W时,视功率下降
;
;PAR2——判断是否置位功率下降标志
; 1 —— 2 —— 3 —— 4 —— 5 ——
; 50W —— 100W —— 150W —— 200W —— 250W ——
; 例:当PAR2=3时,表示当功率下降,且功率下降到 <=150W,不设置功率下降标志
; >150W,设置功率下降标志
;********************************************************************************
;********************************************************************************
;修改条例:
;2005-05-23:在定时关的时候,判断此可表状态是否为永久关闭
;2005-07-14:增加分时限制电流功能
;2006-04-01:恶意负载在一天内连续跳电3次,则不在自动来电,需要人工干预
;********************************************************************************
PAR1 EQU 0FCH
PAR2 EQU 3
;CPU引脚定义
LINE_ADDR BIT p3.7 ;读取本机地址
LINE_BEEP BIT p3.6 ;beep使能
SDA BIT p3.5 ;
SCL BIT p3.4 ;
WDI BIT p3.3 ;watchdog复位
RS485_TR BIT p3.2 ;485发送/接收使能
LINE_LED BIT p1.6 ;指示灯
;-------------------继电器输出控制-----------------
RY_S0 BIT P1.0
RY_S1 BIT P1.1
RY_S2 BIT P1.2 ;8位地址锁存译码器输入
RY_D BIT P1.3 ;
MRY_O0 BIT P2.0
MRY_C0 BIT P2.1
MRY_O1 BIT P2.4
MRY_C1 BIT P2.5
SRY_O0 BIT P2.2
SRY_C0 BIT P2.3
SRY_O1 BIT P2.6
SRY_C1 BIT P2.7 ;8路259使能信号
;---------------脉冲和恶意负载识别输入控制-----------------74LS166
CLOCK BIT P1.4 ;时钟
CLK_INH BIT P1.5 ;时钟抑制
MC_SL0 BIT P0.0 ;(读电表脉冲)shift/load
MC_QH0 BIT P0.1 ;(读电表脉冲)数据线
LC_SL0 BIT P0.2 ;(读恶意负载)shift/load
LC_QH0 BIT P0.3 ;(读恶意负载)数据线
MC_SL1 BIT P0.4 ;(读电表脉冲)shift/load
MC_QH1 BIT P0.5 ;(读电表脉冲)数据线
LC_SL1 BIT P0.6 ;(读恶意负载)shift/load
LC_QH1 BIT P0.7 ;(读恶意负载)数据线
;---------------内部512字节RAM分配---------
;20h
ERR_RATE BIT 00h ;费率表出错标志
FLAG_REQUE BIT 01h ;系统信息请求标志
FLAG_START BIT 02h ;系统开始运行标志
ERR_EE BIT 03h ;EEPROM出错标志
SYS_ERR BIT 04h ;信息标志出错标志
BEEP_EN BIT 05h ;beep允许叫标志 系统不一致的时候叫5次,开始运行的时候叫1次
F_30S BIT 06H ;30秒到标志
F_60S BIT 07H ;60秒到标志
INDEX_MASTER EQU 21H ; 主继电器开/关索引
INDEX_SLAVE EQU 22H ; 从继电器开/关索引
CTRL_MRY00 EQU 23H
CTRL_MRY10 EQU 24H
CTRL_MRY01 EQU 25H
CTRL_MRY11 EQU 26H ;主继电器存储状态
M30 EQU 27H
;28h空余
F_BADF BIT 40H ;恶意负载识别功能是否起用标志
F_FLAG BIT 41H ; 分时间段限制电流比较标志 =1真确
F_1M BIT 42H ;1分钟标志 =1时 到一分钟
F_CLEAR BIT 43H ;每天清楚恶意负载的一个标志
BEEP_MIN EQU 29h ;
BEEP_SEC EQU 2ah ;鸣叫倒计时单元 过流、过载的时候赋值
CURR_SRY00 EQU 2bh ;
CURR_SRY01 EQU 2ch ;
CURR_SRY10 EQU 2dh ;
CURR_SRY11 EQU 2eh ;从继电器状态
CURR_MRY00 EQU 2fh ;
CURR_MRY01 EQU 30h ;
CURR_MRY10 EQU 31h ;
CURR_MRY11 EQU 32h ;主继电器状态
ADDRESS EQU 33h ;本机地址存放
RY_CNT EQU 34h ; 继电器操作计时单元
MC_PORT0 EQU 35h ;前8表的上次 读入的状态
MC_PORT1 EQU 36h ;后8表的上次 读入的状态
PP_SEC EQU 37h ; 秒计时单元 0.5s关蜂鸣器
SECOND EQU 38h ;
MINUTE EQU 39h ;
HOUR EQU 3ah ;系统时间
SERVER EQU 3bh ;
SERVER1 EQU 3ch ;
MASTER EQU 3dh ;
ADDR EQU 3eh ;
SVR_JYH EQU 3fh ;4字节系统信息+1字节校验和
LC_PORT0 EQU 40h ;
LC_PORT1 EQU 41h ;
HALF_MINUTE EQU 42h ;
MICRO_SEC EQU 43h ;
SBLC_FIRST0 EQU 44h ;
SBLC_FIRST1 EQU 45h ;
BAD_PW EQU 46H
SBLC_LIMIT EQU 47h ;恶意负载识别功率值16字节(47H~56H)
BLC_TCNT EQU 57h ;功率下降标志16字节(57H~66H)
BLC_CNT EQU 67h ;恶意负载倾向标志16字节(67H~76H)/改为功率连续增加计数
LC_BUF0 EQU 77h ; METER COUNT 0-7 8byte (77h~7eh)
LC_BUF1 EQU 7fh ; METER COUNT 8-15 8byte (7fh~86h)
MC_BUF EQU 87h ;COUNT OF METER(87H-8eH,8 Byte)
; METER COUNT 0-7(BIT0-3)
; METER COUNT 0-7(BIT4-7)
EEREAD_BUF EQU 8fh ;EEPROM读缓冲器(08FH-09fH,17个字节)
PW_CNT EQU 0a0h ;实时功率保存超时计数单元 16byte 0a0h~0afh
BIHUAN EQU 0B0H ;0B0H~0BFH
TMP EQU 0C0H ;功率增量
;0C0h~0cfh暂时空余 ;z添加
shi_j equ 28h;0c1h ;时间秒计数单元
add_r equ 0c0h ;地址计数单元
; equ 39h
; equ 3ah
STACK_BUF EQU 0c4h;0c1H ; 堆栈(0D0H-0FFH) ?
;---------------内部扩展RAM分配(范围000H-3FFH)---------
PP_BUF EQU 000h ; 存放每个电表的脉冲个数, 满160即为0.1度,并将其清0
POINT_BUF EQU 010h ; 存放每个电表的电表数,每个电表占用4*4+1个字节,对应4种费率,
; Byte0-3 费率1电表数
; Byte4-7 费率2电表数
; Byte8-11 费率3电表数
; Byte12-15 费率4电表数
; Byte16 JYH
LIMIT_SEC EQU 120h ; 跳电计时秒单元 16字节
LIMIT_MIN EQU 130h ; 跳电计时分单元 16字节
MRY_BUF EQU 140h ; 主继电器操作队列(140H-14FH,16 Byte)
SRY_BUF EQU 150h ; 从继电器操作队列(150H-15FH,16 Byte)
LIMIT_BUF EQU 160h ; 限制电流计数单元
CLOSE_TIME EQU 170h ; 跳电关断时间(180H-18FH,16 Byte)
RATE_BUF EQU 180h ; 多费率时间表(16个时段,对应4种费率,每个时段占用5个字节,总计5*16+1=81个字节)
; 范围(190H-1e0H)
; Byte0: 开始小时
; Byte1: 开始分
; Byte2: 结束小时
; Byte3: 结束分
; Byte4: 费率
BLC_BUF EQU 1D1h ; 本次脉冲周期计数单元 32byte
BLC_OLDBUF EQU 1F1h ; 上次脉冲周期计数单元 32byte
LAST_BLC EQU 211h ; 上次功率 16byte
LASTADD_BLC EQU 221h ; 增加的功率 3byte/只
;251H~25FH空余
METER_INF EQU 260H ; 电表当前信息,主继电器状态、从继电器状态、当前功率、跳电电流、跳电功率80byte
PW_OUT EQU 2B0H ; 功率识别屏蔽区间2A0H~2EFH 80byte
METER_DAT EQU 300H ; 电表读数有无更新标志(2F0H-2FFH,16 Byte)
LIMIT_PP EQU 310H ; 限制电流值(300H-30FH,16 Byte)
SHARELIMITT EQU 320H ; 分时间限制电流-时间段 64byte
SHARELIMITC EQU 360H ; 分时间限制电流-限制电流 16byte
LIMIT_CUR EQU 370H ; 当前限制电流
CMP_TIME EQU 380H ; 分时限流判断时间
bad_count equ 390h ; 恶意负载跳电次数 390H~39FH
RD_BUF EQU 3a0h ; 串行接收缓冲区 96byte (3a0h~3ffh)
;---------------AT24C16分配表,000H~7FFH---------
EE_FBUF0 EQU 0000H ;系统初始化标志
EE_FBUF1 EQU 0001H ;系统初始化标志
;0002h~003h 空余
EE_CURRRY EQU 0004H ;继电器状态
EE_SERVER EQU 0008H ;系统ID
;00DH~00EH 空余
EE_BADFLAG EQU 000FH ; 是否起用恶意负载标志
EE_CT EQU 0010H ; 跳电关断时间
;020h~02fh 空余
EE_LPP EQU 0030H ; 限制电流
;040h~04FH 空余
EE_BUF0 EQU 0050H ; 电表电流EEPROM存储区域0
EE_BUF1 EQU 0160H ; 电表电流EEPROM存储区域1
EE_BUF2 EQU 0270H ; 电表电流EEPROM存储区域2
EE_RATE EQU 0380H ; 多费率时间段存储区域
;3B1H~3BFH 空余
EE_BADCODE EQU 03E0H ; 恶意负载识别功率存储单位
;3F0H~3FFH 空余
EE_OUTCODE EQU 0400H ; 功率识别屏蔽区间 80BYTE
EE_SHARELIMITT EQU 0450H ; 分时间限制电流--时间段 64BYTE
EE_SHARELIMITC EQU 0490H ; 分时间限制电流--限制电流 16BYTE
;4A0H~7FFH 空余
;---------------常量定义--------------
SBLC_WD EQU 0 ; 默认软件恶意负载识别功率(12,600W) 不过12
PWCNT EQU 60 ; 实时功率保存超时计数器 暂时定为60S超时
FADDR EQU 0a0h ; fixed address for AT24Cxx EEPROMs
PSIZE EQU 16 ; bytes per page for AT24C16
EE_FLAG EQU 5AH ; 系统初始化标志
METER_VAR EQU 160 ; 电表常量
LMT_VAL EQU 6 ; LIMIT CURRENT VALUE (6 Pulse/A)
DEF_CURR EQU 30 ; DEFAULT CURRENT (30A)
DEF_CT EQU 3 ; DEFAULT CLOSE TIME (3 MINUTE)
RY_DELAY EQU 12
RYB_NUM EQU 16
RD_OK EQU 0FH ; 正确应答值
RD_REQUE EQU 0EEH ; 请求系统信息值
;---------------命令字---------------------------
RF_RP EQU 10H ; 读电表读数
RF_IN EQU 11H ; 读电表状态
RF_WP EQU 12H ; 写电表读数
RF_MSO EQU 20H ; 主继电器绝对开
RF_MSOT EQU 22H ; 主继电器开
RF_MSC EQU 21H ; 主继电器绝对关
RF_MSCT EQU 23H ; 主继电器关
RF_SSO EQU 24H ; 从继电器开
RF_SSC EQU 25H ; 从继电器关
RF_MOP EQU 26H ; 主继电器全开/关
RF_MOPABS EQU 27H ; 主继电器绝对全开/关
RF_SOP EQU 28H ; 从继电器全开/关
RF_LTA EQU 30H ; 写限制值
RF_BAD EQU 31H ; 写恶意负载识别功率
RF_TIM EQU 32H ; 写跳电后的恢复时间
RF_SID EQU 33H ; 写系统ID
RF_OUT EQU 34H ; 写识别功率的屏蔽区间
RF_RATE EQU 35H ; 写多费率时间段
RF_BADF EQU 36H ; 恶意负载识别标志
RF_SHAREL EQU 37H ; 分时间限制电流
RF_RESET EQU 40H ; 电表读数清零
RF_INF0 EQU 51H ; 读取指定电表的恶意负载识别功率和过流值
RF_INF1 EQU 52H ; 读取指定电表的功率识别屏蔽区间
RF_RSHAREL EQU 53H ; 读分时限制电流
AUXR EQU 8EH ; Auxiliary Register(SST89E554)
; D0 -- AO: Disable(1)/Ensble(0) ALE
; D1 -- EXTRAM: Internal(0)/External(1) RAM access
AUXR1 EQU 0A2H ; STC使用DPTR1控制寄存器
DSP EQU 86H ; W77E58使用DPTR1控制寄存器
CHPCON EQU 0BFH ; Auxiliary Register(W77E365)
; D4 -- EXTRAM: Internal(0)/External(1) RAM access
ORG 0000H
SJMP MAIN ; 使用寄存器组 0
ORG 000BH
LJMP Timer0 ; 使用寄存器组 1
ORG 001BH
LJMP Timer1 ; 使用寄存器组 2
ORG 0023H
LJMP Serial ; 使用寄存器组 3
ORG 0030H
MAIN: MOV SP,#STACK_BUF ; 堆栈(0D0H-0FFH) ?好象是从0C1H开始的。
CLR RS0
CLR RS1 ;
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
CLR RS485_TR ; 184设置成接收数据状态
; CLR LINE_LED ; 点亮LED
CLR SYS_ERR ; 系统ID出错标志 =1时信息出错
; MOV AUXR,#01H ; 允许使用片内RAM(SST89E554)
; MOV CHPCON,#00010000B ; 允许使用片内RAM(W77E365)
MOV PMR,#1
;---------------清除所有内存单元-----------------
MOV R0,#20H
MOV A,#STACK_BUF
CLR C
SUBB A,#20H
MOV R1,A
CLR A
MN_00: MOV @R0,A
INC R0
DJNZ R1,MN_00 ; 将内部RAM单元初始化为0(20H~0E0H)
;---------------清除所有内存单元-----------------
MOV DPTR,#0
CLR A
MOV R2,#4
MN_001: MOV R1,#0
MN_002: MOVX @DPTR,A
INC DPTR
DJNZ R1,MN_002
DJNZ R2,MN_001 ; 将内部扩展RAM存储区(0000H~03FFH)清零
;------------------------------------------------
SETB F_1M ;1分钟标志 =1时 到一分钟
;---------------初始化脉冲周期计数单元-----------
MOV DPTR,#BLC_BUF
MOV R7,#16
MN_003: MOV A,#0FBH
MOVX @DPTR,A
INC DPTR
MOV A,#0FFH
MOVX @DPTR,A
INC DPTR
DJNZ R7,MN_003
;---------------初始化分时限流识别时间单元
MOV DPTR,#CMP_TIME
MOV R7,#16
MN_004: CLR A
MOVX @DPTR,A
INC DPTR
DJNZ R7,MN_004
;------------------------------------------------z 开定时器 t0
lcall MN_START ;初始化定时器 并且开定时器T0
lcall WriteEEFlag ;向 AT24C16 中写系统初始化标志 为了后面的读出
;------------------------------------------------ z 1、测试蜂鸣器和led的好坏.
mov shi_j,#0 ;初始化时间秒单元
clr LINE_BEEP ;蜂鸣器鸣叫
clr LINE_LED ;点亮led 2秒钟测试蜂鸣器和led的好、坏。
shi_2: mov a,shi_j
cjne a,#1,shi_1
shi_1: jc shi_2 ;时间没有到2秒在这边等待
setb LINE_BEEP ;蜂鸣器关鸣叫
shi_4:
mov a,shi_j
cjne a,#6,shi_4 ; 延时6-1秒后 再测试 从控地址是否正确
;---------------读系统地址地址------------------- z 2、测试从控地址的好坏。
CLR LINE_ADDR
MOV R7,#20H
DJNZ R7,$ ;
MOV A,P2
CPL A
MOV ADDRESS,A
SETB LINE_ADDR ; 读取从控地址
mov r7,#8
clr c
mov add_r,#0 ;地址计数单元清零
mov A,ADDRESS
add_2: rrc a
inc add_r ;位数加1 看下一位
jnc add_4 ;地址的这一位不等于1跳走 继续右移
sjmp add_3 ; 取出位数据去控制蜂鸣器。
add_4: djnz r7,add_2 ;
sjmp add_5
add_3: clr et0
clr tr0
setb et0
setb tr0
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -