三档八小时遥控电风扇控制电路和单片机程序
---http://blog.sina.com.cn/u/2486009762
大家都知道风扇是每家每户都不可缺少一个电器用品,现在鸿运扇(或台扇)原来的机械式定时器,由于有些老人家说太噪很难入睡,普通型的定时器最长定时时间1小时,特别型的好像2小时经常都是睡到半梦半醒又被热醒了,只好拿风扇来“开刀”了,把它改成遥控三档八小时控制风扇,哈哈!如果朋友们也有这种困扰就不要等了马上开始行动吧!硬件联接与功能简介如下:
;*****************************风扇控制程序*******************************
;用P3.0\P3.1\P3.7 分别控制
风速 定时 关机
;P3.3\P3.4\P3.5分别为 风速1 风速2 风速3
;P1.0~P1.7分别接共阳极数码管A~H指示----->定时:\1H~8H定时\
风速: 一~二~三
;P1.7也作开机OUT控制,全部都是低电平有效。
;开发软件:TKStudio V 3.2.5
(2011-05-22)
;注意晶体: 4MHZ
MCU:89C2051系列
;************************************************************************
电原理图如下:
http://s9/middle/942d7fa2gb081a03778f8&690
电路板实物图:http://s1/middle/942d7fa2gb081a38a9ca0&690
电路工作原理:
市电220V/50HZ经J1进入后按下SW0开机键(或RY1的开关组,开机后由主控芯片控制保持RY1自锁)后通过R2\C0(泄放电阻R10)限流\D1\D2\ZD1\C2整流滤波稳压后得到12V的直流电压(用来给RY1提供工作电压用),再经Q4\ZD2稳压为5V直流给CPU
AT89C2051 供电。开机后默认为风速一档DS1显示为中文的一,不定时状态(即风扇一直工作到按下SW3关机键或市电停止为止,当然风扇马达有故障也会)每按下SW2定时按键一次DS1显示值会自动加一,定时时间也相对应的加一(可从1~8,再到不显示阿拉伯数字,循环。当不显示阿拉伯数字时表示长通不定时),如果风扇是工作在定时自动关机状态时DS1会以约1秒钟的时间来切换当前风速与定时的时间值,显示阿拉伯数字对应定时时间如果为1小时即1小时后风扇会自动停止工作,为了低碳包括整个电路都会停止工作,(此按键可以通过红外遥控器来实现)。
如果每按下SW1风速按键一次则同样DS1显示值会加一(从中文的一
~
三,循环),分别对应控制风扇马达的1~3档(此按键可以通过红外遥控器来实现)。
如果控按下SW3则整个电路都会停止工作,(此按键可以通过红外遥控器来实现)。
此次设计的遥控器要求是NEC编码格式的遥控器,且不具备遥控码学习工能。故仿制的朋友要在原程序里面更改遥控器解码部分的用户码与按键的操作码,需要改动的部分在原程序里面有详细的注释。
与本文所提供的HEX文件对应的遥远控器可以用以(众合RM-139C型万能电视机遥控器的代码为
000时),遥控器上的POWER键对应本电路的SW3关机键,睡眠键对应本电路的SW2定时键,回看键对应本电路的SW1风速键。
#1:本电路带有强电请仿制的朋友注意安全。
;*****************************风扇控制程序*******************************
;用P3.0\P3.1\P3.7
分别控制
风速
定时
关机
;P3.3\P3.4\P3.5分别为
风速1
风速2
风速3
;P1.0~P1.7分别接共阳极数码管A~H指示----->定时:\1H~8H定时\
风速:
一~二~三
;P1.7也作开机OUT控制,全部都是低电平有效。
;开发软件:TKStudio V3.2.5
(2009-12-18)
;注意晶体:
4MHZ
MCU:89C2051系列
;程序设计:LBQ
2011-05-22
;************************************************************************
;
;代码的特征:
; 1.
HT6221键码的形成
;
当一个键按下超过36ms
振荡器使芯片激活
如果这个键按下且延迟大约108ms,
;
这108ms
发射代码由一个起始码9ms,
一个结果码4.5ms,
低8
位地址码9ms~18ms,
;
高8
位地址码9ms~18ms,8
位数据码9ms~18ms
和这8
位数
据的反码9ms~18ms
组成
;
如果键按下超过108ms
仍未松开
接下来发射的
代码
连发代码
将仅由起始码9ms
;
和结束码2.5ms
组成.
;
2.代码格式
以接收代码为准
接收代码与发射代码反向
;
;888888888888888888888888888888888888888888888888888888888888888888888888
ORG
0000H
SwFengSu
BIT
P3.0
;风速
SwTime
BIT
P3.1
;定时
SwOff BIT
P3.7 ;关机
FengSu1
BIT
P3.3
;风速1
FengSu2
BIT
P3.4
;风速2
FengSu3
BIT
P3.5
;风速3
JMP
START
ORG
0003H
JMP
YAO_KONG
ORG
000BH
;定时器0入口
JMP
TIME
;中断程序
ORG
0030H
START:
MOV
SP,#60H
MOV
P3,#0F7H
;11110111B ;默认为风速1
MOV
22H,#09H
;使其取得一.的显示码
MOV
R3,#00H
MOV
R2,#00H
MOV
R4,#00H
CLR
20H.0
;开关标志位
MOV
TMOD,#01H ;定时器0工作于方式1
MOV
TH0,#HIGH(65536-50000)
MOV
TL0,#LOW(65536-50000);50MS(当4mhz晶体时为150MS)
SETB
EA
;开总中断
SETB
ET0
;定时器0中断允许
SETB
EX0
SETB
IT0
LOOP:
JNB
20H.0,ON
;不是关机即转ON处
OFF:
MOV
P1,#8EH
;显示F且P1.7为高即关机
MOV
P3,#0FFH
;风速全部关
JMP
OFF
ON:
MOV
DPTR,#TABLE
MOV
A,R4
;
JB
20H.1,ON1
;如果20H.1=1
即显示定时值
MOV
A,22H
;使其取得一.二.三.的显示码
ON1:
MOVC
A,@A+DPTR
MOV
P1,A
;送P1口显示
CALL
SW_OFF
CALL
SW_FengSu
CALL
SW_Time
JMP
LOOP
SW_OFF:
JB
SwOff,SWO
;是否有关机键压下
CALL
DELAY
;防抖
JB
SwOff,SWO
JNB
SwOff,$
SW1:
SETB
20H.0
;取反即为高电平故关闭总电源
SWO:
RET
SW_FengSu:;调风速键
JB
SwFengSu,LAO ;是否有调风速键压下
CALL
DELAY
JB
SwFengSu,LAO
LA1:
MOV
PSW,#00H
CLR
20H.1
;标志位置
0
显示风速值
SETB
20H.2
;延时轮流显示标志位
MOV
21H,#8
;延时轮流显示
INC
R3
JNB
SwFengSu,$
C01:
;风速2
CJNE
R3,#01H,C02
MOV
22H,#0AH
;使其取得二.的显示码
SETB
FengSu1
;关风速1
CALL
DELAY
;延时防抖14946us
CALL
DELAY
;延时防抖14946us
CLR
FengSu2
;开风速2
JMP
LAO
C02: ;风速3
CJNE
R3,#02H,C03
MOV
22H,#0BH
;使其取得三.的显示码
SETB
FengSu2
;关风速2
CALL
DELAY
;延时防抖14946us
CALL
DELAY
;延时防抖14946us
CLR
FengSu3
;开风速3
JMP
LAO
C03: ;风速1
MOV
22H,#09H
;使其取得一.的显示码
SETB
FengSu3
;关风速3
CALL
DELAY
;延时防抖14946us
CALL
DELAY
;延时防抖14946us
CLR
FengSu1
;开风速1
MOV
R3,#00H
LAO:
RET
SW_Time:;调定时键
JB
SwTime,LBO
;是否有定时键压下
CALL
DELAY
JB
SwTime,LBO
LB:
MOV
PSW,#00H
SETB
20H.1
;标志位置
1
显示定时值
SETB
20H.2
;延时轮流显示/风速标志位置1
JNB
SwTime,$
MOV
21H,#8
;延时轮流显示
MOV
R7,#00H
MOV
R6,#00H
MOV
R5,#00H
INC
R4
;定时时间加
1
小时
CJNE
R4,#09H,C04
;如果大于8即长通不会定时关机
CLR
20H.1
;标志位置
0
显示风速值
MOV
R4,#00H
CLR
TR0
RET
C04:
SETB
TR0
LBO:
RET
DELAY:;延时防抖14946us
MOV
R1,#10
;1*3=3
DD:
MOV
R0,#248
;1*3=3
DJNZ
R0,$
;2*3*248*10=14880
DJNZ
R1,DD
;2*3*10=60
RET
TIME:
PUSH
ACC
PUSH
PSW
MOV
TH0,#HIGH(65536-50000)
MOV
TL0,#LOW(65536-50000);重置初定时值
INC
R7
INC
R5
CJNE
R5,#7,TT1
;150MS*7=1S到了吗?
MOV
R5,#00H
JNB
20H.2,TT2
;延时轮流显示/风速标志位置
DJNZ
21H,TT1
CLR
20H.2
TT2:
CPL
20H.1
;标志位置
0
显示风速值
TT1:
CJNE
R7,#200,TT
;150MS*200=30S到了吗?
MOV
R7,#00H
INC
R6
CJNE
R6,#120,TT
;30S*120=3600S到了吗?
MOV
R6,#00H
DJNZ
R4,TT
;将R4的值减1
SETB
20H.0
;取反即为高电平故关闭总电源
TT:
POP
PSW
POP
ACC
RETI
YAO_KONG:
PUSH
PSW
PUSH
ACC
CLR
EA
MOV
PSW,#10H
IR:
MOV
R6,#10
SB:
ACALL
DELAY882
JB
P3.2,REM_BAK
DJNZ
R6,SB
JNB
P3.2,$
ACALL
DELAY2400
JNB
P3.2,REM_BAK
ACALL
DELAY2400
MOV
R1,#1AH
MOV
R2,#4
PP:
MOV
R3,#8
JJ:
JNB
P3.2,$
LCALL
DELAY882
MOV
C,P3.2
JNC
UUU
LCALL
DELAY1000
UUU:
MOV
A,@R1
RRC
A
MOV
@R1,A
DJNZ
R3,JJ
INC
R1
DJNZ
R2,PP
DAN_JI:
;(众合RM-139C型万能电视机遥控器的代码为
000时)
;遥控器上的POWER键对应本电路的SW3关机键
;睡眠键对应本电路的SW2定时键
;回看键对应本电路的SW1风速键)
NOP
MOV
A,1AH
XRL
A,#40H
;用户码低八位40H
(若你的遥控器不一样请修改其中的立即数)
JNZ
REM_BAK
MOV
A,1BH
XRL
A,#0BFH
;用户码高八位BFH
(若你的遥控器不一样请修改其中的立即数)
JNZ
REM_BAK
MOV
A,1CH
CPL
A
XRL
A,1DH
JNZ
REM_BAK
MOV
A,1CH
CJNE
A,#12H,E81
;遥控器关机键的操作码
(若你的遥控器不一样请修改其中的立即数)
CALL
SW1
;关机
JMP
REM_BAK
E81:
CJNE
A,#17H,E82
;遥控器定时键的操作码
(若你的遥控器不一样请修改其中的立即数)
CALL
LB
;定时
JMP
REM_BAK
E82:
CJNE
A,#0BH,E83
;遥控器关风速键的操作码
(若你的遥控器不一样请修改其中的立即数)
CALL
LA1
;风速
E83:
;CJNE A,#83H,E84
REM_BAK:
POP
ACC
POP
PSW
SETB
EA
RETI
DELAY882:
;882us
MOV
R7,#73
;3*1=3
;NOP
;3*1=3
D3:
NOP
;3*1*73=219
NOP
;3*1*73=219
DJNZ
R7,D3
;2*3*73=438
RET
DELAY1000:
;999us
MOV
R7,#83
;3*1=3
D4:
NOP
;3*1*83=249
NOP
;3*1*83=249
DJNZ
R7,D4
;2*3*83=498
RET
DELAY2400:
;2403us
MOV
R7,#89
;3*1=3
D5:
NOP
;3*89=267
NOP
;3*89=267
NOP
;3*89=267
NOP
;3*89=267
NOP
;3*89=267
NOP
;3*89=267
NOP
;3*89=267
DJNZ
R7,D5
;2*3*89=534
RET
TABLE:;P1.0-P1.7分别接共阳极数码管A-H
DB
40H
;0.
DB
79H
;1.
DB
24H
;2.
DB
30H
;3.
DB
19H
;4.
DB
12H
;5.
DB
02H
;6.
DB
58H
;7.
DB
00H
;8.
DB
3FH
;一.
DB
37H
;二.
DB
36H
;三.
END
加载中,请稍候......