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

📄 rec.asm

📁 基于51单片机的遥控电风扇的红外线接收程序
💻 ASM
字号:
;========================电风扇红外接收(控制板)程序===========	
;用89C51单片机来作主芯片控制,采用红外1838接收头,可控硅采用MC97A6
;风扇具有红外遥控功能
;K1:低档,相应的指示灯亮 ,中档,相应的指示灯亮 , 高档,相应的指示灯亮     
;K2:彩灯,相应的指示灯亮
;K3:自然风控制       睡眠风的控制	正常风的控制       
;K4:定时30分钟,1小时,2小时,4小时
;K5:开关机功能
;自然风的处理流程:停--->开低档--->延时6秒--->开中档-->
;延时6秒--->开高档--->循环
;睡眠风的处理流程:停6S--->开低档10S--->停延时10S-->开中档10S-->
;停延时10S-->开高档10S--->循环
;正常风的处理流程:开低档10S--> 开中档10S--> 开高档10S---> 循环

;==========================================================
$INCLUDE(REG51.INC)
$INCLUDE(89C51RAM.INC)
	ORG	0000H
	JMP	START
	ORG	0003H
	JMP	JISH_INT0	;红外遥控中断设置
	ORG	000BH
	JMP	LP0		;定时中断
	ORG	0013H
	JMP	KEY_INT1	;按键中断	
	ORG	0100H
START:	
	MOV	R0,#7FH		;预使用单元清0
	CLR	A
MAIN0:
	MOV	@R0,A
	DJNZ	R0,MAIN0
		
	MOV	SP,#60H
	MOV	TMOD,#01H
	MOV	TH0,#3CH		;定时50MS
	MOV	TL0,#0B0H
	
	SETB	LLOW			;关低风
	SETB	MDI			;关中风
	SETB	HIGHT			;关高风
	SETB	LLAP			;关彩灯
	MOV	P0,#0FFH		;关所有的指示灯
		
	SETB	EX0
	SETB	EX1
	SETB	EA			;CPU开中
			
MAIN:	JB	LKEYON,KEYHANDLE	;检按键标志位
	JB	REC,KEYHANDLE		;检接收中断标志位

	JMP	MAIN			;转主程序
	
;==============================================================================	
;键值的处理的程序
;键盘处理程序
;K1键:完成弱、中、强控制,相应的指示灯点亮
;K2键:完成彩灯控制,相应的指示灯点亮
;K3键:完成自然风、睡眠风、正常风的控制,相应的指示灯点亮
;K4键:完成定时的控制,同时0.5H,1H,2H,4H,相应的指示灯点亮
;K5键:开/关机
;==============================================================================
KEYHANDLE:
	CLR	LKEYON
	CLR	LREC
	MOV	A,MRD
				
	CJNE	A,#01H,KEY2		;当键值=01H时,	
;------------------------------------------------------------------------------
;低、中、高、的控制
;------------------------------------------------------------------------------
KEY1:	JB	DANG01,DIFENG
	JB	DANG02,ZHONGFENG	;DANG02 中档标志位
	JB	DANG03,QIANGFENG	;DANG03 强档标志位	
	JMP	MAIN
;------------------------------------------------------------------------------
;低档控制	
DIFENG:	
	JNB	DANG01,FAN0
	SETB	LLOW			;完成了低档的程序,关低
	SETB	MDI			;关中
	SETB	HIGHT			;关高
	CALL	DY20MS			;保证三个SCR全部为关断状态
	CLR	LLOW			;开低风
	CLR	LED_L			;开低档指示灯
	CLR	DANG01
FAN0:	JMP	MAIN

;------------------------------------------------------------------------------
;中档控制
ZHONGFENG:	
	
	JNB	DANG02,FAN0
	SETB	LLOW			;关低
	SETB	MDI			;关中
	SETB	HIGHT			;关高
	CALL	DY20MS			;保证三个SCR全部为关断状态
	CLR	MDI
	CLR	LED_M
	CLR	DANG02
	
	AJMP	MAIN			;跳转到
