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

📄 zi nen.asm

📁 一个用单片机做的智能家居服务系统
💻 ASM
字号:
;R/W=0	RS=P0.4  EN=P0.5	DB0~3=P0.0~3	12MHZ
;


RS	EQU	P0.4
EN	EQU	P0.5	
RF	EQU	P2.3	;无限信号接收位			
NEI_MA_1	EQU	80H		;接收EV1527学习码起始地址
NEI_MA_2	EQU	150H	;接收EV1527编码起始地址
;/////////////////
;主程序:MAIN
;/////////////////
	ORG	0000H
START:	
	AJMP	MIAN
	ORG	0003H			;外部中断
	AJMP	INT0			;PHONE INT

	;ORG	000BH		;C/T0 RS232通信波特率设定

	ORG	0013H
	AJMP	INT1			;语音中段

	ORG	001BH			;C/T1	INT CLOCK
	AJMP	PITO_0
	
	ORG	0023H
	AJMP	RS232			;串行通信
	
	ORG	0100H
MAIN:	
	MOV	SP, #60H		;确立堆放区
	CLR	RS0			;用第一组寄存器
	CLR	RS1			

	MOV	TMOD, #12H		
	MOV	TH0, #FDH
	MOV	TL0, #FDH		;波特率为9600
	MOV	TL1, #0B1H		;定时器初始话		50ms X 20次==1S
	MOV	TH1, #3CH
	
	SETB	TR1		
	SETB	TR0
	MOV	SCON, #50H	;设置通信方式1, REN=1			
	SETB	EA
	SETB	ET0
	CLR	ES			;禁止串行中断
	MOV	80H, #14H		;20次为1S

	MOV	R1, #42H	
	MOV	R2, #12H
	MOV	@R1, #00H		;显示缓冲单元清零	
	
	LCALL	MT8880C_INT	;MT8880C初始化
	LCALL	ISD25120_INT	;ISD25120初始化
	
	LCALL	INIT0_LCD		;LCD四位接口指令设置
	LCALL	INT1_LCD		;LCD初始化
	
XUN_HUAN:
	ACALL	KEY_XI_TONG		;调用进入系统检测
	ACALL	DISP_CLOCK		;调用显示时钟程序
	LCALL	WU_XIAN_JIAN_CE		;调用无线检测
	LCALL	ZHEN_LING_JIAN_CE	;调用振铃检测
	LCALL	DUAN_XIAN_JIAN_CE	;调用断线检测
	SJMP	XUN_HUAN		;循环进行系统检测
	
;////////////////////
;F检测程序
;///////////////////
KEY_XI_TONG:
	ACALL	KEY			;查询按键
	CJNE	A, #03H, TUI_CHU	;没按下F键	转移退出
	ACALL	KEY
	CJNE	A, #00H, TUI_CHU	;*
	ACALL	KEY	
	CJNE	A, #00H, TUI_CHU	;*
	ACALL	KEY
	CJNE	A, #06H, TUI_CHU	;**9  ENTER PASSWORD
	ACALL	B_1			;B  SOUND
	ACALL	DISP_LIST		;DISPLAY  "ENTER PASSWORD" IN LINE_1

	ACALL	PASSWORD		;调用密码查询子程序
	CJNE	A, #01H, TUI_CHU	;PASSWORD IS ERR  TUI_CHU 
	;密码正确
SHE_ZHI:
	MOV	A, #0AH			;10秒定时
	ACALL	S_KEY_JIAN_CE		;调用秒定时检测按键,10秒内无正确信息退出
	CJNE	A, #00H, TUI_CHU	;*键
	
	ACALL	S_KEY_JIAN_CE
	CJNE	A, #00H, TUI_CHU	;*键
	
	ACALL	S_KEY_JIAN_CE		;**0~**F		
	MOV	DPTR, #BRTAB		;分支程序				
	MOVC	A, @A+DPTR		;查表转移
	JMP	@A+DPTR

BRTAB:	DB	BR0-BRTAB		;**0
	DB	BR1-BRTAB		;**1
	DB	BR2-BRTAB		;**2
	DB	BR3-BRTAB
	DB	BR4-BRTAB
	DB	BR5-BRTAB
	DB	BR6-BRTAB
	DB	BR7-BRTAB
	DB	BR8-BRTAB
	DB	BR9-BRTAB
	DB	BRA-BRTAB
	DB	BRB-BRTAB
	DB	BRC-BRTAB
	DB	BRD-BRTAB
	DB	BRE-BRTAB
	DB	BRF-BRTAB
	DB	BR10-BRTAB

