×
单片机 > 单片机程序设计 > 详情

电子定时器

发布时间:2020-05-28 发布时间:
|
本电子定时器能定时给电器供电或断电,最大时间可以长达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:          AT892051                         ;
;*MCU-crystal:  12M                              ;
;*Version:      01                               ;
;*Last Updata:  2007-6-14                        ;
;*Author:       zhaojun                          ;
;*Description:                                   ;
;定时器T0、T1溢出周期为50MS,T0为秒计数用        ;
;S2为功能键、S3为方式选择键                      ;
;P1口为字符输出口,采用共阳显示管                 ;
;P3.2~P3.5为位选,P1.7为报警发音,P3.7为被控继电器 ;
;************************************************;

;******************
;      伪定义     ;
;******************
SL      EQU   30H              ; SL存放秒的个位数
SH EQU   31H              ; SH存放秒的十位数
ML      EQU   32H              ; ML存放分的个位数
MH      EQU   33H              ; MH存放分的十位数
HL      EQU   34H              ; HL存放时的个位数
HH EQU   35H            ; HH存放时的十位数
;
L0      EQU   36H              ; L0~L3:显示数据存储器
L1 EQU   37H
L2      EQU   38H
L3 EQU   39H
DSPLYP  EQU   3AH              ; 显示数据指针(DISPLAY-POINT)
PLYTS   EQU   3BH              ; 显示次数计数器(DISPLAY-TIMES)
;
LPLMOD  BIT   39H              ; 低两位显示方式(LOW-PLAY-MOD)
HPLMOD  BIT   3AH              ; 高两位显示方式(HIGH-PLAY-MOD)
BRIGHT  BIT   3BH              ; DISPLAY子程序参数:亮灭指示位
;
TCOUNT  EQU   3CH              ; 时间计数器(TIME-COUNT)
;
ADDRES  EQU   3DH              ; 加1子程序参数
MAX     EQU   3EH              ; 加1子程序参数
IFDEC   BIT   20H              ; BCD加法子程序参数
;
R_MOD   EQU   3FH              ; 响铃方式参数
;
LED4    BIT   30H              ; 发光管状态位
BELL    BIT   P1.7             ; 蜂鸣器
SWITCH  BIT   P3.7             ; 继电器
FKEY    BIT   P3.0             ; 功能键 (S1)
MKEY    BIT   P3.1             ; 修改键 (S2)
;
WORKIN  BIT   38H              ; 工作状态指示位
;

;******************
;     中断入口    ;
;******************
        ORG   0000H
START:  LJMP  MAIN             ; 0000H  引向主程序
 LJMP  ERR              ; 0003H
 NOP
 NOP
 LJMP  ERR              ; 引向出错处理程序
 LJMP  PGT0             ; 000BH  引向中断处理程序PGT0
 NOP
 NOP
 LJMP  ERR              ; 引向出错处理程序
 LJMP  ERR              ; 0013H  INT1
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 001BH  T1
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 0023H
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 002BH
 NOP
 NOP
;
;************
;   主程序  ;
;************
MAIN:   MOV   IE,#00H          ; 关中断
 MOV   SP,#57H          ; 设置堆栈指针
 MOV   PSW,#00H         ; 选用寄存器组0
 MOV   TMOD,#11H        ; 设定中断工作方式为T0和T1
 ;
 MOV   A,56H
 CJNE  A,#0AAH,CSTART   ; 判上电复位标志,无标志转冷启动
 MOV   A,57H
 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       ; 赋显示次数初值为100次
 MOV   DSPLYP,#L0       ; 显示指针指向显存单元
 MOV   L0,#0AH          ; 送显示数据"-----"
 MOV   L1,#0AH
 MOV   L2,#0AH
 MOV   L3,#04H
 SETB  LED4             ; LED4为数码管之间的发光二极管
 SETB  LPLMOD           ; 设定显示方式为闪烁
 SETB  HPLMOD           ;
 SETB  BRIGHT           ; 允许显示
 CLR   WORKIN        ; 清工作标志 , 待命
 AJMP  SETUP            ; 转开始工作
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
HSTART: MOV   SCON,#00H        ; 有上电标志,热启动,清串行口控制寄存器
 MOV   IP,#00H          ; 清中断优先控制寄存器
 SETB  FKEY             ; 重设按键
 SETB  MKEY
 SETB  EA               ; 开中断
 AJMP  BEGIN            ; 转向继续工作
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
SETUP:  SETB  EA               ; 开中断
;
MAIN1:  ACALL DISPLY           ; 调用显示
 JB    FKEY,JUDGE       ; 按键扫描
 ACALL KEYDLY           ; 延时消抖动
 JB    FKEY,JUDGE       ; 无键按下转向判断是否到点
 CLR   ET0              ; 功能键被按下,则
 CLR   TR0        ; 暂停计时
 ACALL MENU             ; 调用菜单设置程序
BEGIN:  SETB  WORKIN           ; 置工作标志位,开始工作
 SETB  ET0              ; 开中断
 SETB  TR0              ; 开始计时
 MOV   A,R4             ; 移入工作模式选择
 RL    A         ; 指针放大
 MOV   DPTR,#M_TAB
 JMP   @A+DPTR          ; 根据工作模式跳转到相应程序段
M_TAB:  AJMP  WORK1
 AJMP  WORK2
 AJMP  WORK3
 AJMP  WORK4
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
WORK1:  ;
WORK2:  CLR   SWITCH           ; 工作方式1和2:开继电器
 AJMP  MAIN2
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
WORK3:  ;
WORK4:  SETB  SWITCH           ; 工作方式3和4:不开继电器
MAIN2:  CLR   BELL             ; 蜂鸣器短鸣一声,以示开始工作
 ACALL DL05S
 SETB  BELL
JUDGE:  JNB   WORKIN,MAIN1     ; 判断是否在定时之中
 MOV   A,SL             ; 判断秒是否为零
 JNZ   MAIN1
 MOV   A,SH             ; 判断秒是否为零
 JNZ   MAIN1
 MOV   A,ML             ; 判断分是否为零
 JNZ   MAIN1
 MOV   A,MH             ; 判断分是否为零
 JNZ   MAIN1
 MOV   A,HL             ; 判断时是否为零
 JNZ   MAIN1
 MOV   A,HH             ; 判断时是否为零
 JNZ   MAIN1            ; 若时分秒全为零则
 CLR   ET0              ; 停止计时
 CLR   TR0              ;
 ACALL ACTION           ; 调用到点工作子程序
 AJMP  MAIN             ; 返回
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
;******************
;    倒计时程序   ;
;******************
PGT0:   CLR   EA               ; 关中断
 PUSH  ACC        ; 保护现场
 PUSH  PSW
 PUSH  DPL
 PUSH  DPH
 MOV   PSW,#08H        ; 选用寄存器组1
 CLR   TR0              ; 暂停计时
 MOV   A,#0B7H          ; 中断同步修正
 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         ; 溢出10次为0.5秒
 JNZ   OUTT0        ; 判断是否到半秒
 MOV   TCOUNT,#0AH      ;
 CPL   LED4        ; 若到半秒LED取反
 JNB   LED4,OUTT0       ; LED每闪烁一次是一秒
 MOV   R0,#SH           ; 移入秒位的地址
 SETB  IFDEC            ; BCD子程序参数,使其做减法
 ACALL ADDBCD           ; 调用BCD子程序, 秒减1
 CJNE  R3,#99H,OUTT0    ; 判断秒要否借位
 MOV   SH,#05H          ; 要借位则
 MOV   SL,#09H          ; 送数据59(否则显示99)
 MOV   R0,#MH           ; 移入分位的地址
 ACALL ADDBCD        ; 分减1
 CJNE  R3,#99H,OUTT0    ; 判断分要否借位
 MOV   MH,#05H
 MOV   ML,#09H
 MOV   R0,#HH
 ACALL ADDBCD
OUTT0:  POP   DPH        ; 恢复现场
 POP   DPL
 POP   PSW
 POP   ACC
 SETB  EA
 RETI                   ; 中断返回
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
 ;