;------------------------------------------------------------------------------
;高档控制
QIANGFENG:
	
	JNB	DANG03,FAN0	
	SETB	LLOW			;关低
	SETB	MDI			;关中
	SETB	HIGHT			;关高
	CALL	DY20MS			;保证三个SCR全部为关断状态
	CLR	HIGHT
	CLR	LED_H
	CLR	DANG03
	AJMP	MAIN			;跳转到
;------------------------------------------------------------------------------
;彩灯控制
;------------------------------------------------------------------------------	
KEY2:	
	CJNE	A,#02H,KEY3		;K4的处理程序 彩灯的处理程序
	JB	PLAP,LED1
	CLR	LLAP			;第一次按时将彩灯打开,
	CLR	LED_LAP			
	SETB	PLAP			
	JMP	MAIN			;返回
LED1:	SETB	LLAP			;第二次按时将彩灯关断
	SETB	LED_LAP
	CLR	PLAP	
	JMP	MAIN			;跳转到
;------------------------------------------------------------------------------
;风类处理过程
;------------------------------------------------------------------------------	
KEY3:	
	CJNE	A,#03H,KEY4_A		;K3的处理程序处理风类
	JB	SMF,SKEEP
	JB	ZCF,SPRING_A
	JB	ZRF,WATERM
	JMP	MAIN
 KEY4_A:JMP	KEY4
 SPRING_A:
 	JMP	SPRING
;------------------------------------------------------------------------------
;自然风控制			
WATERM:	
	JNB	ZRF,FAN1
	CLR	ZRF
	SETB	LLOW			;处理自然风,关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN0		;查询
	JB	LKEYON,ZHUAN0		;查询
	CALL	DY6S
	CLR	LLOW
	JB	LREC,ZHUAN0		;查询
	JB	LKEYON,ZHUAN0		;查询	
	CALL	DY6S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN0		;查询
	JB	LKEYON,ZHUAN0		;查询
	CALL	DY20MS
	CLR	MDI
	JB	LREC,ZHUAN0		;查询
	JB	LKEYON,ZHUAN0		;查询
	CALL	DY6S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN0		;查询
	JB	LKEYON,ZHUAN0		;查询
	CALL	DY20MS
	CLR	HIGHT
	CALL	DY6S
	AJMP	WATERM
ZHUAN0:	SETB	SMF
FAN1:	JMP	MAIN
		
;------------------------------------------------------------------------------
;睡眠风控制
SKEEP:	
	
	JNB	SMF,FAN2
	CLR	SMF
SLEEP1:	SETB	LLOW			;处理睡眠风,关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY6S
	CLR	LLOW			;开低档
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	
	CLR	MDI			;开中档
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
		
	CLR	HIGHT			;开高档
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	JB	LREC,ZHUAN1		;查询
	JB	LKEYON,ZHUAN1		;查询
	CALL	DY10S
	AJMP	SKEEP
ZHUAN1:	CLR	SMF
	SETB	ZCF
FAN2:	JMP	MAIN		
;------------------------------------------------------------------------------
;正常风控制	
		
SPRING:
	
	JNB	ZCF,FAN3
	CLR	ZCF
SPRING1:
	SETB	LLOW			;处理正常风,关低'中'高
	SETB	MDI
	SETB	HIGHT
	CALL	DY20MS
	CLR	LLOW			;开低档	
	JB	LREC,ZHUAN2		;查询
	JB	LKEYON,ZHUAN2		;查询
	CALL	DY10S
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	LCALL	DY20MS
	JB	LREC,ZHUAN2		;查询
	JB	LKEYON,ZHUAN2		;查询
	CLR	MDI			;开中档
	CALL	DY10S
	
	
	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	LCALL	DY20MS
	JB	LREC,ZHUAN2		;查询
	JB	LKEYON,ZHUAN2		;查询
	CLR	HIGHT			;开高档
	CALL	DY10S
	AJMP	SPRING
