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

📄 总程序.asm

📁 用单片机制作的电话遥控装置.用于控制家用电器
💻 ASM
字号:
org	0000h
	ljmp	main
org	0013h
	ljmp	aint1
org	0100h

main:	mov	sp,#67h
	setb	8ah		;边沿触发
	mov	ie,#84h
	lcall	q0
	lcall	rd33		;读24c02原密码
	setb	p1.4
	mov	tmod,#60h
	mov     th1,#0d0h	;响三声摘机
	mov     tl1,#0d0h	;80:五声,0f0:一声
	setb    tr1
	
			
wait:	jbc	tf1,lp
	sjmp	wait		;wait int1
lp:	clr	p1.4
		  

w:	lcall	input
	lcall	test
	lcall	tag		;密码修改标志
	lcall	new1
	lcall	new2
	lcall	save
	lcall	choose		;选择通道
	lcall	close
	lcall	open		;控制电器
	
	ljmp	w

aint1:	inc	24h
	mov	21h,#01h
	setb	p1.0
	setb	p1.1
	setb	p1.2
	setb	p1.3
	mov	a,p1
	anl	a,#0fh
	mov	50h,a
	reti


q0:	mov	20h,#0		;密码无效0	
	mov	21h,#0		;按下键标志0
	mov	22h,#0		;选中第n个通道
	mov	23h,#0		;新密码存储标志0
	mov	24h,#0		;输入的密码位数
	mov	25h,#0		;密码结束标志0
	mov	26h,#0		;密码错误次数
	mov	27h,#0  	;挂机标志
	mov	28h,#0		;*输入新密码0(b)
	mov	29h,#0		;第二次输入新密码标志
	mov	50h,#0		;存当前键值

input:	
	mov	a,25h		;密码输完否
	clr	c
	subb	a,#00h
	jz	bb
	ret
bb:	
	mov	a,#00h		;密码正确否		
	clr	c
	subb	a,20h
	jz	cc		
	ret

cc:	lcall	ring1
	mov	a,21h		;有健按下?
	clr	c
	subb	a,#01h
	jz	dd
	ret

dd:	mov	a,24h		;密码存于35h
	add	a,#34h
	mov	r0,a
	mov	@r0,50h
	mov	a,24h
	clr	c
	subb	a,#2		;2位密码
	jz	mm
	ret

mm:	mov	24h,#0		;清密码计数器
	mov	25h,#01h	;建立密码结束标志
	ret


test:			
	mov	a,#01h
	clr	c
	subb	a,25h		;密码输完否
	jz	bj0
	ret
bj0:	mov	a,#00h		;密码正确否
	clr	c
	subb	a,20h
	jz	bj1
	ret
bj1:	mov	a,35h
	clr	c
	subb	a,30h
	jnz	bj2
	mov	a,36h
	clr	c
	subb	a,31h
	jnz	bj2
	lcall	ring4	
	mov	20h,#01h		;密码有效标志
	mov	24h,#0
	mov	21h,#0			;按键标志清零
	lcall	de1s
	ret
bj2:	
	lcall	ring2
	inc	26h		;密码错误次数加一

	lcall	de1s
	mov	a,#3
	clr	c
	subb	a,26h
	jz	btg
	mov	25h,#0
	mov	24h,#0
	mov	20h,#0
	mov	26h,#0
	ret
btg:	
	mov	26h,#0		;挂机标志
	mov	27h,#1
			
	ret

choose:	mov	a,28h
	clr	c
	subb	a,#1
	jnz	c0
	ret
c0:	mov	a,29h
	clr	c
	subb	a,#1
	jnz	c00
	ret
c00:
	mov	a,22h
	clr	c
	subb	a,#0		;没有通道被选中 
	jz	c1
	ret
c1:	mov	a,#01h		;密码有效?
	clr	c
	subb	a,20h
	jz	cz
	ret
cz:	lcall	ring5	        ;输入操作通道号
	mov	a,21h		;有健按下?
	clr	c
	subb	a,#01h
	jz	cz1
	ret
	
cz1:	mov	21h,#0		;查表
	mov	22h,#0
	mov	r1,50h
	mov	a,50h
	rl	a
	add	a,r1
	mov	dptr,#tab
	jmp	@a+dptr
