📄 rec.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 + -