📄 hldmsapp.asm
字号:
HWENDB2: LJMP HWEND
HW9: MOV A,SBUF
MOV B,A ; 读取标示符看是否为68H
JNB P,PNP2
JNB RB8,HWENDB1
LJMP HW9A
PNP2: JB RB8,HWENDB1
HW9A: ADD A,R2
MOV R2,A
MOV A,B
HW5A: MOV @R0,A
INC R0
MOV R7,#5 ;; 接收 5 位地址
HW_LOOPB1: MOV R3,#02H
HWB2: MOV R5,#0C3H ; 字节之间最大延时500ms
HWB3: MOV R6,#0FFH
HWB4: JBC RI,HWB5 ; 等待读取一字节地址
DJNZ R6,HWB4
DJNZ R5,HWB3
DJNZ R3,HWB2
HWENDBB: LJMP HWEND
HWB5: MOV A,SBUF ; 读取一个地址,与对应的地址进行比较
MOV B,A
JNB P,PNPB1
JNB RB8,HWENDBB
LJMP HWB
PNPB1: JB RB8,HWENDB2
HWB: ADD A,R2
MOV R2,A
MOV A,B
MOV @R0,A
INC R0
DJNZ R7,HW_LOOPB1
MOV A,B
CJNE A,#68H,HWENDB2
MOV R7,#2
HW_LOOPC1: MOV R3,#02H
HWC2: MOV R5,#0C3H ; 字节之间最大延时500ms
HWC3: MOV R6,#0FFH
HWC4: JBC RI,HWC5 ; 等待读取一字节地址
DJNZ R6,HWC4
DJNZ R5,HWC3
DJNZ R3,HWC2
LJMP HWEND
HWC5: MOV A,SBUF ; 读取一个地址,与对应的地址进行比较
MOV B,A
JNB P,PNPC1
JNB RB8,HWENDB2
AJMP HWC
PNPC1: JB RB8,HWENDB
HWC: MOV @R0,A
INC R0
ADD A,R2
MOV R2,A
DJNZ R7,HW_LOOPC1
MOV R7,B
CLR C
CJNE R7, #40, WPPP
AJMP WPPP1
WPPP: JNC HWENDB
WPPP1: SETB HWBR_FRAM_ALL
HW_LOOP2B: CLR EX0
MOV R3,#02H
HW12: MOV R5,#0C3H ; 字节之间最大延时500ms
HW13: MOV R6,#0FFH
HW14: JBC RI,HW15 ; 等待读取一字节地址
DJNZ R6,HW14
DJNZ R5,HW13
DJNZ R3,HW12
HWENDB: LJMP HWEND
HW15: MOV A,SBUF
JNB P,PNP3
JNB RB8,HWENDB
LJMP HW15A
PNP3: JB RB8,HWENDB
HW15A: MOV @R0,A
ADD A,R2
MOV R2,A
INC R0
DJNZ R7,HW_LOOP2B
HW_LOOP4: MOV R3,#02H
HW42: MOV R5,#0C3H ;字节之间最大延时500ms
HW43: MOV R6,#0FFH
HW44: JBC RI,HW45
DJNZ R6,HW44
DJNZ R5,HW43
DJNZ R3,HW42
HWENDC: LJMP HWEND
HW45: MOV A,SBUF ;
JNB P,PNP5
JNB RB8,HWENDC
SJMP HW45A
PNP5: JB RB8,HWENDC
HW45A: CJNE A,1AH,HWENDC ;校验和是否正确
HW_LOOP5: MOV R3,#02H ;接收结束符号16H
HW52: MOV R5,#0C0H ;字节之间最大延时500ms
HW53: MOV R6,#0FFH
HW54: JBC RI,HW55
DJNZ R6,HW54
DJNZ R5,HW53
DJNZ R3,HW52
AJMP HWEND
HW55: MOV A,SBUF ;
JNB P,PNP6
JNB RB8,HWEND
AJMP HW55A
PNP6: JB RB8,HWEND
HW55A: CJNE A,#16H,HWEND2 ;;HWEND
HWEND2: SETB HWR_FRAM_ALL
CLR P1.0
MOV TH0,#0
MOV TL0,#0
HWEND: POP B
POP PSW
POP ACC
CLR RI
SETB ES ;开串口中断
NOP
NOP
RETI
;***************************************************************************
; 收发控制程序,由中断1完成,使用寄存器2区
;****************************************************************************
NOP
NOP
NOP
SETB WDI
clr ea
ajmp $
TRANCIEVE: PUSH PSW
PUSH ACC
PUSH B
SETB PSW.4
CLR PSW.3
JNB R_T,trans ;判断是接收还是发射状态,做出相应处理
ACALL recieve_data
return_tr_rc: POP B
POP ACC
POP PSW
NOP
NOP
NOP
RETI
trans: Acall trans_begin ;当R_T=0时,转发射
AJMP return_tr_rc
;*******************************************************************************
;定时器T0中断,判断转发是否超时
;*******************************************************************************
ret6: NOP
NOP
NOP
SETB WDI
clr ea
ajmp $
T_DEAL: PUSH PSW
cpl wdi
DJNZ WAIT_TIME,UNDO1
CLR UP_BIT ;下行转发后一定时间内没收到上行转发帧,不再上行转发
CLR DOWN_BIT ;同时允许处理下行转发
MOV WAIT_TIME,#0FFH
UNDO1: JB ZBT_FRAM_ALL,UNDO2 ;载波发送3秒后仍没发完,等待硬复位
CLR R_T
DJNZ ZB_SEND_TIME,UNDO
AJMP ret6
UNDO2: setb r_t
JB R_T,UNDO
AJMP RET6
UNDO: MOV TH0,#0
MOV TL0,#0
setb p1.0
setb p1.1
NOP
NOP
POP PSW
NOP
NOP
NOP
RETI
;*******************************************************************
;485发送子程序
;功能:根据R0指定的数据首址和r2指定的数据个数通过串行口
; 发送数据,最后发送字节为累加校验和
;影响资源:acc,r2,r3,R0
;*******************************************************************
NOP
NOP
NOP
SETB WDI
clr ea
ajmp $
SENDBYTE: MOV C,PSW.0 ;发送1字节子程序
MOV TB8,C
mov sbuf,a
senda2: jbc ti,senda3 ;等待该字节发送完成
Ajmp senda2
SENDA3: NOP
NOP
RET
sendDATA: CLR ES ;禁止串口中断
CLR PSW.4
CLR PSW.3
setb r_t_485
MOV R2,#0
Senda1: mov a,#0fEH
ACALL SENDBYTE
mov a,#0fEH
ACALL SENDBYTE
mov a,#0fEH
ACALL SENDBYTE
mov a,#068H ;; 发送帧头 0X68
MOV R3, A
ACALL SENDBYTE
MOV A, Addr_DataRE ;; 发送 A0
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE
ACALL SENDBYTE
MOV A, Addr_DataRE+1 ;; 发送 A1
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+1
ACALL SENDBYTE
MOV A, Addr_DataRE+2 ;; 发送 A2
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+2
ACALL SENDBYTE
mov A, Addr_DataRE+3 ;; 发送 A3
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+3
ACALL SENDBYTE
mov a, Addr_DataRE+4 ;; 发送 A4
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+4
ACALL SENDBYTE
mov A, Addr_DataRE+5 ;; 发送 A5
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+5
ACALL SENDBYTE
mov a,#068H ;; 发送 帧头 0X68
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, #068H
ACALL SENDBYTE
mov a, Addr_DataRE+7 ;; 发送 命令码 C
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+7
ACALL SENDBYTE
mov A, Addr_DataRE+8 ;; 发送 长度 L
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+8
ACALL SENDBYTE
MOV A, Addr_DataRE+8
MOV R7,A
MOV R0,#Addr_DataRE+9
SENDLOOP: MOV A, @R0 ;; 发送 DI0 、DI1
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, @R0
ACALL SENDBYTE
INC R0
DJNZ R7, SENDLOOP
MOV A, R3 ;; 发送累加和
ACALL SENDBYTE
MOV A,#16H
ACALL SENDBYTE ;; 发送完成
MOV ADDR_DATARE, #0
MOV ADDR_DATARE+1,#0
MOV ADDR_DATARE+2,#0
sendEnd: CLR R_T_485
CLR P1.1
MOV TH0,#0
MOV TL0,#0
setb ES ;串行中断允许
NOP
NOP
RET
;*******************************************************************
;串口红外发送子程序
;功能:根据R0指定的数据首址和r2指定的数据个数通过串行口
; 发送数据,最后发送字节为累加校验和
;影响资源:acc,r2,r3,R0
;*******************************************************************
SENDDATA2: CLR ES ;禁止串口中断
PUSH PSW
PUSH ACC
PUSH B
SETB PSW.4
SETB PSW.3
mov a,#0fEH
ACALL SENDBYTE
mov a,#0fEH
ACALL SENDBYTE
mov a,#0fEH
ACALL SENDBYTE
mov a,#0fEH
ACALL SENDBYTE
mov a,#068H ;; 发送帧头 0X68
MOV R3, A
ACALL SENDBYTE
MOV A, Addr_DataRE ;; 发送 A0
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE
ACALL SENDBYTE
MOV A, Addr_DataRE+1 ;; 发送 A1
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+1
ACALL SENDBYTE
MOV A, Addr_DataRE+2 ;; 发送 A2
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+2
ACALL SENDBYTE
mov A, Addr_DataRE+3 ;; 发送 A3
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+3
ACALL SENDBYTE
mov a, Addr_DataRE+4 ;; 发送 A4
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+4
ACALL SENDBYTE
mov A, Addr_DataRE+5 ;; 发送 A5
ADD A, R3 ;; 计算累加和
MOV R3, A
MOV A, Addr_DataRE+5
ACALL SENDBYTE
mov a,#068H ;; 发送 帧头 0X68
ADD A, R3 ;; 计算累加和
MOV R3, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -