header
×
嵌入式 > 嵌入式开发 > 详情

电子钟的设计及仿真

发布时间:2020-10-21 发布时间:
|
一、实现电子钟计时的基本方法:
(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, B ;键值送20H单元保存
EXIT: RET ;返回
KEYS: MOV P1, #0FFH ;先向P1口写1
MOV A, P1 ;P1口值送累加器A
CPL A ;A值取反
ANL A, #0FH ;保存P1口的低4位
MOV 20H, A ;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 A
ORL A, @R0 ;组合十位与个位
ADD A, #01H ;加1
DA A ;十进制调整
MOV R3, A ;暂存
ANL A, #0FH ;屏蔽十位
MOV @R0, A ;放入个位单元
MOV A, R3 ;取值
INC R0
SWAP A
ANL A, #0FH ;屏蔽个位
MOV @R0, A ;放入十位单元
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, A ;送段控
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嵌入式系统串口扩展
footer