tab:	ljmp	nine		;0
	ljmp	one		;
	ljmp	two		;
	ljmp	three		;3
	ljmp	nine
	ljmp	nine
	ljmp	nine
	ljmp	nine
	ljmp	nine
	ljmp	nine		;9
	ljmp	nine		;
	ljmp	tag		;b
	nop	
	nop
	ret
		
one:	mov	22h,#1		;有1通道被选中
	ret

two:	mov	22h,#2		;有2通道被选中
	ret

three:	mov	22h,#3		;有3通道被选中
	ret


nine:	mov	22h,#0
	mov	27h,#1		;关闭
	ret


open:	mov	a,22h		;有电器选中否
	clr	c
	subb	a,#0
	jnz	o1
	ret
o1:	lcall	ring6
	mov	a,21h		;有健按下?
	clr	c
	subb	a,#01h
	jz	o2		
	ret

o2:	mov	21h,#0		;清键值
	mov	a,50h
	clr	c
	subb	a,#0ah		;判0
	jz	one0
	mov	a,50h		;判1
	clr	c
	subb	a,#0ch
	jz	one1
	mov	a,50h
	clr	c
	subb	a,#9
	jz	rest
	mov	27h,#1		;挂机
	ret



rest:	mov	22h,#0
	ret     


one0:	mov	a,22h		
	clr	c
	subb	a,#1
	jz	lp01
	clr	c
	subb	a,#1
	jz	lp02
	lcall	ring8
	setb	p1.7
	ret
lp01:	lcall	ring8
	setb	p1.5
	ret

lp02:	lcall	ring8
	setb	p1.6
	ret


one1:	mov	a,22h
	clr	c
	subb	a,#1
	jz	lp11
	clr	c
	subb	a,#1
	jz	lp12
	lcall	ring7
	clr	p1.7
	ret

lp11:	lcall	ring7
	clr	p1.5
	ret

lp12:	lcall	ring7
	clr	p1.6
	ret



close:	mov	a,27h
	clr	c
	subb	a,#1
	jz	col1
	ret
col1:	lcall	ring8
	lcall	q0
	setb	p1.4
	ljmp	main
	ret


tag:	mov	a,20h		;密码正确
	clr	c
	subb	a,#01h
	jz	tt1
	ret

tt1:	mov	a,#0bh
	clr	c
	subb	a,50h		;*修改密码
	jz	tt2
	ret

tt2:	mov	28h,#1		;*新密码标志位
	mov	21h,#0		;清按键标志
	mov	24h,#0
	ret

		
new1:	
	mov	a,28h		;判新密码标志位
	clr	c
	subb	a,#1
	jz	n1
	ret

n1:	lcall	ring3
	mov	a,21h		;有键按下标志
	clr	c
	subb	a,#1
	jz	n2
	ret	
n2:	
	mov	a,24h		;新密码存于40h
	add	a,#3fh
	mov	r0,a
	mov	@r0,50h
	mov	a,24h
	clr	c
	subb	a,#2		;四位密码
	jz	n3
	ret

n3:	lcall	ring4
	mov	24h,#0		;清密码计数器
	mov	25h,#1	        ;建立密码结束标志
	mov	21h,#0
	mov	28h,#0		;清新密码标志
	mov	29h,#1		;建立第二次输入新密码的标志
	ret


new2:	
	mov	a,29h		;判第二次输入的密码标志位
	clr	c
	subb	a,#1
	jz	nn1
	ret

nn1:	lcall	ring3
	mov	a,21h		;有键按下标志
	clr	c
	subb	a,#1
	jz	nn2
	ret
	
nn2:	
	mov	a,24h		;新密码存于45h
	add	a,#44h
	mov	r0,a
	mov	@r0,50h
	mov	a,24h
	clr	c
	subb	a,#2		;2位密码
	jz	nn3
	ret

nn3:	mov	a,45h
	clr	c
	subb	a,40h
	jnz	cm
	mov	a,46h
	clr	c
	subb	a,41h
	jnz	cm
	mov	21h,#0
	mov	23h,#1		;比较新密码标志
	mov	24h,#0		;清密码计数器
	mov	25h,#1		;建立密码结束标志
	mov	29h,#0
	ret

cm:	lcall	ring2
	mov	27h,#1		;两次输入密码比较不正确
				;挂机
	ret
	


save:	mov	a,23h
	clr	c
	subb	a,#1
	jz	s1
	ret