;
;**************************
;   BCD子程序(加1或减1 )  ;
;**************************
ADDBCD: MOV   A,@R0            ; 移入被操作数的高位
 DEC   R0               ; 指针减一
 SWAP  A
 ORL   A,@R0            ; 移入被操作数的低位
 MOV   B,#01H           ; B寄存器送立即数#01H
 MOV   C,IFDEC          ; 若减法标志位为1,则
 MOV   B.3,C            ;
 MOV   B.4,C            ; B寄存器的值被改为#99H
 MOV   B.7,C            ;
 ADD   A,B              ; 对一个压缩的BCD码加#99H等于对其减一
 DA    A                ; BCD码调整
 MOV   R3,A             ; 暂存结果
 ANL   A,#0FH           ; 取低位码
 MOV   @R0,A            ; 存数
 MOV   A,R3             ; 取回结果
 INC   R0               ; 指针加一
 SWAP  A                ; 交换
 ANL   A,#0FH           ; 取结果数的高位
 MOV   @R0,A            ; 存数
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
;
;**************
;   加1程序   ;
;**************
ADDONE: MOV   R0,ADDRES        ; 移入被加数单元的地址
 CLR   IFDEC            ; 设定BCD子程序做加法
 ACALL ADDBCD           ; 调用BCD子程序
 CLR   C                ; 判断被加数是否大于
 MOV   A,R3             ; 最大值"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              ; 软件陷阱
;
;******************
;   调时快进程序  ;
;******************
QUICK:  CLR   LPLMOD        ; 设定显示方式不闪烁
 CLR   HPLMOD
 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      ; 将 R5 的地址送入,以便于改变 R4 的值
 MOV   MAX, #04H        ; 定义工作模式选择寄存器R4 的最大值
 MOV   DSPLYP,#L0       ; 定义显示指针指向显存
 SETB  LPLMOD        ; 设定低两位数闪烁
 CLR   HPLMOD
 MOV   L0,R4            ; 送显示数据"F-0X"
 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      ; M键扫描
 ACALL KEYDLY           ; 延时消抖动
 JB    MKEY,JGFKEY      ; 未按下则转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
 ;
WAITMK: ACALL DISPLY        ; 等待M键释放
 INC   R2               ; R2自增一
 CLR   C
 CJNE  R2,#0C8H,JGQUIC  ; 若R2大于等于200则调用快进子程序
JGQUIC: JC    WATMK1
        ACALL QUICK
WATMK1: JNB   MKEY,WAITMK      ; R2小于200则等待M键释放
;
JGFKEY: JB    FKEY,MENU1       ; 功能(F)键扫描
 ACALL KEYDLY           ; 延时消抖动
 JB    FKEY,MENU1       ; 键未按下则转修改(M)键扫描
 INC   R6               ; F键按键次数加1
 MOV   A,R6             ; 移入按键次数
 RL    A         ; 指针放大
 MOV   DPTR,#FUNTAB
 JMP   @A+DPTR          ; 根据按键次数跳转到相应的程序段
FUNTAB: AJMP  WAITFK
 AJMP  SETLOW
 AJMP  SETHI
 AJMP  ENDMEN
 NOP
 NOP
 AJMP  ENDMEN
;STWKMD:                       ; 工作模式设定,不需另外改变菜单
;
SETLOW: MOV   MAX,#60H         ; 设置低位(秒位或分位)
 MOV   A,R4             ; 移入工作模式选择数
 RL    A         ; 指针放大
 MOV   DPTR,#FTAB1
 JMP   @A+DPTR          ; 根据工作模式选择数跳转到相应的程序段
FTAB1:  AJMP  SETSS
 AJMP  SETM60
 AJMP  SETSS
 AJMP  SETM60
 NOP
 NOP
 AJMP  WAITFK
SETSS:  MOV   DSPLYP,#SL       ; 设定显示区域为MM:SS
 MOV   ADDRES,#SH
 AJMP  WAITFK
SETM60: MOV   DSPLYP,#ML       ; 设定显示区域为HH:MM
 MOV   ADDRES,#MH
 AJMP  WAITFK
;
SETHI:  CLR   LPLMOD           ; 设置高位(分位或时位)
 SETB  HPLMOD           ; 高两位数码管闪烁
 MOV   MAX,#31H         ; 最大数为30
 MOV   A,R4             ; 移入工作模式选择数
 RL    A                ; 指针放大
 MOV   DPTR,#FTAB2      ; 移入表首地址
 JMP   @A+DPTR          ; 根据工作模式选择数跳转到相应的程序段
FTAB2:  AJMP  SETM30
 AJMP  SETHH
 AJMP  SETM30
 AJMP  SETHH
 NOP
 NOP
 AJMP  WAITFK           ; 返回等待键释放
SETM30: MOV   ADDRES,#MH       ; 移入分位的地址
        AJMP  WAITFK           ; 转向等待键释放
SETHH:  MOV   ADDRES,#HH       ; 移入时位的地址
 AJMP  WAITFK           ; 转向等待键释放
