资源描述
单 片 机 应 用 综 合 设 计 报 告
设 计 题 目:
学 院 名 称:
专 业:
班 级:
姓 名:
指 导 教 师:
日 期: 2015.12.28~2015.12.31
一、任务书
1. 用80C51设计一个数字时钟。
2. 可显示时、分、秒。
3. 按键实现时、分、秒人工校准。
4. 具有闹钟功能。
5. 实现秒表/时钟转换,秒表要求精确到10ms。
二、总体方案
用80C51设计一个数字时钟。该数字钟能显示时、分、秒,并具有闹钟、秒表功能。由四个按键控制,功能分别为启动、调时,调闹、止闹、退出调时,切换秒表时钟,加一,减一、暂停。另外两个按键为电源控制键,复位键。
该电子钟上电或按键复位后能自动显示系统提示符“P.”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次进入时钟运行状态。
用两个四位一体共阴数码管作时间显示:能显示时、分、秒。用一个+5V有源蜂鸣器做闹钟声报警功能,并用四个按键做时间和闹钟调整的数字钟。利用定时/计数器、中断系统来实现时钟计数。
用定时器1实现时钟计时,定时器0实现秒表计时。把定时器0和定时器1都设为工作方式1,定时时间为1.25ms和125ms,则计数溢出8次即得时钟、秒表计时最小单位(10毫秒/秒)。晶振频率f=6MHz。
X1=216-125*103/2=0BDCH。
X2=216-1.25*103/2=0FEFFH。
采用中断方式进行溢出次数累计,计满8次。从秒到分和从分到时的计时是通过累加和数值比较实现。
三、硬件设计
(1) 单片机最小系统
单片机最小系统由单片机,时钟电路,复位电路组成。其中由6MHz晶振构成的振荡电路,并通过使复位端经电阻与Vcc电源接通而实现的按键电平复位电路。
(2) 电源系统
以+5V直流稳压电源作为电源供应系统。
(3) 输入系统
由四个调整键组成独立式键盘,分别具有为启动、调时、退出调闹,调闹、止闹、退出调时,秒表切换,加一,减一、暂停功能。
(4) 输出系统
由两个四位一体的共阴数码管,并以74LS244做驱动电路构成显示输出,由NPN三极管以及一个蜂鸣器构成闹铃。
四、软件设计
4.1 单片机资源使用情况
(1) 时钟与秒表的时分秒在片内RAM存储地址如表3.1所示。
表3.1 时钟存储地址
名称
时
分
秒
十 位
7AH
78H
76H
个 位
79H
77H
75H
表3.4 秒表存储地址
名称
时
分
秒
十 位
66H
64H
62H
个 位
65H
63H
61H
(2) 电子钟的时钟时间在八位数码管上进行显示,因此,在片内RAM中设置显示缓冲区共8个单元。
LED7 LED6 LED5 LED4 LED3 LED2 LED1 LED0
74H 73H 72H 71H 70H 6FH 6EH 6DH
显示缓冲区从左至右依次存时、-、分、-、秒的数值。
(3) 闹钟的时分秒在片内RAM存储地址如表3.2所示。
表3.2 闹钟标志位存储地址表
名称
时
分
秒
十 位
6CH
6AH
68H
个 位
6BH
69H
67H
(4) P0口作为数据显示输出、P1.4作为闹铃输出,P1.0-P1.3接按键输入,
20H.0-20H.3作为P1.0-P1.3的位标志存储地址。
(5) 运用了定时器1作为1秒计时所用,定时器0作为10ms计时所用。
4.2 软件系统程序流程框图
主程序流程框图如图3.1所示。
图3.1 主程序流程框图
(2) 1秒计时子程序流程框图如图3.2所示。
图3.2 1秒计时流程框图
图3.3 键监控程序流程框图
(3) 键监控子程序流程框图如图3.3所示,它还包含了键扫描和P1口处理子程序,它们的程序流程框图分别为图3.4和3.5。
图3.5 P1口处理子程序流程框图
图3.4 键扫描子程序流程框图
4.3 源程序清单
LJMP MAIN
ORG 000BH
LJMP INTT0
ORG 001BH
LJMP INTT1
;---------------------------------------------------------
;-----------------主程序----------------------------------
;---------------------------------------------------------
MAIN: LCALL BEGIN ;上电显示“PP”
MOV SP, #30H
MOV R0, #7AH ;清7AH-67H单元
MOV R1, #14H
LCALL CLR0
MOV 20H, #00H
MOV 6CH, #01H
MOV 6BH, #02H
MOV 7BH, #0CH ;熄灭符
MOV TMOD, #11H ;定时器0、1的工作方式为1
MOV TH1, #0BH ;125ms
MOV TL1, #0DCH
MOV TH0, #0FEH
MOV TL0, #0FFH ;1.25ms
MOV R7, #08H ;125ms*8=1s,1.25ms*8=10ms
SETB EA
SETB ET1
SETB TR1
LOOP: LCALL DIR ;调显示子程序
LCALL CLOCK ;查闹钟
LCALL KEYC
JB 20H.0, KEYAA ;若A键按下跳转,调时
JB 20H.1, KEYCC ;若B键按下跳转,调闹
JB 20H.2, KEYEE ;若C键按下跳转,切换秒表
JB 20H.3, KEYDD ;若D键按下跳转,暂停
LJMP LOOP
;--------------秒表显示程序-----------------------
KEYEE: CLR ET1
CLR TR1
SETB ET0
SETB TR0
MBLOOP: LCALL DIRS
LCALL DIRS
LCALL KEYCS
JB 20H.2, OUTSETS
JB 20H.3, MBZ
LJMP MBLOOP
OUTSETS:CLR ET0
CLR TR0
SETB ET1
SETB TR1
LJMP LOOP
MBZ: CLR ET0
CLR TR0
MBZLOOP:LCALL KEYCS
JB 20H.3, OUTMBZ
JB 20H.2, OUTSETS
LJMP MBZLOOP
OUTMBZ: SETB ET0
SETB TR0
LJMP MBLOOP
;-------------------------------------------------
;--------------闹钟调整程序-----------------------
;-------------------------------------------------
KEYCC: CLR ET1
LCALL SETCH
SETB ET1
LJMP LOOP
;-------------------------------------------------
;------------------暂停---------------------------
;-------------------------------------------------
KEYDD: CLR ET1
CLR TR1
LOOPSP: LCALL KEYC ;键扫描
JB 20H.3, OUTSP ;D键按下,暂停取消,继续走
LJMP LOOPSP
OUTSP: SETB TR1
SETB ET1
LJMP LOOP
;-------------------------------------------------
;-------------时钟调整程序------------------------
;-------------------------------------------------
KEYAA: CLR TR1
CLR ET1
LJMP SETHH
OUTSET: SETB ET1
SETB TR1
LJMP LOOP
;---------------时位调整-------------------------
;------------------------------------------------
SETHH: MOV R5, #0FFH
LOOPH0: MOV R0, #79H
MOV R1, #7AH
LCALL RDIRH ;输出
LCALL DIR ;显示
LCALL DIR
LCALL KEYC ;键扫描
JNB 20H.0, H1
LJMP SETMM ;A键按下,调分
H1: JNB 20H.1, H2
LJMP OUTSET ;B键按下,退出调时
H2: JNB 20H.2, H3
LJMP ADDH1 ;C键按下,加 1
H3: JNB 20H.3, H4
LJMP SUBH1 ;D键按下,减1
H4: DJNZ R5, LOOPH0 ;无键按下,循环,返回
LJMP OUTSET
;------------时加减一----------------------------
ADDH1: MOV R0, #79H ;加一
LCALL ADD1
LJMP SETH
SUBH1: MOV R0, #79H ;减一
LCALL SUBBH1
LJMP SETH
SETH: MOV R0, #79H
MOV R1, #7AH
LCALL RDIRH
CJNE R3, #24H, SETHH
MOV 79H, #00H
MOV 7AH, #00H
LJMP SETHH
;==============分位调整===========================
SETMM: MOV R5, #0FFH
LOOPM0: MOV R0, #77H
MOV R1, #78H
LCALL RDIRM
LCALL DIR
LCALL DIR
LCALL KEYC
JNB 20H.0, M1
LJMP SETSS ;A键按下,调秒
M1: JNB 20H.1, M2
LJMP OUTSET
M2: JNB 20H.2, M3
LJMP ADDM1
M3: JNB 20H.3, M4
LJMP SUBBM
M4: DJNZ R5, LOOPM0
LJMP OUTSET
;---------------分加减一--------------------------
ADDM1: MOV R0, #77H ;加一
LCALL ADD1
LJMP SETM
SUBBM: MOV R0, #77H ;减一
LCALL SUBBMS
LJMP SETM
SETM: MOV R0, #77H
MOV R1, #78H
LCALL RDIRM
CJNE R3, #60H, SETMM
MOV 77H, #00H
MOV 78H, #00H
LJMP SETMM
;==================秒位调整=======================
SETSS: MOV R5, #0FFH
LOOPS0: MOV R0, #75H
MOV R1, #76H
LCALL RDIRS
LCALL DIR
LCALL DIR
LCALL KEYC
JNB 20H.0, S1
LJMP SETHH
S1: JNB 20H.1, S2
LJMP OUTSET
S2: JNB 20H.2, S3
LJMP ADDS1
S3: JNB 20H.3, S4
LJMP SUBBS
S4: DJNZ R5, LOOPS0
LJMP OUTSET
;-------------------秒加减一----------------------
ADDS1: MOV R0, #75H ;加一
LCALL ADD1
LJMP SETS
SUBBS: MOV R0, #75H ;减一
LCALL SUBBMS
LJMP SETS
SETS: MOV R0, #75H
MOV R1, #76H
LCALL RDIRS
CJNE R3, #60H, SETSS
MOV 75H, #00H
MOV 76H, #00H
LJMP SETSS
;------------------------------------------------
;==============闹钟调整子程序====================
;------------------------------------------------
;================时位调整========================
SETCHH: MOV R5, #0FFH
LOOPCH0:MOV R0, #6BH
MOV R1, #6CH
LCALL RDIRH
LCALL DIR
LCALL KEYC
JNB 20H.0, CH0
LJMP OUTSC ;结束子程序
CH0: JNB 20H.1, CH1
LJMP SETCM ;B键按下,调分
CH1: JNB 20H.2, CH2
LJMP ADDCH1
CH2: JNB 20H.3, CH3
LJMP SUBCH1
CH3: DJNZ R5, LOOPCH0
LJMP OUTSC
;-----------------时加减一-----------------------
ADDCH1: MOV R0, #6BH ;加一
LCALL ADD1
LJMP SETCH
SUBCH1: MOV R0, #6BH ;减一
LCALL SUBBH1
LJMP SETCH
SETCH: MOV R0, #6BH
MOV R1, #6CH
LCALL RDIRH
CJNE R3, #24H, SETCHH
MOV 6CH, #00H
MOV 6BH, #00H
MOV R0, #6BH
MOV R1, #6CH
LCALL RDIRH
LJMP SETCHH
;==================分位调整======================
SETCMM: MOV R5, #0FFH
LOOPCM0:MOV R0, #69H
MOV R1, #6AH
LCALL RDIRM
LCALL DIR
LCALL KEYC
JNB 20H.0, CM0
LJMP OUTSC
CM0: JNB 20H.1, CM1
LJMP SETCH
CM1: JNB 20H.2, CM2
LJMP ADDCM1
CM2: JNB 20H.3, CM3
LJMP SUBCM1
CM3: DJNZ R5, LOOPCM0
LJMP OUTSC
;---------------------分加减一--------------------
ADDCM1: MOV R0, #69H ;加一
LCALL ADD1
LJMP SETCM
SUBCM1: MOV R0, #69H ;减一
LCALL SUBBMS
LJMP SETCM
SETCM: MOV R0, #69H
MOV R1, #6AH
LCALL RDIRM
CJNE R3, #60H, SETCMM
MOV 6AH, #00H
MOV 69H, #00H
MOV R0, #69H
MOV R1, #6AH
LCALL RDIRM
LJMP SETCMM
OUTSC: RET
;-------------------------------------------------
;===========调整显示装载子程序====================
;-------------------------------------------------
RDIRH: MOV 6DH, 7BH
MOV 6EH, 7BH
MOV 6FH, 7BH
MOV 70H, 7BH
MOV 71H, 7BH
MOV 72H, 7BH
MOV 73H, @R0
MOV 74H, @R1
RET
RDIRM: MOV 6DH, 7BH
MOV 6EH, 7BH
MOV 6FH, 7BH
MOV 70H, @R0
MOV 71H, @R1
MOV 72H, 7BH
MOV 73H, 7BH
MOV 74H, 7BH
RET
RDIRS: MOV 6DH, @R0
MOV 6EH, @R1
MOV 6FH, 7BH
MOV 70H, 7BH
MOV 71H, 7BH
MOV 72H, 7BH
MOV 73H, 7BH
MOV 74H, 7BH
RET
;--------------------------------------------------
;=====================键扫描子程序=================
;--------------------------------------------------
KEYC: LCALL KEYDEAL ;键扫描子程序
LCALL DIR
LCALL DIR
LCALL KEYDEAL ;再次确认键有无按下,去抖动
JZ EXIT
MOV B, 20H
KEYSF: LCALL KEYDEAL
JZ KEY1
LCALL DIR
LJMP KEYSF ;当键按下弹起后保存键值,返回
KEY1: MOV 20H, B
EXIT: RET
;----------------------秒表键扫描子程序--------------
KEYCS: LCALL KEYDEAL ;键扫描子程序
LCALL DIRS
LCALL DIRS
LCALL KEYDEAL
JZ EXITS
MOV B, 20H
KEYSFS: LCALL KEYDEAL
JZ KEY1S
LCALL DIRS
LJMP KEYSFS
KEY1S: MOV 20H, B
EXITS: RET
;---------------P1口处理子程序----------------------
KEYDEAL:PUSH PSW ;P1口处理子程序
MOV A, P1
CPL A
ANL A, #0FH
MOV 20H, A
POP PSW
RET
;---------------------------------------------------
;=================1S计时程序========================
;---------------------------------------------------
INTT1: PUSH PSW
PUSH ACC
CLR ET1
CLR TR1
MOV TH1, #0BH
MOV TL1, #0DCH
SETB TR1
DJNZ R7, OUTT0
ADDSS: MOV R7, #08H
MOV R0, #75H
LCALL ADD1
CLR C
CJNE R3, #60H, ADDMM
ADDMM: JC OUTT1
MOV 75H, #00H
MOV 76H, #00H
MOV R0, #77H
LCALL ADD1
CLR C
CJNE R3, #60H, ADDHH
ADDHH: JC OUTT0
MOV 77H, #00H
MOV 78H, #00H
MOV R0, #79H
LCALL ADD1
CLR C
CJNE R3, #24H, HOUR
HOUR: JC OUTT0
MOV R0, #75H
MOV R1, #06H
LCALL CLR0
OUTT0: MOV 6FH, #0CH ;熄灭符
MOV 72H, #0CH
LJMP OUTT2
OUTT1: MOV 6FH, #0BH ;‘-’
MOV 72H, #0BH ;‘-’
OUTT2: MOV 6DH, 75H ;秒个位
MOV 6EH, 76H ;十位
MOV 70H, 77H ;分个位
MOV 71H, 78H ;十位
MOV 73H, 79H ;时个位
MOV 74H, 7AH ;十位
SETB ET1
POP ACC
POP PSW
RETI
;----------------10ms计时程序------------------
INTT0: PUSH PSW
PUSH ACC
CLR ET0
CLR TR0
MOV TH0, #0FEH
MOV TL0, #0FFH
SETB TR0
DJNZ R7, OUTTT0
ADDSSS: MOV R7, #08H
MOV R0, #61H
LCALL ADD1
CLR C
CJNE R3, #99H, ADDMMS
ADDMMS: JC OUTTT1
MOV 61H, #00H
MOV 62H, #00H
MOV R0, #63H
LCALL ADD1
CLR C
CJNE R3, #60H, ADDHHS
ADDHHS: JC OUTTT0
MOV 63H, #00H
MOV 64H, #00H
MOV R0, #65H
LCALL ADD1
CLR C
CJNE R3, #60H, HOURS
HOURS: JC OUTTT0
MOV R0, #61H
MOV R1, #06H
LCALL CLR0
OUTTT0: MOV 6FH, #0CH ;熄灭符
MOV 72H, #0CH
LJMP OUTTT2
OUTTT1: MOV 6FH, #0BH ;‘-’
MOV 72H, #0BH ;‘-’
OUTTT2: MOV 6DH, 61H ;秒个位
MOV 6EH, 62H ;十位
MOV 70H, 63H ;分个位
MOV 71H, 64H ;十位
MOV 73H, 65H ;时个位
MOV 74H, 66H ;十位
SETB ET0
POP ACC
POP PSW
RETI
;----------------------------------------------------
;===============加1子程序 入口R0,出口R0,R3===========
;----------------------------------------------------
ADD1: MOV A, @R0
INC R0
SWAP A
ORL A, @R0
SWAP A
ADD A, #01H
DA A
MOV R3, A
ANL A, #0F0H
SWAP A
MOV @R0, A
DEC R0
MOV A, R3
ANL A, #0FH
MOV @R0, A
RET
;------------------------------------------------------
;=============时减一子程序 入口R0,出口R0,R3===========
;------------------------------------------------------
SUBBH1: MOV A, @R0
INC R0
SWAP A
ORL A, @R0
SWAP A
JZ OUTS0
DEC A
MOV R3, A
ANL A, #0FH
CLR C
SUBB A, #0AH
JC SBCLSG
DEC R0
MOV @R0, #09H
MOV A, R3
ANL A, #0F0H
SWAP A
INC R0
MOV @R0, A
RET
SBCLSG: MOV A, R3
ANL A, #0F0H
SWAP A
MOV @R0, A
MOV A, R3
ANL A, #0FH
DEC R0
MOV @R0, A
RET
OUTS0: MOV @R0, #02H
DEC R0
MOV @R0, #03H
MOV R3, #23H
RET
;--------------------------------------------------------
;============分秒减一子程序 入口R0,出口R0,R3=============
;--------------------------------------------------------
SUBBMS: MOV A, @R0
INC R0
SWAP A
ORL A, @R0
SWAP A
JZ OUTS1
DEC A
MOV R3, A
ANL A, #0FH
CLR C
SUBB A, #0AH
JC SBCLG
DEC R0
MOV @R0, #09H
MOV A, R3
ANL A, #0F0H
SWAP A
INC R0
MOV @R0, A
RET
SBCLG: MOV A, R3
ANL A, #0F0H
SWAP A
MOV @R0, A
MOV A, R3
ANL A, #0FH
DEC R0
MOV @R0, A
RET
OUTS1: MOV @R0, #05H
DEC R0
MOV @R0, #09H
MOV R3, #59H
RET
;-----------------------------------------------------
;================清零子程序 入口R0,R1 ================
;-----------------------------------------------------
CLR0:
MOV @R0, #00H
DEC R0
DJNZ R1, CLR0
RET
;-----------------------------------------------------
;===================闹铃子程序========================
;-----------------------------------------------------
CLOCK: PUSH ACC
PUSH PSW
MOV A, 6CH
CJNE A, 7AH, OUTCLK ;查时十位
MOV A, 6BH
CJNE A, 79H, OUTCLK
MOV A, 6AH
CJNE A, 78H, OUTCLK
MOV A, 69H
CJNE A, 77H, OUTCLK
MOV A, 68H
CJNE A, 76H, OUTCLK
MOV A, 67H
CJNE A, 75H, OUTCLK
CLR P1.4
LCALL DL60S
OUTCLK: SETB P1.4
POP PSW
POP ACC
RET
;----------------------------------------------------------------
;=====================显示子程序=================================
;----------------------------------------------------------------
DIR: PUSH PSW
PUSH ACC
MOV DPTR, #TABLE ;74~~~76D时到秒、十到个
MOV R0, 74H
CJNE R0, #00H, MIEL
MOV 74H, #0CH
MIEL: MOV R0, #74H
MOV R1, #01H
LOOPR: MOV A, R1
CPL A
MOV P2, A ;送扫描字
MOV A, @R0
MOVC A, @A+DPTR ;查表
MOV P0, A
LCALL DL1MS
MOV A, R1
JB ACC.7, OUT
展开阅读全文