基于单片机的数字钟设计与实现.docx

上传人:b****1 文档编号:10159678 上传时间:2023-05-24 格式:DOCX 页数:19 大小:222.17KB
下载 相关 举报
基于单片机的数字钟设计与实现.docx_第1页
第1页 / 共19页
基于单片机的数字钟设计与实现.docx_第2页
第2页 / 共19页
基于单片机的数字钟设计与实现.docx_第3页
第3页 / 共19页
基于单片机的数字钟设计与实现.docx_第4页
第4页 / 共19页
基于单片机的数字钟设计与实现.docx_第5页
第5页 / 共19页
基于单片机的数字钟设计与实现.docx_第6页
第6页 / 共19页
基于单片机的数字钟设计与实现.docx_第7页
第7页 / 共19页
基于单片机的数字钟设计与实现.docx_第8页
第8页 / 共19页
基于单片机的数字钟设计与实现.docx_第9页
第9页 / 共19页
基于单片机的数字钟设计与实现.docx_第10页
第10页 / 共19页
基于单片机的数字钟设计与实现.docx_第11页
第11页 / 共19页
基于单片机的数字钟设计与实现.docx_第12页
第12页 / 共19页
基于单片机的数字钟设计与实现.docx_第13页
第13页 / 共19页
基于单片机的数字钟设计与实现.docx_第14页
第14页 / 共19页
基于单片机的数字钟设计与实现.docx_第15页
第15页 / 共19页
基于单片机的数字钟设计与实现.docx_第16页
第16页 / 共19页
基于单片机的数字钟设计与实现.docx_第17页
第17页 / 共19页
基于单片机的数字钟设计与实现.docx_第18页
第18页 / 共19页
基于单片机的数字钟设计与实现.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的数字钟设计与实现.docx

《基于单片机的数字钟设计与实现.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字钟设计与实现.docx(19页珍藏版)》请在冰点文库上搜索。

基于单片机的数字钟设计与实现.docx

基于单片机的数字钟设计与实现

基于单片机的数字钟设计与实现

摘要:

本文介绍了基于单片机的数字钟的设计,详细讨论了它从软件上实现的过程,重点在时钟调整的方式:

查询和中断的比较,然后,对数字钟的稳定性和精确性作了相关的讨论。

在文章的最后,给出了采用中断方式实现的数字钟的源程序。

关键字:

单片机,数字钟,数据缓冲区,中断,定时,消抖

一、引言

在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。

单片机小的系统结构几乎是所有具有可编程硬件的一个缩影,可谓是“麻雀虽小,肝胆俱全”,单片机的学习和研究是对微机系统学习和研究的简捷途径。

二、数字钟硬件框图:

三、程序整体设计:

定时模块,显示模块,数据调整模块,状态调整模块。

(1)总体介绍:

此部分主要介绍定时模块,和显示模块。

定时部分采用经典的定时器定时。

它实现了数字钟的主要部分,和秒表的主要部分,以及产生报时信号,定时设置。

显示模块是实现数字钟的又一重要部分,其模块的的独立程度直接影响到数字钟的可视化程度。

在此部分的设计中,设置专用显示数据缓冲区40h--45h,与分,时及其他数据缓冲区数据区别,在其中存放的是显示段码,而其他缓冲区存放的是时间数据。

在显示时,首先将时间十进制数据转化为显示段码,然后送往数码管显示。

显示段码采用动态扫描的方式。

