电子钟的设计及仿真
时间:11-23
来源:互联网
点击:
一、实现电子钟计时的基本方法:
(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
(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
AJMP
ORG
LJMP
ORG
MAIN:
QL:
MOV
LCALL
NEXT:
RUNF:
JK:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PP:
PPP:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:
JZ
LCALL
JZ
MOV
KEYSF: LCALL
JZ
LCALL
AJMP
KEYY: MOV
EXIT: RET
KEYS:
MOV
CPL
ANL
MOV
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANKEY: CLR
CHECK: JB
K0:
K1:
K2:
K3:
YXZ:
KEY1:
KEY2:
KEY3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTT: MOV
STOP:
RUN:
OUT:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0: PUSH
PUSH
CLR
SETB
DJNZ
ADDSS: MOV
ADDMM: JC
ADDHH: JC
HOUR: JC
OUTT0: MOV
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CLR0: CLR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADD1: MOV
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;显示子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP:
DISP1: MOV
DISP2: RET
TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0CH
DL:
DL1:
DL2:
电子钟设计仿 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)