终于到了……感动ing...自己也可以DIY一个电子时钟了。
电路板和原件要另外找,南宁市的电子元件稀少得真难找啊,弄好后焊接,看来要找个好点的焊台,这样焊接电路时比较方便。
电路如下:
;简单的89C2051时钟程序
;显示方式为.12:34之12小时制
;P1口输出段数据,P3口输出位数据
;P1.7为秒点,P3.7为PM输出
;P3.4校时,P3.5校分
;晶振12MHz
flash equ 31h
sec equ 32h ;定义秒存储位置
min equ 33h ;定义分存储位置
hour equ 34h
hourk bit p3.4 ;调时按钮
mink bit p3.5 ;调分按钮
pm bit p3.7 ;PM输出端
org 0000h
ajmp start
org 000bh
ajmp int_t0
org 0100h
start: mov a,#00h ;清0
mov 30h,a
mov flash,a
mov sec,a ;秒清0
mov min,#00 ;分清0
mov hour,#12
mov sp,#60h ;重设堆栈指针
setb pm ;PM清0
mov p1,#0ffh
mov p3,#0ffh
mov tmod,#01h ;设定定时器0工作于方式1
mov tl0,#0b0h ;设定定时初始值50ms
mov th0,#3ch
setb ea ;启动定时
setb et0
setb tr0
key: lcall disp ;按键处理子程序
jb hourk,mmm
hhh: lcall disp
jnb hourk,hhh
inc hour ;时加1
mov a,hour
cjne a,#12,ppp
cpl pm ;PM取反
ppp: cjne a,#13,key
mov hour,#01h ;12小时到,清零.
mmm: jb mink,key
nnn: lcall disp
jnb mink,nnn
inc min
mov a,min
cjne a,#60,key
mov min,#00h ;一小时时间到
ajmp key
int_t0:push acc ;保护现场
mov tl0,#0b0h ;赋定时初值
mov th0,#3ch
inc 30h ;20H地址加1
mov a,30h
cjne a,#10,reti1
mov 30h,#00h ;半秒钟时间到
inc flash ;半秒加1
mov a,flash
cjne a,#2,reti1
mov flash,#00h
inc sec ;秒加1
mov a,sec
cjne a,#60,reti1
mov sec,#00h ;一分钟时间到
inc min ;分加1
mov a,min
cjne a,#60,reti1
mov min,#00h ;一小时时间到
inc hour ;时加1
mov a,hour
cjne a,#12,cont
cpl pm ;PM取反
cont: cjne a,#13,reti1
mov hour,#01h ;12小时到,清零.
reti1: pop acc ;恢复现场
reti ;中断返回
disp: mov a,#10
mov b,a
mov a,hour
div ab
cjne a,#01,zero
jmp normal
zero: mov a,#10 ;消隐无效零
normal:mov dptr,#tab
movc a,@a+dptr
mov p1,a
clr p3.0
lcall dely
setb p3.0
mov a,b
mov dptr,#tab
movc a,@a+dptr
mov p1,a
clr p3.1
lcall dely
setb p3.1
mov a,#10
mov b,a
mov a,min
div ab
mov dptr,#tab
movc a,@a+dptr
mov p1,a
clr p3.3
lcall dely
setb p3.3
mov a,b
mov dptr,#tab
movc a,@a+dptr
mov p1,a
clr p3.2
lcall dely
setb p3.2
mov a,flash
cjne a,#00,light
setb p1.7
lcall dely
jmp over
light: clr p1.7
lcall dely
over: ret ;子程序返回
tab: db 88h,0afh,91h,0a1h,0a6h,0e0h,0c0h,0adh,80h,0a0h,0ffh;共阳段码表0123456789不亮
dely: mov r6,#10
d1: mov r7,#20
d2: djnz r7,d2
djnz r6,d1
ret
end