s1:	mov	a,40h
	mov	30h,a
	mov	a,41h
	mov	31h,a
	lcall	ring4
	lcall	wr33
	mov	21h,#0		;按下键标志0
	mov	22h,#0		;选中第n个通道
	mov	23h,#0		;新密码存储标志0
	mov	24h,#0		;输入的密码位数
	mov	27h,#0  	;挂机标志
	mov	28h,#0		;*输入新密码0(b)
	mov	29h,#0		;第二次输入新密码标志
	ret	
	


;*************************24c02*******************************
 STA24:	 
	     SETB p0.7      
             SETB p0.6
             NOP
             NOP
             CLR p0.7
             NOP
             NOP
             CLR p0.6
             RET
     STOP:   CLR p0.7
             SETB p0.6
             NOP
             NOP
             SETB p0.7
             NOP
             NOP
             CLR p0.6
             CLR p0.7
             RET
     WRBYTE: MOV R6,#08H  ;写一字节数
     WBLP1:  CLR C
             RLC A   
             MOV p0.7,C
             SETB p0.6
             NOP
             NOP
             CLR p0.6
             CLR p0.7
             DJNZ R6,WBLP1
             NOP
             SETB p0.7
             SETB p0.6
     WBLP2:  NOP
             JB p0.7,WBLP2
             CLR p0.6
             RET
    RDBYTE:  MOV R6,#08H   ;读一字节数
     RBLP:   SETB p0.7
             SETB p0.6
             MOV C,p0.7
             RLC A
             CLR p0.6
             NOP
             DJNZ R6,RBLP
             SETB p0.7
             SETB p0.6
             NOP
             NOP
             CLR p0.6
             CLR p0.7
             RET
     WR33:   ;lcall	ring7
	     MOV R1,#33H   ;写四个数子程序
             MOV R2,#04H
             LCALL STA24
	   ; lcall	ring3
             MOV A,#0A0H
             LCALL WRBYTE
		;lcall	ring4
             MOV A,#00H
             LCALL WRBYTE
     WLP:    MOV A,@R1
             LCALL WRBYTE
             DEC R1
             DJNZ R2,WLP
             LCALL STOP
             RET
     RD33:  ;lcall	ring8
	 MOV R1,#33H   ;读四个数子程序
             MOV R2,#04H
             LCALL STA24
             MOV A,#0A0H
             LCALL WRBYTE
             MOV A,#00H
             LCALL WRBYTE
             LCALL STA24
             MOV A,#0A1H
             LCALL WRBYTE
     RLP:    MOV R6,#08H
     RLP1:   SETB p0.7
             SETB p0.6
             CLR C
             MOV C,p0.7
             RLC A
             CLR p0.6
             NOP
             DJNZ R6,RLP1
             CJNE R2,#01H,RLP2
             SETB p0.7
             SETB p0.6
             MOV @R1,A
             NOP
             NOP
             CLR p0.6
             CLR p0.7
             AJMP RLP3
     RLP2:   CLR p0.7
             SETB p0.6
             MOV @R1,A
             DEC R1
             NOP
             CLR p0.6
             DJNZ R2,RLP
     RLP3:   LCALL STOP
             RET
   
    L_DELAY: MOV R7,#0CH  ;延时50us
     L0:     DJNZ R7,L0
             RET
    M_DELAY: MOV R7,#06H  ;延时25us
     L1:     DJNZ R7,L1
             RET
    S_DELAY: MOV R7,#02H  ;延时8us
     L2:     DJNZ R7,L2
             RET


ring1:  
	mov  p2,#01h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring2:  
	mov  p2,#15h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring3:  
	mov  p2,#25h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring4:  
	mov  p2,#37h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring5:  
	mov  p2,#43h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring6:  
	mov  p2,#59h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring7:  
	mov  p2,#65h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret
ring8:  
	mov  p2,#75h
	clr  p2.0
	acall de2s
	setb  p2.0
	ret


de50ms:   mov r6,#100
     sd:   mov r7,#248
	   djnz r7,$
	   djnz r6,sd
	   ret

   de1s:     mov r5,#10
     de1:    lcall de50ms
	     djnz  r5,de1
		ret
    de2s:     mov r5,#30
     de2:    lcall de50ms
	     djnz  r5,de1
		ret


end	
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -