一 设计任务
利用定时器/计数器中断和静态显示或动态显示,实现电子钟的时分秒精确走时和校准。时间显示用四个数码管分别显示时和分,秒用点表示,在时和分的中间闪动时间显示格式:如12.40。. 时间校准用2个键实现:一个键K1做移位选择键(选中要修改的位,选中的位用闪烁指示)。一个键K2做加1键(对选中的位进行加1修改)。 二 设计要求
(1)时间走时准确,每天误差不能超过5秒。
(2)仿照电子表的校时功能,校时修改时,被修改为能闪烁显示,按键要灵敏。
(3)若最高位为0,高位能灭零显示。
三 程序设计方法
(1)先做资源分配,实现显示时间存储单元的默认数字。
(2)增加定时器./计数器中断服务子程序,定时器/计数器工作是能正确改变时间存储器的值并实现显示。
(3)增加按键子程序,按键要能准确修改时间存储单元。
四 软件流程图
(1)主程序流程图
(2)按键子程序流程图
五、心得体会
通过此次多功能数字钟设计,将从书本上学到的知识用于实践,进一步加深了对单片机的了解,让我对程序的设计有了更多的信心。在设计的过程中遇到问题,可以说得是困难重重,毕竟是第一次做单片机的课程设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次课程设计,我懂得了理论与实际相结合非常重要,只有理论知识是远远不够的,必须把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。这为自己今后进一步深化学习,积累了一定宝贵的经验。把知识转化为能力的实际训练。培养了我运用所学知识解决实际问题的能力。
总的来说,这次课程设计还是比较成功的,在设计中遇到了很多问题,最后在同学的热心的指点下,终于迎刃而解。最后,对给过我帮助的指导老师和同学再次表示忠心的感谢!
附:六 实验程序
NUM DATA 30H ;1秒内T0中断次数
HOUR DATA 31H ;"时"存储单元
MINUTE DATA 32H ;"分"存储单元
SECOND DATA 33H ;"秒"存储单元
DSBUF1 DATA 34H ;显示缓冲区高字节
DSBUF2 DATA 35H ;显示缓冲区低字节
TIME DATA 36H ;修改时间位记数单元
KEY1 BIT P1.6 ;按键1
KEY2 BIT P1.4 ;按键2
MODE BIT 09H ;系统模式标志位
FLAG BIT 10H ;"秒"显示的标志位
ZERO BIT 11H ;时高位灭零控制位,0为灭零,1为不灭零
HH BIT 12H
; 主程序
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ITP0 ;定时器T0中断入口
ORG 0030H
MAIN: MOV SP,#7FH
MOV TMOD,#01H ;贝克曼梁设置定时器工作方式为方式1
MOV NUM,#20 ;转入T0中断次数
CLR HH
CLR A
MOV TIME,A ;修改时间位记数清0
MOV HOUR,A ;"时"单元清0
MOV MINUTE,A ;"分"单元清0
MOV SECOND,A ;"秒"单元清0
CLR FLAG ;"秒"显示的标志位为低电平
CLR MODE ;系统模式标志位为低电平
CLR POINT ;"秒"点闪烁标志位为低电平
SETB ET0 ;允许定时器0申请中断
SETB EA ;CPU开中断
MOV TH0,#3CH ;给T0装入记数初值
MOV TL0,#0B0H
SETB TR0 ;启动定时器0
MOV P1,#0FFH ;P1口初始化
KEYA: JB KEY1,KEYB ;判断KEY1是否按下
JNB KEY1,$ ;等待KEY1松开
LCALL KEYA_DEAL ;调用KEY1处理程序
KEYB: JB KEY2,KEND ;判断KEY2是否按下
JNB KEY2,$ ;等待KEY2松开
LCALL KEYB_DEAL ;调用KEY2处理程序
KEND: SJMP KEYA ;跳回继续查键
; 按键1处理子程序
KEYA_DEAL: SETB MODE ;系统模式标志位置位
CLR FLAG ;"秒"显示的标志位清0
INC TIME ;修改时间位记数增1
CLR ZERO
MOV A, TIME
CJNE A, #01, KEYA_B
SETB ZERO
KEYA_B: CJNE A, #05, KEYA_END
MOV TIME,#00 ;修改时间位归0
MOV SECOND,#00 ;"秒"单元清0
CLR MODE ;系统模式标志位清零
KEYA_END: RET
; 按键2处理子程序
KEYB_DEAL: JB MODE,KEYB_A ;判断处于何种系统模式
CPL FLAG ;"秒"显示的标志位取反
电子定时器
LJMP KEYB_END
KEYB_A: MOV A, TIME
CJNE A,#01,KA ;修改"时"高位?
MOV A , HOUR ;
ANL A,#0F0H ;取"时"高位
ADD A,#10H ;"时"高位加1
ANL HOUR,#0FH ;取"时"低位
ORL HOUR,A ;"时"高低位合并
CJNE A,#30H,KEY0 ;判断"时"高位是否为3
ANL HOUR,#0FH ;是,则"时"高位清0
LJMP KEYB_END
KA: CJNE A,#02,KB ;修改"时"低位?
MOV A, HOUR
ANL A,#0FH ;取"时"低位
ADD A,#01H ;"时"低位加1
ANL HOUR,#0F0H ;取"时"高位
ORL HOUR,A ;"时"高低位合并
MOV C, HH
JNC KEY3
CJNE A , #04H,KEYB_END
SJMP KEY4
KEY3: CJNE A,#0AH,KEYB_END ;判断"时"低位是否为10
KEY4: ANL HOUR,#0F0H ;是,则"时"低位清0
clr HH
LJMP KEYB_END
KB: CJNE A,#03,KC ;修改"分"高位
MOV A, MINUTE
ANL A,#0F0H ;取"分"高位
ADD A,#10H ;"分"高位加1
ANL MINUTE,#0FH ;取"分"低位
ORL MINUTE,A ;"防盗机箱分"高低位合并
CJNE A,#60H,KEYB_END ;判断"分"高位是否为管理农场6
ANL MINUTE,#0FH ;是,则"分"高位清0
LJMP KEYB_END
KC: CJNE A,#04,KEYB_END ;修改"分"低位
MOV A, MINUTE
ANL A,#0FH ;取"分"低位
ADD A,#01H ;"分"低位加1
ANL MINUTE,#0F0H ;取"分"高位
ORL MINUTE,A ;"分"高低位合并
CJNE A,#0AH,KEYB_END ;判断"分"低位是否为10
ANL MINUTE,#0F0H ;是,则"分"低位清0
SJMP KEYB_END
滚珠滑轨
KEY0: CJNE A,#20H,KEYB_END
悬浮床
SETB HH
KEYB_END: RET
; 定时器T0中断服务程序
ITP0: PUSH PSW ;保护现场
PUSH ACC
CLR TR0 ;T0停止记数
MOV A,#0B0H ;给T0赋初值
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADDC A,TH0
MOV TH0,A
SETB TR0 ;T0开始记数
DJNZ NUM,RETURN ;1s未到,跳转
MOV NUM,#20 ;重装中断次数