;
ENDMEN: CLR   HPLMOD           ; 恢复不闪烁显示方式
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
;
;****************
;  到点工作程序 ;
;****************
ACTION: MOV   L0,R4            ; 移入工作模式选择数
 INC   L0               ; 送显示数"F-0X"
 MOV   L1,#00H
 MOV   L2,#0BH
 MOV   L3,#00H
 SETB  LED4
 MOV   DSPLYP,#L0       ; 指针指向显存
 SETB  LPLMOD           ; 设定显示方式不闪烁
 SETB  HPLMOD
 MOV   A,R4             ; 移入工作模式选择数
 RL    A                ;
 MOV   DPTR,#A_TAB
 JMP   @A+DPTR          ; 根据工作模式选择数跳转
A_TAB:  AJMP  ACTF1            ; 工作模式一
 AJMP  ACTF1            ; 工作模式二
 AJMP  ACTF3            ; 工作模式三
 AJMP  ACTF3            ; 工作模式四
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
ACTF1:  SETB  SWITCH           ; 工作模式一(或二): 关继电器
 MOV   R_MOD,#82H       ; 响铃模式参数#82H
 MOV   R2,#96H          ; 响铃次数参数#96H
ACTF11: ACALL RING           ; 调用响铃子程序
 JNB   MKEY,ENDACT      ; 等待键按下
 JNB   FKEY,ENDACT      ; 有键按下则结束响铃
 DJNZ  R2, ACTF11       ; 次数未满继续响铃
 MOV   R_MOD,#0FFH      ; 参数#0FF使响铃无效
 AJMP  ACTF11           ; 无键按下返回
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
ACTF3:  CLR   SWITCH           ; 工作模式三(或四): 开继电器
 CLR   BELL             ; 蜂鸣器短鸣一声
 ACALL DL1S
 SETB  BELL
 MOV   R_MOD,#0FFH      ; 响铃模式参数#0FFH
 MOV   R2,#96H          ; 响铃时间参数#96H
ACTF31: ACALL RING        ; 调用响铃子程序
 JNB   MKEY,ENDACT      ; 等待键按下
 JNB   FKEY,ENDACT      ; 有键按下则结束
 DJNZ  R2,ACTF31        ; 次数未满继续
 MOV   R2,#96H          ; 重新赋值
 CLR   BELL             ; 短鸣一声(说明: 响铃模式参数#0FFH使
 ACALL DL100            ; 响铃程序无效,仅起延时作用,
 SETB  BELL             ; 每延时一段时间短鸣一声,以
 AJMP  ACTF31           ; 提醒使用者继电器仍在工作)
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
ENDACT: SETB  SWITCH           ; 关继电器
AWAITF: ACALL DISPLY           ; 调用显示
        JNB   FKEY,AWAITF      ; 等待键释放
AWAITM: ACALL DISPLY           ; 调用显示
 JNB   MKEY,AWAITM      ; 等待键释放
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
;**************
;   响铃程序  ;
;**************
RING:   MOV   R5,#18H          ; R5为循环控制变量
RING1:  JNB   MKEY,R_EXIT      ; 键扫描
 JNB   FKEY,R_EXIT      ; 有键按下则退出
 MOV   A,R_MOD          ; 移入响铃模式参数
 MOV   C,ACC.7          ; 根据响铃模式参数改变响铃
 MOV   BELL,C
 RL    A
 MOV   R_MOD,A
 ACALL DL100            ; 延时
 DJNZ  R5,RING1         ; 循环次数控制
R_EXIT: SETB  BELL             ; 关闭响铃
 RET
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
;
;**************
;   显示程序  ;
;**************
DISPLY: PUSH  ACC              ; 数据压栈保护
 PUSH  PSW
 MOV   PSW,#10H         ; 选用寄存器组2
 MOV   R0,DSPLYP        ; 移入显示指针
 MOV   R2,#0FDH         ; R2寄存的是数码管选通数
 MOV   A,PLYTS          ; 移入显示循环控制量
 JNZ   PLAY             ; 不为0则转PLAY
 MOV   PLYTS,#64H       ; 否则从新赋值
 CPL   BRIGHT           ; 亮灭指示位取反