BR0:	

;//////////////////////
;改密码程序
;//////////////////////RAM  36H~3CH	
BR1:	ACALL	B_1		;B SOUND
	MOV	R1, #35H	;,密码暂存36H~3BH
	MOV	R0, #06H
GAI_PASSWORD:
	INC	R1
	ACALL	KEY

	MOV	@R1, A
	DJNZ	R0, GAI_PASSWORD
	ACALL	KEY
	CJNE	A, #00H, TUI_CHU	;第七次不是*号退出
	MOV	R6, #00H		;再次输入密码并和第一次比较		
	MOV	R1, #3BH		;PASSWORD SAVE IN 3CH~41H
	MOV	R0, #06H
GAI_PASSWORD_1:
	INC	R1
	ACALL	KEY
	MOV	@R1, A
	DJNZ	R0, GAI_PASSWORD_1	;六次

	MOV	R1, #36H		;取第一次密码
	MOV	R0, #3CH		;取第二次;;
	MOV	R7, #06H		;比较6次
	MOV	R6, #00H		;比教次数清零

	ACALL	COMPARE_2		;调用密码比较子程序
	CJNE	A, #01H, TUI_CHU	;密码错误退出

	MOV	R0, #29H
	MOV	R1, #44H
	MOV	R2, #06H
GAI_PASSWORD_2:
	INC	R0			;密码保存在30H~35H
	INC	R1
	MOV	A, @R1
	MOV	@R0, A
  DJNZ	R2, GAI_PASSWORD_2
	ACALL	B_2
	
	
;///////////////
;接收无线模块  EV1527
;///////////////	1: 12CLK高,4LCK低,  0:4LCK高,12LCK低
BR2:
		LCALL	B_1
		MOV		52H, #00H	;秒计时清零
		MOV		R1, NEI_MA	;RAM首地址
		LCALL	WU_XIAN_1
PPP1:		
		MOV		52H, #00H	;秒计时清零
WU_XIAN_6:
		JB		RF, WU_XIAN_7	;P2.3为高转
		MOV		A, 52H
		SUBB	A, #05H		;
		JNC		WU_XIAN_6	;小于5秒继续
		AJMP	TUI_CHU		;退出
		
		MOV		R5, #04H	;共五组EV1527遍码
WU_XIAN_7:	
		MOV		R6, #38H	;4+124+16x20=448CLK=43.68ms
WU_XIAN_8:	
		ACALL	DELAY_2		;延时0.78ms 
		JB		RF, TUI_CHU
		DJNZ	R6, WU_XIAN_8	;56x0.78=43.68ms=440CLK
		MOV		R3, #04H	;4bit
		JNB		RF, $	;等待数据位
PPP2:
		ACALL	DELAY_2	;延时0.78ms(8CLK)		1: 12CLK高,4LCK低,  0:4LCK高,12LCK低
		MOV		C, RF
		JNC		C, WU_XIAN_9	;C为0转
		JB		RF, $		;为1等待
WU_XIAN_9:		
		MOV		ACC.0, C
		RL		A
		DJNZ	R3, PPP2
		MOV		@R1, A	;存入RAM
		INC		R1
		DJNZ	R5, WU_XIAN_7	;不够4组转
		LJMP	TUI_CHU
DELAY_1:
		MOV R4,#20 ;延时子程序1,精确延时380微秒
D1: 
		MOV R7,#20
		DJNZ R7,$
		DJNZ R4,D1
		RET
DELAY_2:
 		MOV R4,#10 ;延时子程序2,精确延时780微秒
D2: 
		MOV R7,#235
		DJNZ R7,$
		DJNZ R4,D2
		RET	


BR3:
BR4:
BR5:
BR6:
BR7:
	
BR8:
BR9:
BRA:
BRB:
BRD:
BRE:
BRF:
BR10:NOP

TUI_CHU:		
	MOV	A, 01H
	LCALL	W_COM	;清屏
	LCALL	DISP_CLOCK	;调用显示CLOCK
	RET			;返回
	
;//////////////////
;无线检测子程序
;/////////////////
WU_XIAN_JIAN_CE:
		JNB		RF, WU_XIAN_TUI
		MOV		R1, NEI_MA_2
		ACALL	WU_XIAN_1
		
WU_XIAN_TUI:
		RET 
		
;////////////////
;接收EV1527一帧数据
;///////////////R1存接收起始地址,
WU_XIAN_1:
		JB		RF, WU_XIAN_2	;P2.3为高转
		MOV		A, 52H
		SUBB	A, #05H		;
		JNC		WU_XIAN_1	;小于5秒继续
		AJMP	TUI_CHU		;退出
WU_XIAN_2:
		ACALL	DELAY_1		;延时0.38ms
		JB		RF, $		;避开0.39ms的高电平	4LCK
WU_XIAN_3:
		MOV		R6, #0FH	;15
		ACALL	DELAY_2		;延时0.78ms 8LCK
		JB		RF, TUI_CHU
		DJNZ	R6, WU_XIAN_3	;15x0.78=12ms=120LCK
		JNB		RF, $	;等到124LCK的同步码结束
		
		MOV		R5, #03H	;需3个字节保存
		
PPP:		
		MOV		R3, #08H	;8bit	
WU_XIAN_4:
		JNB		RF, $	;等待高电平
		ACALL	DELAY_2	;延时0.78ms(8CLK)		1: 12CLK高,4LCK低,  0:4LCK高,12LCK低
		MOV		C, RF
		JNC		C, WU_XIAN_5	;C为0转
		JB		RF, $		;为1等待
WU_XIAN_5:		
		MOV		ACC.0, C
		RL		A
		DJNZ	R3, WU_XIAN_4
		MOV		@R1, A	;存入RAM
		INC		R1
		DJNZ	R5, PPP
		RET
	


;////////////////////
;密码检测子程序
;////////////////////RAM  30~42H
;R0, R1, R6, R7
PASSWORD:		;ENTER PASSWORD		30~35H	37-42H
	
	CLR	P2.4			;指示灯亮				
	MOV	R6, #03H		;3次输入密码
PASSWORD_1:
	MOV	R1, #06H		;6 BIT PASSWORD
	MOV	R0, #37H		;暂存37H~42H

READ:	
	ACALL	KEY
	MOV	@R0, A
	DJNZ	R1, COMPARE_1		;取按键六次,转比较
	INC	R0
	SJMP	READ

COMPARE_1:				;比较六位数密码
	MOV	R1, #30H		;原密码
	MOV	R0, #36H		;要较正的密码
	MOV	R7, #06H		;比较六次
COMPARE_2:
	MOV	A, @R1
	CJNE	A, @R0, COMPARE_3	;ERR转移
	INC	R1
	INC	R0
	DJNZ	R7, COMPARE_2
	ACALL	KEY
	CJNE	A, #02H, COMPARE_3	;没按#键错误
	MOV	A, #01H			;密码已正确把正确标志01H送A	
	ACALL	B_1
	ACALL	B_1			;DD两声
	SJMP	COMPARE_5
COMPARE_3:
	MOV	A, R6			;错误后还可输入			
	CJNE	A, #00H, COMPARE_4	;不是最后一次转
	ACALL	B_C3			;三声长响
	SETB	P2.4			;指示灯灭
	SJMP	COMPARE_5		;密码不正确返回
COMPARE_4:
	ACALL	B_3			;DDD三声		
	DEC	R6
	SJMP	PASSWORD_1		;重新检测密码
COMPARE_5:
	RET
;//////////////////
;秒定时按键检测子程序	
S_KEY_JIAN_CE:
	 CJNE	A, 52H, S_KEY_0		;52H秒计时加1
	 MOV	A, #10H		;让程序查表退出
   SJMP	S_KEY_1		;大于设定的秒数则退出系统
S_KEY_0:
	ACALL	KEY		
S_KEY_1:
	RET	
	

;//////////////////
;显示时钟子程序
;//////////////////
DISP_CLOCK:
	MOV	R3, #06H
	MOV	R0, #77H
	MOV	R5, #0DH
	MOV	79H, #0AH	;显示:
	MOV	7CH, #0AH	;显示:
DISP_CLOCK_1:
	MOV	B, R5		;显示地址送B
	MOV	A, @R0		;显示数据0~9
	LCALL	LCDP1
	DEC	R5			
	INC	R0
	DJNZ	R3, DISP_CLOCK_1	
	RET


