《单片机原理与应用》课程设计
—数字电子时钟设计
院 系:自动化工程系
专 业:测控技术与仪器
班 级:09测控二班
学 号:200920303225
姓 名:付 强
指导老师:闫智武
20##年12月3号
一 系统设计目的
熟悉51系列单片机结构特点,掌握软件设计的基本思路和基本方法。
学会用汇编语言编写程序,并在电脑上会调用和检测程序的正确与否。学会MCS-51单片机上下载程序并验证。
二 系统设计要求
1、以MCS-51系列单片机,AT89S51为核心器件组成一个电子时钟系统。
2、系统显示器由四位数码管组成,分别显示小时,分钟。
3、能随时对当前事件进行调整。
4、采用4×4行列式键盘输入。
5、四位数码管和24只发光二极管,采用动态显示方式。
三 系统硬件设计
设计思路:根据系统设计要求,我们要设计一个数字电子时钟,随着人类科技文明的发展,人们对于时钟的要求在不断地提高。时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现更多其它的功能。高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。本文正是基于这种设计方向,以单片机(AT89S51)为控制核心,设计制作一个多功能的数字时钟。在这些当中,我必须要求电路要有计算功能、时钟功能、时间设置功能、跑马灯功能等。
硬件电路组成:
实验原理图:
四 系统软件设计
1.数字时钟流程图:
2.数字时钟源程序
SUDAT00 EQU 40H ;加(减数)
SUDAT01 EQU 41H
SUDAT02 EQU 42H
SUDAT03 EQU 43H
SUDAT10 EQU 44H ;加(被减数)
SUDAT11 EQU 45H
SUDAT12 EQU 46H
SUDAT13 EQU 47H
DISPDAT0 EQU 29H ;显示数据区
DISPDAT1 EQU 2AH
DISPDAT2 EQU 2BH
DISPDAT3 EQU 2CH
DISPDAT4 EQU 2DH
DISPDAT5 EQU 2EH
DISPDAT6 EQU 2FH
DISPLONG EQU 31H ;显示长度
DISPCON EQU 32H ;显示计位
KEYDAT EQU 30H ;键码
HOURH EQU 34H ;时间数据
HOURL EQU 35H
MINH EQU 36H
MINL EQU 37H
EDMOD EQU 39H ;流水灯模式
SUCON EQU 3AH ;输入计数
SUBIT EQU 20H.1 ;减标示
DP EQU 20H.2 ;秒显标示
KEYBIT EQU 20H.3 ;有键码标示
SU EQU 20H.4 ;计算标示
TIME EQU 20H.5 ;时间标示 TIMESET EQU 20H.6 ;时间设置标示
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
AJMP TIME0
ORG 0013H
RETI
ORG 001BH
LJMP TIME1
ORG 0023H
RETI
ORG 0050H
START:
MOV A,#00H
MOV R0,#20H
MOV R1,#30H
LOOP0:
MOV @R0,A
INC R0
DJNZ R1,LOOP0
MOV SP,#50H
MOV DISPLONG,#07
SETB RS0
SETB RS1
MOV R0,#DISPDAT0
MOV R2,#200
MOV R3,#120
MOV R4,#00
MOV R5,#00
MOV R6,#0FEH
MOV R7,DISPLONG
CLR RS0
MOV R2,#50
MOV R3,#30
CLR RS1
MOV LEDMOD,#02
MOV DISPLONG,#07
MOV DISPCON,#07
MOV KEYDAT,#0FFH
SETB TIME
MOV TL0,#0AH ;1E定时2.5MS
MOV TH0,#0F7H
MOV IE,#8AH ;开T0,T1
MOV TMOD,#11H ;定时方式1
SETB TR0
MOV TL1,#00H ;定时10MS
MOV TH1,#0DCH
SETB TR1
MAIN:
ACALL KEY
JNB KEYBIT,MAIN1
ACALL DOKEY
MAIN1:
JB TIME,MAIN2
JB TIMESET,MAIN2
JB SU,MAIN3
MAIN2: MOV R0,#HOURH
MOV R1,#DISPDAT0
MOV R2,#04H
MAINLOOP:
MOV A,@R0 ;时间转七段码送显示数据区
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV C,DP
MOV ACC.7,C
MOV @R1,A
INC R0
INC R1
DJNZ R2,MAINLOOP
SJMP MAIN
MAIN3:
MOV R0,#SUDAT00 ;计算数转段码送显区
MOV R1,#DISPDAT0
MOV R2,#04H
SJMP MAINLOOP
TAB:
DB 40H,79H,24H,30H,19H
DB 12H,02H,78H,00H,10H
DB 7FH,7FH,7FH,7FH,7FH,7FH;0A-0FF全黑
;显示子程序
;R0显示数址,R6位选值, R7显示计数,DISPL0NG显示数长度
;DISPDATA0显示数据区首址
DISPLAY:
MOV P2,#0FFH
MOV P0,@R0
MOV P2,R6
INC R0
DJNZ R7,DISPLAY1
MOV R7,DISPLONG
MOV R0,#DISPDAT0
MOV R6,#0FEH
SJMP DISPOUT
DISPLAY1:
MOV A,R6
RL A
MOV R6,A
DISPOUT:
RET
; 键盘扫描程序
;KEYDAT存放键码,双键按下只认前键
;KEYBIT有键标示
KEY:
MOV P1,#0F0H
MOV A,P1
ORL A,#0FH
XRL A,#0FFH
JZ KEYOUT0
MOV A,#60H
LCALL DELAY
MOV P1,#0F0H
MOV A,P1
ORL A,#0FH
XRL A,#0FFH
JZ KEYOUT0
MOV P1,#0FEH ;KEYDAT存放键码
JNB P1.4,KEY1
JNB P1.5,KEY2
JNB P1.6,KEY3
JNB P1.7,KEY4
MOV P1,#0FDH
JNB P1.4,KEY5
JNB P1.5,KEY6
JNB P1.6,KEY7
JNB P1.7,KEY8
MOV P1,#0FBH
JNB P1.4,KEY9
JNB P1.5,KEY10
JNB P1.6,KEY11
JNB P1.7,KEY12
MOV P1,#0F7H
JNB P1.4,KEY13
JNB P1.5,KEY14
JNB P1.6,KEY15
JNB P1.7,KEY16
MOV KEYDAT,#0FFH
CLR KEYBIT
KEYOUT0:
AJMP KEYOUT1
KEY1:
MOV KEYDAT,#0AH
SJMP KEYOUT
KEY2:
MOV KEYDAT,#09H
SJMP KEYOUT
KEY3:
MOV KEYDAT,#08H
SJMP KEYOUT
KEY4:
MOV KEYDAT,#07H
SJMP KEYOUT
KEY5:
MOV KEYDAT,#0BH
SJMP KEYOUT
KEY6:
MOV KEYDAT,#06H
SJMP KEYOUT
KEY7:
MOV KEYDAT,#05H
SJMP KEYOUT
KEY8:
MOV KEYDAT,#04H
SJMP KEYOUT
KEY9:
MOV KEYDAT,#0CH
SJMP KEYOUT
KEY10:
MOV KEYDAT,#03H
SJMP KEYOUT
KEY11:
MOV KEYDAT,#02H
SJMP KEYOUT
KEY12:
MOV KEYDAT,#01H
SJMP KEYOUT
KEY13:
MOV KEYDAT,#0DH
SJMP KEYOUT
KEY14:
MOV KEYDAT,#0EH
SJMP KEYOUT
KEY15:
MOV KEYDAT,#00H
SJMP KEYOUT
KEY16:
MOV KEYDAT,#0FH
KEYOUT:
SETB KEYBIT
MOV P1,#0F0H
MOV A,P1
ORL A,#0FH
XRL A,#0FFH
JNZ KEYOUT
MOV A,#100H
LCALL DELAY
KEYOUT1:
RET
;键盘处理,
; SU计算标志,TIME时间标志,TIMSET时间设置标志
;SUCON计算输入位数 ,TSETCON时间设置位数
;DISPCON显示位数
;SUDAT00-03加数(减数),SUDAT10-13 加数(被减数)
;LEDMOD流水灯模式, TSETCON时间设置位数,DISPCON显示位数
;ADDBIT加法标示,SUBBIT减法标示
DOKEY:
MOV A,KEYDAT
CLR C
SUBB A,#10H ;大于16为错码
JNC DONEXT
CLR C
MOV A,KEYDAT
SUBB A,#0AH ;大于10为功能键,小于10为数字键
JC NEXT
MOV B,#03
MUL AB
MOV DPTR,#DOFKEY ;功能键处理
JMP @A+DPTR
DOFKEY:
LJMP DOFKEY1
LJMP DOFKEY2
LJMP DOFKEY3
LJMP DOFKEY4
LJMP DOFKEY5
LJMP DOFKEY6
NOP
NOP
DONEXT:
LJMP DOKEYOUT
NEXT:
LJMP DOSKEY
DOFKEY1: ;计算功能
LCALL TIMDB
JNB TIMESET,DOFKEY11
PUSH PSW
SETB RS0
SETB RS1
MOV R2,#200
MOV R3,#120
POP PSW
DOFKEY11:
SETB SU ;SU计算标志
CLR TIME ;TIME时间标志
CLR TIMESET ;TIMSET时间设置标志
MOV SUCON,#04H ;SUCON计算输入位数
SETB DP
CLR SUBIT
MOV SUDAT00,#00H
MOV SUDAT01,#00H
MOV SUDAT02,#00H
MOV SUDAT03,#00H
MOV SUDAT10,#00H
MOV SUDAT11,#00H
MOV SUDAT12,#00H
MOV SUDAT13,#00H
LJMP DOKEYOUT
DOFKEY2: ;计时功能
LCALL TIMDB
JNB TIMESET,DOFKEY21
PUSH PSW
SETB RS0
SETB RS1
MOV R2,#200
MOV R3,#120
POP PSW
DOFKEY21:
SETB TIME
CLR SU
CLR TIMESET
MOV SUCON,#00H
SETB DP
LJMP DOKEYOUT
DOFKEY3: ;时间设置功能
LCALL TIMDB
SETB TIMESET
CLR TIME
CLR SU
MOV SUCON,#00H
SETB DP
LJMP DOKEYOUT
DOFKEY4: ;流水灯功能
MOV A,LEDMOD
CLR C
SUBB A,#01H
JNC DOFKEY40
MOV LEDMOD,#03
MOV DISPLONG,#04H
LJMP DOKEYOUT
DOFKEY40:
MOV LEDMOD,A
MOV DISPLONG,#07H ;DISPLONG显示位数
MOV A,LEDMOD
CJNE A,#02H,DOFKEY41
MOV DISPDAT4,#00H
MOV DISPDAT5,#00H
MOV DISPDAT6,#00H
LJMP DOKEYOUT
DOFKEY41:
MOV DISPDAT4,#24H
MOV DISPDAT5,#92H
MOV DISPDAT6,#49H
LJMP DOKEYOUT
DOFKEY5: ;加号处理
MOV R4,SUDAT00
MOV R5,SUDAT01
MOV R6,SUDAT02
MOV R7,SUDAT03
MOV R0,SUDAT10
MOV R1,SUDAT11
MOV R2,SUDAT12
MOV R3,SUDAT13
LCALL BADD
MOV SUCON,#04H
CLR SUBIT
LJMP DOKEYOUT
DOFKEY6: ;减号处理
MOV R4,SUDAT00
MOV R5,SUDAT01
MOV R6,SUDAT02
MOV R7,SUDAT03
MOV R0,SUDAT10
MOV R1,SUDAT11
MOV R2,SUDAT12
MOV R3,SUDAT13
LCALL BADD
MOV SUCON,#04H
SETB SUBIT
LJMP DOKEYOUT
DOSKEY: ;数字键处理
JB SU,DOSKEY1
JB TIMESET,DOSKEY2 ;时间设定
LJMP DOKEYOUT
DOSKEY1:
MOV A,SUCON
CJNE A,#04H,DOSKEY10
MOV SUDAT00,#00H
MOV SUDAT01,#00H
MOV SUDAT02,#00H
MOV SUDAT03,#00H
DOSKEY10:
MOV A,SUCON
JZ DOKEYOUT
MOV SUDAT00,SUDAT01
MOV SUDAT01,SUDAT02
MOV SUDAT02,SUDAT03
MOV SUDAT03,KEYDAT
DEC SUCON
LJMP DOKEYOUT
DOSKEY2:
MOV A,SUCON ; 设定时间
ADD A,SUCON
MOV DPTR,#DOSKEY20
JMP @A+DPTR
DOSKEY20:
SJMP DOSKEY21
SJMP DOSKEY22
SJMP DOSKEY23
SJMP DOSKEY24
DOSKEY21:
MOV A,KEYDAT ;设定小时高位
CLR C
SUBB A,#03
JNC DOKEYOUT
MOV HOURH,KEYDAT
SJMP DOSKEY25
DOSKEY22:
MOV A,HOURH ;设定小时低位
CJNE A,#02,NE1
MOV A,KEYDAT
CLR C
SUBB A,#4
JNC DOKEYOUT
NE1:
MOV HOURL,KEYDAT
SJMP DOSKEY25
DOSKEY23:
MOV A,KEYDAT ;设分高位
CLR C
SUBB A,#6
JNC DOKEYOUT
MOV MINH,KEYDAT
SJMP DOSKEY25
DOSKEY24:
MOV MINL,KEYDAT ;设分低位
DOSKEY25:
LCALL SU10T08
LCALL TIMDB
INC SUCON
MOV A,SUCON
CLR C
SUBB A,#4
JC DOKEYOUT
MOV SUCON,#00H
DOKEYOUT:
CLR KEYBIT
MOV KEYDAT,#0FFH ;0FFH为无键码指示
RET
;;;;;;;;;;;;TIME0;;;;;;;;
;用第三组寄存器,MINL分钟低位,MINH分钟高位
;HOURL小时低位,HOURH小时高位
;R4分钟数<60,R5小时数<24 ,R2为2.5MS计数,R3为0.5S计数
;DP秒闪标示
TIME0: ;T0计时
PUSH ACC
MOV F0,C
PUSH PSW
SETB RS0
SETB RS1
MOV TL0,#0AH ;1E定时2.5MS
MOV TH0,#0F7H
SETB TR0
ACALL DISPLAY ;0.25MS显示一位
DJNZ R2,TIMEOUT
MOV R2,#200 ;200*0.25MS=0.5S
JB SU,TIME00
CPL DP
TIME00:
DJNZ R3,TIMEOUT
MOV R3,#120 ;120*0.5S=60S
INC R4 ;R4计分钟值,满60向R5进位
MOV A,R4
CLR C
SUBB A,#60
JC TIME01
MOV R4,#00
INC R5 ;R5计小时值
TIME01:
MOV A,R4 ;将R5值化为十进制数
MOV B,#10
DIV AB
MOV MINH,A
MOV MINL,B
MOV A,R5
CLR C
SUBB A,#24
JC TIME02
MOV R5,#00
TIME02:
MOV A,R5
MOV B,#10
DIV AB
MOV HOURH,A
MOV HOURL,B
TIMEOUT:
POP PSW
MOV C,PSW.1
POP ACC
RETI
TIME1: ;T1计时,用于跑马灯和控制时间设置闪烁
PUSH ACC ;R2计数时间闪烁频率
MOV F0,C ;r3计数跑马灯频率
PUSH PSW ;R4保存时间闪动初值
CLR RS0 ;第二组寄存器
SETB RS1
MOV TL1,#00H ;定时10MS
MOV TH1,#0DCH
SETB TR1
JNB TIMESET,TI10
DJNZ R2,TI10
MOV R2,#50
MOV A,SUCON
MOV R0,#HOURH
ADD A,R0
MOV R0,A
MOV A,@R0
CJNE A,#0AH,TI11
MOV A,R4
MOV @R0,A
SJMP TI10
TI11:
MOV A,@R0
MOV R4,A
MOV @R0,#0AH
TI10:
MOV A,LEDMOD
CJNE A,#02H,TI12
DJNZ R3,TI1OUT
MOV R3,#15
ACALL LED
SJMP TI1OUT
TI12:
DJNZ R3,TI1OUT
MOV R3,#60
ACALL LED
TI1OUT:
POP PSW
MOV C,PSW.1
POP ACC
RETI
;;;;;;;;;;DELAY;;;;;;
DELAY: ;延时程序 ,时间常数在ACC
PUSH ACC
DELAY1:
DJNZ ACC,$
POP ACC
DJNZ ACC,DELAY
RET
;流水灯子程序
;LEDMOD模式,流水灯数据在DISPDAT4-6
LED:
MOV A,LEDMOD
ADD A,LEDMOD
MOV DPTR,#LED0
JMP @A+DPTR
LED0:
SJMP MODL1
SJMP MODL2
SJMP MODL3
MOV DISPLONG,#04H
RET
RET
MODL1:
MOV C,DISPDAT6.7 ;右移动
MOV A,DISPDAT4
RLC A
MOV DISPDAT4,A
MOV A,DISPDAT5
RLC A
MOV DISPDAT5,A
MOV A,DISPDAT6
RLC A
MOV DISPDAT6,A
RET
MODL2:
MOV C,DISPDAT4.0 ;左移动
MOV A,DISPDAT6
RRC A
MOV DISPDAT6,A
MOV A,DISPDAT5
RRC A
MOV DISPDAT5,A
MOV A,DISPDAT4
RRC A
MOV DISPDAT4,A
RET
MODL3:
MOV C,DISPDAT4.7 ;灯从左全亮后又到全灭
CPL C
MOV A,DISPDAT5
RLC A
MOV DISPDAT5,A
MOV A,DISPDAT6
RLC A
MOV DISPDAT6,A
MOV A,DISPDAT4
RLC A
MOV DISPDAT4,A
RET
;十进制加法子程序
;入口R0-3,R4-7,出口R4-7
SUADD:
MOV A,R3
ADD A,R7
DA A
MOV C,ACC.4
ANL A,#0FH
MOV R7,A
MOV A,R2
ADDC A,R6
DA A
MOV C,ACC.4
ANL A,#0FH
MOV R6,A
MOV A,R1
ADDC A,R5
DA A
MOV C,ACC.4
ANL A,#0FH
MOV R5,A
MOV A,R0
ADDC A,R4
DA A
MOV R4,A
RET
DOBM: ;求补码
MOV A,#99H
CLR C
SUBB A,R4
MOV R4,A
MOV A,#09H
CLR C
SUBB A,R5
MOV R5,A
MOV A,#09H
CLR C
SUBB A,R6
MOV R6,A
MOV A,#0AH
CLR C
SUBB A,R7
MOV R7,A
RET
BUM: ;负数显示数(补码还原)
MOV A,#99H
CLR C
SUBB A,R4
MOV R4,A
MOV A,#09H
CLR C
SUBB A,R5
MOV R5,A
MOV A,#09H
CLR C
SUBB A,R6
MOV R6,A
MOV A,#09H
CLR C
SUBB A,R7
MOV R7,A
MOV R0,#00H
MOV R1,#00H
MOV R2,#00H
MOV R3,#01H
ACALL SUADD
ANL A,#0FH
MOV R4,A
RET
BADD: ;带符号十进制加法
JNB SUBIT,BADD1
ACALL DOBM ;负时求补码
BADD1:
ACALL SUADD ;相加
ANL A,#0E0H
JZ BADD2
MOV A,R4
ANL A,#0FH
ORL A,#90H
MOV R4,A
MOV SUDAT10,R4
MOV SUDAT11,R5
MOV SUDAT12,R6
MOV SUDAT13,R7
ACALL BUM
MOV SUDAT00,R4
MOV SUDAT01,R5
MOV SUDAT02,R6
MOV SUDAT03,R7
RET
BADD2:
MOV A,R4
ANL A,#0FH
MOV R4,A
MOV SUDAT10,R4
MOV SUDAT11,R5
MOV SUDAT12,R6
MOV SUDAT13,R7
MOV SUDAT00,R4
MOV SUDAT01,R5
MOV SUDAT02,R6
MOV SUDAT03,R7
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;
SU10T08: ;十进制化为16进制
PUSH PSW
SETB RS0
SETB RS1
MOV A,HOURH
MOV B,#10
MUL AB
ADD A,HOURL
MOV R5,A
MOV A,MINH
MOV B,#10
MUL AB
ADD A,MINL
MOV R4,A
POP PSW
RET
;;; ; ;;;;;;;;;;;;
TIMDB: ;将时间计数化为十进制
PUSH PSW
SETB RS0
SETB RS1
MOV A,R4 ;将R4值化为十进制数
MOV B,#10
DIV AB
MOV MINH,A
MOV MINL,B
MOV A,R5 ;将R5值化为十进制数
MOV B,#10
DIV AB
MOV HOURH,A
MOV HOURL,B
POP PSW
RET
END
五、程序下载和调试
1.接口初始化
2.硬件选择
3.并口初始化
4.文件导入
5.文件效验
六、设计方案
系统由AT89S51、LED数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。系统的功能选择由“F1”、“F2”、“F3”、“+”、“-”五个功能键来完成。按F1键进入计算功能, 数据与显示归零,按数字键数入数据,按“+”“-”进行加减运算,数码管显示键入数据或运算结果。按F2见后进入时钟显示,数码管显示为时间状态。按F3键进入时间设置功能,当前设置为闪烁,键入数字设定时间,设定完成后按F2确认。按F4键有四种跑马灯模式循环切换。 “+”、“-”分别是调时时数字加1或者减1的功能,键盘上各位数字键则为其设定值。
七、总结
经过两个星期的《单片机课程设计》,目前基本完成了数字电子时钟的设计,通过灵活的应用汇编语言和单片机的111条指令、计数/定时器和中断。让我更加理解了单片机设计的精髓,也更加喜欢单片机。本次的设计中遇到了不少的问题,如原理图的绘制、源程序的编写及仿真中的错误,还有电路板的焊接等等,但通过查阅资料以及同学和老师讨论,最后将问题一一解决,在解决问题的同时也让我学到了更多的关于单片机方面的知识以及动手创作的技巧,让我切实感受到了自主学习以及相互交流在学习中的重要性。单片机是我们的专业核心课,为了强化自己的知识,我要更加努力的学习单片机知识和与之相关的知识,为以后的就业做好充分的准备!
八、【参考文献】
1.《单片机原理与应用》王 艳 编著·北京航空航天大学出版社2009.5
2.《Protel 99SE电路原理图与电路板设计教程》崔 玮 编著·海洋出版社 2005.1
3.《单片机原理与实践》高卫东、辛友顺、韩彦征编著·北京航空航天大学出版社 2008.1
4.《模仿电子技术基础(第四版)》华成英、董诗白 编著·高等教育出版社2006
5.《数字电子技术基础(第五版)》阎 石·高等教育出版社 2006
6.《单片机系统的PROTEUS设计与仿真》张靖武、 周灵彬 编著·电子工业出版社 2007.4