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

电子钟的设计及仿真

发布时间:2020-09-02 发布时间:
|
一、实现电子钟计时的基本方法:
(1) 计数初值计算:
把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。
假设使用T/C0,方式1,50ms定时,fosc=12MHz。
则初值X满足(216-X)×1/12MHz×12μs =50000μs
X=15536→0011110010110000→3CB0H
(2) 采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);
(3) 从秒到分和从分到时的计时是通过累加和数值比较实现。
 

 
 
二、软件系统设计 
 程序清单:
ORG        0000H
AJMP       MAIN
ORG        000BH
LJMP       INTT0
 
ORG        0030H
MAIN:  MOV        SP,        #60H              ;确立堆栈区
       MOV        PSW,       #00H              ;
       MOV        R0,        #20H              ;RAM区首地址
       MOV        R7,        #5FH              ;RAM区单元个数
QL:    MOV        @R0,       #00H              ;RAM清零
       INC        R0
       DJNZ       R7,        QL
       MOV        IP,        #02H              ;IP初始化,优先定时器0
       MOV        IE,        #82H              ;IE初始化,      
MOV        TMOD,      #01H              ;定时器0方式1工作
LCALL      PP                          ;调P.子程序
NEXT:  LCALL      KEY                         ;按键检测子程序
       JB         ACC.0,     RUNF              ;A键按下运行
       LCALL      DISP                        ;调用显示子程序
       SJMP       NEXT
 
RUNF:  LCALL      OUTT                        ;调传送子程序
       LCALL      TIME                        ;开电子钟
JK:    LCALL      DISP                        ;调用显示子程序
       LCALL      KEY                         ;按键检测子程序
       JZ         JK
       LCALL      ANKEY
       LCALL      DISP                        ;调用显示子程序
       SJMP       JK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;     P点显示     ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PP:    MOV        37H,       #12               ;P点编码送寄存器
       MOV        R0,        #30H              ;P点编码送寄存器
       MOV        R7,        #07H
PPP:   MOV        @R0,       #10
       INC        R0
       DJNZ       R7,        PPP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;   键扫子程序    ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:   LCALL      KEYS                       ;调键值处理子程序
JZ         EXIT                        ;没有键按下转到返回
       LCALL      DISP
       LCALL      DISP                        ;调显示去抖动
LCALL      KEYS
JZ         EXIT
MOV        B,         20H               ;保存键值
KEYSF: LCALL      KEYS                       ;调键值处理子程序
JZ         KEYY                        ;键释放,转到恢复键值
LCALL      DISP                       ;调显示子程序延时
AJMP       KEYSF                       ;等到键释放
KEYY: MOV        A,                       ;键值送20H单元保存
EXIT: RET                                   ;返回
KEYS:  MOV        P1,        #0FFH            ;先向P1口写1
MOV        A,         P1               ;P1口值送累加器A
CPL                                 ;A值取反
ANL        A,         #0FH             ;保存P1口的低4位
MOV        20H,                     ;A值送20H保存
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;   键功能子程序  ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANKEY: CLR        EA                          ;关中断
CHECK: JB         TR0,      YXZ               ;判断是否运行
K0:    CJNE       A,         #01H,      K1
       AJMP       RUN                         ;转运行
K1:    CJNE       A,         #02H,      K2
       AJMP       KEY1                        ;转时调整
K2:    CJNE       A,         #04H,      K3
       AJMP       KEY2                        ;转分调整
K3:    CJNE       A,         #08H,      OUT
       AJMP       KEY3                        ;转秒调整
 
YXZ:   JB         ACC.0,     STOP
       AJMP       OUT
 
KEY1:  MOV        R0,        #45H              ;时调整
       LCALL      ADD1
       CLR        C
       CJNE       A,         #24H,      OUTT
       ACALL      CLR0
       AJMP       OUTT
KEY2:  MOV        R0,        #43H              ;分调整
       LCALL      ADD1
       CLR        C
       CJNE       A,         #60H,      OUTT
       ACALL      CLR0
       AJMP       OUTT