在要求改变显示数据的类别时,只须改变@R0(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。

(2)数据调整:

数据调整有多种方式。

一,可以直接进入相关状态进行有关操作,二,将调整分两步,先进入状态,然后执行操作,这两步分别由两个键控制。

方式一,比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。

如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度(显示部分可以采用8279芯片来控制,可以解决此问题)。

当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。

如果采用二的方式,就不会出现这种情况。

因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整(具体操作如图2)。

以上两种方式的实现都可以采用查询和中断的方式。

两种方式必须注意的问题是两者进行相关操作的过程不能太长否则会影响显示的扫描。

利用查询的方式,方法传统,对此就不作过多的讨论,以下是采用中断的方式实现的数字钟的一些讨论和有关问题作的一些处理。

基于以上的讨论可以设计如下:

将调整分为状态调整和数据调整两部分,每次进入中断只执行一次操作,然后返回,这样,就不必让中断处于调整等待状态,这样,可以使中断的耗时很小。

将定时器中断的优先级设置为最高级,那么中断的方式和查询的方式一样不会影响到时钟的记数。

基于以上的讨论,数据修改的具体操作如下。

在状态进入后,调整指针的指向如右图所示:

在右图中@R1表示指向数据缓冲区的指针,它主要是为数据的调整而设立的,在图中:

MBF,HOUR,FS,SS,分别表示时钟的分,时,定时设置分,时,的数据缓冲区。

状态5是秒表进入状态,状态6是时钟正常显示状态。

在程序中@R1为专用指针,它的值只在状态调整时改变,每次运行图示模块,只改变一次状态,就跳出程序。

调整数据只须改变@R1中的数据即可。

(3)中断方式应注意的问题:

采用中断的方式,最好将定时器中断的优先级设置为最高级,关于程序数据的稳定性应注意两个问题:

一,在低优先级中断响应时,应在入栈保护数据时禁止高优先级的中断响应。

二,在入栈保护有关数据后,对中断程序执行有影响的状态位,寄存器,必须恢复为复位状态的值。

例如,在以下程序中,由于用到了十进制调整,所以在中断进入时,将PSW中的AC,CY位清零,否则,十进制调整出错。

(4)定时准确性的讨论:

程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔0.1秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时间就造成了定时器定时的误差。

如果在前述定时器不关的情况下,在中断程序的一开始就给定时器置数,此时误差最小,误差大约为:

每0.1秒,误差7—12个机器周期。

当然这是在定时器定时刚好为0.1秒时的情况,由以上分析,如果数字钟设计为查询的方式或是在中断的方式下将定时器中断设置为最高级,我们在定时值设置时,可以适当的扣除9个机器周期的时间值。

但如果在中断的情况下,没有将定时器中断设置为最高级,那就要视中断程序的大小,在定时值设置时,扣除相应的时间值。

(5)软件消抖:

消抖可以采用硬件(施密特触发器)的方式,也可以采用软件的方式。

在此只讨论软件方式。

软件消抖有定时器定时,和利用延时子程序两种方式。

一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:

设置标志位,在定时器中断中将其置位,然后在程序中查询。

将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。

二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。

因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。

如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:

中断不能连续执行,两次之间有一定的时间间隔。

以下是三种消抖方法的程序流程图:

四、基于以上,设计如下数字钟:

(1)数字钟的操作如下:

按键KEY0

状态1:

KEY0=1,数字钟正常时钟显示状态。

状态2:

KEY0=2,调整数字钟的分数据。

状态3:

KEY0=3,调整数字钟的时数据。

状态4:

KEY0=4,数字钟的定时设置分值。

状态5:

KEY0=5,数字钟的定时设置时值。

状态6:

KEY0=6,秒表进入状态。

说明:

状态N表示KEY0键按下N次。

在进行调整或设置状态时,显示对应状态的数据并且对应的各调整位数码管的DP点亮。

这样可以使调整更加可视化。

按键KEY1

完成加一操作,和秒表的清零操作。

在进入了时间调整状态或定时设置状态时,按此键可以加一,或在秒表启动后处于停止状态时,按此键可以完成清零操作。

按键KEY3

秒表启动和停止键,此键必须在秒表状态进入了之后才有效。

即是:

KEY0=6时有效。

定时时间到或整点时,时钟输出报时脉冲。

(2)流程图:

在以下流程图中只描述了基本的功能,象给显示位加点,中断程序状态调整,加一操作,显示状态的切换,在流程图中都没有描述。

但其设计就是基于以上介绍的显示指针,和状态指针的思想。

在程序中用@R0,@R1充当此指针。

程序设计的基本流程图如下:

五、结束语:

本文从整体到部分详细介绍了数字钟的设计,在比较重要的部分进行了详细的论述,并且给出了程序框图及说明。

文中在讨论部分隐含的给出了几种数字钟的设计方法,在最后给出了一种采用中断方式设计的数字钟,此方法得到了实验的证明。

其可靠性和稳定性都达到了很好的效果。

在文中最后给出的设计的基础上很容易扩展写入年月日,其方法基本与时间的显示和调整相类似。

六、参考资料:

[1]李建忠编著,《单片机原理及应用》.西安电子科技大学出版2002年2月

[2]张俊谟编著,《单片机中级教程》.北京航空航天大学出版2000年1月

附录:

NAMEZF

PORTEQU0CFA0H

HOUREQU26H;设置数据缓冲区

BUFEQU23H

SBFEQU22H

MBFEQU21H

SAEQU27H

FAEQU28H

HHEQU29H

MB0EQU2AH

MB1EQU2BH

MB2EQU2CH

MM0EQU2DH

CSEGAT0000H

LJMPSTART;中断初始化

CSEGAT0003H

LJMPKEY0

CSEGAT0013H

LJMPKEY1

CSEGAT401BH

LJMPCLOCK

CSEGAT4100H

START:

MOVR0,#40H;数据缓冲区初始化

MOVR6,#00H

MOVA,#00H

MOV@R0,A

INCR0

MOV@R0,A

INCR0

MOV@R0,A

INCR0

MOV@R0,A

INCR0

MOV@R0,A

INCR0

MOV@R0,A

MOVSP,#30H

MOVTMOD,#10H

MOVTH1,#38H

MOVTL1,#00H

MOVBUF,#00H

MOVSBF,#00H

MOVMBF,#00H

MOVHOUR,#00H

MOVSA,#00H

MOVFA,#00H

MOVHH,#00H

MOVMB0,#00H

MOVMB1,#00H

MOVMB2,#00H

MOVMM0,#00H

SETBET1

SETBEX1

SETBPT1

SETBEA

SETBP3.5

CLRP3.0

MOVTCON,#45H

MOVR5,#01H

DS1:

MOVR0,#40H;扫描显示

MOVR2,#20H

DS2:

MOVDPTR,#PORT

MOVA,@R0

ACALLTABLE

CJNER5,#02,L3

SJMPL2

L3:

CJNER5,#04H,L1;让调整位的

DP点亮

L2:

CJNER0,#42H,L0

ADDA,#80H

SJMPL0

L1:

CJNER5,#03H,L4

SJMPL5

L4:

CJNER5,#05H,L0

L5:

CJNER0,#44H,L0

ADDA,#80H

L0:

MOVX@DPTR,A

MOVA,R2

CPLA

MOVP1,A

MOVR3,#07FH

DEL:

NOP

DJNZR3,DEL

INCR0

CLRC

MOVA,R2

RRCA

MOVR2,A

S2:

CJNER5,#06H,S3;切换到显示秒表计数

SETBEX0

SJMPMIAOBIAO

S3:

CJNER5,#04H,S1;切换到定时设置状态的显示

SJMPDINGSHI

S1:

CJNER5,#05H,S0

SJMPDINGSHI

S0:

JNZDS2

MOVR0,#40H;取缓冲区到显示缓冲区

MOVA,SBF

ACALLGET

MOVA,MBF

ACALLGET

MOVA,HOUR

ACALLGET

SJMPDS1

MIAOBIAO:

JNZDS2;秒表显示

MOVR0,#40H

MOVA,MB0

ACALLGET

MOVA,MB1

ACALLGET

MOVA,MB2

ACALLGET

AJMPDS1

DINGSHI:

JNZDS2;定时设置显示

MOVR0,#40H

MOVA,HH

ACALLGET

MOVA,FA

ACALLGET

MOVA,SA

ACALLGET

AJMPDS1

TABLE:

INCA;查表取段码

MOVCA,@A+PC

RET

DB3FH

DB06H

DB5BH

DB4FH

DB66H

DB6DH

DB7DH

DB07H

DB7FH

DB6FH

DB40H

GET:

;将一个两位十进制数放入两个数码管对应的两个缓冲区

MOVR4,A

ANLA,#0FH

MOV@R0,A

INCR0

MOVA,R4

SWAPA

ANLA,#0FH

MOV@R0,A

INCR0

RET

CLOCK:

;定时器中断服务程序

JNBP3.0,D4;产生定时输出脉冲

CPLP3.4

D4:

MOVTL1,#0AFH

MOVTH1,#3CH

PUSHPSW

PUSHACC

JNBP3.5,C0;秒表计数模块

INCMB0

MOVA,MB0

CJNEA,#0AH,C0

MOVMB0,#00H

MOVA,MB1

INCA

DAA

MOVMB1,A

CJNEA,#60H,C0

MOVMB1,#00H

MOVA,MB2

INCA

DAA

MOVMB2,A

CJNEA,#60H,C0

MOVMB2,#00H

C0:

JNB78H,Z1;时钟计数程序

INCR6

CJNER6,#05H,Z1

MOVR6,#00H

CLR78H

SETBEX0

Z1:

JNB79H,Z2;去抖延时程序

INCR6

CJNER6,#0FH,Z2

MOVR6,#00H

CLR79H

SETBEX1

Z2:

INCBUF

MOVA,BUF

CJNEA,#0AH,QUIT

MOVBUF,#00H

MOVA,SBF

INCA

DAA

MOVSBF,A

CJNEA,#60H,QUIT

MOVSBF,#00H

MOVA,MBF

CLRP3.0;定时脉冲输出

一分钟

D2:

INCA

DAA

MOVMBF,A

MOVA,FA;定时比较分值

CJNEA,MBF,D0

SJMPD1

D0:

MOVA,MBF

CJNEA,#60H,QUIT

MOVMBF,#00H

MOVA,HOUR

INCA

DAA

MOVHOUR,A

D1:

MOVA,SA;定时比较时值

CJNEA,HOUR,D3

SETBP3.0

D3:

MOVA,HOUR

CJNEA,#18H,QUIT

MOVHOUR,#00H

QUIT:

POPACC

POPPSW

RETI

KEY0:

CLRET1;外部中断零服务程序

PUSHACC

PUSHPSW

SETBET1

CLREX0

CLRCY;清与十进制调整有关的状态位

CLRAC

SETB78H

JBP3.5,K0

MOVMB0,#00H;秒表数据清零

MOVMB1,#00H

MOVMB2,#00H

K0:

MOVA,@R1;完成加一操作

INCA

DAA

CJNER1,#26H,K2;调整数据的限制

SJMPK3

K2:

CJNER1,#27H,K4

SJMPK3

K4:

CJNEA#60H,K1

MOVA,#00H

K3:

CJNEA#24H,K1

MOVA,#00H

K1:

MOV@R1,A

POPPSW

POPACC

RETI

KEY1:

CLRET1;外部中断一中断程序,完成状态的调整

PUSHACC

PUSHPSW

SETBET1

CLREX1

SETB79H

CJNER5,#01H,M0

MOVR1,#21H

INCR5

SETBEX0

SJMPEXIT

M0:

CJNER5,#02H,M1

MOVR1,#26H

INCR5

SETBEX0

SJMPEXIT

M1:

CJNER5,#03H,M2

MOVR1,#28H

INCR5

SETBEX0

SJMPEXIT

M2:

CJNER5,#04H,M3

MOVR1,#27H

INCR5

SETBEX0

SJMPEXIT

M3:

CJNER5,#05H,M4

INCR5

MOVR1,#00H

SETBEX0

SJMPEXIT

M4:

CJNER5,#06H,EXIT

MOVR1,#00H

MOVR5,#01H

CLREX0

EXIT:

SETBEX1

POPPSW

POPACC

RETI

END

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2