六位数码管时钟设计.docx
《六位数码管时钟设计.docx》由会员分享,可在线阅读,更多相关《六位数码管时钟设计.docx(11页珍藏版)》请在冰豆网上搜索。
六位数码管时钟设计
xxxx职业技术学院
《计算机控制技术》实训报告
题目:
六位数码管时钟设计
专业:
________机电一体化
班级:
机电1006班
学生姓名:
学号:
指导教师:
实训时间:
2012年12月29—2013年1月6日
一.系统设计要求
(一)设计1分钟定时程序
•选择定时器(T0/T1)
•选择适当的工作方式(方式1/方式2)
•计算并设定定时器的计数初值
•要求用中断方式
•每隔1秒钟信号取反一次,输出到P1.0引脚所连接的LED灯去。
(二)设计6位数码管显示程序
设计6位数码管显示程序,用动态扫描方式显示6位数字(如日期:
)。
段码显示由P0口负责,位码由P2口显示
(三)实际完成的功能
起始值时、分、秒全是零,系统执行初始化程序后,随即开始走时,无须特为启动。
当时钟显示为23:
59:
59时,再加1,时钟从00:
00:
00开始运行,从而达到24小时循环。
二.系统的硬件设计
•
•CPU--AT89C51
•段码驱动芯片--74LS245
•6位数码管--7SEG-MPX6-CC
•电阻--3WATT10K
•电容--AVX0402……、GENELECT……
•晶振--CRYSTAL
•按钮--BUTTON
6LED日期显示
三.系统的软件设计
程序流程图
主程序
子程序定时中断子程序
调节分钟中断子程序调节小时中断子程序
源程序
(一)定时程序
1秒定时(模式1)
ORG0000H
SJMPSTART
ORG000BH
SJMPINTI
ORG0030H
START:
MOVTMOD,#01H
SETBTR0
SETBEA
SETBET0
MOVR6,#10
MOVTH0,#15H
MOVTL0,#0A0H
MOVR6,#0E8H
MOVR7,#03H
SJMP$
INTI:
MOVTH0,#15H
MOVTL0,#0A0H
DJNZR6,EXIT
DJNZR7,EXIT
MOVR6,#0E8H
MOVR7,#03H
CPLP1.0
EXIT:
RETI
END
(二)6位LED显示程序
ORG0000H
LJMPLOOP4
ORG0030H
LOOP4:
MOVSP,#60H
MOVR5,#6
MOVR1,#30H
MOVR4,#1
LOOP2:
MOVA,R4
MOV@R1,A
INCR1
INCR4
DJNZR5,LOOP2
LOOP1:
MOVDPTR,#TAB
MOVR0,#30H
MOVR2,#6H
MOVR3,#0FEH
LOOP:
MOVP2,R3
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
ACALLDE
INCR0
MOVA,R3
RLA
MOVR3,A
DJNZR2,LOOP
SJMPLOOP1
DE:
MOVR7,#0FFH
DE12:
MOVR6,#0
DJNZR6,DE12
DE1:
DJNZR7,DE1
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
END
(三)时钟程序
ORG0000H
LJMPSTART
ORG000BH
LJMPNETI
ORG0030H
START:
MOVSP,#60H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
SETBEA
SETBET0
SETBTR0
MOVR6,#20
MOVDPTR,#TAB
LOOP2:
MOVR0,#30H
MOVR2,#6H
MOVR3,#0FEH
LOOP1:
MOVP2,R3
MOVA,@R0
MOVCA,@A+DPTR
MOVP0,A
ACALLDELAY
INCR0
MOVA,R3
RLA
MOVR3,A
DJNZR2,LOOP1
SJMPLOOP2
NETI:
MOVTH0,#3CH
MOVTL0,#0B0H
DJNZR6,EXTI1
MOVR6,#20
INC30H
D0:
MOVA,30H
CJNEA,#10,EXTI1
MOV30H,#0
MOVA,31H
INCA
MOV31H,A
CJNEA,#6,EXTI1
D2:
MOV31H,#0
MOVA,32H
INCA
MOV32H,A
CJNEA,#10,EXTI1
D3:
MOV32H,#0
MOVA,33H
INCA
MOV33H,A
CJNEA,#6,EXTI1
MOV33H,#0
MOVA,34H
INCA
MOV34H,A
EXTI1:
RETI
DELAY:
MOVR7,#0
DE1:
DJNZR7,DE1
RET
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
END
四、实训总结
这次单片机的实训有三任务:
第一个是一分钟定时器,由P1口的一个二极管的闪烁作标示。
第二个是显示六个七段数码管,用动态扫描的方式实现。
第三个是设定一计数器。
这三个任务的前二个是第三个任务的基础。
在实训时用WAVE6000软件来编程,用ISIS7Professional来进行彷真。
第一个任务我之前是用软件的多个环多实现,但老师说这样是不精准的,因为它们在计算时会有误差,计算出来的时间会比实际要长。
为了精确,最后用了中断进行定时。
中断的定时思路是首先将定时器各种前奏工作如开中断,开定时器,设定计器的初始值等,做好这些后就用一个原地踏步指令,等待中断的到来。
如一分钟到,那么就去处理中断子程,处理中断子程序时要判断是否到一分钟,每到一分钟就将P1口的二极管取一次反,来实现标示。
第二任务是六个七段码的显示,这个程序的设计思路是位码与段码的同步循环控制。
我是用一小循环程序实现将六个数分别送到数据寄存器的30H至35H单元内,作为要显示的数。
然后就是第一位的段码与位码设设定,每一循环一次就显示一位,当循环一次结束后就用循环程序调整下一次要显示的位码与段码,一定要注意位码与段码是严格一一对应的。
这六个七段数码管是循环显示的,当它们循环的频率足够大时人的眼睛就会看到同时显示的效果。
第三个任务是记时器的设计,要求是每一秒钟计数一次,满进位就进位,并且用六个七段码来显示记时的时间,从右到左看到去就要看到秒,分,时,每个单位都占二个七段数码管。
这个程序我总的思路是用定时中断来实现,分三个大的模块来设计。
第一个模块是定时一秒中断,第二个模块是六个七段的循环显示,第三个模块是数据的处理。
总的功能是结合前二个任务来设计的。
我的最终确定下来的程序顺序是可分为五个部分,第一个是部分是定位与设定推栈区,第二个部分是开启定时器与定时器中断,并且设定定时器的初始值,第三个部分是六个七段数码管的循环显示,这部分很相似于第二个任务的那原地踏步指令,第四个部分是中断子程序的设计,是这个任务最重要的也是最复杂的部分。
它首先是把定时器复位到所设定的初始值,然后再判断是否到了一秒的,没到则继续等待,到了则进行数据的处理,数据处理包括秒位上加一,然后再用判断是否需要进位。
第五部分则是简单的延时小程序,是在每次显示每位数码管是要调用的小程序,目的是让数管显示稳定后才到下一个数码管显示。
如果将这五个部分紧密的组织起来,就可完成第三个任务了。
在组织这五个部分的时候需要很注意几个事项:
首先必须明确每个标号的用途,要尽可能的减少标号的使用。
第二是要是明确R0至R7每个寄存器的用途,并且谨慎R0和R1是可寄存器间接寻址,需要使用间接寻址时才好使用。
第三是每个小功能不能有冲突,一但有冲突则容易整个程序的功能都无法实现。
第四是输入时一定要细心,不能输错任何一个数字与字母,还有就是在使用十进制与十六进制数时不能搞混。
第五一定要有开辟推栈区的习惯。
刚开始,程序的设计与调试都是艰难的,一定要相对树立信心,不断的检查不断的调试不断的思考不断的修改,就有很大可能完成任务。
教师签名:
年月日