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

📄 hwfs.asm

📁 基于8051单片机的遥控电风扇的红外发射源程序
💻 ASM
字号:
;=============电风扇红外发射(遥控器)程序=====================================
;按键说明:
;K1:低风档,键值为 01
;K2:中风档,键值为 02
;K3:高风档,键值为 03
;K4:彩灯档,键值为 04
;K5:自然风档,键值为05
;K6:睡眠风档,键值为06
;K7:正常风档,键值为07
;K8:定时档,键值为08
;K9:开关机,键值为9
;采用 4×1.5V 供电,用89C2051作CPU芯片,当没有按键按下时,进入待机状态
;按键采用INT0进行中断,只采用了8个按键
;==============================================================================
$include(2051RAM.INC)
;$include(REG51.INC)

	ORG	0000H
	JMP	MAIN
	ORG	0003H			;INT0的中断入口
	JMP	KEY_INT0
	ORG	000BH			;T0的中断入口
	JMP	FM_T0
	ORG	0100H
;------------------------------------------------------------------------------
;进入主程序
;------------------------------------------------------------------------------
MAIN:	MOV	R0,#7FH		;预使用单元清0
	CLR	A
MAIN0:
	MOV	@R0,A
	DJNZ	R0,MAIN0		;清缓冲的地址单元值
	MOV	SP,#60H
			
	MOV	P1,#00001111B		;将P1置输入
	CLR	KEYON			
	CLR	IT0			;设置电平触发
	SETB	PT0			
	SETB	EX0
	SETB	EA			
	MOV	40H,#0FFH
	MOV	41H,#0FFH
	MOV	42H,#0FFH	
	CLR	DATAOUT					
	CLR	FMOUT			;38K的中断初始值
	MOV	TMOD,#02H		;T0的工作方式2
	MOV	TH0,#0F7H		;送初值		
	SETB	FMOUT			
	CLR	TR0			;1/3的高电平标志
	MOV	R2,#02H			;2/3的循环次数	
	DJNZ	40H,LOOP1
	DJNZ	41H,LOOP1
	DJNZ	42H,LOOP1
	MOV	PCON,#01H		;进入待机
LOOP1:	JMP	MAIN
		
;=============================================================	
;中断程序:完成其按键按下的标志位
;=============================================================
KEY_INT0:
	PUSH	ACC
	PUSH	PSW
	CLR	EX0
	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	SENDBUF+2,A		;键号存于32H单元中
	CPL	A
	MOV	SENDBUF+3,A		;存键号的反码
	MOV	SENDBUF,#0FFH		;系统码在30H单元中
	MOV	SENDBUF+1,#00H		;系统反码在31H单元中
	LCALL	SEND
	SETB	ET0			;发送引导码
	SETB	TR0			;启动T0
	LCALL	PP			;发送一帧数据.包括系统码和数据码
	CLR	TR0			;当发送完后关断定时器
	CLR	ET0			;关T0的中断
	SETB	EX0			;执行完后打开外INT0
	MOV	40H,#0FFH
	MOV	41H,#0FFH
	MOV	42H,#0FFH
	POP	PSW
	POP	ACC
	RETI
;=============================================================================
FM_T0:	JB	F0,IT01
	DJNZ	R2,GRET
	MOV	R2,#2
IT01:	CPL	FMOUT
	CPL	F0
GRET:	RETI
;==============================================================================			
;引导脉冲子程序
SEND:	SETB	DATAOUT
	LCALL	DY9000us
	CLR	DATAOUT
	LCALL	DY4500us
	RET	
;==============================================================================

;发送四个缓冲单元中的内容程序:

PP:	MOV	R3,#4		;发送的字节数
	MOV	R1,SENDBUF	
PP0:	MOV	R2,#08H		;让其循环8次
	MOV	A,@R1		;将数据首址
	CLR	C		;清CY
PP1:	RRC	A		;右环移带进位
	JC	ONE		;若C等1
ZER0:	SETB	DATAOUT		;若C等0
	CALL	DY562us
	CLR	DATAOUT
	CALL	DY562us
		
ONE:	SETB	DATAOUT
	CALL	DY562us
	CLR	DATAOUT
	CALL	DY1687us
	DJNZ	R2,PP1
	INC	R1
	DJNZ	R3,PP0		;等四个字节的发送完
	RET
;=========================================================================		
DY1687us:
	MOV	R31,#38
L2:     PUSH   	R31
L3:    	DJNZ   	R31,L3
        POP    	R31
        DJNZ   	R31,L2
        RET
;========================================================================		
DY562us:	
	MOV	R31,#20
L22:    PUSH   	R31
L33:    DJNZ   	R31,L33
        POP    	R31
        DJNZ   	R31,L22
        RET		
;==========================================================================
;延时9000us子程序:
DY9000us:	
	MOV	R31,#91
L2A:    PUSH   	R31
L3A:    DJNZ   	R31,L3A
        POP    	R31
        DJNZ   	R31,L2A
        RET	
;==============================================================================
;延时4500us子程序		
DY4500us:		
	MOV	R31,#67
L2B:    PUSH   	R31
L3B:    DJNZ   	R31,L3B
        POP    	R31
        DJNZ   	R31,L2B
        RET		
;==============================================================================

DY10S:	MOV	R6,#10
L2C:	MOV	R4,#2
L3C:	MOV	R5,#248
	DJNZ	R5,$
	DJNZ	R4,L3C
	DJNZ	R6,L2C
	RET
END	
			
				

⌨️ 快捷键说明

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