ZHUAN2:	CLR	ZCF
FAN3:	JMP	MAIN	
		
;------------------------------------------------------------------------------
;定时控制
;------------------------------------------------------------------------------		
KEY4:	
	CJNE	A,#04H,KEY5	;K4的定时的处理程序
	JB	SJ01,DY1H		
	JB	SJ02,DY2H
	JB	SJ03,DY4H
	JNB	SJ00,FAN4
	CLR	SJ00
	SETB	TR0			;0 5H处理			
	JMP	MAIN
	
DY1H:	
	JNB	SJ01,FAN4
	CLR	SJ01
	SETB	TR0
	JMP	MAIN
		
DY2H:	
	JNB	SJ02,FAN4
	CLR	SJ02
	SETB	TR0
	JMP	MAIN
	
DY4H:	
	JNB	SJ03,FAN4
	CLR	SJ02
	SETB	TR0
FAN4:	JMP	MAIN
;------------------------------------------------------------------------------
;开关机
;------------------------------------------------------------------------------	
KEY5:	
	CJNE	A,#05H,POTHER		;开关机处理程序
	JB	KAI,GUAN
	CLR	MDI			
	CLR	LED_M			
	SETB	KAI
	JMP	MAIN			;返
	
GUAN:	SETB	LLOW			;关低'中'高
	SETB	MDI
	SETB	HIGHT
	CLR	KAI
	JMP	MAIN
POTHER:
	JMP	MAIN			;其他键的不处理直接返回	
;==============================================================================
;T0定时中断处理
;==============================================================================		
LP0:
	PUSH	ACC			;中断处理
	PUSH	PSW
	MOV	TH0,#3CH		;定时50MS
	MOV	TL0,#0B0H
	DJNZ	CUZHI,GRET		;1S到后向下执行
	MOV	CUZHI,#20			;给50MS的寄存器给初值
	INC	SEN			
	MOV	A,SEN
	CJNE	A,#60,GRET		;1分钟到后向下执行
	INC	MIN
	MOV	A,MIN
	
	JB	SJ01,LOOP_1H		;定时1小时的处理
	JB	SJ02,LOOP_2H		;定时2小时的处理
	JB	SJ03,LOOP_4H		;定时4小时的处理
	CJNE	A,#30,GRET		;半小时到后向下执行		
	MOV	P1,#0FFH		;关断所有档位
	MOV	P0,#0FFH
	SETB	SJ01			;将1H的标志位进行置 1
	JMP	GRET
LOOP_1H:
	CJNE	A,#60,GRET		;1小时到后向下执行
	MOV	P1,#0FFH
	MOV	P0,#0FFH
	CLR	SJ01			;将1H的标志位进行置 0
	SETB	SJ02			;将2H的标志位进行置 1
	JMP	GRET
LOOP_2H:
	CJNE	A,#60,GRET		;1小时到后向下执行
	INC	HOUR
	MOV	A,HOUR
	CJNE	A,#2,GRET		
	MOV	P1,#0FFH		;关断
	MOV	P0,#0FFH
	CLR	SJ02			;关断2H的标志位
	SETB	SJ03			;将4H的标志位进行置位
	JMP	GRET			;中断返回
LOOP_4H:
	CJNE	A,#60,GRET		;1小时到后向下执行
	INC	HOUR
	MOV	A,HOUR
	CJNE	A,#4,GRET		;4小时到后向下执行
	MOV	P1,#0FFH		;关断
	MOV	P0,#0FFH
	CLR	SJ03			;将4H的标志位进行清零
	JMP	GRET			;中断返回
GRET:	
	CLR	TR0
	POP	PSW
	POP	ACC
	RETI

;==============================================================================	
;INT0中断处理程序:对接收数据进行接收			
;==============================================================================
JISH_INT0:
	PUSH	ACC
	PUSH	PSW
	CLR	EX0			;关断中断	
	MOV	R6,#10			;避开9MS时间的引导码
