制作这个风扇控制器主要是有时需要非常小的微风,特别是睡觉的时候,其次是年纪大了不容易睡着,想要定时久点,至少2小时以上。两年前制作过一个风扇控制器,不是特别好用,现在用电容做调速,效果不错运行很静没有噪音。原打算用可控硅控制,无奈试了几种电路形式都会不定期损坏可控硅,甚至有过几次一插电就击穿,只好放弃,改用继电器控制,继电器的缺点是吸合/断开有哒哒响的声音,所以先全功率驱动继电器,延时一定时间后使用PWM方式驱动保持吸合状态,降低功耗减少发热量,这样就可以用隔音材料把它包起来,减小哒哒响的声音。PWM频率过低会听到继电器线圈产生的噪音,所以定为人耳可听范围的上限20KHz,占空比50%,实测驱动电流为30%左右,能保持吸合状态,在继电器线圈并联一只104电容后驱动电流为50%左右,为了稳定可靠,保留继电器线圈并联的104电容,经测试未感觉到继电器有明显升温。遥控可使用家里闲置的遥控器,只要能解码都可以使用,或花几块钱网购一个风扇遥控器。
汇编程序源代码:
电风扇-电容调速.rar
(90.28 KB, 下载次数: 3)
- ;=======================================
- ;红外遥控电容调速长定时电风扇控制器
- ;STC8G1K08(DIP16或SOP16)+TM1637显示模块+EC11编码器+CBB电容
- ;杨小强,2022年8月
- ;内部R/C时钟,频率选择:11.0592MHz
- ;显示:(TM1637)4位数码管显示模块
- ;调整定时、档位:EC11带按键5脚旋转编码器。也可以用3只按键代替EC11编码器
- ;
- ;工作时先全功率驱动继电器,延时一定时间后转为PWM方式驱动,以降低功耗减少发热量,
- ;PWM周期25微秒*2=50微秒,频率20KHz占空比50%,继电器线圈并联一只104电容,驱动电流降低到50%左右
- ;保持吸合状态。
- ;如果使用可控硅控制就取消主程序中初始化部分的“SETB PWM”指令,或改为“CLR PWM”(禁止PWM驱动)
- ;
- ;EC11编码器按键、旋转动作:
- ; 1.旋转编码器:对当前显示的“定时时间”或“档位”作增(减)调整
- ; 2.短按1次:正常风与自然风(睡眠风)切换。自然风状态时LED指示灯亮,只显示定时时间。
- ; 3.短按2次:设置自然风(睡眠风)渐慢/渐快变化的上下限档位范围、各档位变化的间隔时间(秒)
- ; 4.长按10秒:显示“----”,红外遥控信号解码,遥控器按键功能定义。定义好后须长按10秒才保存
- ;
- ;短按编码器按键2次设置自然风(睡眠风)渐慢/渐快变化的上下限档位范围、档位变化的间隔时间(秒):
- ; 1.显示:L-最低档位下限,旋转编码器加/减,上、下限档位之间最少间隔3档。
- ; 2.显示:H-最高档位上限,旋转编码器加/减,上、下限档位之间最少间隔3档。
- ; 3.显示:E-档位渐慢/渐快变化时的间隔时间(1~5秒),旋转编码器加/减
- ;设置好一项,短按编码器按键或者闪烁5秒无操作,自动跳到下一项。
- ;短按2次编码器按键保存并退出,或在第3项时无操作闪烁5秒自动保存并退出。
- ;
- ;长按10秒显示“----”进入红外遥控器的按键定义:
- ;定义1“关”、2“开/风速”、3“定时”、4“自然风”、5“+”、6“-”六个功能键。
- ; 交替显示功能编号+遥控器客户码(不显示反码)和原来保存的按键值,按键值为数据码+数据码反码
- ;共4个十六进制数,按下遥控器按键收到信号解码成功并显示,即为新的按键值,遥控器客户码与原来保
- ;存的不相同时,自动删除旧的数据(保存才会生效),短按跳到下一个功能编号,也可以旋转EC11编码器
- ;向前/后跳到任意编号,全部或部分定义好后,长按10秒编码器按键显示“----”保存并退出才生效,
- ;短按两次退出或60秒无操作自动退出,不保存,仍然还是原来的数据。
- ;
- ;1“关”键:定时时间清零,关风扇
- ;2“开/风速”键:当定时时间为零时,置上电默认定时时间,开风扇;定时时间不为零时,档位
- ; 加1,到最高档后又从1档开始循环,支持长按连续加;自然风(睡眠风)状态时
- ; 不能调整档位。
- ;3“定时”键:增加定时时间。风扇在关的状态时,增加定时时间立即开风扇。
- ;4“自然风”键:正常风与自然风(睡眠风)切换,自然风(睡眠风)状态时LED指示灯亮,只显示定时时间。
- ;5“+”键:对当前显示的“定时时间”或“档位”作增加调整,支持长按连续加。
- ;6“-”键:对当前显示的“定时时间”或“档位”作减少调整,支持长按连续减。
- ;
- ;保存失败显示5秒E1
- ;
- ;P3口接6只继电器(5只CBB电容,耐压400V或630V)、LED指示灯、红外接收头:
- ;P3.0----9脚,继电器,1uF
- ;P3.1----10脚,继电器,2.2uF
- ;P3.2----11脚,继电器,3.3uF
- ;P3.3----12脚,继电器,4.7uF
- ;P3.4----13脚,继电器,4.7uF
- ;P3.5----14脚,继电器,直通
- ;P3.6----15脚,自然风LED指示灯,低电平亮
- ;P3.7----16脚,红外接收头
- ;
- ;各档档位控制码及对应的电容容量:
- ;01档:控制码FEH,P3.0控制的继电器导通,电容容量1uF
- ;02档:控制码FDH,P3.1控制的继电器导通,电容容量2.2uF
- ;03档:控制码FBH,P3.2控制的继电器导通,电容容量3.3uF
- ;04档:控制码FAH,P3.0、P3.2控制的继电器导通,电容容量1uF+3.3uF=4.3uF
- ;05档:控制码F9H,P3.1、P3.2控制的继电器导通,电容容量2.2uF+3.3uF=5.5uF
- ;06档:控制码F8H,P3.0、P3.1、P3.2控制的继电器导通,电容容量1uF+2.2uF+3.3uF=6.5uF
- ;07档:控制码F4H,P3.0、P3.1、P3.3控制的继电器导通,电容容量1uF+2.2uF+4.7uF=7.9uF
- ;08档:控制码F2H,P3.0、P3.2、P3.3控制的继电器导通,电容容量1uF+3.3uF+4.7uF=9uF
- ;09档:控制码F1H,P3.1、P3.2、P3.3控制的继电器导通,电容容量2.2uF+3.3uF+4.7uF=10.2uF
- ;10档:控制码F0H,P3.0、P3.1、P3.2、P3.3控制的继电器导通,电容容量1uF+2.2uF+3.3uF+4.7uF=11.2uF
- ;11档:控制码E4H,P3.0、P3.1、P3.3、P3.4控制的继电器导通,电容容量1uF+2.2uF+4.7uF+4.7uF=12.6uF
- ;12档:控制码E2H,P3.0、P3.2、P3.3、P3.4控制的继电器导通,电容容量1uF+3.3uF+4.7uF+4.7uF=13.7uF
- ;13档:控制码E1H,P3.1、P3.2、P3.3、P3.4控制的继电器导通,电容容量2.2uF+3.3uF+4.7uF+4.7uF=14.9uF
- ;14档:控制码E0H,P3.0、P3.1、P3.2、P3.3、P3.4控制的继电器导通,电容容量1uF+2.2uF+3.3uF+4.7uF+4.7uF=15.9uF
- ;15档:控制码DFH,P3.5控制的继电器导通,直通。
- ;
- ;----------------------------- 端口定义 ------------------------------------
- P5 DATA 0C8H ;P5口定义
- P1M1 DATA 091H ;P1口配置寄存器1
- P1M0 DATA 092H ;P1口配置寄存器0
- P3M1 DATA 0B1H ;P3口配置寄存器1
- P3M0 DATA 0B2H ;P3口配置寄存器0
- P5M1 DATA 0C9H ;P5口配置寄存器1
- P5M0 DATA 0CAH ;P5口配置寄存器0
- CLK EQU P1.0 ;1脚,接显示模块TM1637的CLK
- DIO EQU P1.1 ;2脚,接显示模块TM1637的DIO
- EC11A EQU P1.6 ;3脚,接编码器的A引脚(+)
- EC11B EQU P1.7 ;4脚,接编码器的B引脚(-)
- EC11K EQU P5.4 ;5脚,接编码器的按键KEY
- LED EQU P3.6 ;15脚,自然风状态LED指示灯,低电平亮
- IR EQU P3.7 ;16脚,红外接收头
- BUZZER EQU P5.5 ;7脚,无源蜂鸣器
- ;---------------------------- 位地址及RAM的使用 ----------------------------
- BMQDZ BIT 20H.0 ;编码器动作,1=编码器有旋转动作;0=没有旋转动作
- XZFX BIT 20H.1 ;旋转方向,1=编码器顺时针正转;0=编码器逆时针反转
- FLQH BIT 20H.2 ;风类切换,1=自然风(睡眠风);0=正常风
- TSFX BIT 20H.3 ;调速方向,1=渐快;0=渐慢。自然风渐变控制时的调速方向。
- YSBC BIT 20H.4 ;延时保存,1=在MJS倒计时结束时保存档位。
- SSBZ BIT 20H.5 ;闪烁标志,1=不显示,0=显示,数字及冒号闪烁时用,每0.5秒变化一次。
- XSNRXZ BIT 20H.6 ;显示内容选择,1=显示档位;0=显示定时时间。
- XSKG BIT 20H.7 ;显示开关,1=关闭T1中断的显示功能,0=允许显示定时和档位等内容
- XSQHY BIT 21H.0 ;显示切换1,1=显示自然风档位变化范围或红外解码显示;0=显示档位或定时。
- XSQHE BIT 21H.1 ;显示切换2,1=显示自然风档位变化范围;0=红外遥控信号解码显示。设置时用
- BMXSQH BIT 21H.2 ;编码显示切换,1=显示数据码+反码;0=显示功能编号+系统码。设置时用
- PWM BIT 21H.3 ;1=使用PWM方式驱动;0=禁止PWM驱动
- PWMBZ BIT 21H.4 ;PWM的电平状态标志,1=高电平,0=低电平。PWM周期25微秒*2=50微秒,20KHz占空比50%
- EEPBC BIT 21H.5 ;EEPROM操作子程序调用标志,1=EEPROM操作子程序正在调用继电器控制程序
- FWBZ0 EQU 022H ;闪烁显示时长(秒)。受干扰等原因导致复位时闪烁10秒
- DSSJS EQU 023H ;定时时间,时
- DSSJF EQU 024H ;定时时间,分
- DSSJM EQU 025H ;定时时间,秒
- SMGLD EQU 026H ;数码管亮度,1~8级
- DSDWJG EQU 027H ;上电设置的定时与档位交替显示的间隔时间(秒)
- DSDW EQU 028H ;运行时使用,定时与档位交替显示的间隔时间(秒)
- SMFJG2 EQU 029H ;运行时使用,自然风(睡眠风)档位变化的间隔时间(秒)
- DANGW EQU 02AH ;运行时使用,自然风(睡眠风)变化时的实时档位
- XMBH EQU 02BH ;项目编号,设置时使用
- HM EQU 02CH ;毫秒,每毫秒减1,为0后重新放入计数值。定时器1使用,时间、显示处理
- SHMJS EQU 02DH ;(10)毫秒倒计时,每10毫秒减1,直到为0
- HMJS EQU 02EH ;(10)毫秒计数,为0后重新放入99(1秒)
- MJS EQU 02FH ;秒计数,每秒减1,直到为0,主程序使用
- XSHC1 EQU 030H ;显示缓存1,与上次不同就立即显示,否则0.5秒显示一次
- XSHC2 EQU 031H ;显示缓存2,与上次不同就立即显示,否则0.5秒显示一次
- ZXM1 EQU 032H ;显示用,待发送到TM1637的字形码1
- ZXM2 EQU 033H ;显示用,待发送到TM1637的字形码2
- ZXM3 EQU 034H ;显示用,待发送到TM1637的字形码3
- ZXM4 EQU 035H ;显示用,待发送到TM1637的字形码4
- MA1 EQU 036H ;接收到的红外遥控系统码(客户码)
- MA2 EQU 037H ;接收到的红外遥控系统码(客户码)反码
- MA3 EQU 038H ;接收到的红外遥控数据码
- MA4 EQU 039H ;接收到的红外遥控数据码反码
- HWJS EQU 03AH ;每10毫秒减1,直到为0,为0时清除“接收到的红外遥控数据码”,防止接收到别的连续码产生误动作。
- ZRFJG EQU 03BH ;1:自然风变化时的档位下限;2=档位上限;3=档位变化的间隔时间。设置时用
- FENGMQ EQU 03CH ;蜂鸣器鸣响时长(*10毫秒),每10毫秒减1直到为0,0=蜂鸣器不响
- ZDJS EQU 03DH ;中断计数,蜂鸣器处理用
- YSPWM EQU 03EH ;延时PWM驱动(*10毫秒),先全功率驱动继电器,每10毫秒减1,为0时转为PWM方式驱动
- FWBZ1 EQU 03FH ;复位判断标志1,也作EEPROM数据判断标志
- FWBZ2 EQU 040H ;复位判断标志2,也作EEPROM数据判断标志
- DANG_G EQU 041H ;自然风(睡眠风)变化时的档位上限
- DANG_D EQU 042H ;自然风(睡眠风)变化时的档位下限
- SMFJG EQU 043H ;自然风(睡眠风)档位变化的间隔时间(秒)
- DANG EQU 044H ;正常风档位
- ANJZ EQU 045H ;红外遥控编码首地址,系统码(客户码),6个键的数据码+数据码反码使用此地址后面12个字节
- ;--------------- 辅助寄存器、EEPROM寄存器地址 ---------------
- AUXR EQU 08EH ;辅助寄存器
- IAP_DATA EQU 0C2H ;数据寄存器,读出、写入的数据放在此处
- IAP_ADDRH EQU 0C3H ;地址寄存器高八位
- IAP_ADDRL EQU 0C4H ;地址寄存器低八位
- IAP_CMD EQU 0C5H ;命令寄存器,0=关闭,1=读,2=写,3=擦除
- IAP_TRIG EQU 0C6H ;命令触发寄存器
- IAP_CONTR EQU 0C7H ;控制寄存器
- IAP_TPS EQU 0F5H ;等待时间控制寄存器
- ;======================= 程序代码开始 =======================
- ORG 0000H
- LJMP START
- ORG 000BH ;定时器0中断
- LJMP INTT0 ;定时器0中断
- ORG 001BH ;定时器1中断
- LJMP INTT1 ;定时器1中断
- ORG 0100H ;程序代码从0100H开始
- ;--------------- 定时器0,25微秒产生一次中断,控制继电器、LED指示灯、蜂鸣器 ---------------
- INTT0:
- PUSH ACC
- PUSH PSW
- LCALL Control ;控制继电器
- JNB FLQH,INTT01 ;如果“风类切换”是0(正常风)就转移
- CLR LED ;是自然风状态,点亮LED指示灯
- INTT01:
- CPL PWMBZ ;“PWM电平状态标志”取反。PWM周期25微秒*2=50微秒,20KHz占空比50%
- MOV A,ZDJS ;中断计数
- JZ INTT02 ;为0就转移,每5次(25微秒*5=125微秒)执行一次蜂鸣器处理。
- DEC ZDJS ;减1
- LJMP INTT04 ;
- INTT02:
- MOV ZDJS,#4 ;重新放入计数(5次)
- MOV A,FENGMQ ;蜂鸣器鸣响时长
- JZ INTT03 ;如果是0(不响)就转移
- CPL BUZZER ;取反,驱动无源蜂鸣器发声。周期125微秒*2=250微秒,4KHz占空比50%
- LJMP INTT04
- INTT03:
- SETB BUZZER ;置蜂鸣器控制端口为高电平(不响)
- INTT04:
- POP PSW
- POP ACC
- RETI
- ;--------------- 定时器1,1毫秒产生一次中断,时间、显示处理 ---------------
- INTT1:
- PUSH ACC
- PUSH B
- PUSH PSW
- SETB RS1 ;RS1、RS0组合为11,选择03组工作寄存器(R0~R7地址为18H~1FH),退
- SETB RS0 ;出中断时会自动恢复原默认的第0组工作寄存器(R0~R7地址为00H~07H)
- MOV A,HM ;毫秒计数
- JZ INTT10 ;如果是0就转移,每10毫秒执行一次显示、时间处理子程序
- DEC HM ;减1
- LJMP INTT11
- INTT10:
- MOV HM,#9 ;重新放入计数值(10毫秒)
- LCALL TIME ;时间处理
- LCALL DISPLAY ;显示处理
- INTT11:
- POP PSW
- POP B
- POP ACC
- RETI
- ;--------------- 定时器T0、T1设置 ----------------
- SETINT:
- ORL AUXR,#0C0H ;定时器T0、T1时钟1T模式
- ANL TMOD,#00H ;设置定时器T0、T1模式为16位自动重载
- MOV TL0,#0ECH ;设置定时0初始值(25微秒)
- MOV TH0,#0FEH ;设置定时0初始值(25微秒)
- MOV TL1,#0CDH ;设置定时1初始值(1毫秒)
- MOV TH1,#0D4H ;设置定时1初始值(1毫秒)
- CLR TF1 ;清除TF1标志
- SETB TR1 ;定时器1开始计时
- SETB ET1 ;允许定时器1中断
- CLR TF0 ;清除TF0标志
- SETB TR0 ;定时器0开始计时
- SETB ET0 ;允许定时器0中断
- SETB PT0 ;设置定时器0中断为最高优先级
- SETB EA ;允许全局中断
- RET
- ;*********************************** 主程序开始 ***********************************
- START:
- MOV P1M0,#00H ;设置P1为双向口模式
- MOV P1M1,#00H ;
- MOV P3M0,#00H ;设置P3为双向口模式
- MOV P3M1,#00H ;
- MOV P5M0,#00H ;设置P5为双向口模式
- MOV P5M1,#00H ;
- MOV SP,#0C0H ;设置堆栈指针
- MOV A,FWBZ1 ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
- CJNE A,#0C8H,START1 ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
- MOV A,FWBZ2 ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
- CJNE A,#0D9H,START1 ;检查复位判断标志,RAM数据不变就跳过初始化继续运行
- MOV FWBZ0,#10 ;放入复位提示,闪烁显示时长(秒)
- LCALL SETINT ;定时器设置
- LJMP START3 ;跳过初始化继续运行
- START1:
- CLR A ;初始化,RAM从20H开始清零50H个字节
- MOV R0,#50H ;初始化,RAM从20H开始清零50H个字节
- MOV R1,#20H ;初始化,RAM从20H开始清零50H个字节
- START2:
- MOV @R1,A ;初始化,RAM从20H开始清零50H个字节
- INC R1 ;初始化,RAM从20H开始清零50H个字节
- DJNZ R0,START2 ;
- SETB PWM ;PWM标志置为1,使用PWM方式驱动,如果用可控硅控制就取消这条指令或改为“CLR PWM”(禁止PWM驱动)
- MOV FWBZ1,#0C8H ;初始化,放入复位及EEPROM判断标志1到RAM
- MOV FWBZ2,#0D9H ;初始化,放入复位及EEPROM判断标志2到RAM
- MOV FENGMQ,#12 ;上电蜂鸣器响一声,鸣响时长12*10毫秒=120毫秒
- LCALL SDMRDS ;置上电默认定时时间
- MOV SMGLD,#3 ;置数码管亮度为3级(8级亮度最高)
- MOV DSDWJG,#3 ;定时与档位交替显示的间隔时间(秒)
- MOV SMFJG,#2 ;睡眠风(自然风)渐慢/渐快档位变化的间隔时间(秒),如果EEPROM保存有设置值,将替换此默认设置
- MOV DANG,#15 ;正常风档位(1~15),如果EEPROM保存有设置值,将替换此默认设置
- MOV DANG_G,#5 ;自然风变化时最高档位上限(4~15),如果EEPROM保存有设置值,将替换此默认设置
- MOV DANG_D,#1 ;自然风变化时最低档位下限(1~12),如果EEPROM保存有设置值,将替换此默认设置
- LCALL SETINT ;初始化,定时器设置
- LCALL REEP ;读EEPROM保存的各项设置,没有就保存当前的设置值
- START3:
- CLR XSKG ;“显示开关”置为0,允许T1中断的显示功能
- CLR XSQHY ;“显示切换1”置为0,显示档位、定时时间
- LCALL HWYKCL ;调用红外遥控处理子程序
- LCALL SKEY ;扫描编码器按键
- JC START4 ;有按键动作(C=1)就转移
- LCALL Scan1 ;扫描编码器
- JNB BMQDZ,START5 ;编码器没有动作(BMQDZ=0)就转移
- LCALL BMQCL ;调用编码器旋转动作处理子程序
- LJMP START3
- START4:
- LCALL AJDZCL ;调用按键动作处理子程序
- LJMP START3
- START5:
- JNB YSBC,START3 ;如果“延时保存”为0(不需保存当前档位值)就转移
- MOV A,MJS ;装入倒计时
- JNZ START3 ;不是0就转移
- CLR YSBC ;时间到,“延时保存”置为0
- LCALL WEEP ;保存当前档位值
- LJMP START3
- ;*********************************** 主程序结束 ***********************************
- ;
- ;--------------- 设置上电默认定时 ---------------
- SDMRDS:
- MOV DSSJS,#8 ;小时
- RET
- ;--------------- 设置“延时PWM驱动”时间 ---------------
- ;先全功率驱动继电器,延时结束后转为PWM方式驱动,降低功耗减少继电器发热量。
- ;继电器吸合速度正常为几毫秒至几十毫秒。PWM方式驱动改为禁止后,“延时PWM驱动”无意义
- SETPWM:
- MOV YSPWM,#10 ;延时时间(*10毫秒),10*10=100毫秒
- RET
- ;-------------------------------------------------------------------------------
- ;红外遥控处理子程序
- ;1“关”键:定时时间清零,关风扇
- ;2“开/风速”键:定时时间为零时,置上电默认定时时间,开风扇;定时时间不为零时,档位
- ; 加1,到最高档后又从1档开始循环,支持长按连续加;
- ; 自然风(睡眠风)状态时不能调整档位。
- ;3“定时”键:增加定时时间。在关的状态时,增加定时时间立即开风扇。支持长按连续加。
- ;4“睡眠”键:正常风与自然风(睡眠风)切换,自然风状态时LED指示灯亮,只显示定时时间。
- ;5“+”键:对当前显示的“定时时间”或“档位”作增加调整,支持长按连续加。
- ;6“-”键:对当前显示的“定时时间”或“档位”作减少调整,支持长按连续减。
- ;-------------------------------------------------------------------------------
- HWYKCL:
- LCALL JIEMA ;调用红外遥控解码子程序
- JC YKCL1 ;解码成功(C=1)就转移
- YKCL0:
- RET
- YKCL1:
- MOV R5,A ;解码子程序返回的参数暂时放到R5
- MOV A,MA1 ;装入当前接收到的系统码到A
- MOV B,ANJZ ;装入原来保存的系统码到B
- CJNE A,B,YKCL0 ;不同就转移退出
- MOV R0,#ANJZ ;按键值首地址
- INC R0 ;地址加1
- MOV R3,#6 ;共搜索6个按键值
- MOV R7,#1 ;功能编号
- YKCL2:
- MOV A,MA3 ;装入数据码
- MOV B,@R0 ;装入原来的数据码
- CJNE A,B,YKCL3 ;不同就转移,检查下一个
- INC R0 ;相同,地址加1,检查反码是否相同
- MOV A,MA4 ;装入数据码反码
- MOV B,@R0 ;装入数据码反码
- DEC R0 ;地址减1
- CJNE A,B,YKCL3 ;不同就转移,检查下一个
- LJMP YKCL4 ;搜索到了
- YKCL3:
- INC R0 ;地址加1
- INC R0 ;地址加1
- INC R7 ;功能编号加1
- DJNZ R3,YKCL2 ;如果未检查完就转移继续
- RET ;未搜索到,退出
- YKCL4:
- LCALL SETPWM ;设置“延时PWM驱动”时间
- MOV A,R5 ;解码子程序返回的参数
- JNZ YKCL41 ;如果是连续码(1)就转移
- MOV FENGMQ,#12 ;蜂鸣器响一声,12*10毫秒=120毫秒
- YKCL41:
- MOV A,R7 ;功能编号放入A
- CJNE A,#1,YKCL5 ;不是1(关)就转移
- LCALL DSSJQL ;定时时间清零,关风扇
- CLR XSNRXZ ;“显示内容选择”置为0,显示定时时间
- RET
- YKCL5:
- CJNE A,#2,YKCL8 ;不是2(开/风速)就转移
- MOV A,DSSJS ;检查定时时间是否为0
- JNZ YKCL6 ;不为0就转移
- MOV A,DSSJF ;检查定时时间是否为0
- JNZ YKCL6 ;不为0就转移
- MOV A,DSSJM ;检查定时时间是否为0
- JNZ YKCL6 ;不为0就转移
- LCALL SDMRDS ;是0,放入上电默认定时时间,开风扇
- MOV SHMJS,#150 ;设置持续按下“开/风速”等待1.5秒才响应连续码
- RET
- YKCL6:
- JB FLQH,YKCL12 ;如果“风类切换”为1睡眠风(自然风)就转移退出
- MOV A,SHMJS
- JNZ YKCL12 ;如果时间未到就转移退出,不响应
- MOV SHMJS,#30 ;设置响应连续码间隔时间(×10毫秒)
- SETB XSNRXZ ;“显示内容选择”置为1,显示档位
- MOV A,DANG ;装入当前档位值
- CJNE A,#15,YKCL7 ;不是最高档(15)就转移
- MOV DANG,#0 ;是,改为0
- YKCL7:
- SETB XZFX ;“旋转方向”置为1(+)
- LCALL BMQCL ;加
- RET
- YKCL8:
- CJNE A,#3,YKCL9 ;不是3(定时)就转移
- MOV A,SHMJS
- JNZ YKCL12 ;如果时间未到就转移退出,不响应
- MOV SHMJS,#30 ;设置响应连续码的间隔时间(×10毫秒)
- CLR XSNRXZ ;“显示内容选择”置为0,显示定时时间
- LJMP YKCL7
- YKCL9:
- CJNE A,#4,YKCL10 ;不是4睡眠风(自然风)就转移
- MOV A,SHMJS
- JNZ YKCL12 ;如果时间未到就转移退出,不响应
- MOV SHMJS,#100 ;设置响应连续码的间隔时间,1秒
- CPL FLQH ;“风类切换”取反,正常风/自然风切换
- RET
- YKCL10:
- CJNE A,#5,YKCL11 ;不是5(加+)就转移
- MOV A,SHMJS
- JNZ YKCL12 ;如果时间未到就转移退出,不响应
- MOV SHMJS,#20 ;设置响应连续码的间隔时间(×10毫秒)
- SETB XZFX ;“旋转方向”置为1(+)
- LCALL BMQCL ;加
- RET
- YKCL11:
- MOV A,SHMJS ;
- JNZ YKCL12 ;如果时间未到就转移退出,不响应
- MOV SHMJS,#20 ;设置响应连续码的间隔时间(×10毫秒)
- CLR XZFX ;“旋转方向”置为0(-)
- LCALL BMQCL ;减
- YKCL12:
- RET
- ;--------------------------------------------------------------------------------------------
- ;子程序:红外遥控解码
- ;出口参数:
- ;C=1、A=0:解码成功。
- ;C=1、A=1:连续码。
- ;系统码(客户码)放在MA1,系统码(客户码)反码放在MA2
- ;数据码(按键值)放在MA3,数据码(按键值)反码放在MA4
- ;
- ;红外接收头实际输出的NEC编码格式:
- ;引导码:9ms低电平+4.5ms高电平
- ;码0:0.56ms低电平+0.56ms高电平
- ;码1:0.56ms低电平+1.68ms高电平
- ;结束位:0.56ms低电平
- ;单键码:引导码+8位系统码+8位系统码反码+8位数据码+8位数据码反码+结束位
- ;连续码:引导码9ms低电平+2.25ms高电平+结束位0.56ms低电平
- ;
- ;有个别红外遥控器并不是8位系统码+8位系统码反码+8位数据码+8位数据码反码的数据格式,
- ;而是这两种情况:
- ;一、16位固定的系统码(客户码)+8位数据码+8位数据码反码
- ;二、24位固定的系统码(客户码)+8位数据码
- ;所以对解码结果不作反码检验
- ;
- ;43微秒延时子程序的数值是156,因T0中断频率高占用资源,使延时变长,修改为127才能正确解码,
- ;如果移植到别的程序,没有过高频率的中断,数值要改回156
- ;--------------------------------------------------------------------------------------------
- JIEMA:
- JB IR,JMerr ;IR为1(高电平)就转移退出,无信号
- MOV R7,#200 ;检测200次×43微秒=8600微秒(8.6毫秒)
- JIEMA1:
- LCALL DELAY43US ;延时43微秒
- JB IR,JMerr ;如果出现高电平(IR为1)就转移退出,不是有效信号
- DJNZ R7,JIEMA1 ;重复200次
- MOV R7,#20 ;未出现高电平,视为有效9毫秒引导码,再检测20次
- JIEMA2:
- LCALL DELAY43US ;延时43微秒
- JB IR,JIEMA3 ;如果出现高电平(IR=1)就转移
- DJNZ R7,JIEMA2 ;重复20次×43微秒=860微秒(0.86毫秒)
- LJMP JMerr ;超时,退出,不是有效信号
- JIEMA3:
- MOV HWJS,#50 ;500毫秒计数,为0时清除“接收到的红外遥控数据码”,防止接收到别的连续码产生误动作。
- MOV R7,#70 ;已变为高电平,9毫秒引导码结束,检测70次共3010微秒
- JIEMA4:
- LCALL DELAY43US ;延时43微秒
- JNB IR,LXM ;出现低电平(IR=0)就视为是2.25毫秒连续码
- DJNZ R7,JIEMA4
- MOV R7,#50 ;3.01毫秒内未出现低电平,不是连续码,再检测50次
- JIEMA5:
- LCALL DELAY43US ;延时43微秒
- JNB IR,JIEMA6 ;出现低电平(IR=0)就转移,4.5毫秒引导码高电平结束
- DJNZ R7,JIEMA5 ;重复50次共2150微秒
- LJMP JMerr ;超时,退出,不是有效信号
- LXM:
- SETB C ;是连续码,把C置为1
- MOV A,#1 ;是连续码,把1放入A
- RET
- JIEMA6:
- ;--- 引导码9ms低电平+4.5ms高电平结束 ---
- MOV R1,#MA1 ;存放编码的首地址放入R1
- MOV R5,#4 ;共4个字节数据
- JIEMA7:
- MOV R6,#8 ;每个字节为8位
- JIEMA8:
- MOV R7,#20 ;检测20次×43微秒=860微秒(0.86毫秒),要大于0.56毫秒
- JIEMA9:
- LCALL DELAY43US ;延时43微秒
- JB IR,JIEMA10 ;如果IR是1(高电平)就转移
- DJNZ R7,JIEMA9 ;时间未到就继续检测,等待低电平信号结束
- LJMP JMerr ;超时,退出
- JIEMA10:
- MOV R7,#20 ;变为高电平了,延时20次共860微秒(0.86毫秒)
- JIEMA11:
- LCALL DELAY43US
- DJNZ R7,JIEMA11 ;延时0.86毫秒
- MOV C,IR ;延时结束IR的电平就是数据信号(0或1),移入C中
- JNB IR,JIEMA13 ;如果IR是0(低电平)就转移
- MOV R7,#50 ;是高电平,检测50次×43微秒=2150微秒(2.15毫秒)
- JIEMA12:
- LCALL DELAY43US ;
- JNB IR,JIEMA13 ;如果IR是0(低电平)就转移,
- DJNZ R7,JIEMA12 ;时间未到就继续检测,等待高电平信号结束
- LJMP JMerr ;超时,退出
- JIEMA13:
- MOV A,@R1 ;装入R1指向的RAM地址的数据到A寄存器
- RRC A ;将C中的值(0或1)移入A中的最低位
- MOV @R1,A ;把A中的数据放回R1指向的RAM
- DJNZ R6,JIEMA8 ;如果未接收完8位就转移继续
- INC R1 ;接收完8位了,地址加1
- DJNZ R5,JIEMA7 ;如果4个字节数据未接收完就转移继续
- JMok:
- SETB C ;把C置为1,解码成功
- CLR A ;把A置为0,解码成功
- RET
- JMerr:
- CLR C ;把C置为0,解码不成功
- RET
- ;------------ 延时43微秒 ------------
- DELAY43US: ;@11.0592MHz
- PUSH 12H
- MOV 12H,#127 ;延时43微秒的数值是156,因T0中断频率高占用资源,使延时变长,修改为此数
- NEXT43: ;值才能正确解码,如果移植到别的程序,没有过高频率的中断,此数值要改回156
- DJNZ 12H,NEXT43
- POP 12H
- RET
- ;------------------------------------------------------------------------------------------------
- ;子程序:EC11编码器按键动作处理
- ; 1.短按1次:正常风与睡眠风(自然风)切换。睡眠风状态时LED指示灯亮,只显示定时时间。
- ; 2.短按2次:设置睡眠风(自然风)渐慢/渐快变化的上下限档位范围、档位变化时的间隔时间(秒)
- ; 3.长按10秒:显示“----”,红外线遥控信号解码,遥控器按键的功能定义,定义好后须长按10秒才保存
- ;
- ;红外遥控器的按键定义:
- ;定义1“关”、2“开/风速”、3“定时”、4“睡眠”、5“+”、6“-”六个功能键。
- ; 交替显示功能编号+遥控器客户码和原来保存的按键值,按键值为数据码+数据码反码4个十
- ;六进制数,按下遥控器按键收到信号解码成功并显示,即为新的按键值,遥控器客户码与原来保
- ;存的不相同时,自动删除旧的数据(保存才会生效),短按跳到下一个功能编号,也可以旋转EC11
- ;编码器向前/后跳到任意功能编号,全部或部分定义好后,长按10秒显示“----”保存并退出才生
- ;效,短按两次退出或60秒无操作自动退出,不保存,仍然还是原来的数据。
- ;-------------------------------------------------------------------------------------------------
- AJDZCL:
- LCALL KEY ;调用编码器按键开关处理子程序
- CJNE A,#1,AJDZ2 ;如果不是按下1次就转移
- CPL FLQH ;“风类切换”取反,正常风/自然风切换
- RET
- AJDZ2:
- CJNE A,#2,AJDZ3 ;如果不是按下2次就转移
- LCALL ZRFFW ;调用自然风变化档位上下限范围、档位变化间隔时间设置子程序
- RET
- AJDZ3:
- SETB XSQHY ;是长按10秒,“显示切换1”置为1,显示红外解码或自然风档位变化范围
- CLR XSQHE ;“显示切换2”置为0,红外遥控信号解码显示
- MOV XMBH,#1 ;先放入项目编号1(关)
- LCALL HENGX ;关闭T0中断的显示功能,显示“----”
- LCALL KEYEX ;等待按键释放
- CLR XSKG ;“显示开关”置为0,恢复T1中断的显示功能
- AJDZ4:
- CLR BMXSQH ;“编码显示切换”置为0,先显示功能编号+系统码
- AJDZ5:
- MOV MJS,#60 ;设置无信号等待时间(秒)
- MOV DSDW,#2 ;设置系统码和数据码交替显示间隔时间(秒)
- AJDZ6:
- MOV FWBZ0,#0 ;把0放入到FWBZ0,不闪烁显示
- AJDZ7:
- LCALL JIEMA ;调用红外遥控解码子程序
- JC LXMPD ;解码成功(C=1)就转移
- LCALL SKEY ;扫描编码器按键
- JNC AJDZ11 ;没有按键动作(C=0)就转移
- MOV FWBZ0,#0 ;把0放入到FWBZ0,不闪烁显示
- LCALL KEY ;有按键动作,调用编码器按键处理子程序
- CJNE A,#3,AJDZ9 ;如果不是3(长按10秒)就转移
- AJDZ8:
- LCALL WEEP ;保存当前设置
- LCALL HENGX ;关闭T0中断的显示功能,显示“----”
- LCALL KEYEX ;等待按键释放
- CLR XSKG ;“显示开关”置为0,恢复T1中断的显示功能
- RET
- LXMPD:
- JZ AJDZ17 ;如果A=0(不是连续码)就转移
- LJMP AJDZ5
- AJDZ9:
- CJNE A,#1,AJDZ_Q ;如果不是1(短按1次)就转移退出,不保存
- AJDZ90:
- MOV A,XMBH ;装入项目编号
- CJNE A,#6,AJDZ10 ;如果不是最后一项就转移
- MOV XMBH,#0
- AJDZ10:
- INC XMBH ;加1,跳到下一个功能编号
- LJMP AJDZ4
- AJDZ11:
- LCALL Scan1 ;扫描编码器(有方向标志)
- JB BMQDZ,AJDZ15 ;编码器有动作(1)就转移
- MOV A,DSDW ;没有转动,装入交替显示间隔时间(秒)到寄存器A
- JNZ AJDZ12 ;不为0就转移
- CPL BMXSQH ;为0,“编码显示切换”取反,显示另一项
- MOV DSDW,#1 ;设置系统码和数据码交替显示间隔时间(秒)
- AJDZ12:
- MOV A,MJS ;装入无信号等待时间到寄存器A
- JNZ AJDZ13 ;不为0就转移
- AJDZ_Q:
- LCALL RE00 ;读EEPROM保存的数据
- MOV FWBZ0,#0 ;把0放入到FWBZ0,不闪烁显示,退出,不保存
- RET
- AJDZ13:
- CJNE A,#6,AJDZ14 ;检查剩余时间
- AJDZ14:
- JNC AJDZ6 ;等于或大于就转移,不闪烁显示
- MOV FWBZ0,A ;剩余时间放到FWBZ0,闪烁显示
- LJMP AJDZ7
- AJDZ15:
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB BMQDZ,AJDZ15 ;旋转动作未结束(1)就转移继续等待
- JB XZFX,AJDZ90 ;顺时针正转(1)就转移
- MOV A,XMBH ;反转,装入项目编号
- DEC A ;减1
- JNZ AJDZ16 ;不为0就转移
- MOV A,#6 ;跳到第6项
- AJDZ16:
- MOV XMBH,A
- LJMP AJDZ4
- ;
- AJDZ17:
- SETB BMXSQH ;“编码显示切换”置为1(显示数据码+反码)
- MOV A,MA1 ;装入当前接收到的系统码到A
- MOV B,ANJZ ;装入原来保存的系统码到B
- CJNE A,B,AJDZ20 ;不同就转移
- MOV R0,#ANJZ ;遥控编码首地址
- INC R0 ;地址加1
- MOV R3,#6 ;检查6个按键值,发现有相同的就删除(清零)
- AJDZ18:
- MOV A,MA3 ;装入数据码
- MOV B,@R0 ;装入原来的数据码
- CJNE A,B,AJDZ19 ;不同就转移,检查下一个
- INC R0 ;相同,地址加1,检查反码看是否也相同
- MOV A,MA4 ;装入数据码反码
- MOV B,@R0 ;装入数据码反码
- DEC R0 ;地址减1
- CJNE A,B,AJDZ19 ;不同就转移,检查下一个
- MOV @R0,#0 ;也相同,数据码位置放入0
- INC R0 ;地址加1
- MOV @R0,#0 ;反码位置放入0
- DEC R0 ;地址减1
- AJDZ19:
- INC R0 ;地址加1
- INC R0 ;地址加1
- DJNZ R3,AJDZ18 ;如果未检查完就转移继续
- LJMP AJDZ22
- AJDZ20:
- MOV ANJZ,MA1 ;移入新的系统码
- MOV R0,#ANJZ ;原来的数据全部清零
- MOV R3,#12 ;原来的数据全部清零
- AJDZ21:
- INC R0 ;原来的数据全部清零
- MOV @R0,#0 ;原来的数据全部清零
- DJNZ R3,AJDZ21 ;原来的数据全部清零
- AJDZ22:
- MOV A,XMBH ;装入项目编号
- MOV B,#2 ;项目编号乘2
- MUL AB ;项目编号乘2
- DEC A ;计算结果减1
- ADD A,#ANJZ ;加遥控编码首地址
- MOV R0,A ;得出数据码的实际地址
- MOV @R0,MA3 ;把接收到的数据移到对应的按键值RAM地址
- INC R0 ;把接收到的数据移到对应的按键值RAM地址
- MOV @R0,MA4 ;把接收到的数据移到对应的按键值RAM地址
- LJMP AJDZ5
- ;---------------------------------------------------------------------------------
- ;子程序:设置调整睡眠风(自然风)变化的档位上下限范围、变化时的间隔时间(秒)
- ; 1.显示:L-最低档位下限
- ; 2.显示:H-最高档位上限
- ; 3.显示:E-档位变化时的间隔时间(秒)
- ;短按编码器按键,跳到另一项;短按2次编码器按键保存并退出;无操作5秒后开始闪烁显示,
- ;闪烁显示5秒跳到下一项,如果在第3项,闪烁显示5秒无操作则保存并退出。
- ;上、下限档位之间最少间隔3档。自然风档位变化的间隔时间为1~5秒
- ;---------------------------------------------------------------------------------
- ZRFFW:
- SETB XSQHY ;“显示切换1”置为1,显示红外解码或自然风档位变化范围
- SETB XSQHE ;“显示切换2”置为1,显示自然风档位变化范围
- MOV ZRFJG,#1 ;先设为第一项,档位下限
- ZRFFW1:
- MOV A,ZRFJG ;装入项目号
- DEC A ;减1
- JNZ ZRFFW2 ;不为0就转移
- LCALL ZRFXX ;是1,设置下限档位调整时的最大和最小值、调整对象的地址
- LJMP SZTZ
- ZRFFW2:
- DEC A ;减1
- JNZ ZRFFW3 ;不为0就转移
- LCALL ZRFSX ;是2,设置上限档位调整时的最大和最小值、调整对象的地址
- LJMP SZTZ
- ZRFFW3:
- MOV R5,#1 ;是3,档位变化的间隔时间(秒),调整时的最小值
- MOV R6,#5 ;是3,档位变化的间隔时间(秒),调整时的最大值
- MOV R0,#SMFJG ;档位变化的间隔时间(秒)地址
- SZTZ:
- MOV MJS,#10 ;无操作等待时间10秒
- SZTZ1:
- MOV FWBZ0,#0 ;把0放入到FWBZ0,不闪烁显示
- SZTZ2:
- LCALL SKEY ;扫描编码器按键开关
- JNC SZTZ5 ;没有按键动作(C=0)就转移
- LCALL KEY ;有按键动作,调用编码器按键处理子程序
- CJNE A,#2,SZTZ3
- SZTZ3:
- JNC SZTZ4 ;如果是按下2次及以上就转移
- SZTZ30:
- INC ZRFJG ;是按下1次,项目号加1(跳到下一项)
- MOV A,ZRFJG ;装入项目号
- CJNE A,#4,SZTZ31 ;是否小于4
- SZTZ31: JC ZRFFW1 ;小于就转移
- LJMP ZRFFW ;等于或大于,转移,设为第一项
- SZTZ4:
- LCALL WEEP ;保存
- MOV FWBZ0,#0 ;把0放入到FWBZ0,不闪烁显示
- LCALL KEYEX ;等待按键释放
- RET
- SZTZ5:
- LCALL Scan1 ;扫描编码器(有方向标志)
- JB BMQDZ,SZTZ8 ;编码器已经转动(1)就转移
- MOV A,MJS ;没有转动,装入秒计数到寄存器A
- JZ SZTZ7 ;如果秒计数为0(10秒无操作)就转移
- CJNE A,#6,SZTZ6 ;检查剩余时间
- SZTZ6:
- JNC SZTZ1 ;等于或大于就转移,不闪烁显示
- MOV FWBZ0,A ;剩余时间放到FWBZ0,闪烁显示
- LJMP SZTZ2
- SZTZ7:
- MOV A,ZRFJG ;时间到,装入项目号
- CJNE A,#3,SZTZ30 ;不是最后一项就转移,跳到下一项
- LJMP SZTZ4 ;转移,保存并退出
- SZTZ8:
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB BMQDZ,SZTZ8 ;旋转动作未结束(1)就转移继续等待
- JB XZFX,SZTZ11 ;是顺时针正转(1)就转移
- MOV B,R5 ;是反转,装入最小值到B寄存器
- MOV A,@R0 ;装入R0指向的RAM地址的调整对象数值
- DEC A ;减1
- CJNE A,B,SZTZ9 ;与最小比较
- SZTZ9:
- JC SZTZ10 ;如果小于就转移
- MOV @R0,A ;等于或大于,把减1后的结果放回去
- LJMP SZTZ
- SZTZ10:
- MOV @R0,B ;直接放入最小值
- LJMP SZTZ
- SZTZ11:
- MOV B,R6 ;装入最大值到B寄存器
- MOV A,@R0 ;装入R0指向的RAM地址的调整对象数值
- INC A ;加1
- CJNE A,B,SZTZ12 ;加完后与最大值比较
- SZTZ12:
- JC SZTZ13 ;如果小于就转移
- MOV @R0,B ;等于或大于,直接放入最大值
- LJMP SZTZ
- SZTZ13:
- MOV @R0,A ;小于最大值,把加1后的结果放回去
- LJMP SZTZ
- ;---------------------------------------------------------------------------
- ;设置睡眠风(自然风)变化范围的上限档位,最大为15档,最小为下限档位加3档
- ;---------------------------------------------------------------------------
- ZRFSX:
- MOV B,#15 ;调整时的最大值
- MOV A,DANG_D ;装入当前档位下限
- ADD A,#3 ;加3档
- CJNE A,B,ZRFSX1 ;是否等于或大于上限
- ZRFSX1:
- JC ZRFSX2 ;小于就转移
- MOV A,B
- PUSH ACC
- SUBB A,#3 ;等于或大于,把档位下限改为最大值减3档
- MOV DANG_D,A ;等于或大于,把档位下限改为最大值减3档
- POP ACC
- ZRFSX2:
- MOV R5,A ;调整时的最小值
- MOV R6,B ;调整时的最大值
- MOV R0,#DANG_G ;自然风档位上限地址
- RET
- ;---------------------------------------------------------------------------
- ;设置睡眠风(自然风)变化范围的下限档位,最小为1档,最大为上限档位减3档
- ;---------------------------------------------------------------------------
- ZRFXX:
- MOV B,#4 ;调整时的最小值1加3档
- MOV A,DANG_G ;装入当前自然风档位上限
- CJNE A,B,ZRFXX1
- ZRFXX1:
- JC ZRFXX2 ;小于就转移
- SUBB A,#3 ;等于或大于,档位上限减3档即为调整时的最大值
- MOV B,A ;等于或大于,档位上限减3档即为调整时的最大值
- LJMP ZRFXX3
- ZRFXX2:
- MOV DANG_G,B ;小于最小值+3档,把上限档位改为最小值加3档
- MOV B,#1
- ZRFXX3:
- MOV R5,#1 ;调整时的最小值
- MOV R6,B ;调整时的最大值
- MOV R0,#DANG_D ;自然风档位下限地址
- RET
复制代码 未完,下面还有
|