(3)程序流程图 :
(图14)控制板主程序流程
(图15)键值处理流程
======================================================================
红外发射控制程序:
;=============电风扇红外发射(遥控器)程序=====================================
;按键说明:
;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个按键
;==============================================================================
R31 DATA 1FH
KEYON BIT 20H.0 ;按键按下的标志
SENDBUF DATA 30H ;定义发送系统码缓冲的地址
FMOUT BIT P3.3 ;38K输出
DATAOUT BIT P3.0 ;数据输出
; BYTE Register
P0 DATA 80H
P1 DATA 90H
P2 DATA 0A0H
P3 DATA 0B0H
PSW DATA 0D0H
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
PCON DATA 87H
TCON DATA 88H
TMOD DATA 89H
TL0 DATA 8AH
TL1 DATA 8BH
TH0 DATA 8CH
TH1 DATA 8DH
IE DATA 0A8H
IP DATA 0B8H
SCON DATA 98H
SBUF DATA 99H
RG 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