程序整体设计:定时模块,显示模块,数据调整模块,状态调整模块。
2.1总体介绍:
此部分主要介绍定时模块,和显示模块。定时部分采用经典的定时器定时。它实现了数字钟的主要部分和秒表的主要部分,以及产生报时信号,定时设置。显示模块是实现数字钟的又一重要部分,其模块的的独立程度直接影响到数字钟的可视化程度。在此部分的设计中,设置专用显示数据缓冲区40h--45h,与分,时及其他数据缓冲区数据区别,在其中存放的是显示段码,而其他缓冲区存放的是时间数据。在显示时,首先将时间十进制数据转化为显示段码,然后送往数码管显示。显示段码采用动态扫描的方式。在要求改变显示数据的类别时,只须改变@R0(指向数据缓冲区的指针)指向的十进制数据缓冲区即可。
2.2数据调整
数据调整有多种方式。一,可以直接进入相关状态进行有关操作,二,将调整分两步,先进入状态,然后执行操作,这两步分别由两个键控制。方式一,比较直接,设计思想也比较简单,但是,这种方式存在操作时间和控制键数目的矛盾。如果用比较少的键,那么可能会在进入状态后处于数据调整等待状态,这样会影响到显示的扫描速度(显示部分可以采用8279芯片来控制,可以解决此问题)。 当然在这种方式下,还可以使用多个状态键,每个状态键,完成一个对应数据的调整。如果采用二的方式,就不会出现这种情况。因为状态的调整,与状态的操作可以分别由两个键控制,其状态的调整数可以多达256个(理论上),操作的完成是这样的,一键控制状态的调整,一键控制数据的调整(具体操作如图2)。以上两种方式的实现都可以采用查询和中断的方式。两种方式必须注意的问题是两者进行相关操作的过程不能太长否则会影响显示的扫描。利用查询的方式,方法传统,对此就不作过多的讨论,以下是采用中断的方式实现的数字钟的一些讨论和有关问题作的一些处理。基于以上的讨论可以设计如下:将调整分为状态调整和数据调整两部分,每次进入中断只执行一次操作,然后返回,这样,就不必让中断处于调整等待状态,这样,可以使中断的耗时很小。将定时器中断的优先级设置为最高级,那么中断的方式和查询的方式一样不会影响到时钟的记数。
基于以上的讨论,数据修改的具体操作如下。在状态进入后,调整指针的指向如右图(2.1)所示:在右图(2.1)中@R1表示指向数据缓冲区的指针,它主要是为数据的调整而设立的,在图(2.1)中:MBF ,HOUR,FS,SS,分别表示时钟的分,时,定时设置分,时,的数据缓冲区。状态5是秒表进入状态,状态6是时钟正常显示状态。 在程序中@R1为专用指针,它的值只在状态调整时改变,每次运行图(2.1)所示模块,只改变一次状态,就跳出程序。调整数据只须改变@R1中的数据即可。
2.3中断方式应注意的问题
采用中断的方式,最好将定时器中断的优先级设置为最高级,关于程序数据的稳定性应注意两个问题:一,在低优先级中断响应时,应在入栈保护数据时禁止高优先级的中断响应。二,在入栈保护有关数据后,对中断程序执行有影响的状态位,寄存器,必须恢复为复位状态的值。例如,在以下程序中,由于用到了十进制调整,所以在中断进入时,将PSW中的AC,CY位清零,否则,十进制调整出错。中断原理图,如图(2.3)
2.4定时准确性的讨论
程序中定时器,一直处于运行状态,也就是说定时器是理想运作的,其中断程序每隔0.1秒执行一次,在理想状态下,定时器定时是没有系统误差的,但由于定时器中断溢出后,定时器从0开始计数,直到被重新置数,才开始正确定时,这样中断溢出到中断响应到定时器被重新置数,其间消耗的时间就造成了定时器定时的误差。如果在前述定时器不关的情况下,在中断程序的一开始就给定时器置数,此时误差最小,误差大约为:每0.1秒,误差7—12个机器周期。当然这是在定时器定时刚好为0.1秒时的情况,由以上分析,如果数字钟设计为查询的方式或是在中断的方式下将定时器中断设置为最高级,我们在定时值设置时,可以适当的扣除9个机器周期的时间值。但如果在中断的情况下,没有将定时器中断设置为最高级,那就要视中断程序的大小,在定时值设置时,扣除相应的时间值。
2.5软件消抖
消抖可以采用硬件(施密特触发器)的方式,也可以采用软件的方式。在此只讨论软件方式。软件消抖有定时器定时,和利用延时子程序两种方式。一,定时器定时消抖可以不影响显示模块扫描速度,其实现方法是:设置标志位,在定时器中断中将其置位,然后在程序中查询。将其中断优先级设置为低于时钟定时中断,那么它就可以完全不影响时钟定时。二,在采用延时子程序时,如果显示模块的扫描速度本来就不是很快,此时可能会影响到显示的效果,一般情况下,每秒的扫描次数不应小于50次,否则,数码的显示会出现闪烁的情况。因此,延时子程序的延时时间应该小于20毫秒,如果采用定时器定时的方式,延时时间不影响时钟。
如果,设计时采用的是中断的方式来完成有关操作,同样可以采用软件的方式来消抖,其处理思想是:中断不能连续执行,两次之间有一定的时间间隔。
以下是三种消抖方法的程序流程图:如图(2.2)
2.6基于以上,设计如下数字钟
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充当此指针。程序设计的基本流程图如下