本电子钟采用PIC16C55单片机控制,适于温室的定时恒温或自来水的定时定压控制等。PIC16C55单片机工作电压为2.5~6.25V,功耗低、驱动能力强。本电子钟可以控制一路负载在24小时内的3次开/关;一个双限触发的定时输出口,既可接传统的功率保持型继电器,也可接脉冲继电器。本机用四位LED数码管扫描式显示,还有消隐(省电)工作方式,使用起来非常灵活、方便。
一、工作原理
电子钟电路见图1。
RB7口是定时指示端,在定时开期间输出高电平,驱动V1发光,该口也可经缓冲作定时输出口;RB6是双限触发控制的定时输出口,其工作方式是:在RB7高电平期间,若RB1为高电平,则RB6输出高电平;若RB0为高电平,RB6输出低电平;若RB1、RB0同为低电平,RB6保持原态;同为高电平时,RB6输出低电平。RB5、RB4用于驱动脉冲继电器,RB6上升沿触发RB5输出高电平开脉冲;在RB6下降沿触发RB4时,RB4端输出高电平关脉冲,开/关脉冲的持续时间均为125ms。
RB3是消隐控制器,接高电平(即SK1闭合)时,显示屏及秒闪正常;否则,显示消隐。显示消隐时,时钟及各控制逻辑都正常运行,如忽略RB4至RB7各口的驱动电流,则在3V供电时,整机电流不足20μA,即两节5号电池可用数月!RB2选择数码管极性,RB2为低电平,使用共阴LED;RB2为高电平,则用共阳LED。数码管的极性是在上电初始化时,根据RB2口状态确定的,工作过程中改变RB2的电平则不起作用。
本机设S1~S4四个按键,S1是功能选择键,S2是小时增量调整,S3是分钟增量,S4用于分钟减量调节,其使用方法为:
上电时,RB5至RB7均为低电平,RB4端送出一个关脉冲,使SK1闭合,整机正常显示、工作,RC7口送出秒闪脉冲,RC6~RC0送字段码。RA3~RA0分别为10时、时、10分、分位的位码输出。这时,按一下S2或S3(时增量/分增量键),可使RB7端置位或复位。
在正常走时期间,秒闪正常;在校对或设置定时时,秒停闪。例如:在正常走时期间,按一下S1键,秒闪停止,屏幕显示J-,表示可以校对时间。这时再按S2~S4中任一键,屏幕显示现在时间,但秒不闪,此刻可按S2~S4校对时钟。再次按S1,屏幕显示1∪,表示可以设定第一次开时间,此时按S2~S4对时间进行查看及设置。继续按S1,系统显示1∩,表示可设置第一次关时间……依次进行。设置好系统及3次开关时间后,整机回到正常显示状态,秒闪恢复。
如欲取消某次开/关定时,只需把该次的开与关时间设置成相同值即可。
笔者曾把该时钟用于定时定压供水控制系统,RB6端用于驱动继电器(也可用RB5与RB4两端驱动脉冲继电器),RB1端接水压(水位)的低限输入,RB0端接高限输入,设置好定时,一个简易的定时定压自动供水系统即告完成。
二、编程技巧
PIC16C55单片机程序存储器只有512字节,加上采用外接32768Hz晶体振荡方式,时钟速度较低,因此,统筹好系统的工作时序与人机界面之间的关系是软件设计成败的关键。本机编程采用如下方案:
软件工作流程见附图2。
PIC16C55单片机的一个机器周期是4个时钟周期,不难算出,本系统中每秒有8192个机器周期。在编制软件时,先设定单片机内部定时计数器F1的计数方式为机器周期的64分频。这样,每当F1溢出时,系统递加2秒。平时,系统每128个机器周期内用RC口与RA口驱动扫描一次显示屏,可保证每秒内扫描64次显示屏,基本上无闪烁感。而128个机器周期正是F1的第0位(为便于叙述以下简记为F10)每次下降沿的间隔时间,我们可以编一段程序,当F10的下降沿到来时,扫描一次显示屏,每当F1的低4位为全0时(125ms一次)使系统检测一次RB口与按键状态,并进行相关处理,部分相关程序如下:
WAIT BTFSC 1,0 ;等待F10的下降沿,编程时
GOTO WAIT ;要保证每次下降沿前到此
MOVFW 1
SKPNZ
GOTO CLOCK ;F1=0,满2秒,转时钟处理
ANDLW 0FH ;屏蔽F1高4位
SKPZ
GOTO DISPLAY;F1低4位不为0,转显示
MOVLW 0C0H ;满125mS,使RB口脉冲复位
ANDWF 6,1
MOVLW 0FH ;检测按键
TRIS 7
MOVFW 7
ANDLW 0FH ;保留按键数据
SKPZ
GOTO AN ;有键值,转按键处理
DISPLAY …… ;显示扫描,定时管理RB口
CLOCK …… ;时钟,定时处理程序
AN …… ;按键管理程序
经近一年的运行,该系统非常的稳定、可靠。有兴趣者不妨一试
本源程序系`一款多用电子钟芯片'源程序,可有3开3关定时,且有受双限触发的定时口
;该程序硬件系采用PIC16C55芯片LP振荡方式外接32768Hz晶振
ORG 000H
TOP XORLW 0FFH
XORLW 0FFH
XORLW 0FFH
XORLW 0FFH
MOVLW 08H ;F 12H--1DH依次为K1F--G3S
MOVWF 4
QL CLRF 0
INCF 4,1
CLRWDT
MOVFW 4
ANDLW 1FH
SKPZ
GOTO QL
CLRF 4
BTFSC 6,2
BSF 0BH,2 ;共阳
GOTO CSH
HBCD NOP
DBCD ANDLW 0FH
CLRWDT
NOP
ADDWF 2,1
RETLW 01H ;0(共阳)
RETLW 4FH ;1
RETLW 12H ;2
RETLW 06H ;3
RETLW 4CH ;4
RETLW 24H ;5
RETLW 20H ;6
RETLW 0FH ;7
RETLW 00H ;8
RETLW 04H ;9
RETLW 47H ;A(校时) 显示J
RETLW 71H ;B(闹铃) 显示L
RETLW 31H ;C
RETLW 63H ;D(开)
RETLW 6AH ;E(关)
RETLW 7EH ;F(杠)
CSH CLRW ;初始化
TRIS 5 ;F5,3--5,0共阳显示扫描10时--分
BTFSS 0BH,2
MOVLW 0FH
MOVWF 5 ;关扫描
MOVLW 0FH
TRIS 6
CLRF 6 ;关闭定时输出
BSF 6,4 ;输出关脉冲
MOVLW 11H ;置显示指针,F11H--时,F10H--分
MOVWF 4
MOVLW 05H ;F1计数64分频
OPTION
MOVLW 01H
MOVWF 1
MOVLW 0E2H
MOVWF 0FH
HBEGIN BCF 0BH,0 ;清1/8秒标志
CLRWDT
WAIT BTFSC 1,0 ;至HXSCL-17
GOTO WAIT ;1/64秒检查
MOVFW 1
SKPNZ
INCFSZ 0FH,1 ;秒增量(逢2秒1次)
GOTO DZJC
GOTO HSZCL ;整分处理
DZJC ANDLW 0FH
SKPZ
GOTO XSCL ;转显示处理
BSF 0BH,0 ;0BH.0-1/8秒标志(启动/停止检测时用)
MOVLW 0C0H
ANDWF 6,1 ;关(继电器)驱动脉冲
MOVLW 0FH
TRIS 7
MOVFW 7 ;检查按键状态(0.125S-1次)
ANDLW 0FH ;F7,3--7,0依次是功能,时加,分加,分减键
SKPZ
GOTO HAJCL ;转按键处理
XSCL MOVF 0EH,1 ;F0EH-调节指针
MOVLW 80H
SKPNZ
MOVLW 00H ;在设定时间时,
秒停闪
BTFSS 6,3
MOVLW 0FFH ;消隐时,7段码口为高阻态
TRIS 7
BTFSS 0BH,2 ;共阳/共阴选择
GOTO DXSCL ;转共阴显示
BTFSC 0BH,6
GOTO HBZXS ;转标志显示
HXSB MOVFW 0AH ;时间显示(95)
MOVWF 7 ;输出10时码
BSF 5,3 ;开10时线
CLRW
BTFSC 0BH,0
MOVFW 6 ;每0.125秒`启动/停止'检测1次
ANDLW 03H
MOVWF 8
BTFSC 8,0
BCF 8,1 ;消除启动/停止竞争
MOVFW 0
CALL HBCD ;10
BTFSC 1,6
IORLW 80H ;准备`时'数据
BCF 5,3 ;关10时
MOVWF 7
BTFSS 0BH,7
CLRF 8
BSF 5,2 ;显示时
BTFSS 6,6
BCF 8,0 ;如已关,不再停止
BTFSC 6,6
BCF 8,1 ;如已开,不再启动
BTFSC 8,0
BCF 6,6 ;如停止,复位开电平
DECF 4,1
SWAPF 0,0
CALL HBCD ;10
BTFSC 1,6
IORLW 80H ;准备10分显示数
据
BCF 5,2 ;关扫描线
MOVWF 7
BTFSC 8,1
BSF 6,6 ;如启动,置位开电平
BSF 5,1 ;显示10分
SWAPF 08H,1
MOVFW 6
ANDLW 0C0H
IORWF 08H,1
MOVFW 08H
MOVWF 6 ;启动/停止输出
NOP
MOVFW 0
CALL HBCD ;10
BTFSC 1,6
IORLW 80H ;准备分显示数据
BCF 5,1 ;关扫描线
MOVWF 7
BSF 5,0 ;显示分
NOP
NOP
NOP
NOP
NOP
INCF 4,1 ;恢复时指针
SWAPF 0,0 ;准备10时7段码
CALL HBCD ;10
BTFSC 1,6
IORLW 80H
MOVWF 0AH ;10时位7段显示码暂存于F0AH中
CLRF 5
GOTO HBEGIN ;时间显示完,转程序结束
HBZXS RRF 0EH,0 ;调节指针(F0EH)除以2(71)
ANDLW 0FH
MOVWF 1FH
SKPNZ
MOVLW 0AH ; J 7段码地址
CALL HBCD ;(10)标志指示1(10分位)
MOVWF 7 ;此时可能显示[J 1 2 3]
BSF 5,1 ;开(10分位)显示
MOVFW 6
ANDLW 03H
MOVWF 8 ;启动/停止数据暂存入F8中
NOP
MOVLW 0DH ; U 地址
BTFSC 0EH,0
MOVLW 0EH ; n 地址
MOVF 1FH,1
SKPNZ
MOVLW 0FH ; - 地址
CALL HBCD ;10
BCF 5,1 ;关10分位
MOVWF 7
BSF 5,0 ;开分位,可能显示[- U n]
BTFSS 0BH,0
CLRF 8 ;每0.125秒取1次启动/停止数据
BTFSS 0BH,7
CLRF 8
BTFSC 8,0
BCF 8,1 ;免除启/停竞争(停止优先)
BTFSC 6,6
BCF 8,1 ;如已开,则清启动位
BTFSS 6,6
BCF 8,0 ;如已关,则清停止位
SWAPF 8,1
BTFSC 8,5
BSF 6,6 ;如启动,置位开电平
BTFSC 8,4
BCF 6,6 ;如停止,复位开电平
MOVFW 6 ;控制输出
ANDLW 0C0H
IORWF 08H,1
MOVFW 08H
MOVWF 6
CLRF 5 ;标志显示完
GOTO HBEGIN
DXSCL BTFSC 0BH,6
GOTO DBZXS ;转标志显示
DXSB MOVFW 0AH ;时间显示(84)
MOVWF 7 ;输出10时码
BCF 5,3 ;开10时线
CLRW
BTFSC 0BH,0
MOVFW 6 ;每0.125秒`启动/停止'检测1次
ANDLW 03H
MOVWF 8
BTFSC 8,0
BCF 8,1 ;消除启动/停止竞争
MOVFW 0
CALL DBCD ;9
XORLW 7FH
BTFSC 1,6
IORLW 80H ;准备`时'数据
BSF 5,3 ;关10时
MOVWF 7
BTFSS 0BH,7
CLRF 8
BCF 5,2 ;显示时
BTFSS 6,6
BCF 8,0 ;如已关,不再停止
BTFSC 6,6
BCF 8,1 ;如已开,不再启动
BTFSC 8,1
BSF 6,6 ;如启动,置位开电平
DECF 4,1
SWAPF 0,0
CALL DBCD ;9
XORLW 7FH
BTFSC 1,6
IORLW 80H ;准备10分显示数据
MOVWF 7
BTFSS 0BH,7
CLRF 8
BCF 5,2 ;显示时
BTFSS 6,6
BCF 8,0 ;如已关,不再停止
BTFSC 6,6
BCF 8,1 ;如已开,不再启动
BTFSC 8,1
BSF 6,6 ;如启动,置位开电平
DECF 4,1
SWAPF 0,0
CALL DBCD ;9
XORLW 7FH
BTFSC 1,6
IORLW 80H ;准备10分显示数据
BTFSC 1,6
IORLW 80H
MOVWF 0AH ;10时位7段显示码暂存于F0AH中
MOVLW 0FH
MOVWF 5
GOTO HBEGIN ;时间显示完,转程序结束
DBZXS RRF 0EH,0 ;调节指针(F0EH)除以2(66)
ANDLW 0FH
MOVWF 1FH
SKPNZ
MOVLW 0AH ; J 7段码地址
CALL DBCD ;标志指示1(10分位)
XORLW 7FH
MOVWF 7 ;此时可能显示[J 1 2 3]
BCF 5,1 ;开(10分位)显示
MOVFW 6
ANDLW 03H
MOVWF 8
MOVLW 0DH ; U 地址
BTFSC 0EH,0
MOVLW 0EH ; n 地址
MOVF 1FH,1
SKPNZ
MOVLW 0FH ; - 地址
CALL HBCD ;10
XORLW 7FH
BSF 5,1 ;关10分位
MOVWF 7
BCF 5,0 ;开分位,可能显示[- U n]
BTFSC 0BH,0
CLRF 8 ;每0.125秒取1次启动/停止数据
BTFSS 0BH,7
CLRF 8 ;启动/停止数据暂存入F8中
BTFSC 8,0
BCF 8,1 ;免除启/停竞争
BTFSC 6,6
BCF 8,1 ;如已开,则清启动位
BTFSS 6,6
BCF 8,0 ;如已关,则清停止位
SWAPF 8,1
BTFSC 8,5
BSF 6,6 ;如启动,置位开电平
BTFSC 8,4
BCF 6,6 ;如停止,复位开电平
MOVFW 6
ANDLW 0C0H
IORWF 8,1 ;准备输出控制数据