时钟计时器.docx
《时钟计时器.docx》由会员分享,可在线阅读,更多相关《时钟计时器.docx(35页珍藏版)》请在冰点文库上搜索。
![时钟计时器.docx](https://file1.bingdoc.com/fileroot1/2023-8/4/a7c964a8-5c3f-4ffe-ab49-7e54c187d9b0/a7c964a8-5c3f-4ffe-ab49-7e54c187d9b01.gif)
时钟计时器
摘要
本设计为时钟计时器,用AT89C52单片机及6位7段共阳LED数码管显示时、分、秒,以24小时计时方式运行,能整点提醒(蜂鸣),使用按键开关可实现时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒(蜂鸣器)的功能。
采用11.597MHZ的晶振,能提高秒计时的精确性。
选用的是动态扫描法来实现LED的显示。
程序较为复杂:
有主调用程序;计时及秒表中断程序;显示子程序;调时与秒表功能程序以及闹钟时间设定程序。
关键词:
AT89C52;7段共阳极LED;蜂鸣。
目录
设计要求1
1.方案论证与对比1
2.单元电路的设计2
2.1LED显示电路的设计2
2.2蜂鸣器电路2
2.3复位电路2
3.系统程序的设计3
3.1主程序3
3.2显示子程序3
3.3定时器T0中断服务程序4
3.4定时器T1中断服务程序4
3.5调时功能程序5
3.6秒表功能程序5
3.7闹钟时间设定功能程序5
4.调试6
4.1硬件调试6
4.2软件调试6
5.详细仪器清单7
6.总结及致谢8
6.1总结8
6.2致谢8
参考文献9
附录一时钟计时器系统电路图10
附录二时钟计时器源程序11
时钟计时器的设计
设计要求:
时钟计时器要求用单片机及6位LED数码显示时、分、秒,以24小时计时方式运行,能整点提醒(蜂鸣),使用按键开关可实现时、分调整,秒表/时钟功能转换,省电(关闭显示)及定时设定提醒的功能。
方案论证与对比
为了实现LED显示器的数字显示,可以采用静态扫描和动态扫描显示法两种,但由于静态显示法需要数据锁存器的硬件,接口较复杂,且本设计只要求显示6位,系统也没有其他复杂处理任务,所以决定采用动态扫描法莱实现LED的显示。
时钟计时器采用AT89C52单片机最小化应用设计;P1口输出段码数据;P3.0~P3.5作列扫描输出;P2.5、P2.6和P2.7接按钮开关,用于调时及功能设置;P2.4接5V的小蜂鸣器,用于定时提醒和整点到时提醒等;采用11.597MHZ的晶振。
时钟计时器硬件系统的总体原理框图如图1所示:
图1硬件系统的总体设计框图
单元电路的设计
LED显示电路的设计
本设计采用6个7段共阳极LED显示器,用三极管作电源驱动输出为共阳LED数码管的列扫描提供驱动电压。
如图2所示:
图2LED显示电路图
蜂鸣器电路
本设计的蜂鸣器电路如图3所示:
图3蜂鸣器电路
复位电路
复位电路如图4所示:
图4复位电路
系统程序的设计
主程序
本设计中计时采用定时器T0中断完成,秒表使用定时器T1中断完成。
主程序循环调用显示子程序和查键子程序,当端口有开关按下时,转入相应功能程序。
其主程序执行流程如图5所示:
图5主程序流程图
显示子程序
时间显示子程序每次显示6个连续内存单元的十进制BCD码数据,首地址在调用显示程序时先指定。
内存中50H~55H为闹钟定时单元,60H~65H为秒表计时单元,70H~75H为时钟显示单元。
显示时,先取出内存地址中的数据,然后查得对应的显示用短码从P1口输出,P3口将对应的数码管选中供电,就能显示该地址单元的数据值。
为了显示小数点及“—”等特殊字符,在显示班级和计时时应采用不同的显示子程序。
定时器T0中断服务程序
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断进入后先进行定时中断初值校正,当中断累计20次(即50ms*20=1s)时,对秒计数单元进行加1操作。
时钟计数单元地址分别在70H~71H(秒)、76H~77H(分)、78H~79H(时)中,最大计时值为23时59分59秒。
7AH单元存放“熄灭符”数据(#0AH),用于时间调整时的闪烁功能。
在计数单元中,采用十进制BCD码计数,满10进位。
T0中断计时程序流程图如图6所示:
图6T0中断计时程序流程图
定时器T1中断服务程序
T1中断程序用于指示时间调整单元数字的闪亮或秒表计数,在时间调整状态下,每过0.3s左右,将对应调整单元的显示数据换成“熄灭符”数据。
这样,在调整时间时,对应调整单元的显示数据会间隔闪亮。
在秒表计数时,每10ms中断1次,计数单元加1,每100次为1s。
秒表计数单元地址在60H~61H(10毫秒)、62H~63H(秒)、64H~65H(分)中,最大计数值为99分59.99秒。
T1中断服务程序流程图如图7所示:
图7T1中断服务程序流程图
调时功能程序
调时功能程序的设计方法是:
按下P2.5按键,若按下时间小于1s,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作。
此时计时器停止走动。
当再按下P2.5口按键时,若按下时间小于0.5s,则时间加1分(钟);若按下时间大于0.5s,则进入小时调整状态。
按下P2.6可进行减1调整。
在小时调整状态下,当按键按下时间大于0.5s时,退出调整状态,时钟从0s开始计时。
秒表功能程序
在正常时钟状态下,若按下P2.6口按键,则进行时钟/秒表显示功能的转换,秒表中断计时程序启动,显示首地址改为60H,LED将显示秒表计时单元60H~65H中的数据。
按下P2.7口按键,可实现秒表清0、秒表启动、秒表暂停功能;当再按下P2.6口按键,关闭T1秒表中断计时,显示首地址又改为70H,恢复正常时间显示功能。
闹钟时间设定功能程序
在正常时钟状态下按下P2.5口的按键开关,进入设定闹钟调分状态,显示首地址改为50H。
LED将显示50H~55H中的闹钟设定时间,显示式样为00:
00:
—,其中高2位代表时,低2位代表分,在定时闹铃时精确到分。
按P2.7分加1,按P2.5分减1。
再按P2.6口开关,进入时调整状态,显示式样为00:
00:
—0;再按P2.7时加1按P2.5时减1。
再按下P2.6口退出闹钟设定状态,恢复正常时间显示。
在闹铃是,可按下P2.5键使蜂鸣停止。
调试
硬件调试
先检查了电路板焊接情况,然后上电用万用表测试了各个芯片及二极管电压,开始电源指示灯不亮,然后发现跳帽没装,装上后指示灯亮,各个器件都没有问题。
再下载了几个调试程序到单片机中,看是否能够装载运行程序,结果是都能产生想要的现象。
软件调试
在软件调试工具KeilC51中编译连接源程序,生成HEX文件,下载到单片机中,打开电源开关,数码管显示日期班级学号,然后从0开始计时,开始调试闹钟是始终没有反应,仔细检查了一下后发现蜂鸣器接入电路要装跳帽,装上后程序调试成功。
详细仪器清单
表格1仪器清单
仪器名称
数量
AT89C52单片机芯片
1
7段共阳数码管
6
1K电阻
8
680Ω电阻
8
三极管
6
10Ω电阻
1
11.597MHZ晶振
1
蜂鸣器
1
30pF电容
2
2.2uF电容
1
按键开关
6
总结及致谢
总结
这次的单片机课程设计让我更深入的理解了单片机的应用及汇编语言编程,这过程中有很多困难,先是电路元件必须焊接正确,有一个电容正负级焊反了;放置芯片时要注意保护引脚,我的一个芯片断了一只脚;然后是程序太复杂……有问题也有收获,通过自己设计时钟计时器,把知识运用于实践,锻炼了动手能力,为以后工作奠定坚实的基础。
致谢
在这次课程设计中受到了很多老师与同学的帮助,我们的任课老师们对我们细心教导,耐心讲解,及时解决设计过程中遇到的困难,给我们领器件,讲程序原理。
同学帮忙检查调试板子,老师忙不过来时就问同学,在这过程中互助让我们更加团结。
我要感谢辛苦的老师们,感谢友爱的同学,感谢系里给我们动手实践的机会。
参考文献
[1]张鑫.单片机原理及应用.[M].北京:
电子工业出版社,2005.
[2]楼然苗,李光飞.单片机课程设计指导.[C].北京:
北京航空航天大学出版社,2007
[3]汪敏,周鹏.单片机实验与实践.北京航空航天大学出版社,2007.7
[4]张鑫,陈书谦.单片机原理及运用.电子工业出版社,2005.8
[5]李广第.单片机基础.第一版.北京航空航天大学出版社,1997.7
附录一时钟计时器系统电路图
其系统硬件电路如图8所示:
图8秒表/时钟计时器电路原理图
附录二时钟计时器源程序
DISPFIRSTEQU30H;显示首址存放单元
BELLEQUP2.4;小喇叭
CONBSEQU2FH;存放报时次数
ORG0000H;程序执行开始地址
LJMPSTART;跳到标号START执行
ORG0003H;外中断0中断程序入口
RETI;外中断0中断返回
ORG000BH;定时器T0中断程序入口
LJMPINTT0;跳至INTTO执行
ORG0013H;外中断1中断程序入口
RETI;外中断1中断返回
ORG001BH;定时器T1中断程序入口
LJMPINTT1;跳至INTT1执行
ORG0023H;串行中断程序入口地址
RETI;串行中断程序返回
;****************************************
;;以下程序开始;;
;****************************************
;整点报时用
QQQQ:
MOVA,#10H
MOVB,79H
MULAB
ADDA,78H
MOVCONBS,A
BSLOOP:
LCALLDS20MS
LCALLDL1S
LCALLDL1S
LCALLDL1S
DJNZCONBS,BSLOOP
CLR08H;清整点报时标志
AJMPSTART1
;****************************************
;;主程序开始;;
;****************************************
START:
LCALLST;上电显示年月日及班级学号
MOVR0,#00H;清00H-7FH内存单元
MOVR7,#80H
CLEARDISP:
MOV@R0,#00H
INCR0;
DJNZR7,CLEARDISP;
MOV20H,#00H;清20H(标志用)
MOV7AH,#0AH;放入"熄灭符"数据
MOVTMOD,#11H;设T0、T1为16位定时器
MOVTL0,#0B0H;50MS定时初值(T0计时用)
MOVTH0,#3CH;50MS定时初值
MOVTL1,#0B0H;50MS定时初值(T1闪烁定时用)
MOVTH1,#3CH;50MS定时初值
SETBEA;总中断开放
SETBET0;允许T0中断
SETBTR0;开启T0定时器
MOVR4,#14H;1秒定时用计数值(50MS×20)
MOVDISPFIRST,#70H;显示单元为70-75H
START1:
LCALLDISPLAY;调用显示子程序
MOVP2,#0f7H
JNBP2.5,SETMM1;P2.5口为0时转时间调整程序
JBP2.6,ji
LCALLFUNSS
ji:
JNBP2.7,FUNPT;秒表STOP,PUSE,CLR
MOVP2,#0fbH
JNBP2.5,TSFUN;定时闹铃设定
JB08H,QQQQ
AJMPSTART1;P2.5口为1时跳回START1
FUNPT:
LJMPFUNPTT
TSFUN:
LCALLDS20MS
MOVP2,#0FBH
JBP2.5,START1
WAIT113:
JNBP2.5,WAIT113;等待键释放
JB05H,CLOSESP;闹铃已开的话,关闹铃
MOVDISPFIRST,#50H
MOV50H,#0CH;闹铃设定时显示格式00:
00:
-
MOV51H,#0AH;"黑"
DSWAIT:
SETBEA
LCALLDISPLAY
JNBP2.7,DSFINC;分加1
JNBP2.5,DSDEC;分减1
MOVP2,0FBH
JNBP2.6,DSSFU;进入时调整
AJMPDSWAIT
CLOSESP:
CLR05H;关闹铃标志
CLRBELL
AJMPSTART1
DSSFU:
LCALLDS20MS;消抖
JBP2.6,DSWAIT
LJMPDSSFUNN;进入时调整
SETMM1:
LJMPSETMM;转到时间调整程序SETMM
DSFINC:
LCALLDS20MS;消抖
JBP2.7,DSWAIT
DSWAIT12:
LCALLDISPLAY;等键释放
JNBP2.7,DSWAIT12
CLREA
MOVR0,#53H
LCALLADD1;闹铃设定分加1
MOVA,R3;分数据放入A
CLRC;清进位标志
CJNEA,#60H,ADDHH22;
ADDHH22:
JCDSWAIT;小于60分时返回
ACALLCLR0;大于或等于60分时分计时单元清0
AJMPDSWAIT
DSDEC:
LCALLDS20MS;消抖
JBP2.5,DSWAIT
DSWAITEE:
LCALLDISPLAY;等键释放
JNBP2.5,DSWAITEE
CLREA
MOVR0,#53H;
LCALLsub1;闹铃设定分减1
LJMPDSWAIT
FUNSS:
LCALLDS20MS
JBP2.6,START11
WAIT11:
JNBP2.6,WAIT11
CPL03H
JNB03H,TIMFUN
MOVDISPFIRST,#60H;显示秒表数据单元
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
MOVTL1,#0F0H;10MS定时初值()
MOVTH1,#0D8H;10MS定时初值
SETBTR1
SETBET1
START11:
LJMPSTART1
TIMFUN:
MOVDISPFIRST,#70H;显示时钟数据单元
CLRET1
CLRTR1
START12:
LJMPSTART1
;以下秒表暂停\清零功能程序
;按下P2.7暂停或清0,按下P2.6退出秒表回到时钟计时
FUNPTT:
LCALLDS20MS
JBP2.7,START12
WAIT22:
JNBP2.7,WAIT21
CLRET1
CLRTR1
WAIT33:
JNBP2.6,FUNSS
JBP2.7,WAIT31
LCALLDS20MS
JBP2.7,WAIT33
WAIT66:
JNBP2.7,WAIT61
MOV60H,#00H
MOV61H,#00H
MOV62H,#00H
MOV63H,#00H
MOV64H,#00H
MOV65H,#00H
WAIT44:
JNBP2.6,FUNSS
JBP2.7,WAIT41
LCALLDS20MS
JBP2.7,WAIT44
WAIT55:
JNBP2.7,WAIT51
SETBET1
SETBTR1
AJMPSTART1
WAIT21:
LCALLDISPLAY
AJMPWAIT22
WAIT31:
LCALLDISPLAY
AJMPWAIT33
WAIT41:
LCALLDISPLAY
AJMPWAIT44
WAIT51:
LCALLDISPLAY
AJMPWAIT55
WAIT61:
LCALLDISPLAY
AJMPWAIT66
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;1秒计时程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0:
PUSHACC;累加器入栈保护
PUSHPSW;状态字入栈保护
CLRET0;关T0中断允许
CLRTR0;关闭定时器T0
MOVA,#0B7H;中断响应时间同步修正
ADDA,TL0;低8位初值修正
MOVTL0,A;重装初值(低8位修正值)
MOVA,#3CH;高8位初值修正
ADDCA,TH0
MOVTH0,A;重装初值(高8位修正值)
SETBTR0;开启定时器T0
DJNZR4,OUTT0;20次中断未到中断退出
ADDSS:
MOVR4,#14H;20次中断到(1秒)重赋初值
CPL07H;闹铃时间隔呜叫用
MOVR0,#71H;指向秒计时单元(71H-72H)
ACALLADD1;调用加1程序(加1秒操作)
MOVA,R3
CLRC;清进位标志
CJNEA,#60H,ADDMM;
ADDMM:
JCOUTT0;小于60秒时中断退出
ACALLCLR0;大于或等于60秒时对秒计时单元清0
MOVR0,#77H;指向分计时单元(76H-77H)
ACALLADD1;分计时单元加1分钟
MOVA,R3;分数据放入A
CLRC;清进位标志
CJNEA,#60H,ADDHH
ADDHH:
JCOUTT0;小于60分时中断退出
ACALLCLR0
LCALLDS20MS;正点报时
SETB08H
MOVR0,#79H;指向小时计时单元(78H-79H)
ACALLADD1;小时计时单元加1小时
MOVA,R3;时数据放入A
CLRC;清进位标志
CJNEA,#24H,HOUR
HOUR:
JCOUTT0;小于24小时中断退出
ACALLCLR0;大于或等于24小时小时计时单元清0
OUTT0:
MOV72H,76H;中断退出时将分、时计时单元数据移
MOV73H,77H;入对应显示单元
MOV74H,78H
MOV75H,79H
LCALLBAOJ
POPPSW;恢复状态字(出栈)
POPACC;恢复累加器
SETBET0;开放T0中断
RETI;中断返回
;****************************************
;;闪动调时程序\秒表功能程序;;
;****************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1:
PUSHACC;中断现场保护
PUSHPSW;
JB03H,MMFUN;=1时秒表
MOVTL1,#0B0H;装定时器T1定时初值
MOVTH1,#3CH;
DJNZR2,INTT1OUT;0.3秒未到退出中断(50MS中断6次)
MOVR2,#06H;重装0.3秒定时用初值
CPL02H;0.3秒定时到对闪烁标志取反
JB02H,FLASH1;02H位为1时显示单元"熄灭"
MOV72H,76H;02H位为0时正常显示
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
INTT1OUT:
POPPSW恢复现场
POPACC
RETI;中断退出
FLASH1:
JB01H,FLASH2;01H位为1时,转小时熄灭控制
MOV72H,7AH;01H位为0时,"熄灭符"数据放入分
MOV73H,7AH
MOV74H,78H
MOV75H,79H
AJMPINTT1OUT;转中断退出
FLASH2:
MOV72H,76H
MOV73H,77H
MOV74H,7AH
MOV75H,7AH
AJMPINTT1OUT;转中断退出
MMFUN:
CLRTR1
MOVA,#0F7H
ADDA,TL1;低8位初值修正
MOVTL1,A;重装初值(低8位修正值)
MOVA,#0D8H;高8位初值修正
ADDCA,TH1
MOVTH1,A重装初值(高8位修正值)
SETBTR1;开启定时器T0
MOVR0,#61H;指向秒计时单元(71H-72H)
ACALLADD1;调用加1程序(加1秒操作)
CLRC
MOVA,R3
JZFSS1;加1后为00,C=0
AJMPOUTT01;加1后不为00,C=1
FSS1:
ACALLCLR0