单片机的数字钟设计Word文档下载推荐.docx
《单片机的数字钟设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机的数字钟设计Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
以上两种方式的实现都可以采用查询和中断的方式。
两种方式必须注意的问题是两者进行相关操作的过程不能太长否则会影响显示的扫描。
利用查询的方式,方法传统,对此就不作过多的讨论,以下是采用中断的方式实现的数字钟的一些讨论和有关问题作的一些处理。
基于以上的讨论可以设计如下:
将调整分为状态调整和数据调整两部分,每次进入中断只执行一次操作,然后返回,这样,就不必让中断处于调整等待状态,这样,可以使中断的耗时很小。
在状态进入后,调整指针的指向如右图所示:
在右图中@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和图2是三种消抖方法的程序流程图:
图1查询方式消抖
图2采用中断方式消抖
中断入口
关本中断
置位标志位BZ
出口
查询标志位BZ
BZ为1
延时N时间
开中断,清BZ
Y
N
定时延长设置0.3秒,甚至更长,而不影响计数
2.基于以上,数字钟详细设计如下:
2.1数字钟的操作如下:
按键KEY0
状态1:
KEY0=1,数字钟正常时钟显示状态。
状态2:
KEY0=2,调整数字钟的分数据。
状态3:
KEY0=3,调整数字钟的时数据。
状态4:
KEY0=4,数字钟的定时设置分值。
状态5:
KEY0=5,数字钟的定时设置时值。
状态6:
KEY0=6,秒表进入状态。
说明:
状态N表示KEY0键按下N次。
2.2流程图:
程序设计的基本流程图如下:
显示状态是否切换查询
3.源代码
NAME
ZF
PORT
EQU
0CFA0H
HOUR
26H
;
设置数据缓冲区
BUF
23H
SBF
22H
MBF
21H
SA
EQU
27H
FA
28H
HH
29H
MB0
2AH
MB1
2BH
MB2
2CH
MM0
2DH
CSEGAT0000H
LJMPSTART
中断初始化
CSEGAT0003H
LJMPKEY0
CSEGAT0013H
LJMPKEY1
CSEGAT401BH
LJMPCLOCK
CSEGAT4100H
START:
MOV
R0,#40H
数据缓冲区初始化
R6,#00H
A,#00H
@R0,A
INC
R0
MOV
@R0,A
SP,
#30H
TMOD,#10H
TH1,#38H
TL1,#00H
BUF,#00H
SBF,#00H
MBF,#00H
HOUR,#00H
SA,
#00H
FA,
HH,
MB0,
MB1,
MB2,
MM0,
SETB
ET1
EX1
PT1
SETB
EA
P3.5
CLR
P3.0
TCON,
#45H
R5,
#01H
DS1:
扫描显示
R2,#20H
DS2:
DPTR,#PORT
A,@R0
ACALL
TABLE
CJNE
R5,#02,L3
SJMP
L2
L3:
R5,#04H,L1;
让调整位的
DP点亮
L2:
R0,#42H,L0
ADD
A,#80H
L0
L1:
R5,#03H,L4
L5
L4:
R5,#05H,L0
L5:
R0,#44H,L0
L0:
MOVX
@DPTR,A
A,R2
CPL
A
P1,A
R3,#07FH
DEL:
NOP
DJNZ
R3,DEL
R0
C
A,R2
RRC
A
R2,A
S2:
R5,#06H,S3
切换到显示秒表计数
EX0
SJMPMIAOBIAO
S3:
R5,#04H,S1;
切换到定时设置状态的显示
DINGSHI
S1:
R5,#05H,S0
S0:
JNZ
DS2
取缓冲区到显示缓冲区
A,SBF
ACALL
GET
A,MBF
A,HOUR
DS1
MIAOBIAO:
JNZ
DS2
秒表显示
R0,#40H
A,MB0
A,MB1
A,MB2
AJMP
DS1
DINGSHI:
定时设置显示
A,HH
A,FA
A,SA
DS1
TABLE:
查表取段码
MOVC
A,@A+PC
RET
DB
3FH
06H
5BH
4FH
66H
6DH
7DH
DB
07H
7FH
6FH
40H
GET:
;
将一个两位十进制数放入两个数码管对应的两个缓冲区
R4,A
ANL
A,#0FH
A,R4
SWAP
A,#0FH
CLOCK:
定时器中断服务程序
JNB
P3.0,D4
产生定时输出脉冲
P3.4
D4:
TL1,#0AFH
TH1,#3CH
PUSH
PSW
ACC
P3.5,C0
秒表计数模块
MB0
A,MB0
A,#0AH,C0
MB0,#00H
DA
MB1,A
A,#60H,C0
MB1,#00H
MB2,A
A,#60H,C0
MB2,#00H
C0:
78H,Z1
时钟计数程序
R6
R6,#05H,Z1
R6,#00H
78H
Z1:
79H,Z2
去抖延时程序
R6,#0FH,Z2
79H
EX1
Z2:
INC
BUF
A,BUF
A,#0AH,QUIT
A,SBF
A
SBF,A
A,#60H,QUIT
SBF,#00H
A,MBF
CLR
P3.0
定时脉冲输出
一分钟
D2:
MBF,A
A,FA
定时比较分值
A,MBF,D0
D1
D0:
A,
MBF
MBF,#00H
MOV
HOUR,A
D1:
A,SA
定时比较时值
A,HOUR,D3
D3:
A,#18H,QUIT
QUIT:
POP
RETI
KEY0:
ET1
外部中断零服务程序
SETBET1
CY
清与十进制调整有关的状态位
AC
JB
P3.5,K0
#00H;
秒表数据清零
#00H
K0:
A,@R1
完成加一操作
R1,#26H,K2
调整数据的限制
K3
K2:
R1,#27H,K4
SJMP
K3
K4:
CJNEA#60H,K1
A,#00H
K3:
CJNEA#24H,K1
A,#00H
K1:
@R1,A
RETI
KEY1:
外部中断一中断程序,完成状态的调整
CJNER5,#01H,M0
R1,#21H
R5
SJMPEXIT
M0:
CJNER5,#02H,M1
R1,#26H
R5
M1:
CJNER5,#03H,M2
R1,#28H
M2:
CJNER5,#04H,M3
R1,#27H
EXIT
M3:
CJNER5,#05H,M4
MOVR1,#00H
M4:
CJNER5,#06H,EXIT
R1,#00H
R5,#01H
EXIT:
SETBEX1
RETI
END
4.结束语:
此次课程设计从整体到部分详细介绍了数字钟的设计,在比较重要的部分进行了详细的论述,并且给出了程序框图及说明。
文中在讨论部分隐含的给出了几种数字钟的设计方法,在最后给出了一种采用中断方式设计的数字钟,此方法得到了实验的证明。
其可靠性和稳定性都达到了很好的效果。
在文中最后给出的设计的基础上很容易扩展写入年月日,其方法基本与时间的显示和调整相类似。
5.参考资料:
[1]
李建忠
编著,《单片机原理及应用》.西安电子科技大学出版
2002年2月
[2]
张俊谟
编著,《单片机中级教程》.北京航空航