电子定时器
单片机 DIY 2008-05-19 20:42:33 阅读 204 评论 0 字号:大中小
本电子定时器能定时给电器供电或断电,最大时间可以长达 30h,操作使用方便,采用
AT89C2051 单片机控制,4 位共阳数码管显示时间,继电器作电器电源输出控制,其电路简
单。
1.系统硬件电路的设计
(1)芯片的选择
硬件电路要求实现对交流大电流电源的控制、定时时间的设定显示和到点提醒等功能。
若采用 40 脚单片机有利于设计,但会增大电路板的体积。本设计采用 ATMEL 公司的
AT89C2051 单片机,芯片为 20 脚,体积小,工作电压范围宽(2.7V~6V)。
(2)交流控制接口电路
本设计采用继电器控制。也可用可控硅控制等。
(3)显示电路
显示电路采用 4 个 LED 数码管。为了在定时精度达到分的时候能显示出时钟在计时,两
个数码管之间增加了两个发光二极管,以其闪烁来代表秒走动;为了使硬件显示电路简单,
采用单片机直接驱动 LED 数码管(AT89C2051 输出口能吸收 20mA 电流),用动态扫描法实
现 LED 显示。
(4)电源电路
电源电路采用普通三端集成稳压电路。
(5)报警电路
报警电路采用普通 5V 成品小蜂鸣器。
2.系统软件主程序的设计
程序采用模块化、结构化设计,并采用了软件抗干扰技术,其软件的可靠性较好,可维
护性强。其主要程序模块有:
(1)主程序
主程序有 3 个状态:待命状态、计时工作状态和到点工作状态。
(2)菜单(设置)程序
菜单程序完成定时方式和定时时间的设定。
(3)到点工作程序
到点工作程序根据所选定的不同定时方式,作不同的处理。
(4)抗干扰(出错)程序
程序跑飞时能被软件陷阱捕获,被抗干扰程序处理,返回复位状态,重新启动系统。
3.操作说明:
(1)通电以后,显示窗显示“----”,表示机器处于待命状态。
(2)按功能键(S2),显示窗显示“F-01”,进入功能设置,此时按修改键(S3)选择
不同定时方式:
方式 1:定时关电源,定时范围为 1s ~ 30 min 59 s ;
方式 2:定时关电源,定时范围为 1s ~ 30 h 59 min;
方式 3:定时开电源,定时范围为 1s ~ 30 min 59 s ;
方式 4:定时开电源,定时范围为 1s ~ 30 h 59 min.
(3) 选定定时方式后,再按功能键,进入时间设定。先设定秒(方式 1、方式 3)或分
(方式 2、方式 4),再设定分(方式 1、方式 3)或小时(方式 2、方式 4)。按修改键增
加数字,按功能键确定,按住修改键不放可快进。
(4)设定时间完毕,按下功能键,定时器长鸣一声,开始工作。
(5)定时时间到了在定时方式 1 和方式 2,定时器会鸣叫,此时按任意键可停止鸣叫。
(6)在任何情况下,按下复位键( S2 键),定时器重新回到待命状态。
原理图:
实物图:
源代码:
;************* 电子定时器的设计******************;
;*MCU:
;*MCU-crystal: 12M
AT892051
;*Version:
01
;*Last Updata: 2007-6-14
;*Author:
;*Description:
zhaojun
;
;
;
;
;
;
;定时器 T0、T1 溢出周期为 50MS,T0 为秒计数用
;
;S2 为功能键、S3 为方式选择键
;P1 口为字符输出口,采用共阳显示管
;
;
;P3.2~P3.5 为位选,P1.7 为报警发音,P3.7 为被控继电器 ;
;************************************************;
;******************
; 伪定义 ;
;******************
EQU 30H
SL
SH EQU 31H
ML
MH
HL
EQU 32H
EQU 33H
EQU 34H
HH EQU 35H
; SL 存放秒的个位数
; SH 存放秒的十位数
; ML 存放分的个位数
; MH 存放分的十位数
; HL 存放时的个位数
; HH 存放时的十位数
L0
EQU 36H
; L0~L3:显示数据存储器
L2
L1 EQU 37H
EQU 38H
L3 EQU 39H
DSPLYP EQU 3AH
PLYTS EQU 3BH
LPLMOD BIT 39H
HPLMOD BIT 3AH
BRIGHT BIT 3BH
; 显示数据指针(DISPLAY-POINT)
; 显示次数计数器(DISPLAY-TIMES)
; 低两位显示方式(LOW-PLAY-MOD)
; 高两位显示方式(HIGH-PLAY-MOD)
; DISPLAY 子程序参数:亮灭指示位
;
;
;
TCOUNT EQU 3CH
ADDRES EQU 3DH
MAX
EQU 3EH
IFDEC BIT 20H
R_MOD EQU 3FH
; 时间计数器(TIME-COUNT)
; 加 1 子程序参数
; 加 1 子程序参数
; BCD 加法子程序参数
; 响铃方式参数
LED4
BIT 30H
BELL BIT P1.7
SWITCH BIT P3.7
FKEY
MKEY
BIT P3.0
BIT P3.1
; 发光管状态位
; 蜂鸣器
; 继电器
; 功能键 (S1)
; 修改键 (S2)
WORKIN BIT 38H
; 工作状态指示位
;
;
;
;
;
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;
;******************
; 中断入口 ;
;******************
ORG 0000H
START: LJMP MAIN
LJMP ERR
; 0000H 引向主程序
; 0003H
LJMP ERR
LJMP PGT0
; 引向出错处理程序
; 000BH 引向中断处理程序 PGT0
LJMP ERR
LJMP ERR
; 引向出错处理程序
; 0013H INT1
LJMP ERR
LJMP ERR
; 001BH T1
LJMP ERR
LJMP ERR
LJMP ERR
LJMP ERR
; 0023H
; 002BH
;************
; 主程序 ;
;************
MAIN: MOV IE,#00H
MOV SP,#57H
MOV PSW,#00H
; 关中断
; 设置堆栈指针
; 选用寄存器组 0
MOV TMOD,#11H
; 设定中断工作方式为 T0 和 T1
;
MOV A,56H
MOV A,57H
CJNE A,#0AAH,CSTART ; 判上电复位标志,无标志转冷启动
CJNE A,#55H,CSTART
; 无标志转冷启动
AJMP HSTART
; 有上电复位标志转热启动
NOP
NOP
; 软件陷阱,引向出错处理程序
; 冷启动,全面初始化
LJMP ERR
CSTART: MOV P1,#0FFH
MOV P3,#0FFH
MOV TCON,#00H
MOV TL0,#0B0H
; 计时停止
; 赋中断 T0 初值
MOV TH0,#3CH
MOV TCOUNT,#0AH
MOV R5,#00H
; 赋定时器初值
; R5 为一空单元(备用)
MOV R4,#00H
; R4 为工作模式选择寄存器
MOV SL,#00H
; 定时单元清零
MOV SH,#00H
MOV ML,#00H
MOV MH,#00H
MOV HL,#00H
MOV HH,#00H
; 秒
;
; 分
;
; 时
MOV PLYTS,#64H
MOV DSPLYP,#L0
MOV L0,#0AH
; 赋显示次数初值为 100 次
; 显示指针指向显存单元
; 送显示数据"-----"
MOV L1,#0AH
MOV L2,#0AH
MOV L3,#04H
SETB LED4
; LED4 为数码管之间的发光二极管
SETB LPLMOD
; 设定显示方式为闪烁
SETB HPLMOD
;
SETB BRIGHT
CLR WORKIN
AJMP SETUP
; 允许显示
; 清工作标志 , 待命
; 转开始工作
NOP
NOP
NOP
NOP
LJMP ERR
; 软件陷阱
HSTART: MOV SCON,#00H
MOV IP,#00H
; 有上电标志,热启动,清串行口控制寄存器
; 清中断优先控制寄存器
SETB FKEY
; 重设按键
SETB MKEY
SETB EA
AJMP BEGIN
; 开中断
; 转向继续工作
LJMP ERR
SETUP: SETB EA
;
MAIN1: ACALL DISPLY
FKEY,JUDGE
JB
ACALL KEYDLY
; 软件陷阱
; 开中断
; 调用显示
; 按键扫描
; 延时消抖动
JB
FKEY,JUDGE
CLR ET0
CLR TR0
ACALL MENU
BEGIN: SETB WORKIN
SETB ET0
SETB TR0
; 无键按下转向判断是否到点
; 功能键被按下,则
; 暂停计时
; 调用菜单设置程序
; 置工作标志位,开始工作
; 开中断
; 开始计时
MOV A,R4
; 移入工作模式选择
RL
; 指针放大
MOV DPTR,#M_TAB
A
JMP @A+DPTR
; 根据工作模式跳转到相应程序段
M_TAB: AJMP WORK1
AJMP WORK2
AJMP WORK3
AJMP WORK4
LJMP ERR
NOP
NOP
WORK1:
WORK2: CLR SWITCH
; 软件陷阱
;
; 工作方式 1 和 2:开继电器
LJMP ERR
; 软件陷阱
WORK4: SETB SWITCH
MAIN2: CLR BELL
; 工作方式 3 和 4:不开继电器
; 蜂鸣器短鸣一声,以示开始工作
JUDGE: JNB WORKIN,MAIN1
; 判断是否在定时之中
MOV A,SL
; 判断秒是否为零
AJMP MAIN2
NOP
NOP
WORK3:
;
ACALL DL05S
SETB BELL
JNZ MAIN1
JNZ MAIN1
JNZ MAIN1
JNZ MAIN1
JNZ MAIN1
MOV A,SH
; 判断秒是否为零
MOV A,ML
; 判断分是否为零
MOV A,MH
; 判断分是否为零
MOV A,HL
; 判断时是否为零
MOV A,HH
JNZ MAIN1
CLR ET0
; 判断时是否为零
; 若时分秒全为零则
; 停止计时
CLR TR0
;
ACALL ACTION
; 调用到点工作子程序
AJMP MAIN
; 返回
LJMP ERR
; 软件陷阱
NOP
NOP
;
PGT0: CLR EA
PUSH ACC
; 关中断
; 保护现场
MOV PSW,#08H
CLR TR0
MOV A,#0B7H
; 选用寄存器组 1
; 暂停计时
; 中断同步修正
;******************
; 倒计时程序 ;
;******************
PUSH PSW
PUSH DPL
PUSH DPH
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADD A,TH0
MOV TH0,A
SETB TR0
; 恢复计时
DEC TCOUNT
; 定时器 T0 每 50 000 毫秒溢出一次,则
MOV A,TCOUNT
JNZ OUTT0
; 溢出 10 次为 0.5 秒
; 判断是否到半秒
MOV TCOUNT,#0AH
;
CPL LED4
; 若到半秒 LED 取反
JNB LED4,OUTT0
MOV R0,#SH
SETB IFDEC
ACALL ADDBCD
; LED 每闪烁一次是一秒
; 移入秒位的地址
; BCD 子程序参数,使其做减法
; 调用 BCD 子程序, 秒减 1
CJNE R3,#99H,OUTT0
MOV SH,#05H
; 判断秒要否借位
; 要借位则
MOV SL,#09H
MOV R0,#MH
; 送数据 59(否则显示 99)
; 移入分位的地址
ACALL ADDBCD
CJNE R3,#99H,OUTT0
; 分减 1
; 判断分要否借位
OUTT0: POP DPH
; 恢复现场
MOV MH,#05H
MOV ML,#09H
MOV R0,#HH
ACALL ADDBCD
POP DPL
POP PSW
POP ACC
SETB EA
NOP
NOP
;
;
RETI
; 中断返回
LJMP ERR
; 软件陷阱
;**************************
; BCD 子程序(加 1 或减 1 )
;**************************
;
ADDBCD: MOV A,@R0
DEC R0
; 移入被操作数的高位
; 指针减一
SWAP A
ORL A,@R0
MOV B,#01H
MOV C,IFDEC
; 移入被操作数的低位
; B 寄存器送立即数#01H
; 若减法标志位为 1,则
MOV B.4,C
; B 寄存器的值被改为#99H
MOV B.3,C
MOV B.7,C
;
;
ADD A,B
; 对一个压缩的 BCD 码加#99H 等于对其减一
A
DA
MOV R3,A
ANL A,#0FH
MOV @R0,A
MOV A,R3
INC R0
SWAP A
; BCD 码调整
; 暂存结果
; 取低位码
; 存数
; 取回结果
; 指针加一
; 交换
ANL A,#0FH
; 取结果数的高位
MOV @R0,A
; 存数
LJMP ERR
; 软件陷阱
RET
NOP
NOP
;
;**************
; 加 1 程序 ;
;**************
ADDONE: MOV R0,ADDRES
; 移入被加数单元的地址
CLR IFDEC
ACALL ADDBCD
CLR C
MOV A,R3
; 设定 BCD 子程序做加法
; 调用 BCD 子程序
; 判断被加数是否大于
; 最大值"MAX"
CJNE A,MAX,JGOVER
JGOVER: JC ENDADO
CLR A
; 若大于"MAX",则清零
MOV @R0,A
DEC R0
MOV @R0,A
ENDADO: RET
NOP
NOP
;
;******************
; 调时快进程序 ;
LJMP ERR
; 软件陷阱
;******************
CLR HPLMOD
QUICK: CLR LPLMOD
; 设定显示方式不闪烁
ACALL ADDONE
; 调用加 1 子程序
MOV L0,R4
INC L0
; 将工作模式选择数移入显存
; 加 1 转化成显示值
ACALL KEYDLY
; 延时
ACALL DL100
JNB MKEY,QUICK
; 判断键是否松开
SETB LPLMOD
; 若松开则恢复闪烁显示方式
CJNE R6,#02H,ENDQUK
SETB HPLMOD
CLR LPLMOD
ENDQUK: RET
NOP
NOP
;
;
;******************
; 功能菜单程序 ;
;******************
LJMP ERR
; 软件陷阱
MENU: MOV R6,#00H
; 初始化; R6 计功能键按键次数
MOV ADDRES,#05H
MOV MAX, #04H
; 将 R5 的地址送入,以便于改变 R4 的值
; 定义工作模式选择寄存器 R4 的最大值
MOV DSPLYP,#L0
SETB LPLMOD
; 定义显示指针指向显存
; 设定低两位数闪烁
MOV L0,R4
; 送显示数据"F-0X"
CLR HPLMOD
INC L0
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
;
WAITFK: ACALL DISPLY
; 等待 F 键释放
JNB FKEY,WAITFK
MENU1: ACALL DISPLY
JB MKEY,JGFKEY
ACALL KEYDLY
JB MKEY,JGFKEY
; M 键扫描
; 延时消抖动
; 未按下则转 F 键扫描
CJNE R6,#00H,NEXT1
;
MOV SL,#00H
; 若中途改变定时方式,则清除原计时数据
MOV SH,#00H
MOV ML,#00H
MOV MH,#00H
MOV HL,#00H
MOV HH,#00H
NEXT1: MOV R2,#00H
; R2 用于判断按键时间是否超过 0.5 秒
NEXT2: ACALL ADDONE
; 调用加 1 程序
MOV L0,R4
; 移入工作方式选择数
INC L0
CLR C
;
;
WAITMK: ACALL DISPLY
; 等待 M 键释放
INC R2
; R2 自增一
CJNE R2,#0C8H,JGQUIC ; 若 R2 大于等于 200 则调用快进子程序
JGQUIC: JC WATMK1
ACALL QUICK
WATMK1: JNB MKEY,WAITMK
; R2 小于 200 则等待 M 键释放
JGFKEY: JB FKEY,MENU1
ACALL KEYDLY
; 功能(F)键扫描
; 延时消抖动