PLAY:   DEC   PLYTS            ; 显示循环控制量减1
 JNB   LPLMOD,PLAYL     ; 低两位数码管不闪则"PLAYL"
 JB    BRIGHT,PLAYL     ; 亮灭指示为1也"PLAYL"
 ACALL NOPLAY           ; 否则灭灯延时
 AJMP  PLAY1            ; 转显示高位数码管
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
;用来显示低位
PLAYL:  ORL   P1,#7FH          ; 清原显示数据
 ORL   P3,#3CH          ; 清原选通数据
 MOV   A,R2             ; 移入数码管位选数
 RL    A                ; 换一位
 ANL   P3,A             ; 选通低位的个位数码管
 MOV   R2,A             ; 暂存位选数
 MOV   A,@R0            ; 移入显示数值
 MOV   DPTR,#TABLE1     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送显示数据
 ACALL DL1MS            ; 延时
 INC   R0               ; 指向低位的十位数
 JB    P3.3,PLAYL       ; 显示低位的十位数
;
PLAY1:  JNB   HPLMOD,PLAYH     ; 高两位数码管不闪则"PLAYH"
 JB    BRIGHT,PLAYH     ; 亮灭指示为1也"PLAYH"
 ACALL NOPLAY           ; 否则灭灯延时
 AJMP  OUTPLY           ; 转结束
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
;
;用来显示高位
PLAYH:  ORL   P1,#7FH          ; 清原显示数据
 ORL   P3,#3CH          ; 清原选通数据
 ANL   P3,#0EFH         ; 选通高位的个位数数码管
 MOV   A,@R0            ; 移入显示数值
 MOV   DPTR,#TABLE1     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送显示数据
 ACALL DL1MS            ; 延时
 INC   R0               ; 指向高位的十位数
 ;                      ; 显示高位的十位数
 ORL   P1,#7FH          ; 清原显示数据
 ORL   P3,#3CH          ; 清原选通数据
 ANL   P3,#0DFH         ; 选通高位的十位数
 MOV   A,@R0            ; 移入显示数值
 MOV   C,LED4        ; 指针放大+小灯状态
 RLC   A                ;
 MOV   DPTR,#TABLE2     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送显示数据
 ACALL DL1MS            ; 延时
;
OUTPLY: POP   PSW              ; 恢复数据
 POP   ACC
 RET
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
;
TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
;         "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
;  "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
;
;
;
;**********************
;    无显示(灭灯)程序   ;
;**********************
NOPLAY: ORL   P1,#7FH          ; 清显示数据
 ORL   P3,#3CH          ; 清选通数据
 INC   R0               ; 指针自增2
 INC   R0
 ACALL DL1MS            ; 延时
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
;******************
;     延时程序    ;
;******************
DL1MS:  MOV   R3,#0F9H         ; 延时 1250US  只为DISPLY所调用
DL1MS1: NOP
 NOP
 NOP
 DJNZ  R3,DL1MS1
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
KEYDLY: CLR   BELL        ; 按键消抖动专用延时程序,
 ACALL DISPLY           ; 在消除抖动的同时发出按键提示音
 SETB  BELL
 RET
 NOP
 NOP
 LJMP ERR               ; 软件陷阱
;
DL50MS: MOV   R7,#0AH          ; 50毫秒延时程序
DL50M1: ACALL DISPLY        ; 每调用一次显示程序5MS
 DJNZ  R7,DL50M1        ; 调用10次
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
;
DL100:  ACALL DL50MS           ; 延时100毫秒
 ACALL DL50MS
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
;
DL05S:  ACALL DL100            ; 延时0.5秒
 ACALL DL100
 ACALL DL100
 ACALL DL100
 ACALL DL100
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
DL1S:   ACALL DL05S            ; 延时1秒
 ACALL DL05S
 RET
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 ;
;****************************
;     ERR(出错处理) 程序    ;
;****************************
ERR:    CLR   EA               ; 关中断
 MOV   DPTR,#ERR1       ; 准备返回地址
 PUSH  DPL              ; 压栈
 PUSH  DPH              ;
 RETI                   ; 中断返回
ERR1:   MOV   56H,#0AAH        ; 建立上电标志(出错标志)
 MOV   57H,#55H
 MOV   A,#00H           ; 准备返回地址
 PUSH  ACC              ; 压栈
 PUSH  ACC          
 RETI                   ; 中断返回
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
;
 ORG   07FAH
 NOP
 NOP
 NOP
 LJMP  ERR              ; 软件陷阱
 
 END                    ; 程序结束

关键字:电子定时器  AT89C2051 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