SB:	CALL	DY882US
	JB	P3.2,EXIT		;,EX检测为1时退出
	DJNZ	R6,SB			;检测为0时,引导码过
	JNB	P3.2,$;			;检测为0时,等待
	ACALL	DY4700US		;避开4。5MS时间的引导码
	MOV	R7,#16			;避开系统码
JJJJA:	JNB	P3.2,$
	LCALL	DY882US
	MOV	C,P3.2			;将P3.2送C中
	JNC	UUUA			;若C=0则转
	LCALL	DY1000US
UUUA:	DJNZ	R7,JJJJA
	MOV	R1,#MRD
	MOV	R2,#2
PP:	MOV	R3,#8			;右移的次数
JJJJ:	JNB	P3.2,$			;=0则等
	LCALL	DY882US
	MOV	C,P3.2			;送C中
	JNC	UUU
	LCALL	DY1000US
UUU:	MOV	A,@R1			;送存贮的首址
	RRC	A
	MOV	@R1,A			;送存贮单元中
	DJNZ	R3,JJJJ			;完成一个字节,没完则
	INC	R1
	DJNZ	R2,PP
	MOV	A,MRD
	CPL	A
	CJNE	A,31H,EXIT		;进行数据码和数据的反码进行比较
EXIT:	POP	PSW
	POP	ACC
	SETB	LREC			;置REC的标志位
	SETB	EX0			;打开INT0的中断
	RETI
			
;==============================================================================
;INT1的中断处理
;==============================================================================
KEY_INT1:
	PUSH	ACC
	PUSH	PSW
	CLR	EX1			;关断INT1
	LCALL	SCANKEY
	CALL	KEY_K10			;置高、中、低的标志位
	CALL	FENG_3			;置风类的标志位
	CALL	JS			;置定时时间标志位
	SETB	LKEYON			;按键标志位
	SETB	EX1			;打开中断位
	POP	PSW
	POP	ACC
	RETI
;------------------------------------------------------------------------------
;定时的置位标志程序
;------------------------------------------------------------------------------	
JS:
	CLR	SJ00
	CLR	SJ01
	CLR	SJ02
	CLR	SJ03
		
	MOV	A,MRD
	CJNE	A,#04H,KEY_K4D		;
	INC	TIME
	MOV	A,TIME
	CJNE	A,#5,KEY_K4
	MOV	TIME,#1
KEY_K4:
	MOV	A,TIME
	CJNE	A,#1,KEY_K4A		;等1则置ZRF
	SETB	SJ00
	JMP	KEY_K4D

KEY_K4A:	
	CJNE	A,#2,KEY_K4B		;等2则置SMF
	SETB	SJ01
	JMP	KEY_K4D
KEY_K4B:
	CJNE	A,#3,KEY_K4C		;等3则置ZCF
	SETB	SJ02
	JMP	KEY_K4D
KEY_K4C:
	CJNE	A,#4,KEY_K4D		;等3则置ZCF
	SETB	SJ03
	JMP	KEY_K4D
KEY_K4D:
	RET
;------------------------------------------------------------------------------
;高中低档的置标志位子程序
;------------------------------------------------------------------------------
KEY_K10:
	CLR	DANG01
	CLR	DANG02
	CLR	DANG03
		
	MOV	A,MRD
	CJNE	A,#01H,KEY_K1C		;
	INC	FENG
	MOV	A,FENG
	CJNE	A,#4,KEY_K1
	MOV	FENG,#1
KEY_K1:
	MOV	A,FENG
	CJNE	A,#1,KEY_K1A
	SETB	DANG01
	JMP	KEY_K1C
KEY_K1A:	
	CJNE	A,#2,KEY_K1B
	SETB	DANG02
	JMP	KEY_K1C

KEY_K1B:
	CJNE	A,#3,KEY_K1C
	SETB	DANG03
	JMP	KEY_K1C
KEY_K1C:
	RET
