📄 hldmsapp.asm
字号:
WDI EQU P1.5 ;
ROM_SCL EQU P1.6
ROM_SDA EQU P1.7 ;
R_T EQU P1.4
RXD_TXD EQU P1.3
ROM_WP EQU P3.5
R_T_485 EQU P3.4
R_485 EQU P3.7 ;控制CD4052
;定义保存于2404中数据的地址
Addr1_sno EQU 00H ;表号1的地址
ADDR_SNONUM EQU 0BH ;表号数量
ADDR_SNONUMXX EQU 0CH ; 是否设置电表标志
ADDR_SNONUMYY EQU 1CH
ADDR2_sno EQU 10H ;表号2的地址
Addr3_Sno EQU 20H ;表号3的地址
Addr4_sno EQU 30H ;表号4的地址
ADDR5_sno EQU 40H ;表号5的地址
Addr6_Sno EQU 50H ;表号6的地址
Addr7_sno EQU 60H ;表号7的地址
ADDR8_sno EQU 70H ;表号8的地址
Addr9_Sno EQU 80H ;表号9的地址
Addr10_sno EQU 90H ;表号10的地址
ADDR11_sno EQU 0A0H ;表号11的地址
Addr12_Sno EQU 0B0H ;表号12的地址
Addr13_sno EQU 0C0H ;表号13的地址
ADDR14_sno EQU 0D0H ;表号14的地址
Addr15_Sno EQU 0E0H ;表号15的地址
Addr16_Sno EQU 0F0H ;表号16的地址
;定义保存于RAM中的数据的地址
SNO_NUM EQU 7FH ;收到的表号在2402中排列的序号
Addr_DataTR EQU 38H
Addr_DataTRB EQU 4AH
Addr_DataTRA EQU 5AH
Addr_DataRE EQU 38H ;红外或载波接收到数据的首地址,共26字节
HW_COM EQU 3FH ;红外接收到的控制码C
ZB_COM EQU 38H ;载波接收到的控制码C
SADD EQU 60H ;校验和
SBS EQU 68H ;计数
UPPER_ADDR_L EQU 7BH ;上位机地址
UPPER_ADDR_M EQU 7CH
UPPER_ADDR_H EQU 7DH
WAIT_TIME EQU 0FH
ZB_SEND_TIME EQU 7aH
;可寻址的位空间
HWBR_FRAM_ALL EQU 00H
E99_BIT EQU 01H
ZBR_FRAM_ALL EQU 02H ;载波数据接收完毕标志
ZBT_FRAM_ALL EQU 03H ;载波数据发送完毕标志
HWR_FRAM_ALL EQU 04H
HWT_FRAM_ALL EQU 05H
BS1_BIT EQU 06H
BS2_BIT EQU 07H
T_NOR_BIT EQU 08H ;发送普通数据标志
BS3_BIT EQU 09H ;载波通信中1字节发送或接收完毕标志
RELAY_BIT EQU 0AH
EEP_BIT EQU 0BH
UP_BIT EQU 0CH ;上行转发接收到标志
DOWN_BIT EQU 0DH ;=0下行转发允许,收到一次下行转发后还没转发或等待时间不到,不再进行下行转发
WR_BIT EQU 0EH ;=1允许写
hwr1_fram_all equ 0fh ;
;22H用于载波接收标志
SYN_BIT EQU 10H ;
B1S_BIT EQU 11H
B2S_BIT EQU 12H
ADDR_BIT EQU 13H
CL_BIT EQU 14H
DATA_BIT EQU 15H
CSL_BIT EQU 16H
CSH_BIT EQU 17H
;H_INT EQU 18H ; 红外有接收标志
WR1_COM EQU 0A0H ;24c02 写命令字
RD1_COM EQU 0A1H ;24c02 读命令字
;**********************************************************
;**********************************************************
;入口地址定义
org 0000h ;主循环程序入口
ljmp start
org 0003h ;载波int1中断程序入口
ljmp TRANCIEVE
nop
nop
reti
org 000bh ;定时器t0中断
LJMP T_DEAL
nop
nop
nop
reti
org 0013h
nop
nop
nop
nop
reti
org 001bh ;定时器t1中断保护(用串行通信)
nop
nop
nop
nop
nop
nop
nop
reti
org 0023h ;长检中断(串行中断)程序入口
ljmp HW ;使用寄存器3区
nop
nop
nop
nop
reti
;********************************************************************************************
;主程序
;初始化模块
;*********************************************************************************************
ORG 0030h
START: CLR P1.0
CLR P1.1
SETB ROM_WP
CLR EA
MOV SP,#25H
MOV P1,#0FFH
MOV P3,#0FFH
CLR PSW.3
CLR PSW.4
clrin: MOV R0,#0
MOV A,#0
XHX: MOV @R0,A
NOP
INC R0
NOP
cjne R0,#00h,XHX
MOV R5, #02H
XHX3: MOV R7, #0FEH
XHX2: MOV R6, #0FEH
XHX1: CLR WDI
NOP
NOP
NOP
SETB WDI
DJNZ R6, XHX1
DJNZ R7,XHX2
DJNZ R5,XHX3
COMM1:
MOV WAIT_TIME,#0FFH
MOV TL1, #0D7H ;晶振9.6MHZ,通信波特率1200bps
MOV TH1, #0D7H
setb R_T ;载波中断处于接收
MOV TMOD,#21h ;t1工作于方式2,T0工作于方式1
MOV PCON,#80h ;smod=1
MOV SCON,#0D0h ;串行口工作于方式3,带奇偶校验位
SETB ZBT_FRAM_ALL
MOV SP,#25H
;YES_OK:
CLR P1.0
CLR P1.1
MOV TH0,#00
MOV TL0,#00
;循环程序
MAIN_LOOP:
;部分设置重复初始化
SETB ROM_WP
MOV IP,#07h ;int0int1T0为高级,串口中断低级中断
SETB IT0 ;载波中断(int1)沿触发
SETB EX0 ;载波中断允许
;setb R_T
SETB TR1 ;允许t1计数
SETB TR0 ;允许t0计数
CLR RI ;清接收中断标志
SETB EA ;开中断
SETB ET0 ;T0中断允许
setb rxd
setb txd
CLR R_T_485 ;485接收状态
clr psw.3
clr psw.4
clr hwr1_fram_all
JNB ZBT_FRAM_ALL,MAIN_LOOPa
setb ES ;串行中断允许
MAIN_LOOPa: MOV A,SCON
CJNE A,#11010000B,REG1 ;部分设置重复初始化
AJMP REG1
REG1: MOV SCON,#0D0H
REG2: MOV A,PCON
CJNE A,#10000000B,REG3
AJMP REG4
REG3: MOV PCON,#80H
REG4: MOV A,TMOD
CJNE A,#00100001B,REG5
AJMP REG6
REG5: MOV TMOD,#21H
REG6: MOV A,TH1
CJNE A,#0D7H,REG7
AJMP MAIN_LOOP1
REG7: MOV TH1,#0D7H
MAIN_LOOP1: CLR HWR1_FRAM_ALL ; 红外有接收标志hwr1_fram_all
SETB R_485 ;; CD4052重恢复
SETB P3.3 ;; 设置键重恢复
; CLR H_INT ; 红外有接收标志
clr wr_bit ;; 循环清写允许标志位
MOV C,P3.3
JNC MAX_1 ; 强制允许为0时 亮灯
SETB P1.1
SJMP MAX_2
MAX_1: CLR P1.1
MAX_2: JNB HWR_FRAM_ALL,MAIN_LOOP2
JNB HWBR_FRAM_ALL,MAIN_LOOP2 ;红外接收完毕
clr hwbr_fram_all
clr hwr_fram_all
SETB HWR1_FRAM_ALL
CLR EX0
CLR ES
ACALL HW_DEAL
; CLR H_INT ; 红外有接收标志
clr hwbr_fram_all
clr hwr_fram_all
CLR HWR1_FRAM_ALL
SETB EX0
SETB ES
MAIN_LOOP2: JNB ZBR_FRAM_ALL,MAIN_LOOP
clr zbr_fram_all ;载波接收完毕
CLR EX0
CLR ES
AJMP ZB_DEAL
;红外通信处理模块
RETEND: RET
HW_DEAL : CLR E99_BIT
MOV 24H,ADDR_DATARE+9 ;; 保存 D0
MOV 7EH,ADDR_DATARE+10 ;; 保存 D1
MOV DPL,ADDR_DATARE ;; 保存 A0
MOV DPH,ADDR_DATARE+1 ;; 保存 A1
MOV 23H,ADDR_DATARE+2 ;; 保存 A2
MOV ADDR_DATARE-3,ADDR_DATARE+3 ;; 保存 A3
MOV ADDR_DATARE-2,ADDR_DATARE+4 ;; 保存 A4
MOV ADDR_DATARE-1,ADDR_DATARE+5 ;; 保存 A5
MOV R2,#6
MOV R0,#ADDR_DATARE
CMP1: MOV A,@R0
INC R0
CJNE A,#99H,CMP ;地址为广播地址吗?不为,判断是否为本抄表器地址
DJNZ R2,CMP1
MOV A, HW_COM
SETB E99_BIT
AJMP HW_DEAL_R
CMP: clr hwbr_fram_all
clr hwr_fram_all
LCALL ADDR_CMP ;; 比较地址
JNC HW_DEAL_R ;地址不符,不处理
RET
HW_BSCOM: LCALL AD_BS1 ;通过485抄表子程序
CLR ES
RET
RDBS_ERRORA: MOV ADDR_DATATRB+2,#08H
MOV ADDR_DATATRB,#0C1H
AJMP WRBS_ERROR1A
RDSY1: AJMP RDSY
RDBS_ERROR2: AJMP RDBS_ERROR1
HW_DEAL_R: MOV A,HW_COM ;读命令字
RDATA: CJNE A,#04H,RDATA1 ;=04H,请求写数据
LJMP WDATA
RDATA1: CJNE A,#01H,RDBS_ERROR2 ;=01H,请求读数据
MOV A,7EH ;读数据项标识高位
CJNE A,#0F3H,JMPNN
MOV A, ADDR_DATARE+8
CJNE A, #2, JMPLL4
MOV A, 24H
CJNE A,#65H, JMPLL4
LJMP RDXXX
JMPNN: CJNE A,#0C3H,JMPLL2 ;; 90H + 33H 当前
AJMP JMPLL1
JMPLL2: CJNE A,#0C7H,JMPLL3 ;; 94H + 33H 上月
AJMP JMPLL1
JMPLL3: CJNE A,#0CBH, JMPLL4 ;RDSY1 ;; 98H + 33H 上上月
AJMP JMPLL1
JMPLL4: MOV A,7EH
CJNE A,#0F3H, RDBS_ERRORAXX ;RDSY1
AJMP RDSNO_NUM
JMPLL1: LCALL HW_BSCOM
;; // 抄表返回处理
JNB HWR_FRAM_ALL,RDBS_ERRORAXX
CLR HWR_FRAM_ALL
MOV A, ADDR_DATARE+7
CJNE A,#81H,RDC1
MOV A, ADDR_DATARE
CLR C
SUBB A, DPL
JNZ RDBS_ERRORAXX ; A0不等 转移
MOV A, ADDR_DATARE+1
CLR C
SUBB A, DPH
JNZ RDBS_ERRORAXX ; A1不等 转移
MOV A, ADDR_DATARE+2
CLR C
SUBB A, 23H
JNZ RDBS_ERRORAXX ; A2不等 转移
MOV A, ADDR_DATARE+10
CJNE A, #0C3H, RLMP1
AJMP RLMP3
RLMP1: CJNE A, #0C7H, RLMP2
RLMP3:
; MOV R0, #ADDR_DATARE+15
; MOV R1, #ADDR_DATARE+19
; MOV R7, #12
;RLMP4: MOV A, @R1
; MOV @R0, A
; INC R0
; INC R1
; DJNZ R7, RLMP4
; MOV A, ADDR_DATARE+8
; CLR C
; SUBB A, #4
; MOV ADDR_DATARE+8, A
RLMP2: LCALL SENDDATA2
RET
RDC1: CJNE A,#0C1H,RDBS_ERRORAXX
MOV ADDR_DATARE, DPL ;; 加入表号
MOV ADDR_DATARE+1,DPH
MOV ADDR_DATARE+2,23H
MOV ADDR_DATARE+3,ADDR_DATARE-3
MOV ADDR_DATARE+4,ADDR_DATARE-2
MOV ADDR_DATARE+5,ADDR_DATARE-1
LCALL SENDDATA2
RET
RDBS_ERRORAXX: MOV ADDR_DATARE, DPL ;; 加入表号
MOV ADDR_DATARE+1,DPH
MOV ADDR_DATARE+2,23H
MOV ADDR_DATARE+3,ADDR_DATARE-3
MOV ADDR_DATARE+4,ADDR_DATARE-2
MOV ADDR_DATARE+5,ADDR_DATARE-1
MOV ADDR_DATARE+7, #0C1H
MOV ADDR_DATARE+8, #01H
MOV ADDR_DATARE+9, #34H
LCALL SENDDATA2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -