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

📄 irda2.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
字号:
C8279	EQU  	0F239H
D8279	EQU		0F238H

		ORG		0000H
		LJMP	MAIN
		ORG		001BH
		LJMP	CTC1
		
		ORG		0030H
MAIN:	MOV		SP,#60H
		LCALL	INIT8279		;调用8279初始化子程序
		LCALL	IN0				;调用单元初始化子程序
START:	LCALL	DIS0			;待接收状态显示	
		LCALL	READ			;调用数据接收子程序
		LCALL	CSTART			;调用接收处理子程序
		LCALL	DISP			;调用显示子程序	
		LCALL	DELAY			;延时
		SJMP	START
	
	
INIT8279:                       ;8279初始化子程序
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        MOV    DPTR ,#C8279
        MOV    A,#00H		    ;置8279工作方式
        MOVX   @DPTR,A
        MOV    A,#2FH	        ;置键盘扫描速率
        MOVX   @DPTR,A
        MOV    A,#0C1H	        ;清除 LED 显示
        MOVX   @DPTR,A
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET	
		
		
IN0:	MOV		R0,#30H			;存储单元设初值
		MOV		R7,#30H
		MOV		A,#00H
IN00:	MOV		@R0,A		
		INC		R0
		DJNZ	R7,IN00
		MOV		5FH,#0FFH		;移位存储单元设初值
		MOV     TMOD,#10H       ;设置定时器1为工作方式1
        MOV     TL1,#00H        
        MOV     TH1,#00H
 		SETB    ET1
        SETB    EA 				;开中断              		
		RET
		
READ:	MOV		R7,#08H
		MOV		R6,#04H
		MOV		R0,#40H		
READ0:	LCALL	TB10			;等待负跳变
		SETB	TR1  			;开定时器
		MOV		4AH,TH1			;读定时器初始值
		MOV		4BH,TL1			
PMC0:	LCALL	TB				;等待跳变
		MOV		4CH,TH1			;读定时器值
		MOV		4DH,TL1
		LCALL	SUB220			;时间处理
P9200:	MOV		A,46H			;判时间是否在引导码9200us(L)8600~9700us范围内
		CJNE	A,#1FH,P92001
		SJMP	YES9200
P92001:	CJNE	A,#20H,P92002
		SJMP	YES9200
P92002:	CJNE	A,#21H,P92003
		SJMP	YES9200
P92003:	CJNE	A,#22H,P92004
		SJMP	YES9200				
P92004:	CJNE	A,#23H,P92005
		SJMP	YES9200
P92005:	SJMP	READ0		
				
YES9200:MOV		4AH,4CH			;时间值存储
		MOV		4BH,4DH
		LCALL	TB				;等待跳变	
		MOV		4CH,TH1			;读定时器值
		MOV		4DH,TL1
PMC1:	LCALL	MC				;判毛刺	
		JNB		02H,NOMC1
		LCALL	TB				;有毛刺,去毛刺
		MOV		4CH,TH1
		MOV		4DH,TL1
		SJMP	PMC1
NOMC1:	LCALL	SUB220			;时间处理
		
P4400:	MOV		A,46H			;判时间是否在引导码4400us(H)3900~4700us范围内
		CJNE	A,#0EH,P44001
		SJMP	YES4400
P44001:	CJNE	A,#0FH,P44002
		SJMP	YES4400
P44002:	CJNE	A,#10H,P44003
		SJMP	YES4400
P44003:	CJNE	A,#11H,P2200
		SJMP	YES4400	
			
P2200:	CJNE	A,#06H,P22001	;判时间是否在1700~2500us范围内
		LJMP	YESREDATE
P22001:	CJNE	A,#07H,P22002
		LJMP	YESREDATE
P22002:	CJNE	A,#08H,P22003
		LJMP	YESREDATE		
P22003:	CJNE	A,#09H,P22004
		LJMP	YESREDATE
P22004:	LJMP	NODATE
		
YES4400:MOV		4AH,4CH			;时间值存储
		MOV		4BH,4DH	
		MOV		4CH,4EH
		MOV		4DH,4FH		
PMC2:	LCALL	MC				;判毛刺
		JNB		02H,NOMC2
		LCALL	TB			    ;有毛刺,去毛刺	
		MOV		4CH,TH1
		MOV		4DH,TL1
		SJMP	PMC2
NOMC2:	LCALL	SUB220			;时间值处理
P680:	MOV		A,46H			;判时间是否在数据码680us(L)300~800us范围内
		CJNE	A,#01H,P6801
		SJMP	YES680
P6801:	CJNE	A,#02H,P6802
		SJMP	YES680		
P6802:	CJNE	A,#03H,NODATE		

YES680:	MOV		4AH,4CH			;时间值存储
		MOV		4BH,4DH
		MOV		4CH,4EH
		MOV		4DH,4FH
PMC3:	LCALL	MC				;判毛刺
		JNB		02H,NOMC3
		LCALL	TB				;有毛刺,去毛刺	
		MOV		4CH,TH1
		MOV		4DH,TL1
		SJMP	PMC3		
NOMC3:	LCALL	SUB220			;时间值处理
		
P500:	MOV		A,46H			;判时间是否在数据码500us(H)300~600us范围内
		CJNE	A,#01H,P5001
		SJMP	YES500
P5001:	CJNE	A,#02H,P1600
YES500:	CLR		C
		SJMP	YESDATE
P1600:	CJNE	A,#04H,P16001	;判时间是否在数据码1600uS(H)1100~1900us范围内
		SJMP	YES1600
P16001:	CJNE	A,#05H,P16002
		SJMP	YES1600	
P16002:	CJNE	A,#06H,P16003
		SJMP	YES1600					
P16003:	CJNE	A,#07H,NODATE
YES1600:SETB	C
YESDATE:MOV		A,@R0
		RRC		A
		MOV		@R0,A
		DJNZ	R7,YES4400		;接收完8位数据?
		MOV		R7,#08H
		INC		R0
		DJNZ	R6,YES4400		;接收完4组数据?
		SETB	00H				;置接收到数据标志
		SJMP	RDEND	
YESREDATE:						;置持续码标志
		SETB	01H
		SJMP	RDEND
NODATE:	CLR		00H				;置无数据接收标志
		CLR		01H
RDEND:	
		RET		
		
TB10:	JNB		P1.7,TB100		;判负跳变子程序
		SETB	C
		MOV		A,5FH
		RLC		A
		MOV		5FH,A
		SJMP	TB10
TB100:	CLR		C
		MOV		A,5FH
		RLC		A
		MOV		5FH,A
		ANL		A,#02H
		JZ		TB10
		RET		
			

					
TB:		MOV		C,P1.7			;判跳变子程序
		MOV		A,5FH
		RLC		A
		MOV		5FH,A
		ANL		A,#03H
		JZ		TB
		CJNE	A,#03H,TB1
		SJMP	TB
TB1:	RET

SUB220:							;时间值处理子程序
		MOV		46H,4CH
		MOV		47H,4DH
		MOV		48H,4AH
		MOV		49H,4BH
SUB221:	CLR		C
		MOV		A,47H
		SUBB	A,49H
		MOV		47H,A
		MOV		A,46H
		SUBB	A,48H
		MOV		46H,A
		CLR		C
		RET


MC:		LCALL	TB				;判毛刺子程序
		MOV		4EH,TH1
		MOV		4FH,TL1
		MOV		46H,4EH
		MOV		47H,4FH
		MOV		48H,4CH
		MOV		49H,4DH
		LCALL	SUB221			;时间值处理
		MOV		A,#0C0H			
		SUBB	A,47H
		JC		NOMC		
		MOV		A,#00H
		SUBB	A,46H
		JC		NOMC			;判时间是否小于200us
		SETB	02H				;置有毛刺标志
		SJMP	MCEND
NOMC:	CLR		02H				;置无毛刺标志
MCEND:	RET
		
CSTART:	JB		00H,RXD
		JB		01H,CEND
		SJMP	NORXD
RXD:	MOV		A,43H			;接收数据校对
		CPL		A
		XRL		A,42H
		JZ		RXDOK
		SJMP	NORXD
		
RXDOK:	MOV		R0,#50H			;接收数据送显示缓冲区
		MOV		R1,#40H
		MOV		R2,#02H
YHDIS1:	MOV		A,@R1
		ANL		A,#0F0H
		SWAP	A
		MOV		@R0,A
		INC		R0
		MOV		A,@R1
		ANL		A,#0FH
		MOV		@R0,A
		INC		R0
		INC		R1
		DJNZ	R2,YHDIS1	
		MOV		A,42H			
		ANL		A,#0FH
		MOV		57H,A
		MOV		A,42H
		ANL		A,#0F0H
		SWAP	A
		MOV		56H,A
		SJMP	CEND
NORXD:	MOV		57H,#11H		;无数据接收,显示待接收状态
		MOV		56H,#11H
CEND:	RET		

DIS0:	MOV		50H,#11H		;待接收状态显示子程序	
		MOV		51H,#11H
		MOV		52H,#11H		
		MOV		53H,#11H
		MOV		54H,#10H		
		MOV		55H,#10H
		MOV		56H,#11H			
		MOV		57H,#11H
		LCALL	DISP
		RET		
		
DISP:	PUSH	DPL				;显示
		PUSH	DPH
		PUSH	PSW
		PUSH	ACC					
		MOV		R1,#50H
		MOV		R4,#07H
DIS1:
		MOV		A,@R1
		MOV		R5,A
		LCALL	DISLED
		INC		R1
		DEC		R4
		CJNE	R4,#0FFH,DIS1
		POP		ACC
		POP		PSW
		POP		DPH
		POP		DPL
		RET			


DISLED:							;显示字符子程序
		PUSH	DPH
		PUSH	DPL
		PUSH	PSW
		PUSH	ACC
		MOV		A,#80H
		ADD		A,R4			;R4显示位置
		MOV		DPTR,#C8279
		MOVX	@DPTR,A
		MOV		DPTR,#LEDSEG
		MOV		A,R5			;R5显示数值
		MOVC	A,@A+DPTR
		MOV		DPTR,#D8279
		MOVX	@DPTR,A
		POP		ACC
		POP		PSW
		POP		DPL
		POP		DPH
		RET
		
CTC1:	
		RETI
		
DELAY:                          ;延时子程序
        PUSH    2
        PUSH    1
        PUSH    0
        MOV		2,#0AH
DELAY1: MOV     1,#00H
DELAY2: MOV     0,#0B2H
        DJNZ    0,$
        DJNZ    1,DELAY2        ;延时100mS
        DJNZ    2,DELAY1		;100ms*R2
        POP     0
        POP     1
        POP     2
        RET
        
		
LEDSEG:	DB	3FH,06H,5BH,4FH,66H,6DH,7DH,07H	;'0,1,2,3,4,5,6,7'
		DB	7FH,6FH,77H,7CH,39H,5EH,79H,71H	;'8,9,A,b,C,d,E,F'
		DB	00H,40H    							;' ,-' 		
		
		END
		

⌨️ 快捷键说明

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