📄 new6.asm
字号:
ORG 0000H
LJMP INIT
ORG 000BH
LJMP TMINT
ORG 0023H
LJMP CORINT ;ES
ORG 0300H
INIT: MOV P1,#33H
MOV P2,#0FH
;mov p3,#0dh
CLR P1.3 ;SET RECEIVE STATE
SETB P2.4
SETB 04H
SETB P2.5
SETB 05H
CLR P2.6
CLR 06H
mov sp,#60h
MOV TMOD,#21H ;INI T0,T1,T0 10MS TIME
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV TH1,#0FAH
MOV TL1,#0FAH ;fa 9600 e8 2400 f4 4800
MOV SCON,#50H
MOV 0B8H,#10H
NOP
MOV 87H,#80H ;pcon's SMOD
MOV R1,#2FH ;DATA SAVE ADDRESS
MOV A,#0
MOV R7,A ;0,DATA NET END ,1,DATA END
MOV 50H,A ;MS 毫秒
MOV 51H,A ;S 秒
MOV 52H,A ;MS 毫秒
MOV 53H,A ;S 秒
MOV 5AH,A ;MINUTE 分钟
MOV 54H,A
MOV 55H,A
MOV 56H,A
CPL P1.6
mov a,p0 ;address data to a.
cpl a ;inverse (a)
mov R2,a ;temporary save address data to r2.
MOV R0,#0
mov a,p2 ;address data to a. 这个地方处理报警时间的初始化
cpl a ;inverse (a)
mov R5,a
MOV A,#0Fh
ANL A,R5
JNZ INIT1
MOV A,#1
INIT1: MOV 4AH,A
SETB 14H ;用于保存P1.4,P1.5的状态,字节地址为22H
SETB 15H
SETB IT0
SETB IT1
SETB TR0
SETB TR1
SETB ET0
CLR EX0 ;禁止外部中断
CLR EX1
SETB EA
SETB ES
MAIN: CALL TXPRO ;通讯处理函数,里面包括开关阀动作和应答数据的产生
;CPL P1.6
;CALL SEND ;发送数据
CPL P1.6
CALL ALARM ;是否有报警,同时给出报警信号
CPL P1.6
CALL CHECK ;检查当前阀的状态
CPL P1.6
CALL CHSD ;检查手动开关阀函数
LJMP MAIN
TXPRO: CJNE R0,#1,FUNC1 ;R0为1代表收到前导码
CJNE R7,#1,TXP1 ;R7为1代表收到一条完整的指令
MOV A,31H ;30h~34H分别存放前导码,地址,指令长度,指令,和检验码
CLR C
SUBB A,R2
JZ TXP2 ;ADDRESS IS NOT ME
LJMP TXP3 ;地址不是自己的话,清理现场,返回主循环
TXP2: MOV R3,31H ;R3 IS ADDRESS
MOV R4,32H ;R4 IS ORDER lenth
MOV R5,33H ;R5 IS order
MOV R6,34H ;r6 is check number
MOV A,#36
ADD A,R3
ADD A,R4 ;
ADD A,R5
CLR C
SUBB A,R6 ;JUDGEA)IF=R5,R5SUMR3R4)
JZ TXP4
LJMP TXP3 ;校验没有通过的话,清理现场,返回主循环
TXP4: MOV A,R5
JNZ TXP5
CALL CLOSE ;指令为0,调用关阀函数
CALL SEND
LJMP TXP3 ;返回主循环
TXP5: CLR C
SUBB A,#1
JNZ TXP6
CALL OPEN ;指令为1,调用开阀函数
CALL SEND
LJMP TXP3
TXP6: CALL CHAXU ;指令为2,调用查询函数
CALL SEND
LJMP TXP3
TXP1: MOV A,50H
CLR C
SUBB A,#3
JNZ FUNC1
TXP3: CALL CLEAR
FUNC1: RET
CLEAR: MOV A,#0
MOV 30h,A
MOV 31H,A
MOV 32H,A
MOV 33H,A
MOV 34H,A
MOV R1,#2FH
MOV R0,#0
MOV R7,#0
CLR P1.3
RET
CLOSE: CLR P2.4
CLR 04H
SETB P2.5
SETB 05H
CLR P2.6
CLR 06H
MOV A,#0
MOV 52H,A
MOV 53H,A
MOV 5AH,A
MOV A,#2
MOV 54H,A
MOV A,#33
MOV 40H,A
MOV 41H,R2
MOV A,#2
MOV 42H,A
MOV A,#40
MOV 43H,A
MOV A,#0
ADD A,40H
ADD A,41H
ADD A,42H
ADD A,43H
MOV 44H,A
MOV A,#1
MOV 49H,A
RET
OPEN: SETB P2.4
SETB 04H
CLR P2.5
CLR 05H
CLR P2.6
CLR 06H
MOV A,#0
MOV 52H,A
MOV 53H,A
MOV 5AH,A
MOV A,#1
MOV 54H,A
MOV A,#33
MOV 40H,A
MOV 41H,R2
MOV A,#2
MOV 42H,A
MOV A,#41
MOV 43H,A
MOV A,#0
ADD A,40H
ADD A,41H
ADD A,42H
ADD A,43H
MOV 44H,A
MOV A,#1
MOV 49H,A
RET
CHAXU: MOV A,#33
MOV 40H,A
MOV 41H,R2
MOV A,#2
MOV 42H,A
MOV A,48H
MOV 43H,A
MOV A,#0
CLR C
ADD A,40H
ADD A,41H
ADD A,42H
ADD A,43H
MOV 44H,A
MOV A,#2
MOV 49H,A
RET
ALARM: JNB 04H,ALA2
JNB 05H,ALA2
LJMP ALA1
ALA2: MOV A,5AH
CLR C
SUBB A,4AH ;报警时间,在这个地方可以修改
JC ALA1
SETB P2.6
SETB 06H
SETB P2.4
SETB 04H
SETB P2.5
SETB 05H
LJMP ALA1
ALA1: RET
CHECK: JNB 06H,CH1 ;没有报警跳到CH1,报警执行下面的代码
MOV A,54H ;54H开阀还是关阀的标志,1代表开阀,2代表关阀
CJNE A,#2,CH2
MOV 48H,#47
LJMP CHOVER
CH2: CJNE A,#1,CH3
MOV 48H,#46
LJMP CHOVER
CH3: MOV 48H,#49
LJMP CHOVER
CH1: JB P1.0,CH4 ;关阀到位了吗,没有的话跳转
MOV 48H,#45
SETB P2.4
SETB 04H
MOV 54H,#0
LJMP CHOVER
CH4: JB P1.1,CH5 ;开阀到位了吗,没有的话跳转
MOV 48H,#43
SETB P2.5
SETB 05H
MOV 54H,#0
LJMP CHOVER
CH5: JB 04H,CH6
MOV 48H,#44
LJMP CHOVER
CH6: JB 05H,CH7
MOV 48H,#42
LJMP CHOVER
CH7: MOV 48H,#48
CHOVER: RET
SEND: CLR ES
CLR RI
CLR TI
MOV A,#0
MOV 56H,A
SETB P1.3 ;FORBID 485 RECEIVE DATA.
MOV 40H,#33
MOV R1,#40H
SEND1: MOV A,@R1
MOV SBUF,A
WAIT1: MOV A,56H
CLR C
SUBB A,#2
JZ SEND2
JNB TI,WAIT1
CLR TI
INC R1
MOV A,#0
MOV 56H,A
CLR C
CJNE R1,#45H,SEND1
SEND2: CLR P1.3
SETB ES
RET
CHSD: JB P1.4,CHSD1 ;是高电平吗,是的话跳到chsd1
JNB 14H,CHSD2 ;原来也是低电平,直接跳到 CHSD2
CALL INT00 ;调用手动开阀函数
CHSD2: CLR 14H ;把P1.4的值保存到14H中
LJMP CHSD3
CHSD1: SETB 14H ;把P1.4的值保存到14H中
CHSD3: JB P1.5,CHSD4 ;是高电平吗,是的话跳到chsd4
JNB 15H,CHSD5
CALL INT01
CHSD5: CLR 15H
LJMP CHSD7
CHSD4: SETB 15H
CHSD7: RET
INT00: SETB P2.4 ;手动开阀的指令
SETB 04H
CLR P2.5
CLR 05H
CLR P2.6
CLR 06H
MOV A,#0
MOV 52H,A
MOV 53H,A
MOV A,#1
MOV 54H,A
RET
INT01: SETB P2.5 ;手动关阀的指令
SETB 05H
CLR P2.4
CLR 04H
CLR P2.6
CLR 06H
MOV A,#0
MOV 52H,A
MOV 53H,A
MOV A,#2
MOV 54H,A
RET
CORINT: CLR EA
JBC RI,CORINT1 ;SEND INT NO USE
JBC TI,COROUT
COROUT: RETI
CORINT1:CLR RI
PUSH ACC
PUSH PSW
MOV A,SBUF
INC R1
MOV @R1,A
CJNE R0,#1,NBEGIN
MOV A,32H
JZ NEND
ADD A,#32H
CLR C
SUBB A,R1
JNZ NEND
MOV A,#1
MOV R7,A
LJMP NEND
NBEGIN: CJNE A,#36,COR1 ;$
MOV A,#0
MOV 50H,A
MOV 51H,A ;BEGING CHECK TIME
MOV A,#1
MOV R0,A
LJMP NEND
COR1: CALL CLEAR
NEND: CLR C
POP PSW
POP ACC
SETB EA
RETI
TMINT: CLR EA
PUSH ACC
PUSH PSW
SETB EA
MOV TH0,#0D8H
MOV TL0,#0F0H
MOV A,50H
INC A
CJNE A,#100,TMLAG1
MOV A,51H
INC A
MOV 51H,A ;SECOND
;CPL P2.6
MOV A,#0
TMLAG1: MOV 50H,A
MOV A,52H
INC A
CJNE A,#100,TMLAG2
MOV A,53H
INC A
MOV 53H,A ;修改了这个地方
CJNE A,#60,LOW1
MOV A,5AH
INC A
MOV 5AH,A
MOV A,#0
MOV 53H,A
LOW1: MOV A,#0
TMLAG2: MOV 52H,A
MOV A,56H
CLR C
INC A
MOV 56H,A
CLR C
CLR EA
POP PSW
POP ACC
SETB EA
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -