电子钟专周报告.docx
《电子钟专周报告.docx》由会员分享,可在线阅读,更多相关《电子钟专周报告.docx(26页珍藏版)》请在冰豆网上搜索。
电子钟专周报告
单片微型计算机与接口技术
专周报告
题目
电子钟设计
班级
10261
学号
04号
姓名
尹荣超
指导老师
傅林
完成时间
2012-5-31
成都电子机械高等专科学校电气与电子工程系
电子钟专周报告
一.实验目的
1.学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
2.设计任务及要求:
通过LCD液晶模块,进行时间显示,格式为“时:
分:
秒”;整点报时。
二.实验要求
A.基本要求:
1.通过LCD液晶模块,进行时间显示,格式为“时:
分:
秒
2.整点报时
3.清零
4.能对时,分,秒任意可调
B.扩展部分:
1.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
2.实现秒表功能
3.定时功能
三.实验设计分析
针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。
第三部分是软件部分:
先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
四.实验要求实现
A.电路设计
1.整体设计
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:
显示电路用8个共阴数码管分别显示,小时、分钟和秒,通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。
单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。
电路的总体设计框架如下:
2.分块设计
模块电路主要分为:
输入部分、输出部分,复位。
2.1输入部分
输入信号主要是各种模式选择和调整信号,由按键开关提供。
以下为输入部分样:
在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。
对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示:
2.2输出部分
本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。
本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图:
闹铃由P1.0端输出,模块如下:
各模块拼接组合,电路总体设计图如下:
B.程序设计
B.1程序总体设计
本实验用汇编程序完成.
NO
YES
结合电路图,程序设计的整体思路为:
接通电源,数码管显示时,分,秒。
并且走时显示LED灯每隔1秒改变一次明暗,此为正常工作模式。
以下为在该工作方式下模式选择的按键方式:
1.按4开始计时,秒表开始,停止
2.按1调整秒,按4继续计时
3.按2调整分,按4继续计时
4.按3调整时,按4继续计时
5.按5设置闹钟时间,再按5回复原有时间,闹铃声停止
6.按6所有设置清零
B.2程序主要模块
B.2.1不加扩展功能
主程序开始
显示时间
按1
按
2
按3
按4
按
5
按
6
调秒
调分
调时
开始
暂停、继续
清零
按4
按5
按4
是否有调
主程序
NO
YES
程序清单:
;12M晶振20100114调试完成0315修改20110303注释
STRTEQUP2.6
STPEQUP2.7
CLRREQUP3.0
SECEQUP3.5
MINEQUP3.6
HOUREQUP3.7
ORG00H
SJMPMAIN
ORG0BH
AJMPT0INT0
ORG30H
MAIN:
MOVSP,#60H
MOVR4,#20
MOVTMOD,#01H
MOVTH0,#03CH;#9EH12M晶振时定时初值取#3CB0H,还可细调,如TL=#0B7H,可以更准
MOVTL0,#0B0H;#58H
SETBET0
SETBEA
;MOV28H,#12
kS:
LCALLDISP;秒调整按键
JBSEC,KM
LCALLDISP
JNBSEC,$-3
AJMPSINC
kM:
JBMIN,KH;分调整按键
LCALLDISP
JNBMIN,$-3
AJMPMINC
KH:
JBHOUR,K1;时调整按键
LCALLDISP
JNBHOUR,$-3
AJMPHINC
SINC:
INC26H;秒调整
MOVA,26H
CJNEA,#60,SINC0
MOV26H,#0
SINC0:
AJMPKS
MINC:
INC27H;分调整
MOVA,27H
CJNEA,#60,MINC0
MOV27H,#0
MINC0:
AJMPKM
HINC:
INC28H;时调整
MOVA,28H
CJNEA,#24,HINC0
MOV28H,#0
HINC0:
AJMPKH
k1:
LCALLDISP;开始键
JBSTRT,K2
LCALLDISP
JNBSTRT,$-3
AJMPSTART
k2:
JBSTP,K3;暂停键
LCALLDISP
JNBSTP,STOP
K3:
JBCLRR,KS
LCALLDISP
JNBCLRR,CLEAR;清零键
AJMPKS
START:
SETBTR0;开始
AJMPK1
STOP:
CLRTR0;暂停
AJMPK2
CLEAR:
CLRTR0;清零
MOVA,#0
MOV26H,A
MOV27H,A
MOV28H,A
AJMPKS
DISP:
MOVA,26H
MOVB,#10
DIVAB
MOV20H,B;余数(秒个位数)
MOV21H,A;商(秒十位数)
MOVA,27H
MOVB,#10
DIVAB
MOV22H,B;余数(分个位数)
MOV23H,A;商(分十位数)
MOVA,28H
MOVB,#10
DIVAB
MOV24H,B;余数(时个位数)
MOV25H,A;商(时十位数)
MOVA,20H;秒个位
ACALLSEG7
MOVP0,A
CLRP2.0
ACALLDLY
SETBP2.0
MOVA,21H;秒十位
ACALLSEG7
MOVP0,A
CLRP2.1
ACALLDLY
SETBP2.1
MOVA,22H;分个位
ACALLSEG7
MOVP0,A
SETBP0.7
CLRP2.2
ACALLDLY
SETBP2.2
MOVA,23H;分十位
ACALLSEG7
MOVP0,A
CLRP2.3
ACALLDLY
SETBP2.3
MOVA,24H;时个位
ACALLSEG7
MOVP0,A
SETBP0.7
CLRP2.4
ACALLDLY
SETBP2.4
MOVA,25H;时十位
ACALLSEG7
MOVP0,A
CLRP2.5
ACALLDLY
SETBP2.5
RET
T0INT0:
MOVTH0,#03CH;#9EH;定时中断子程序。
重装定时常数
MOVTL0,#0B0H;#58H
DJNZR4,T0INTR;50msX20=1S,未满20次,跳出中断子程序
MOVR4,#20
INC26H;1S,秒存储单元内数+1
MOVA,26H
CJNEA,#60,T0INTR;未满60S,跳出中断。
MOV26H,#0;满60S,秒单元清零
INC27H;分+1
MOVA,27H
CJNEA,#60,T0INTR
MOV27H,#0
INC28H
MOVA,28H
CJNEA,#24,T0INTR
MOV28H,#0
T0INTR:
RETI
DLY10:
MOVR3,#30
D0:
ACALLDLY
DJNZR3,D0
RET
DLY:
MOVR7,#2
D1:
MOVR6,#40
DJNZR6,$
DJNZR7,D1
RET
SEG7:
INCA
MOVCA,@A+PC
RET
DB03FH;0共阴
DB006H;1
DB05BH;2
DB04FH;3
DB066H;4
DB06DH;5
DB07DH;6
DB007H;7
DB07FH;8
DB06FH;9
END
总体电路图:
加上整点提醒,响1S,闹铃响3S,定时整点总程序如下:
STRTEQUP2.6
STPEQUP2.7
CLRREQUP3.0
SECEQUP3.5
MINEQUP3.6
HOUREQUP3.7
ORG00H
AJMPMAIN
ORG0BH
AJMPT0INT
ORG1BH
AJMPT1INT
ORG30H
MAIN:
MOVSP,#60H
MOVR4,#20
MOVTMOD,#11H
MOVTH0,#03CH;#9EH定时初值取#3CB0H,还可细调如TL=#0B7H,可以更准
MOVTL0,#0B0H;#58H
MOVTH1,#0FEH
MOVTL1,#0CH
SETBEA
SETBET0
SETBET1
kS:
ACALLDISP
ACALLALARM
JBSEC,KM;秒调整按键
ACALLDISP
JNBSEC,$-2
AJMPSINC
kM:
JBMIN,KH;分调整按键
ACALLDISP
JNBMIN,$-2
AJMPMINC
KH:
JBHOUR,K1;时调整按键
ACALLDISP
JNBHOUR,$-2
AJMPHINC
SINC:
JB7FH,SINC_A
INC26H;秒调整
MOVA,26H
CJNEA,#60,SINC0
MOV26H,#0
AJMPSINC0
SINC_A:
INC36H;闹秒调整
MOVA,36H
CJNEA,#60,SINC0
MOV36H,#0
SINC0:
AJMPKS
MINC:
JB7FH,MINC_A
INC27H;分调整
MOVA,27H
CJNEA,#60,MINC0
MOV27H,#0
MINC_A:
INC37H;闹分调整
MOVA,37H
CJNEA,#60,MINC0
MOV37H,#0
MINC0:
AJMPKM
HINC:
JB7FH,HINC_A
INC28H;时调整
MOVA,28H
CJNEA,#24,HINC0
MOV28H,#0
HINC_A:
INC38H;闹时调整
MOVA,38H
CJNEA,#24,HINC0
MOV38H,#0
HINC0:
AJMPKH
k1:
ACALLDISP;开始键
JBSTRT,K2
ACALLDISP
JNBSTRT,$-2
AJMPSTART
k2:
JBSTP,K3;暂停键
ACALLDISP
JNBSTP,$-2
AJMPCL_AL
K3:
JBCLRR,KS0
ACALLDISP
JNBCLRR,CLEAR;清零键
KS0:
AJMPKS
START:
CPLTR0;开始/暂停
SETB7DH;7DH为开始键按下标志,此作为允许闹铃标志
AJMPK1
CL_AL:
CPL7FH;7FH作时钟和闹铃标志位
AJMPK2
CLEAR:
CLRTR0;清零
MOVA,#0
MOV26H,A
MOV27H,A
MOV28H,A
MOV36H,A
MOV37H,A
MOV38H,A
AJMPKS
DISP:
JB7FH,DISP_A
MOV29H,26H;秒送秒显示缓存
MOV2AH,27H
MOV2BH,28H
AJMPDISP1
DISP_A:
MOV29H,36H
MOV2AH,37H
MOV2BH,38H
DISP1:
MOVA,29H
MOVB,#10
DIVAB
MOV20H,B;余数(秒个位数)
MOV21H,A;商(秒十位数)
MOVA,2AH
MOVB,#10
DIVAB
MOV22H,B;余数(分个位数)
MOV23H,A;商(分十位数)
MOVA,2BH
MOVB,#10
DIVAB
MOV24H,B;余数(时个位数)
MOV25H,A;商(时十位数)
MOVA,20H;秒个位
ACALLSEG7
MOVP0,A
CLRP2.0
ACALLDLY
SETBP2.0
MOVA,21H;秒十位
ACALLSEG7
MOVP0,A
CLRP2.1
ACALLDLY
SETBP2.1
MOVA,22H;分个位
ACALLSEG7
MOVP0,A
SETBP0.7
CLRP2.2
ACALLDLY
SETBP2.2
MOVA,23H;分十位
ACALLSEG7
MOVP0,A
CLRP2.3
ACALLDLY
SETBP2.3
MOVA,24H;时个位
ACALLSEG7
MOVP0,A
SETBP0.7
CLRP2.4
ACALLDLY
SETBP2.4
MOVA,25H;时十位
ACALLSEG7
MOVP0,A
CLRP2.5
ACALLDLY
SETBP2.5
RET
ALARM:
JNB7DH,RT;开始键未按下跳出
MOVA,28H;开机时,时分秒都为0,跳出
JZAL0M
AJMPALARM1
AL0M:
MOVA,27H
JZAL0S
AJMPALARM1
AL0S:
MOVA,26H
JZRT
ALARM1:
MOVA,28H;比较小时
CJNEA,38H,AL;不等返回,相等,转分钟比较
MOVA,27H;比较分钟?
CJNEA,37H,AL
MOVA,26H;比较秒
CJNEA,36H,AL
AJMPALARM2;转闹铃
AL:
;整点提醒
MOVA,28H
JZRT;小时不是00,判分是不是00
MOVA,27H
JNZRT;分不是00,跳出
MOVA,26H
JNZRT
AJMPALARM3;秒不为00,跳出。
为00,整点提醒
ALARM2:
;闹铃3S
SETBTR1
MOVR0,#0
AJMPRT
ALARM3:
;整点提醒1S
SETBTR1
MOVR0,#2
RT:
RET
T0INT:
MOVTH0,#03CH;定时中断子程序。
重装定时常数
MOVTL0,#0B0H
DJNZR4,T0INTR;50msX20=1S,未满20次,跳出中断子程序
MOVR4,#20
INC26H;1S,秒存储单元内数+1
INCR0;响铃时间
MOVA,26H
CJNEA,#60,T0INTR;未满60S,跳出中断。
MOV26H,#0;满60S,秒单元清零
INC27H;分+1
MOVA,27H
CJNEA,#60,T0INTR
MOV27H,#0
INC28H
MOVA,28H
CJNEA,#24,T0INTR
MOV28H,#0
T0INTR:
RETI
T1INT:
MOVTH1,#0FEH
MOVTL1,#0CH
CPLP1.0
CJNER0,#3,T1RTI;闹铃时间设为5秒
CLRTR1;关闹铃
T1RTI:
RETI
DLY:
MOVR7,#20
MOVR6,#25
DJNZR6,$
DJNZR7,$-4
RET
SEG7:
INCA
MOVCA,@A+PC
RET
DB03FH;0共阴
DB006H;1
DB05BH;2
DB04FH;3
DB066H;4
DB06DH;5
DB07DH;6
DB007H;7
DB07FH;8
DB06FH;9
END
C.程序调试及仿真
2利用Proteus仿真实验过程截图:
普通时间显示模式仿真图,表示:
2点过2分11
普通时间显示模式仿真图,表示:
设置闹钟2分钟
普通时间显示模式仿真图,表示:
整点报时
五.实验总结及感想
一分耕耘,一分收获。
只有亲自用实践来验证这句话,在能得其要领。
经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。
虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。
刚开始的时候完全不知道怎么做,毕竟我们学单片机的时间不长,这学期开的课我在整体思路模糊的情况下,在网上大量收集资料,各种与电子时钟相关的文章,我阅读了不少。
从中找到了不少对我有帮助,以及在老师的帮助下慢慢的思路开始清晰。
通过和同组同学细心的推敲下,慢慢的对设计有了信心。
对资料有了一定的积累后我们开始了我们的设计,一点点的写程序修改再修改,慢慢的错误减少直到正确。
然后开始画图,慢慢的修改,直到仿真成功。
成功的那时候真的很开心。
实验中遇到了不少问题,接下来总结一下,共同探讨。
1.开始写程序时由于对汇编语言有的指令不熟悉导致很多错误,经过老师指导及翻书查询把错误找出来,对症下药。
感觉到自己知识学得不牢靠,再以后的学习中严格要求自己。
2.按键问题。
我们的设计中,功能选择是通过按键开关实现的。
在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间,。
但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少。
3.P0口开关问题。
P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。
4.对画电路图有一定的难度。
主要是对元件不熟,不知道该选什么。
还有就是对元件的英文不知道,有的只有慢慢一个个找。
比如在选择的过程中,第一次没注意显示屏是共阴还是共阳,选了个共阳的没仿真出来,经过查找原因换了个共阴的就可以了。
以上就是实验中遇到的主要问题,基本上都找到了相应的解决之道。
整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!
附件:
A.Proteus电路图