;/////////////////////////----------------------------------INT0
;定时器中断
;定时中断0	,  RS0=1 RS1=0
;DISPLAY  2000 12 12 12:00:00		75H,77H,79H为空格
;RAM 70H为秒 71H为:	72H为分 73H为:	74为时 76H为日,78H为月,7A~7BH为年
;////////////////////////
PITO_0: 
		PUSH	PSW
		PUSH	ACC
	
		CLR	RS1			;用第二组寄存器
		SETB	RS0		
	
		MOV	TL1, #0B1H		;重装定时初值
		MOV	TH1, #3CH		
		MOV	A, 80H
		DEC	A
		MOV	80H, A
		JNZ	A, RET0			;不满20次反回
		MOV	30H, #14H
		MOV	R0, #70H
		ACALL	ADD_1			;加1
		MOV	A, @R0
		XRL	A, #60H			;=60S?
		JNZ	RET0			;A不为0转
		ACALL	CLR0			;显示缓冲单元清零
		
		MOV	R0, #72H		;分缓冲单元
		ACALL	ADD_1
		MOV	A, @R0
		XRL	A, #60H
		JNZ	RET0
		ACALL	CLR0

		MOV	R0, #74H		;时缓冲单元
		ACALL	ADD_1
		MOV	A, @R0
		XRL	A, #24H
		JNZ	RET0
		ACALL	CLR0
	
		MOV	R0, #76H		;日缓冲单元
		LCALL	ADD_1
		MOV	A, @R0
	                                                                                                                                                  
RET0:	
		POP	ACC
		POP	PSW
		RETI				;中断反回		

ADD_1:	
	INC	52H			;秒计时加1
;	MOV	A, @R0
;	DEC	R0
;	SWAP	A			;十位数占高十位,
;	ORL	A, @R0			;个位数占低四位   合并
;	ADD	A, #01H			;合并后加1
;	DA	A
;	MOV	R2, A				
;	ANL	A, #0FH			;取出个位数
;	MOV	@R0, A			;送缓冲单元
;	MOV	A, R2
;	ANL	A, #F0H			;取十位数
;	SWAP	A			;十位数占低四位
;	MOV	@R0, 
;	RET	
	MOV	A, @R0
	ADD	A, #01H
	DA	A
	MOV	@R0, A	


CLR0:	CLR	A
	MOV	@R0, A			;清个位
;	DEC	A
;	MOV	@R0, A			;清十位
	RET


;/////////////////--------------------------KEY
;循检按键子程序
;RAM  50~51H
;////////////////
KEY:	
	MOV	52H, #00H		;秒计时,连续15秒内没任何按键则退出
KEY_0:	
	MOV	50H, #FEH		;1111 1110
	MOV	51H, #03H		;列值	
	MOV	R2, #00H		;行值
	MOV	R3, #04H		;次数

KEY_1:
	MOV	P1, 50H
	MOV	R4, P1
	MOV	A, R4			;读取键直
	CJNE	A, 50H, KEY_2		;有键按下,转移
	MOV	A, 50H		
	RL	A			
	MOV	50H, A
	INC	R2			
	DJNZ	R3, KEY_1		;没四次继续
	
	ACALL	DISP_CLOCK		;没按键调显示程序clock
	MOV	A, 52H			
	CJNE	A, 0FH, KEY_0		;不够十五秒可继续扫描
	LJMP	TUI_CHU			;大于15秒,系统退出	
	

KEY_2:	
	MOV	52H, #00H		;秒计时清零
	PUSH	A
	MOV	A, P1
	CJNE	A, 50H, KEY_2		;等待按键放开
	SETB	C
	POP	A
KEY_3:
	RLC	A
	JNC	KEY_4			
	DEC	51H
	SJMP	KEY_3			
KEY_4:	
	MOV	B, #04H			;计算键值+==(行X4)+列		
	MOV	A, R2			
	MUL	AB
	ADD	A, 51H
	PUSH	A
	POP 	A
	RET
	
;/////////////////////----------------------------FMQ
;蜂鸣器子程序
;/////////////////////
B_1:	
	CLR	P3.4			;B 短响
	ACALL	DE			;短延时		
	SETB	P3.4
	RET

B_2:	CLR	P3.4			;B  长响
BB:	MOV	R3, #0C8H		;延时0.5S
	DJNZ	R3, BB
	MOV	R4, #0FAH
	SETB	P3.4
	RET
B_3:					;BBB
	ACALL	B_1
	ACALL	B_1
	ACALL	B_1
	RET

B_4:	ACALL	B_2			;B....B....B....
	ACALL	B_2
	ACALL	B_2
	RET
	
