|
谢玉平
深圳市福田区车公庙天安数码城 带闹钟智能电子钟 石老师: 你好!我在06年8月开始学习单片机,是一个单片机初学者。 我在一次上网时偶然发现了51单片机学习网,在51单片机学习网网站有好多对我有帮助的知识。我在里面学到了好多东西。看到你们的征文我感到特别的高兴,也祝你们越办越好,多搞一些活动。本人希望可以得到你的指点和帮助,如果可以通过征文提高我的水平,得到一个实验箱来做实验我会非常开心。 这个带闹钟智能电子钟,我花了将近两周的时间,终于成功的完成。其中的也是通过一个电子钟改进而来的。我已经调试通过并用了二个多月,没有出现问题。 电路特点 以一片AT89C2051单片机为主体,其显示数据从P3.0-P3.7口输出,P1口输出对应的六位位选信号。电子钟程序设计时使用了T0作为计时,T1为调整时显示用。只要对程序稍加更改,可以很容易的实现8路定时功能。 电子钟只用一个轻触式按键来完成所有的设置。为了使闹钟音量足够大,采用了PNP型三极管8550来驱动蜂鸣器,驱动电阻用1K的,蜂鸣器为5V小型蜂鸣器。若用NPN来驱动蜂鸣器音量要小一点。LED数码管位驱动用8850,电子钟采用自制的3A开关电源供电。如图1。供电效率高,可和7-24V的直流电源直接连接,电子钟工作电流20MA左右。
图1
LM2576做的3A电源 电子钟功能 一、时间显示: 六位LED数码管显示时间,按24小时制分别显示“时时:分分:秒秒”,最小单位为秒。精确度5秒/月(与晶振有关,可加电容调整)。 二.走时调整: 长按按键0。5秒钟以上,可以进入闹钟和时间设置状态,按“闹钟分”、“闹钟时”、“走时分”、“走时时”的顺序进行设置。 设置方法为: 1、 走时和闹钟调整: 走时状态,长按按键0。5秒钟以上后松开按键,“闹钟分”以0。3秒的速度闪烁显示,再次按下按键不要松开,“闹钟分”会快速的从00到59之间变化,从而达到快速设定时间的目的。当显示到需要的时间时松开按键,会自动进入到设置“闹钟时”的状态,可以同样的方法设置“闹钟时”。当松开按键后此时有两种选择,一是长按按键退出闹钟设置状态,返回到正常走时;二是短按一下按键进入继续设置时间的状态。
设置方法相同。 注意:为了对只要设置闹钟时不影响电子钟的走时精确度,在设置闹钟的时候,秒钟位走时不停止,正常显示,但对闹钟设置无任何影响。在进入走时设置后自动把秒设置为00秒,以确保可以在设置后从00秒开始走时,有利于提高我们调时的准确性。 2、 闹钟开关设置:只要短按一下按键即可开启或关闭闹钟。 走时状态,短按一下按键可以查询闹钟时间,约显示两秒钟后,自动设置闹钟开关。其中00为闹钟关闭状态、01为闹钟开启状态。设置完毕自动退出。 注意:如果原来闹钟为开启状态则关闭闹钟,反之,开启闹钟。第一次通电工作时默认为闹钟开启。 硬件电路实现 电路如图2所示,因有秒钟位,末设置秒点闪烁,如果要秒位可在VCC与数码管的DP之间接一个1K电阻即可达到12:00显示的效果。
图2
电子钟原理图 电路所用的元件较少,根据实际情况可以调整R8的阻值来改变数码管亮度。 本人所做的实物如图3、图4所示。
图3 实物图
图4 实物图 源程序 源程序如下: ORG
0000H
;程序开始入口
LJMP START
ORG
0003H
;外中断0中断程序入口
RETI
ORG 000BH
;定时器T0中断程序入口
LJMP INTT0
;跳至INTTO执行
ORG 0013H
;外中断1中断程序入口
RETI
ORG
001BH
;定时器T1中断程序入口
LJMP INTT1
ORG 0023H
;串行中断程序入口地址
RETI ;---------------主程序----------------------;
START:MOV R0,#70H
;70给R0,清70-7FH显示内存
MOV R7,#0FH
CLEARDISP:MOV @R0,#00H
;0给R0中的数为地址的内存中存放(70H)
INC R0
DJNZ R7,CLEARDISP
MOV 78H,#2
;默认时间为12:00,闹钟5:00
MOV
79H,#1
MOV 74H,#2
;防止上电时数码管显示00小时
MOV 75H,#1
MOV 66H,#1
;中断退出时66H为1时,分、时计时单元数据移入显存标志
MOV 68H,#1
;上电默认闹钟开状态
MOV 7DH,#6
;闹钟时十位
MOV 7CH,#3
MOV 69H,#0
MOV 7AH,#0AH
;放入"熄灭符"数据
MOV TMOD,#11H
;设T0、T1为16位定时器
MOV
TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH
SETB EA
;总中断开放
SETB ET0
;允许T0中断
SETB TR0
;T0定时器开始计时
MOV R4,#14H
;1秒定时用初值(50MS×20)
START1:LCALL DISPLAY
;显示子程序
LCALL BEEP
;闹钟查询
JNB P1.7,SETTIME ;P1.7口为0时转时间调整程序
JMP START1
;P1.7口为1时跳回START1 ;-----------------------时间闹钟调整系统--------------------------;
NFLAG:MOV
A,68H
;设置闹钟开关状态
CJNE
A,#1,BEE68
MOV
68H,#0
JMP
E6
BEE68:MOV
68H,#1
E6:MOV
66H,#8
;中断退出66H不为1时分、时计时单元数据移入显存标志
MOV
72H,7BH
MOV
73H,7CH
MOV
74H,7DH
MOV 75H,7EH
LCALL
DDL
LCALL
DDL
MOV
72H,68H
MOV
73H,69H
MOV
74H,7AH
MOV
75H,7AH
LCALL
DDL
LCALL
DDL
MOV
66H,#1
LJMP
START1
SETTIME:LCALL
DDL
JB
P1.7,NFLAG
;键按下时间小于1秒,设置闹钟开关状态并查看闹钟时间,不关走时,确保准确,大于1秒调时
MOV
TL1,#0B0H ;T1闪烁定时初值
MOV
TH1,#3CH
MOV
R2,#06H
;进入调时状态,赋闪烁定时初值
MOV 66H,#8
;调闹钟时保持走时,关闭时钟显示数据
SETB
ET1
;允许T1中断
SETB
TR1
;开启定时器T1
SET1:LCALL
DISPLAY
;调用显示,防止键按下无显示
JNB
P1.7,SET1 ;P1.7口为0等待键释放
MOV
R5,#00H ;清设置类型闪烁标志
SETN1:INC
R5 ;闹钟分调整
SET5:LCALL
DISPLAY
JB
P1.7,SET5
SEETN1:LCALL
DDL
;有键按下大于1秒分时间连续加(0.5秒加1),小于1秒转调时状态
JB
P1.7,SET6 ;键释放查询,键释放自动转调时
MOV
R0,#7CH
LCALL ADD1
MOV
A,R3
CLR
C
CJNE A,#60H,HHN1
HHN1:JC SEETN1
LCALL CLR0
JMP
SEETN1
SET6:INC R5
;闹钟时调整
SEET6:LCALL
DISPLAY
JB
P1.7,SEET6
SEETNH1:LCALL
DDL
JB
P1.7,SETF
MOV
R0,#7EH
LCALL
ADD1
MOV
A,R3
CLR
C
CJNE A,#24H,HOUU1
HOUU1:JC
SEETNH1
LCALL CLR0
JMP
SEETNH1
SETF:LCALL
DISPLAY
JB
P1.7,SETF
LCALL
DDL
JNB
P1.7,SETOUT ;短按调时,长按退出
CLR
ET0
CLR
TR0
MOV
70H,#00H ;设定后的时间从00秒开始走时
MOV
71H,#00H
INC
R5
SET3:LCALL
DISPLAY
JB
P1.7,SET3
SETMM:LCALL
DDL
JB
P1.7,SET4
MOV
R0,#77H
LCALL ADD1
MOV
A,R3
CLR
C
CJNE
A,#60H,MMH
MMH:JC
SETMM
LCALL CLR0
AJMP
SETMM
SET4:INC
R5
SEET4:LCALL
DISPLAY
JB
P1.7,SEET4
SETHH:LCALL
DDL
JB
P1.7,SETOUT1
MOV
R0,#79H
LCALL
ADD1
MOV
A,R3
CLR
C
CJNE A,#24H,HOUU
HOUU:JC
SETHH
LCALL CLR0
AJMP
SETHH
SETOUT1:SETB
ET0
SETB
TR0 ;计时开始
SETOUT:MOV
R5,#00H ;清设置类型闪烁标志
CLR
TR1 ;关闭T1
CLR
ET1 ;关T1中断
MOV
66H,#1
SETOUT2:LCALL
DISPLAY
JNB
P1.7,SETOUT2
LJMP START1 ;--------------------------延时1秒钟-----------------------;
DDL:MOV
18H,#36
DDL0:MOV
17H,#239
DDL1:LCALL
DISPLAY
DJNZ
17H,DDL1
DJNZ
18H,DDL0
RET ;----------------------------T0中断程序------------------------;
INTT0: PUSH ACC
;打包
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0B7H
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADDC A,TH0
MOV TH0,A
SETB TR0
DJNZ
R4, OUTT0 ;20次中断未到中断退出
ADDSS: MOV
R4,#14H
;20次中断到(1秒)重赋初值
MOV R0,#71H
;指向秒计时单元(70-71H)
ACALL ADD1
;调用加1程序(加1秒操作)
MOV A,R3
;秒数据放入A(R3为2位十进制数组合)
CLR C
;清进位标志
CJNE A,#60H,ADDMM ADDMM: JC |