;------------------------------------------------------------------------------
;自然风、睡眠风、正常风的置标志位子程序
;------------------------------------------------------------------------------
FENG_3:
	CLR	ZRF
	CLR	SMF
	CLR	ZCF
		
	MOV	A,MRD
	CJNE	A,#03H,KEY_K3C		;
	INC	FLEI
	MOV	A,FLEI
	CJNE	A,#4,KEY_K3
	MOV	FLEI,#1
KEY_K3:
	MOV	A,FLEI
	CJNE	A,#1,KEY_K3A		;等1则置ZRF
	SETB	ZRF
	JMP	KEY_K3C
KEY_K3A:	
	CJNE	A,#2,KEY_K3B		;等2则置SMF
	SETB	SMF
	JMP	KEY_K3C
KEY_K3B:
	CJNE	A,#3,KEY_K3C		;等3则置ZCF
	SETB	ZCF
	JMP	KEY_K3C
KEY_K3C:
	RET
;==============================================================================
;扫描键盘程序。
;==============================================================================	
SCANKEY:
	MOV	A,P1			
	CPL	A			
	ANL	A,#0FH
	MOV	R2,A			;将行号存入R2中
	MOV	P1,#0F0H		;将列置输入端
	MOV	A,P1			
	CPL	A
	ANL	A,#0F0H			;取列号并存入A中
	MOV	R1,#03H			;置列初号
	MOV	R3,#03H			;置循环次数
	CLR	C
PINT01:	RLC	A			;取列号
	JC	PINT01			
	DEC	R1
	DJNZ	R3,PINT01
		
PINT02:	MOV	A,R2			;取行号
	MOV	R2,#00H
	MOV	R3,#03H			;置循环次数
PINT03:	RRC	A			
	JC	PINT04
	INC	R2
	DJNZ	R3,PINT03
PINT04:	MOV	A,R2
	CLR	C			
	RLC	A			
	RLC	A
	ADD	A,R1
	MOV	MRD,A			;键号存于MRD单元中	
	RET
;==============================================================================					
DY20MS:
 	MOV	53H,#8AH       
DELAY_0: 
	PUSH    53H
DELAY_1: 
	DJNZ    53H,DELAY_1
        POP     53H
        DJNZ    53H,DELAY_0
        RET						
;==============================================================================		
DY6S:	
	MOV	R7,#12H
DEYLAY_00:
	MOV	53H,#0DDH       
DELAY_11: 
	PUSH    53H
DELAY_22: 
	DJNZ    53H,DELAY_22
        POP     53H
        DJNZ    53H,DELAY_11
        DJNZ	R7,DEYLAY_00
        RET						
;==============================================================================							
DY8S:	MOV	R7,#16
	
DEYLAY_33:
	MOV	53H,#0DDH       
DELAY_44: 
	PUSH    53H
DELAY_55:
	DJNZ    53H,DELAY_55
        POP     53H
        DJNZ    53H,DELAY_44
        DJNZ	R7,DEYLAY_33
        RET				
;==============================================================================		
DY10S:	MOV	R7,#20
	MOV	R7,#12H
DEYLAY_66: 
	MOV	53H,#0DDH       
DELAY_77: 
	PUSH    53H
DELAY_88: 
	DJNZ    53H,DELAY_88
        POP     53H
        DJNZ    53H,DELAY_77
        DJNZ	R7,DEYLAY_66
       	RET				
;==============================================================================	

DY882US:MOV	R4,#20
D1:	MOV	R5,#20
	DJNZ	R5,$
	DJNZ	R4,D1
	RET
DY1000US:
	MOV	R4,#2
D3:	MOV	R5,#248
	DJNZ	R5,$
	DJNZ	R4,D3
	RET
DY4700US:
YS2:	MOV	R4,#10
D2:	MOV	R5,#235
	DJNZ	R5,$
	DJNZ	R4,D2
	RET

END
		
		
		
								

				
		
	

⌨️ 快捷键说明

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