⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new6.asm

📁 串口通讯
💻 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 + -