- UID
- 1058057
- 阅读权限
- 10
- 推广
-
- 幽默
-
- 注册时间
- 2018-8-30
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
本帖最后由 杨小强08 于 2021-1-19 15:08 编辑
用STC15F104W制作定时IC,适用于各种需延时通断、循环通断的控制场合
作者:杨小强,2021年1月
MCU:STC15F104W,内部R/C时钟,频率选择:11.0592MHz
显示:(TM1637)4位数码管显示模块
调整定时时间、设置:EC11带按键5脚旋转编码器。也可以用两只按键代替编码器
定时范围:10毫秒~100小时
描述:
默认导通定时时间10小时,上电就导通,可通过旋转编码器实时调整当前定时时间,最大可调
到99小时59分59+1秒=100小时,最小为0;导通定时时间到0就断开,停止运行,不循环,睡眠模式
为“始终显示”,旋转编码器调整当前导通定时时间,又开始运行。
定时时间1小时以上显示“时:分”,冒号闪烁;小于1小时自动切换为显示“分:秒”,冒号不
闪烁;小于1分钟自动切换为显示“秒:毫秒”,冒号不闪烁。
用于固定定时时间的场合时,设置好各项参数,可取消数码管显示模块、编码器、按键,同时
把编码器、按键I/O端口P3.1、P3.2、P3.3接到2脚VCC,避免万一端口受到干扰而产生误动作。
设置共有2种方式:
方式1(适合手头上没有TM1637数码管显示模块的情况):把源程序中“设置各项默认值”处改
为需要的值,编译为HEX文件,烧写时把“本次将EEPROM区域全部填充为FF”选项勾上。
方式2:之1.长按KEY3秒,显示“--:--”时释放,进入“设置”状态进行设置。
之2.转动编码器一点点停留在半格,也就是两格之间,让A或B、或者AB都为ON并保持
3秒,显示“--:--”时转完一格,进入“设置”状态进行设置。当“主界面状态下长按快速加减使
能的常数”设为081H(允许)时此方式无效。
按键、编码器动作:
1.处于睡眠状态时,按键、编码器动作只唤醒睡眠,恢复数码管显示,不影响正常运行和数据。
2.处于始终导通状态时,有按键、编码器动作将退出始终导通状态,切换到“导通时间”结束的断
开状态,如果设置的是循环定时,就从“断开时间”继续运行。
3.同时处于睡眠状态和终导通状态时,先唤醒睡眠,退出睡眠状态2秒后,再次有按键、编码器动
作才退出始终导通状态。
4.短按KEY1次,暂停计时,如果当前是导通状态将断开,再按恢复导通并继续计时。
5.处于“导通”或“断开”工作状态时,短按2次KEY,当前时间清零,运行下一项(如果设有)。
6.短按KEY3次:重新启动,相当于重新上电。
7.间隔时间不超过0.5秒的2次或3次短按,为有效按键动作。
8.长按KEY3秒,显示“--:--”时释放,进入“设置”,如果保持按下达到10秒,将恢复默认设置。
9.长按KEY10秒,恢复默认设置,显示88:88,然后按默认值从“导通”开始执行。
10.处于“上电延时导通”、“导通”、“断开”工作状态时,旋转编码器可进行实时调整,最
大99小时59分59+1秒=100小时,最小为0。
11.处于“上电延时导通”工作状态,延时导通模式为2(延时时间到后从“断开”继续运行)时,上
电4.2分钟后,按下KEY达到设置的时长,时间清零,之后不响应按键动作,继续执行“断开”、
“导通”,执行到“导通”状态运行结束时,恢复按键全部功能。
12.转动编码器一点点停留在半格,也就是两格之间,让A或B、或者AB都为ON并保持3秒,这时显示
“--:--”(如果仍然保持不动达到10秒,将恢复默认设置),然后转完一格,进入“设置”。
当“定义主界面状态下长按快速加减使能的常数”设为081H(允许)时此方式无效。
设置:
进入“设置”后,根据数码管左边显示的内容进行相应设置,旋转编码器加或减,设置好一项,
闪烁5秒无操作或者短按KEY释放0.5秒后,跳到下一项。任何时候都可以短按2次KEY保存并退出,
或在最后一项无操作自动保存退出。
按住KEY不放,旋转编码器可向上/下转移到任意一项设置,释放按键后旋转编码器加或减。
1、显示“1A”设置导通时间(时),0~99小时,默认10小时
2、显示“1b”设置导通时间(分),0~59分钟
3、显示“1C”设置导通时间(秒),0~59秒
4、显示“1d”设置导通时间(×10毫秒),0~99
5、显示“o-”设置循环定时,0=无限循环;1=不循环;2~99=循环导通次数。默认为1,不循环
6、显示“C-”设置睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)。默认为0,始终显示
7、显示“bC”设置实时调整时(步长),3小时以下定时调整时,编码器每转动一格的增(减)值:
1~30分钟,默认1分钟;3小时以上增(减)值30分钟;10小时以上增(减)值1个小时;
20小时以上增(减)值2个小时。
8、显示“Ld”设置数码管亮度,1~8级。默认为3级
9、显示“2A”设置断开时间(时),0~99小时
10、显示“2b”设置断开时间(分),0~59分钟
11、显示“2C”设置断开时间(秒),0~59秒
12、显示“2d”设置断开时间(×10毫秒),0~99
13、显示“3A”设置上电延时导通(时),0~99小时,默认值为0
14、显示“3b”设置上电延时导通(分),0~59分钟,默认值为0
15、显示“3C”设置上电延时导通(秒),0~59秒,默认值为0
16、显示“d-”设置延时导通模式,0~2。默认为2(延时时间到后从“断开”继续运行)
17、显示“E-”设置“持续时间”秒计数0~99,按下KEY持续0~99秒结束“上电延时导通”状态
保存失败将显示5秒E1。
导通时间:1~99(×10)毫秒~100小时,如果“上电延时导通”时间设为0(关闭),则上电就执行本项。
如果设置为循环定时,本项时间结束就执行“断开时间”。
循环定时:0=无限循环;1=不循环;2~99=导通次数;导通次数是指从上电到循环结束为止,总共导通
的次数。如果“断开时间”设置的时间为0,循环无效,导通定时时间到后就断开,停止。
睡眠模式:0=始终显示;1~59=无操作1~59分钟关闭显示继续运行;按键、编码器有动作就唤醒睡眠
断开时间:1~99(×10)毫秒~100小时,时间结束就运行“导通时间”。默认值为2小时。
上电延时导通:1秒~100小时。设置的时间全部为0=关闭;设置的时间不为0就启用;
本项上电只执行一次,不参与循环定时。默认为0
启用上电延时导通,延时导通模式为2时,上电4.2分钟内不响应按键动作,编码
器可以正常使用,4.2分钟之后,当持续按下按键的时间达到设置的时长(0~99秒)就
清零,结束“上电延时导通”状态,继续不响应按键动作,执行到“导通”状态运行
结束时,按键功能恢复正常。
延时导通模式:0=延时时间到后始终导通。旋转编码器或按下KEY就退出始终导通状态,切换到
“导通时间”的结束状态,如果设置的是循环定时,就从“断开时间”继续运行。
1=延时时间到后从“导通”继续运行,如果“导通时间”设置的时间为0就结束
2=延时时间到后从“断开”继续运行,如果“断开时间”设置的时间为0就转到“导
通”继续运行。
下面用电动车充电定时器等电路举例其应用:
上面是“导通时间”和“断开时间”设为最小值1(10毫秒),“循环定时”设为“无限循环”的情况,P3.0的输出为50Hz方波。
下面是源程序:
- ;----------------------------- 端口定义 ------------------------------------
- MOC EQU P3.0 ;5脚,导通状态输出低电平;断开状态输出高电平
- KEY EQU P3.1 ;6脚,按键KEY
- EC11A EQU P3.2 ;7脚,接编码器的A引脚
- EC11B EQU P3.3 ;8脚,接编码器的B引脚
- DIO EQU P3.4 ;1脚,接显示模块TM1637的DIO
- CLK EQU P3.5 ;3脚,接显示模块TM1637的CLK
- ;---------------------------- 位地址及RAM的使用 ----------------------------
- ;(20H)第0位:1=编码器有旋转动作;0=没有旋转动作
- ;(20H)第1位:1=编码器顺时针正转;0=编码器逆时针反转
- ;(20H)第2位:1=暂停;0=正常运行
- ;(20H)第3位:1=禁止;0=允许。进行各项设置时使用,允许/禁止检查剩余时间
- ;(20H)第4位:1=闪烁显示;0=不闪烁。进行各项设置时用
- ;(20H)第5位:1=不显示,0=显示,数字及冒号闪烁时用,每0.5秒变化一次
- ;(20H)第6位:1=关闭时间显示,3秒88:88或5秒E1显示占用;0=正常显示
- ;(20H)第7位:1=已进入“上电延时导通”的始终导通状态;0=正常
- ;(21H)第8位:1=禁止响应按键动作;0=正常
- ;(21H)第9位:1=允许恢复响应按键动作;0=正常
- FWBZ1 EQU 022H ;复位判断标志1,也作EEPROM数据判断标志
- FWBZ2 EQU 023H ;复位判断标志2,也作EEPROM数据判断标志
- DTS EQU 024H ;导通时间(时),0~99
- DTF EQU 025H ;导通时间(分),0~59
- DTM EQU 026H ;导通时间(秒),0~59
- DTHM EQU 027H ;导通时间,100(0~99)×10毫秒
- XHDS EQU 028H ;循环定时,0=无限循环;1=不循环;2~99=循环次数
- SMMS EQU 029H ;睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)
- BMQZJ EQU 02AH ;编码器每转动一小格的增/减值,1~30分钟
- SMGLD EQU 02BH ;数码管亮度,1~8级
- DKS EQU 02CH ;断开时间(时),0~99
- DKF EQU 02DH ;断开时间(分),0~59
- DKM EQU 02EH ;断开时间(秒),0~59
- DKHM EQU 02FH ;断开时间,100(0~99)×10毫秒
- SDYSS EQU 030H ;上电延时导通(时),0~99
- SDYSF EQU 031H ;上电延时导通(分),0~59
- SDYSM EQU 032H ;上电延时导通(秒),0~59
- YSMS EQU 033H ;延时导通模式,0~2
- YSJS EQU 034H ;在上电延时导通状态时,按下KEY持续0~99秒结束该状态
- YSXY EQU 035H ;延时响应,在上电延时导通状态时,此处为0才响应按键动作
- DSSJS EQU 036H ;定时时间,时
- DSSJF EQU 037H ;定时时间,分
- DSSJM EQU 038H ;定时时间,秒
- DSSJHM EQU 039H ;定时时间,毫秒,100(0~99)×10毫秒=1秒
- SMJSF EQU 03AH ;睡眠计时(分)
- SMJSM EQU 03BH ;睡眠计时(秒)
- SMJS EQU 03CH ;睡眠处理计时用
- XHJS EQU 03DH ;循环定时用,导通次数计数
- SHMJS EQU 03EH ;(10)毫秒计数,每10毫秒减1,直到为0
- HMJS EQU 03FH ;(10)毫秒计数2,为0后自动重新放入99
- MJS EQU 040H ;秒计数,每秒减1,直到为0
- DQZT EQU 041H ;当前状态,0=导通、1=断开,2=上电延时导通
- XSHC1 EQU 042H ;缓存1,与上次不同就立即显示,否则0.5秒显示一次
- XSHC2 EQU 043H ;缓存2,与上次不同就立即显示,否则0.5秒显示一次
- XXSZ EQU 044H ;下限数值,进行各项设置时用
- SXSZ EQU 045H ;上限数值,进行各项设置时用
- ZXM1 EQU 046H ;显示用,待发送到TM1637的字形码1
- ZXM2 EQU 047H ;显示用,待发送到TM1637的字形码2
- ZXM3 EQU 048H ;显示用,待发送到TM1637的字形码3
- ZXM4 EQU 049H ;显示用,待发送到TM1637的字形码4
- DSZJ EQU 04AH ;加减定时时间使用
- DISPL EQU 04BH ;要显示的项目
- ;
- ;定义主界面状态下长按快速加减使能的常数:
- KSJJ EQU 080H ;禁止主界面状态下长按快速加减
- ;KSJJ EQU 081H ;允许主界面状态下长按快速加减
- ;当使用按键代替编码器,需要“长按快速加减”功能时,把080H改为081H。
- ;
- ;--------------- 看门狗、EEPROM特殊功能寄存器地址 ---------------
- AUXR EQU 08EH ;辅助寄存器
- WDT_CONTR EQU 0C1H ;看门狗地址
- IAP_DATA EQU 0C2H ;数据寄存器,读出、写入的数据放在此处
- IAP_ADDRH EQU 0C3H ;地址寄存器高八位
- IAP_ADDRL EQU 0C4H ;地址寄存器低八位
- IAP_CMD EQU 0C5H ;命令寄存器,0=关闭,1=读,2=写,3=擦除
- IAP_TRIG EQU 0C6H ;命令触发寄存器,每次操作先放入5A再放入A5,命令立即被触发起动
- IAP_CONTR EQU 0C7H ;控制寄存器,Flash操作允许/禁止及等待时间
- ENABLE_IAP EQU 083H ;定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数,时钟<12MHz时为83H
- ;======================= 程序代码开址 =======================
- ORG 0000H
- LJMP START
- ORG 000BH ;T0中断入口
- LJMP T0INT ;T0中断入口
- ORG 0030H ;程序代码始址安排在30H
- ;--------------- 定时器0中断(10毫秒产生一次中断) ---------------
- T0INT:
- PUSH ACC
- PUSH PSW
- SETB RS1 ;RS1、RS0组合为11,选择第3组工作寄存器,R0~R7地址为18H~1FH
- SETB RS0 ;退出中断时恢复默认的工作寄存器(第0组:R0~R7地址为00H~07H)
- LCALL TIME ;处理各项时间、状态切换
- LCALL DISPLAY ;显示
- JB 02H,T0INT0 ;如果位地址02H为1(暂停)就转移,断开
- JB 07H,T0INT1 ;如果位地址07H为1(始终导通)就转移,导通
- MOV A,DQZT ;装入“当前状态”
- JNZ T0INT0 ;不是0(导通时间)就转移,断开
- MOV A,DSSJHM ;是“导通时间”,装入定时时间(毫秒)到寄存器A
- JNZ T0INT1 ;不是0就转移,导通
- MOV A,DSSJM ;装入定时时间(秒)到寄存器A
- JNZ T0INT1 ;不是0就转移,导通
- MOV A,DSSJF ;装入定时时间(分)到寄存器A
- JNZ T0INT1 ;不是0就转移,导通
- MOV A,DSSJS ;装入定时时间(时)到寄存器A
- JNZ T0INT1 ;不是0就转移,导通
- T0INT0:
- SETB MOC ;定时时间为0,置MOC为高电平,断开
- LJMP T0INT2
- T0INT1:
- CLR MOC ;置MOC为低电平,可控硅(或继电器)导通,通电
- T0INT2:
- POP PSW
- POP ACC
- RETI
- ;--------------- 设置各项默认值(#号后面都为十进制数) ----------------
- SZMRZ:
- MOV DTS,#10 ;导通时长(时),0~99。默认10小时
- MOV DTF,#0 ;导通时长(分),0~59
- MOV DTM,#0 ;导通时长(秒),0~59
- MOV DTHM,#0 ;导通时长,0~99(×10毫秒)
- MOV XHDS,#1 ;循环定时,0=无限循环;1=不循环;2~99=导通次数
- MOV SMMS,#0 ;睡眠模式,0=始终显示;1~59=无操作进入睡眠(分钟)
- MOV BMQZJ,#1 ;实时调整时,编码器每转动一格的+、-值(分钟)
- MOV SMGLD,#3 ;数码管亮度,8级亮度最高
- MOV DKS,#2 ;断开时长(时),0~99
- MOV DKF,#0 ;断开时长(分),0~59
- MOV DKM,#0 ;断开时长(秒),0~59
- MOV DKHM,#0 ;断开时长,0~99(×10毫秒)
- MOV SDYSS,#0 ;上电延时导通时长(时),0~99
- MOV SDYSF,#0 ;上电延时导通时长(分),0~59
- MOV SDYSM,#0 ;上电延时导通时长(秒),0~59
- MOV YSMS,#0 ;延时导通模式,0~2;
- MOV YSJS,#99 ;结束“上电延时导通”的“按下持续时间”秒计数,0~99
- RET
- ;--------------- 定时器T0设置(10毫秒产生一次中断) ----------------
- SETINT: ;10毫秒@11.0592MHz
- ANL AUXR,#7FH ;定时器时钟12T模式
- ANL TMOD,#0F0H ;设置定时器模式
- MOV TL0,#000H ;设置定时初值
- MOV TH0,#0DCH ;设置定时初值
- CLR TF0 ;清除TF0标志
- SETB TR0 ;定时器0开始计时
- SETB ET0 ;允许定时器0中断
- SETB EA ;允许全局中断
- RET
- ;---- 启动看门狗及喂狗,11.0592MHz预分频数=2(71.1毫秒),00111000B(38H) ----
- WG:
- MOV WDT_CONTR,#00111000B
- RET
- ;*********************************** 主程序开始 ***********************************
- START:
- MOV SP,#050H ;设置堆栈指针
- MOV A,FWBZ1 ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
- CJNE A,#0C8H,START0 ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
- MOV A,FWBZ2 ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
- CJNE A,#0D9H,START0 ;检查复位判断标志,不相同就是初次上电,从初始化开始运行
- LCALL SETINT ;相同,定时器设置(10毫秒产生一次中断)
- LJMP START2 ;相同,跳过初始化继续运行
- START0:
- CLR A ;初始化,RAM从20H开始清零30H个字节
- MOV R0,#30H ;初始化,RAM从20H开始清零30H个字节
- MOV R1,#20H ;初始化,RAM从20H开始清零30H个字节
- START1:
- MOV @R1,A ;初始化,RAM从20H开始清零30H个字节
- INC R1 ;初始化,RAM从20H开始清零30H个字节
- DJNZ R0,START1 ;初始化,RAM从20H开始清零30H个字节
- MOV FWBZ1,#0C8H ;初始化,放入复位判断标志1到RAM
- MOV FWBZ2,#0D9H ;初始化,放入复位判断标志2到RAM
- MOV YSXY,#0FFH ;初始化,放入结束“上电延时导通”的延时响应时间,4.2分钟
- LCALL SETINT ;初始化,定时器设置(10毫秒产生一次中断)
- LCALL REEP ;初始化,读EEPROM保存的各项设置,没有就设为默认值并保存
- START2:
- CLR 06H ;位地址06H置为0,正常显示
- MOV DISPL,#0 ;设置要显示的目标,0=显示定时时间
- LCALL SKEY ;扫描KEY
- JC START3 ;有按键动作(C=1)就转移
- LCALL Scan1 ;扫描编码器(有方向标志)
- JNB 00H,START2 ;如果位地址00H为0(编码器没有转动)就转移
- LCALL BMQCL ;调用编码器动作处理子程序
- LJMP START2
- START3:
- LCALL AJDZCL ;调用按键动作处理子程序
- LJMP START2
- ;*********************************** 主程序结束 ***********************************
- ;
- ;----------------------------------------------------------------------------------------
- ;子程序:编码器动作处理,实时调整定时时间
- ;如果是用按键代替编码器,支持长按快速加减(需要把“长按快速加减使能常数”由080H改为081H)。
- ;----------------------------------------------------------------------------------------
- BMQCL:
- MOV A,#KSJJ ;装入“长按快速加减使能常数”
- CJNE A,#081H,BMQCL5 ;如果不是“支持长按快速加减”就转移
- MOV SHMJS,#50 ;设置有效长按所需时长,50×10毫秒=500毫秒
- BMQCL1:
- MOV A,SHMJS ;装入(10)毫秒计数
- JZ BMQCL2 ;如果时长达到(为0)就转移
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB 00H,BMQCL1 ;动作未结束就转移
- LCALL DSSJZJ ;动作结束,根据方向加/减定时时间
- RET
- BMQCL2:
- LCALL DSSJZJ ;根据方向加/减定时时间
- MOV SHMJS,#13 ;加/减间隔时间,(×10)毫秒
- BMQCL3:
- MOV A,SHMJS ;装入(10)毫秒计数
- JNZ BMQCL4 ;时间未到(不为0)就转移
- LJMP BMQCL2 ;已达到设定的时长,转移,根据方向加/减定时时间
- BMQCL4:
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB 00H,BMQCL3 ;动作未结束就转移
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan2 ;第2次扫描编码器(无方向标志)
- JB 00H,BMQCL3 ;动作未结束就转移
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan2 ;第3次扫描编码器(无方向标志)
- JB 00H,BMQCL3 ;动作未结束就转移
- RET ;动作结束,退出
- BMQCL5:
- MOV MJS,#10 ;设置等待时间(秒)
- BMQCL6:
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB 00H,BMQCL7 ;如果还没转到卡点位置就转移
- LCALL DSSJZJ ;已经旋转到卡点位置,根据旋转方向增/减定时时间
- RET
- BMQCL7:
- MOV A,MJS ;装入秒计数到寄存器A
- CJNE A,#7,BMQCL6 ;检查剩余时间,如果不是7(10秒-3秒=7)就转移,继续扫描
- SETB 06H ;达到3秒了,把位地址06H设置为1,数码管显示“--:--”
- MOV ZXM1,#0C0H ;-
- MOV ZXM2,#0C0H ;-
- MOV ZXM3,#0C0H ;-
- MOV ZXM4,#0C0H ;-
- LCALL DISP ;显示“--:--”
- BMQCL8:
- LCALL Scan2 ;扫描编码器(无方向标志)
- MOV A,MJS ;装入秒计数到寄存器A
- JZ BMQCL9 ;如果秒计数为0(达到10秒)就转移
- JB 00H,BMQCL8 ;如果还没转到卡点位置就转移,继续扫描
- MOV SMJSF,#0FFH ;已经旋转到卡点位置,先放入一个数值,等退出后才恢复睡眠计时
- LCALL TZGXSZ ;调用“调整各项设置”子程序
- MOV SMJSF,SMMS ;睡眠模式
- MOV SMJSM,#0
- RET
- BMQCL9:
- MOV ZXM1,#0FFH ;达到了10秒,显示3秒88:88
- MOV ZXM2,#0FFH ;8
- MOV ZXM3,#0FFH ;8
- MOV ZXM4,#0FFH ;8
- LCALL DISP ;显示
- MOV MJS,#3 ;显示3秒
- BMQCL10:
- MOV A,MJS ;装入秒计数到寄存器A
- LCALL WG ;喂狗
- JNZ BMQCL10 ;等待MJS变为0秒
- LCALL SZMRZ ;延时时间到,恢复各项默认设置
- LCALL WSET ;保存设置
- BMQCL11:
- LCALL Scan2 ;扫描编码器(无方向标志)
- JB 00H,BMQCL11 ;如果还没转到卡点位置就继续扫描
- LCALL REEPR ;把“导通时间”放入“定时时间”,从“导通”开始运行。
- CLR 02H ;位地址02H置为0(正常运行)
- MOV MJS,#2 ;延时2秒才退出
- BMQCL12:
- MOV A,MJS ;装入秒计数到寄存器A
- LCALL WG ;喂狗
- JNZ BMQCL12
- RET
- ;-------------------------------------------------------------------------------------
- ;子程序:根据编码器旋转方向加减定时时间
- ;3小时及以下,按设置的值加减:1~30分钟
- ;3小时以上每次增(减)30分钟;10小时以上每次增(减)1个小时;20小时以上每次增(减)2个小时
- ;-------------------------------------------------------------------------------------
- DSSJZJ:
- MOV DSSJM,#0 ;放入0到定时时间(秒)
- MOV DSSJHM,#99
- CLR 05H
- MOV A,DSSJS ;装入定时时间(时)
- CJNE A,#20,DSZJ1 ;当前“时”是否等于或大于20
- DSZJ1:
- JC DSZJ2 ;小于就转移
- MOV DSZJ,#2 ;等于或大于20,加减2个小时
- LJMP DSZJ4
- DSZJ2:
- CJNE A,#10,DSZJ3 ;当前“时”是否等于或大于10
- DSZJ3:
- JC DSZJ8 ;小于就转移
- MOV DSZJ,#1 ;等于或大于10,加减1个小时
- DSZJ4:
- JNB 01H,DSZJ6 ;如果位地址01H为0(逆时针反转)就转移
- ADD A,DSZJ ;是正转,加
- CJNE A,#100,DSZJ5 ;加完后是否等于或大于100
- DSZJ5:
- JC DSZJ7 ;如果小于就转移,把A放回到DSSJS
- MOV DSSJS,#99 ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
- MOV DSSJF,#59 ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
- MOV DSSJM,#59 ;已经大于99了,直接设置为99:59:59+DSSJHM(1秒),100小时
- RET
- DSZJ6:
- SUBB A,DSZJ ;是反转,减
- DSZJ7:
- MOV DSSJS,A ;把计算结果放入DSSJS
- RET
- DSZJ8:
- MOV DSZJ,BMQZJ ;把设置的“增(减)值”放入DSZJ
- CJNE A,#3,DSZJ11 ;当前“时”不是3就转移
- JB 01H,DSZJ12 ;是3,如果位地址01H为1(正转)就转移,把DSZJ处的“增(减)值”改为30(分钟)
- MOV A,DSSJF ;是反转,装入定时时间(分)
- JZ DSZJ13 ;如果当前“分”为0(3:00)就转移,按设置的增(减)值减
- CJNE A,#30,DSZJ9 ;“分”不为0,是否等于或大于30
- DSZJ9:
- JC DSZJ10 ;小于就转移,把0放入定时时间(分),使时间变为3:00
- SUBB A,#30 ;等于或大于,减30分
- MOV DSSJF,A ;把计算结果放入定时时间(分)
- RET
- DSZJ10:
- MOV DSSJF,#0 ;小于30,把0放入定时时间(分),使时间变为3:00
- RET
- DSZJ11:
- JC DSZJ13 ;小于3就转移
- DSZJ12:
- MOV DSZJ,#30 ;大于3:00,把DSZJ处的“增(减)值”改为30(分钟)
- DSZJ13:
- MOV A,DSSJF ;装入定时时间(分)
- JNB 01H,DSZJ17 ;如果位地址01H为0(逆时针反转)就转移
- ADD A,DSZJ ;是正转,当前“分”直接加DSZJ处的“增(减)值”
- CJNE A,#60,DSZJ14 ;加完后“分”是否等于或大于60
- DSZJ14:
- JC DSZJ15 ;小于60就转移,把A放入定时时间(分)
- SUBB A,#60 ;等于或大于60,就减60,然后小时加1
- MOV DSSJF,A ;把A放入定时时间(分)
- MOV A,DSSJS ;装入“时”
- INC A ;小时加1
- MOV DSSJS,A
- CJNE A,#3,DSZJ16 ;加完后“时”不是3就转移,退出
- CLR A ;加完后大于3:00了,把0放入定时时间(分),使时间变为3:00
- DSZJ15:
- MOV DSSJF,A
- DSZJ16: RET
- DSZJ17:
- CJNE A,DSZJ,DSZJ18 ;是逆时针反转,当前“分”是否等于或大于DSZJ处的“增(减)值”
- DSZJ18:
- JC DSZJ19 ;小于就转移
- SUBB A,DSZJ ;等于或大于,定时时间(分)减“增(减)值”
- MOV DSSJF,A ;把计算结果放入定时时间(分)
- RET
- DSZJ19:
- MOV A,DSZJ ;“分”小于“增(减)值”,装入DSZJ处的“增(减)值”
- CLR C ;进位标志清0
- SUBB A,DSSJF ;“增(减)值”减“定时时间(分)”
- MOV DSSJF,A ;减完后的结果暂时放入DSSJF
- MOV A,#60
- SUBB A,DSSJF ;60减上面的计算结果,得出定时时间(分),然后小时减1
- MOV DSSJF,A ;得出的数放入定时时间(分)
- MOV A,DSSJS ;装入定时时间(时)
- JZ DSSJQL ;如果“时”为0就转移
- DEC DSSJS ;“时”不为0,减1
- RET
- DSSJQL:
- MOV DSSJF,#0 ;把“分”置为0
- MOV DSSJHM,#0
- RET
- ;-------------------------------------------------------------------------------------
- ;子程序:按键动作处理
- ;短按1次暂停计时;短按2次当前项时间(当次)清零;短按3次重新启动,相当于重新上电。
- ;长按3秒显示“--:--”时释放,进入“设置”;长按10秒,恢复默认设置,显示88:88。
- ;
- ;启用“上电延时导通”,“延时导通模式”为2时,上电4.2分钟内按键失效,4.2分钟之后
- ;按键只有时间清零功能,持续按下按键的时间达到设置的时长(0~99秒)就清零,清零后
- ;继续执行下一项,执行到“导通”状态运行结束时,按键功能恢复正常。
- ;-------------------------------------------------------------------------------------
- AJDZCL:
- JB 08H,JSYSDT2 ;位地址08H为1就转移,不响应按键动作。
- MOV A,DQZT ;装入“当前状态”,0=导通、1=断开,2=上电延时导通
- CJNE A,#2,KEY0 ;不是“上电延时导通”状态就转移
- MOV A,YSMS ;装入“延时导通模式”
- CJNE A,#2,KEY0 ;不是2(延时时间到后从“断开”继续运行)就转移
- MOV A,YSXY ;装入“延时响应”
- JNZ JSYSDT2 ;延时响应时间未到就转移退出
- MOV MJS,YSJS ;把设置的“按下持续时间”秒计数放入MJS
- JSYSDT1:
- MOV A,MJS
- JNZ JSYSDT3 ;等待秒计数为0
- MOV DSSJS,A ;持续按下的时间到,定时时间(时)清零
- MOV DSSJF,A ;持续按下的时间到,定时时间(分)清零
- MOV DSSJM,A ;持续按下的时间到,定时时间(秒)清零
- MOV DSSJHM,A ;持续按下的时间到,定时时间(毫秒)清零
- LCALL KEYEX ;等待按键释放
- SETB 08H ;位地址08H置为1,不响应按键动作。
- JSYSDT2:
- RET
- JSYSDT3:
- LCALL SKEY0
- JC JSYSDT1 ;如果C=1(按键还没释放),就继续扫描等待
- RET
- KEY0:
- MOV MJS,#10 ;放入等待时间,10秒
- KEY1:
- MOV A,MJS ;装入等待时间
- CJNE A,#7,KEY5 ;按下未达到3秒(10-3=7)就转移
- SETB 06H ;到3秒了,把位地址06H设置为1,数码管显示“--:--”
- MOV ZXM1,#0C0H ;-
- MOV ZXM2,#0C0H ;-
- MOV ZXM3,#0C0H ;-
- MOV ZXM4,#0C0H ;-
- LCALL DISP ;显示“--:--”
- KEY2:
- MOV A,MJS ;装入等待时间
- JZ KEY3 ;如果为0(长按达到了10秒)就转移
- LCALL SKEY ;扫描按键
- JC KEY2 ;如果C=1(按键还没释放),就继续扫描
- MOV SMJSF,#0FFH ;先放入一个数值,等退出后才恢复睡眠计时
- LCALL TZGXSZ ;调用“调整各项设置”子程序
- MOV SMJSF,SMMS ;睡眠模式
- MOV SMJSM,#0 ;
- RET
- KEY3:
- MOV ZXM1,#0FFH ;达到了10秒,显示3秒88:88
- MOV ZXM2,#0FFH ;8
- MOV ZXM3,#0FFH ;8
- MOV ZXM4,#0FFH ;8
- LCALL DISP ;显示
- MOV MJS,#3 ;显示3秒
- KEY4:
- MOV A,MJS ;显示3秒
- LCALL WG ;喂狗
- JNZ KEY4 ;等待MJS为0秒
- LCALL SZMRZ ;延时时间到,恢复各项默认设置
- LCALL WSET ;保存设置
- LCALL KEYEX ;等待按键释放
- LCALL REEPR ;把“导通时间”放入“定时时间”,从“导通”开始运行。
- CLR 02H ;位地址02H置为0(正常运行)
- RET
- KEY5:
- LCALL SKEY ;扫描按键
- JC KEY1 ;如果C=1(按键还没释放),就继续扫描
- MOV A,DSSJHM ;装入定时时间(毫秒)到寄存器A
- JNZ KEY6 ;不是0就转移
- MOV A,DSSJM ;装入定时时间(秒)到寄存器A
- JNZ KEY6 ;不是0就转移
- MOV A,DSSJF ;装入定时时间(分)到寄存器A
- JNZ KEY6 ;不是0就转移
- MOV A,DSSJS ;装入定时时间(时)到寄存器A
- JNZ KEY6 ;不是0就转移
- CLR 02H ;定时时间为0,位地址02H置为0(正常)
- LJMP KEY7
- KEY6:
- CPL 02H ;位地址02H取反,暂停/正常切换
- KEY7:
- LCALL KEYA ;第1次按键释放了,再次扫描按键500毫秒
- JZ KEY8 ;如果500毫秒内有按键动作就转移
- RET
- KEY8:
- LCALL KEYEX ;有按键动作,等待第2次按键释放
- LCALL KEYA ;按键释放了,扫描按键500毫秒
- JZ KEY9 ;如果500毫秒内有按键动作就转移
- MOV DSSJS,#0 ;没有按键动作,按了2次,把当前时间清零
- MOV DSSJF,#0 ;把当前时间清零
- MOV DSSJM,#0 ;把当前时间清零
- MOV DSSJHM,#0 ;把当前时间清零
- CLR 02H ;位地址02H置为0(正常)
- RET
- KEY9:
- LCALL KEYEX ;等待第3次按键释放
- CLR EA ;关闭全局中断
- INC FWBZ1 ;加1,改变复位判断标志1
- LJMP START ;跳转到START,重新初始化
- ;------------------------------------------------------------------
- ;子程序:调整各项设置值
- ;短按2次KEY保存并退出,或在最后一项无操作自动保存退出。
- ;闪烁5秒无操作或者短按KEY释放0.5秒后,跳到下一项设置。
- ;按住KEY不放,旋转编码器可向上/下跳到任意一项设置
- ;如果是用按键代替编码器,支持长按快速加/减
- ;------------------------------------------------------------------
- TZGXSZ:
- CLR 06H ;位地址06H置为0,正常显示
- MOV DISPL,#1 ;第一项,导通时间(时),0~99小时
- SZTZ:
- MOV MJS,#7 ;放入无操作等待时间(秒)到MJS
- CLR 03H ;位地址03H置为0,允许检查剩余时间
- SZTZ1:
- LCALL SKEY0 ;扫描按键
- JNC SZTZ7 ;没有按键动作(C=0)就转移
- CLR 04H ;已经按下,把位地址04H置为0,不闪烁显示
- SZTZ2:
- LCALL Scan10 ;扫描编码器(有方向标志)
- JB 00H,SZTZ4 ;如果编码器有旋转动作(位地址00H为1)就转移
- LCALL SKEY0 ;扫描按键
- JC SZTZ2 ;按键未释放(C=1)就转移
- LCALL KEYA ;释放了,再次扫描按键500毫秒
- JNZ SZTZ3 ;没有第2次按键动作就转移
- LCALL WSET ;已经第2次按下,保存设置
- LCALL KEYEX ;等待按键释放
- RET
- SZTZ3:
- SETB 01H ;把位地址01H置为1,顺时针正转(切换到下一项)
- LCALL QHXM ;根据位地址01H的方向,切换到上/下一项
- LJMP SZTZ
- SZTZ4:
- LCALL QHXM ;根据位地址01H的方向,切换到上/下一项
- SZTZ5:
- LCALL Scan20 ;扫描编码器(无方向标志)
- JB 00H,SZTZ5 ;编码器动作未结束就继续扫描,等待
- SZTZ6:
- LCALL SKEY0 ;扫描按键
- JNC SZTZ ;按键释放(C=0)就转移
- LCALL Scan10 ;扫描编码器(有方向标志)
- JB 00H,SZTZ4 ;编码器有动作(位地址00H为1)就转移,切换到上/下一项
- LJMP SZTZ6
- SZTZ7:
- LCALL Scan10 ;扫描编码器(有方向标志)
- JB 00H,SZTZ9 ;如果编码器有旋转动作(位地址00H为1)就转移
- MOV A,MJS ;没有转动,装入秒计数到寄存器A
- JZ SZTZ8 ;如果秒计数为0(等待时间到)就转移
- JB 03H,SZTZ1 ;不为0,如果位地址03H为1就转移,不检查剩余时间
- CJNE A,#5,SZTZ1 ;检查剩余时间,不到就转移,继续扫描编码器
- SETB 04H ;把位地址04H置为1,设置为闪烁显示
- SETB 03H ;位地址03H置为1,禁止检查剩余时间
- LJMP SZTZ1
- SZTZ8:
- CLR 04H ;等待时间到,把位地址04H置为0,不闪烁显示
- MOV A,DISPL ;装入当前目标项
- CJNE A,#17,SZTZ3 ;不是最后一项就转移,跳到下一项
- LCALL WSET ;保存设置
- RET
- SZTZ9:
- CLR 04H ;编码器已经转动,把位地址04H置为0,不闪烁显示
- MOV SHMJS,#50 ;设置有效长按所需时长,50×10毫秒=500毫秒
- SZTZ10:
- MOV A,SHMJS ;装入(10)毫秒计数
- JZ SZTZ11 ;如果时长达到(为0)就转移
- LCALL Scan20 ;扫描编码器(无方向标志)
- JB 00H,SZTZ10 ;动作未结束就转移,继续扫描
- LCALL MBSZ ;动作结束了,调整DISPL指向的对象,加/减1
- LJMP SZTZ
- SZTZ11:
- LCALL MBSZ ;加/减1。已经为有效长按,下面进入长按快速加/减
- MOV SHMJS,#13 ;间隔加/减时间,(×10)毫秒
- SZTZ12:
- MOV A,SHMJS ;装入(10)毫秒计数
- JNZ SZTZ13 ;时间未到(不为0)就转移
- LJMP SZTZ11 ;已达到设定的间隔时长,转移,加/减1
- SZTZ13:
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan20 ;扫描编码器(无方向标志)
- JB 00H,SZTZ12 ;动作未结束就转移
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan20 ;第2次扫描编码器(无方向标志)
- JB 00H,SZTZ12 ;动作未结束就转移
- LCALL DELAY10 ;延时10毫秒
- LCALL Scan20 ;第3次扫描编码器(无方向标志)
- JB 00H,SZTZ12 ;动作未结束就转移
- LJMP SZTZ ;动作结束
- MBSZ:
- MOV A,DISPL ;装入要调整的目标项
- LCALL SXXFW ;设置上下限限值
- DEC A ;减1
- ADD A,#DTS ;加上各项设置的起始地址
- MOV R0,A ;把得出的目标项地址放入R0
- JB 01H,MBSZ2 ;如果位地址01H为1(顺时针正转)就转移
- INC XXSZ ;是反转,下限值先加1
- MOV A,@R0 ;装入R0指向的目标数值
- CJNE A,XXSZ,MBSZ0 ;与加1后的下限值比较
- MBSZ0:
- JC MBSZ1 ;如果小于“下限值+1”(不够减)就转移
- DEC @R0 ;等于或大于下限值,目标数值减1
- DEC XXSZ ;减1,恢复下限值
- RET
- MBSZ1:
- DEC XXSZ ;减1,恢复下限值
- MOV @R0,XXSZ ;不够减了,直接放入下限值
- RET
- MBSZ2:
- MOV A,@R0 ;是正转,装入R0指向的RAM地址的目标数值
- INC A ;加1
- CJNE A,SXSZ,MBSZ3 ;加完后与上限数值比较
- MBSZ3:
- JC MBSZ4 ;如果小于就转移
- MOV @R0,SXSZ ;等于或大于上限值,直接放入上限值
- RET
- MBSZ4:
- MOV @R0,A ;小于上限值,把计算结果放回去
- RET
- ;-------------------------------------------------------------------------
- ;子程序:切换项目。根据位地址01H的方向标志,把当前设置项切换到上/下一项
- ;-------------------------------------------------------------------------
- QHXM:
- MOV A,DISPL ;装入当前项目号
- JB 01H,QHXM2 ;如果位地址01H为1(正转)就转移,切换到下一项
- CJNE A,#1,QHXM1 ;是反转,如果不是1就转移
- MOV DISPL,#17 ;切换到上一项17
- RET
- QHXM1:
- DEC DISPL ;减1,切换到上一项
- RET
- QHXM2:
- CJNE A,#17,QHXM3 ;是正转,如果不是17就转移
- MOV DISPL,#1 ;切换到下一项1
- RET
- QHXM3:
- INC DISPL ;加1,切换到下一项
- RET
- ;-------------------------------------------------------------------------
- ;子程序:根据当前项目号设置加/减调整的上下限值。入口参数:A=项目号。
- ;-------------------------------------------------------------------------
- SXXFW:
- CJNE A,#1,SXXFW1 ;1=显示“1A”设置导通时间(时),0~99小时
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW1:
- CJNE A,#2,SXXFW2 ;2=显示“1b”设置导通时间(分),0~59分钟
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW2:
- CJNE A,#3,SXXFW3 ;3=显示“1C”设置导通时间(秒),0~59秒
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW3:
- CJNE A,#4,SXXFW4 ;4=显示“1d”设置导通时间(×10毫秒),0~99
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW4:
- CJNE A,#5,SXXFW5 ;5=显示“o-”设置循环定时,0~99
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW5:
- CJNE A,#6,SXXFW6 ;6=显示“C-”设置睡眠模式,0~59
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW6:
- CJNE A,#7,SXXFW7 ;7=显示“bC”设置实时调整时的增/减值(步长):1~30分钟
- MOV XXSZ,#1 ;下限为1
- MOV SXSZ,#30 ;上限为30
- RET
- SXXFW7:
- CJNE A,#8,SXXFW8 ;8=显示“Ld”设置数码管亮度,1~8级。
- MOV XXSZ,#1 ;下限为1
- MOV SXSZ,#8 ;上限为8
- RET
- SXXFW8:
- CJNE A,#9,SXXFW9 ;9=显示“2A”设置断开时间(时),0~99小时
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW9:
- CJNE A,#10,SXXFW10 ;10=显示“2b”设置断开时间(分),0~59分钟
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW10:
- CJNE A,#11,SXXFW11 ;11=显示“2C”设置断开时间(秒),0~59秒
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW11:
- CJNE A,#12,SXXFW12 ;12=显示“2d”设置断开时间(×10毫秒),0~99
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW12:
- CJNE A,#13,SXXFW13 ;13=显示“3A”设置上电延时导通(时),0~99小时
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- SXXFW13:
- CJNE A,#14,SXXFW14 ;14=显示“3b”设置上电延时导通(分),0~59分钟
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW14:
- CJNE A,#15,SXXFW15 ;15=显示“3C”设置上电延时导通(秒),0~59秒
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#59 ;上限为59
- RET
- SXXFW15:
- CJNE A,#16,SXXFW16 ;16=显示“d-”设置延时导通模式,0~2。默认为0
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#2 ;上限为2
- RET
- SXXFW16: ;17=显示“E-”设置“持续按下时间”秒计数0~99
- MOV XXSZ,#0 ;下限为0
- MOV SXSZ,#99 ;上限为99
- RET
- ;----------------------------------------------------------------------------------------
- ;子程序:扫描编码器是否有旋转动作并设置好方向标志
- ;出口参数:位地址第00位=1已经转动,=0没有转动;位地址第01位=1顺时针正转,=0逆时针反转
- ;----------------------------------------------------------------------------------------
- 源程序后半部分在下面2楼
复制代码 源程序后半部分在下面2楼
源程序.rar
(16.72 KB, 下载次数: 38)
|
评分
-
查看全部评分
|