;//////////////////////---------------------------LCD		
;LCD初始化
;/////////////////////
INT1_LCD:
	MOV	A, #00H
	ACALL	W_COM
	MOV	R3, #0FH		;LCD处始话 DELAY15MS
	ACALL	DELAY
	MOV	A, #28H			
	ACALL	W_COM
	MOV	R3, #05H		;DELAY 5MS
	ACALL	DELAY
	MOV	A, #28H
	ACALL	W_COM
	MOV	R3, #05H		;DELAY 5MS
	MOV	A, #28H		
	ACALL	W_COM

;/////////////////
;LCD  4 位接口指令设置
;////////////////
INIT0_LCD:                        	
   	MOV  P0,#03H            	 ;RS=0  R/W=0  D4~D0=0011
  	ACALL  EN1
   	MOV  P0,#03H
  	ACALL  EN1
  	MOV  P0,#03H
  	ACALL  EN1

   	MOV  P0,#02H                 	;启动4位接口指令
    ACALL  EN1                    	;RS=0  R/W=0  D7~D4=0010
    ACALL  INIT_LCD1              	;LCD指令设置初始化
    RET	
    
;/////////////////
;写数据
;/////////////////
LCD_W_DATA:			
		SWAP	A			;写入高字节数据
		MOV	P0, A
		SETB	RS
		CLR	EN
		CLR	EN
		SETB	EN

		SWAP	A			;写入低字节数据		
		SETB	RS
		CLR	EN
		CLR	EN
		SETB	EN
		RET
	
;///////////////
;写命令
;//////////////
LCD_W_COM:	
		SWAP	A			;写入高字节命令
		MOV	P0, A
		CLR	RS
		CLR	EN
		CLR	EN
		SETB	EN
	
		SWAP	A			;写入高字节命令
		CLR	RS
		CLR	EN
		CLR	EN
		SETB	EN
		RET
	
;///////////////
;LCD_W_CHAR:	写一个字符
;///////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_W_CHAR:
		MOV		A, R3
		ANL		A, #0FH		;限定X不能大于15
		MOV		R3, A
		MOV		A, R4
		ANL		A, #01H		;Y不能大于1
		MOV		R4, A
		MOV		A, R3
		CJNE	R4, #01H, W_CHAR_1
		ADD		A, #40H		;第二行加40H
W_CHAR_1:
		ADD		A, #80H
		ACALL	LCD_W_COM	;写地址
		MOV		A, R2
		ACALL	LCD_W_DATA	;写数据
		RET

;//////////////////
;LCD_W_STR:	写一串固定字符
;/////////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_W_STR:
	;	MOV		DPTR, #TABLE_2	;查表地址
		MOV		A, #00H
LCD_W_STR_1:
		MOVC		A, @A+DPTR
		MOV		R2, A
		ACALL	LCD_W_CHAR
		INC		R3		;X地址加1
		CJNE	R2, #00H, LCD_W_STR_1
		RET

;////////////////
;LCD_CHA_CHAR:	显示一个固定字符0~#
;////////////////字符缓冲R2,R3为XPOS,R4为YPOS
LCD_CHA_CHAR:
		MOV		DPTR, #TABLE_1		;查表地址
		MOVC	A, @A+DPTR		;要显示的字符表送R2
		MOV		R2, A
		ACALL	LCD_W_CHAR		;显示
		RET
  	
;/////////////////
;EN短脉冲可不要
;///////////////
EN1:                             	
    	SETB  EN
    	ACALL  DE
    	CLR  EN
    	ACALL  DE
    	RET
;//////////////
;短暂延迟
;/////////////
DE: 	MOV  R7,#5                   
    	DJNZ  R7,$
    	RET
    	
;//////////////	
;延时 R3 ms
;//////////////
DELAY:	MOV	78H, #C8		;延时
	NOP
	NOP
	DJNZ	78H, DELAY
	DJNZ	R3, DELAY		;DELAY R3  MS
	RET


TABLE_1:DB	30H	;0
	DB	31H	;1
	DB	32H
	DB	33H
	DB	34H
	DB	35H
	DB	36H
	DB	37H
	DB	38H
	DB	39H	;9
	DB	3AH	;:
	DB	2AH	;*
	DB	46H	;F
	DB	23H	;#

TABLE_2:DB	45H, 4EH, 54H, 45H, 58H, 50H, 41H, 53H, 53H, 57H, 4FH, 52H, 44H, 00H 	;ENTER PASSWORD
		
	
		

⌨️ 快捷键说明

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