KEY3:  MOV        R0,        #41H              ;秒调整
       ACALL      ADD1 
       CLR        C
      CJNE       A,         #60H,      OUTT
      ACALL      CLR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;  传送显示数据   ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTT: MOV        30H,       40H               ;秒显示单元41H-42H
      MOV        31H,       41H
      MOV        32H,       #11               ; "-"
      MOV        33H,       42H               ;分显示单元43H-44H
      MOV        34H,       43H
      MOV        35H,       #11               ; "-"
      MOV        36H,       44H               ;时显示单元44-45H
      MOV        37H,       45H
      RET
STOP:  CLR        TR0                         ;关电子钟并跳出
       RET
RUN:   LCALL      TIME                        ;运行电子钟
OUT:   SETB       EA                          ;无键按下或完成功能跳出
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;    运行电子钟   ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME:  SETB       EA
       MOV        TL0,       #0B0H    
       MOV        TH0,       #3CH             ;3CB0H
       MOV        R4,        #20              ;50ms,20次循环
       SETB       TR0                         ;启动定时器0
       RET
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;     定时中断    ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0: PUSH       ACC
PUSH       PSW
CLR        ET0
        CLR        TR0
       MOV        TL0,       #0B0H            ;重新设定定时初值
       MOV        TH0,       #3CH
SETB       TR0                         ;启动定时器0
DJNZ       R4,        OUTT0             ;1秒到
ADDSS: MOV        R4,        #14H              ;20次计数
      MOV        R0,        #41H              ;秒十位
      ACALL      ADD1                        ;加1程序     
      CLR        C
      CJNE       A,         #60H,      ADDMM ;1分到
ADDMM: JC         OUTT0
      ACALL      CLR0
      MOV        R0,        #43H
      ACALL      ADD1                        ;加1程序
      CLR        C
      CJNE       A,         #60H,      ADDHH ;1小时到
ADDHH: JC         OUTT0
      ACALL      CLR0
      MOV        R0,        #45H
      ACALL      ADD1                        ;加1程序
      CLR        C
      CJNE       A,         #24H,      HOUR   ;1天到
HOUR: JC         OUTT0 
      ACALL      CLR0
OUTT0: MOV        30H,       40H               ;秒显示单元41H-42H
      MOV        31H,       41H
      MOV        32H,       #11               ; "-"
      MOV        33H,       42H               ;分显示单元43H-44H
      MOV        34H,       43H
      MOV        35H,       #11               ; "-"
      MOV        36H,       44H               ;时显示单元44-45H
      MOV        37H,       45H
      POP        PSW
      POP        ACC
      SETB       ET0
      RETI
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;  时间清零子程序 ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLR0: CLR        A
       MOV        @R0,       A
      DEC        R0
      MOV        @R0,       A
      RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;   加一子程序    ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD1: MOV        A,         @R0               ;取十位
      DEC        R0 
      SWAP      
      ORL        A,         @R0               ;组合十位与个位
      ADD        A,         #01H              ;加1
      DA                                  ;十进制调整
      MOV        R3,                       ;暂存
      ANL        A,         #0FH              ;屏蔽十位
      MOV        @R0,                      ;放入个位单元
      MOV        A,         R3                ;取值
      INC        R0 
      SWAP       A
      ANL        A,         #0FH              ;屏蔽个位
      MOV        @R0,                      ;放入十位单元
       MOV        A,         R3                ;数值放入A中等待判断
      RET
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;显示子程序  30H  ;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:  MOV        R1,        #30H              ;显示缓冲存储单元首地址
       MOV        R2,        #80H              ;从右至左显示
DISP1: MOV        P2,        R2                ;送位控
      MOV        A,         @R1
       MOV        DPTR,      #TAB
       MOVC       A,         @A+DPTR
       MOV        P0,                       ;送段控
       ACALL      DL                          ;延时
       MOV        A,         R2
       JB         ACC.0,     DISP2
       RR         A
       INC        R1
       MOV        R2,        A
       AJMP       DISP1
DISP2: RET
TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0CH
DL:    MOV        R6,        #14H              ;显示延时子程序
DL1:   MOV        R7,        #19H ;
DL2:   DJNZ       R7,        DL2
       DJNZ       R6,        DL1
      RET
       END
关键字:电子钟  设计  仿真

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

热门文章 更多
ARM 汇编的必知必会