#51单片机数码管时钟电路的设计_AT89C51

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广东石油化工学院
《51单片机原理和实践》课程设计报告学院计算机和电子信息学院
专业
班级
学号
姓名
指导教师
课程成绩
完成日期 2010年12月27日
数码管时钟电路的设计
一、设计目的:
通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。

二、设计要求:
LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。

该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。

三、设计实验内容:
1. 硬件的设计
其采用AT89C51单片机使用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。

为了提供LED数码管的驱动电流,采用6MHz晶振。

2. 系统总体分析
系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。

●显示模块:主要由主循环负责。

内存中开辟了一段8字节的内存空间,
用作数据显示的字符缓冲区。

主循环不断将缓冲区中的字符呈现至数码管。

●时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。

●模式切换模块(MODE):切换电子钟的设置模式,包括时设置、分设
置、秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。

相关数据被设置时将闪烁显示。

●模式设置模块(CONFIG):通过判断设置模式(MODE),执行相应的
设置。

如时、分、秒的增1以及闹铃开关的变换。

另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。

在定时器1中断时,被登记的功能正式执行。

期间用时约10ms,用以消除机械抖动。

主循环流程图大致如下:
开始
键被按下
登记相应功能
数码管显示
图(一)主循环流程图
定时器1中断服务程序流程图如下:
定时器1中断
MODE CONFIG
logfunc = ?
执行MODE 执行CONFIG
结束
图(二)定时器1中断服务程序流程图
3. 系统主要程序的设计
1)主程序
本设计中的主程序主要负责对键盘扫描及显示数据,还包括判断是否闹钟正在活动。

若键盘中的P1.6(模式键)或P1.7(设置键)被按下,登记将被执行的功能,主循环不负责功能模块的执行。

若闹钟正在活动,调用蜂鸣函数。

其中bPalse标识了一秒的前半秒和后半秒,是为了控制显示数据
的半秒闪烁。

主函数还包含初始化操作,以下省略。

loop:
MOV B, #01111111B ;位选通信号
MOV R0, #prebuf - 01H ;数据缓冲区
nextnum:
ACALL keyscan ;扫描键盘
INC R0
MOV A, @R0
PUSH ACC
MOV A, B
RL A
MOV B, A
JB bPalse, show
ORL A, dmask
JNB bAlaIng, show
MOV led, #0FFH
ACALL beeponce 若闹铃活动,调用蜂鸣函数
DEC SP
SJMP loop
show:
PUSH ACC
ACALL displayone 在特定数码管显示数据。

DEC SP
DEC SP
ACALL delay
CJNE R0, #prebufend, nextnum
SJMP loop
keyscan:
JNB keym, keymode ;若切换键被按下,登记“切换”功能
JNB keyc, keyconf ;若设置键被按下,登记“设置”功能
RET
;=====================
;
;log function 'mode'
;
;=====================
keymode:
MOV funclog, #01H ;key act
ACALL funcperform ;激活“功能执行模块”(见下文),
RET
;=====================
;
;log function 'config'
;
;=====================
keyconf:
MOV funclog, #02H
ACALL funcperform ;激活“功能执行模块”(见下文)
RET
2)显示子程序
在特定数码管显示数据,通过堆栈传递参数。

第一个参数是待显示的字符,第二个参数是位选通信号。

函数通过查字形码表将字形显示至数码管。

displayone:
PUSH ACC
PUSH PSW
MOV A, R0
PUSH ACC
PUSH B
MOV PSW, #00H
MOV A, SP
SUBB A, #07H
MOV R0, A
MOV A, @R0
INC R0
MOV B, @R0
PUSH DPL
PUSH DPH
MOV DPTR, #metrix
MOVC A, @A + DPTR
JNB bPalse, noft
ANL A, ft
noft:
MOV lmask, B
MOV led, A
POP DPH
POP DPL
POP B
POP ACC
MOV R0, A
POP PSW
POP ACC
RET
3)定时器TO中断服务程序
电子钟的计秒程序,负责计算时间。

act: ;main timer actor
CJNE R2, #0BH, con
CLR bPalse ;palse per second
con:
DJNZ R2, leave
MOV R2, #14H
PUSH ACC
PUSH PSW
MOV PSW, #00H
MOV A, s ;s
INC A
DA A
MOV s, A
CJNE A, #60H, incn
MOV s, #00H
MOV A, m ;m
INC A
DA A
MOV m, A
CJNE A, #60H, incn
MOV m, #00H
MOV A, h ;h
INC A
DA A
MOV h, A
CJNE A, #24H, incn
MOV h, #00H
incn:
SETB bPalse
JNB bAlaOn, alarmoff
ACALL checkala ;check alarm when alarm is ON
alarmoff:
MOV A, npage
ANL A, #02H
JNZ skip
ACALL prepare
skip:
POP PSW
POP ACC
leave:
MOV TH0,#03CH
MOV TL0,#0B0H
RETI
4)模式切换程序
切换设置模式,包括时间时设置、时间分设置、时间秒设置、闹铃开关设置、闹铃时设置、闹铃分设置。

mode: ;mode
;SETB P3.2
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
JNB bAlaIng, modeskip
SETB bKick ;stop alarm
CLR bAlaIng
SJMP modeleave
modeskip:
MOV npage, #00H
MOV DPTR, #maskdat
MOV A, cmode
INC A
CJNE A, #07H, enmode
MOV A, #00H
enmode:
MOV cmode, A
ANL A, #04H
JZ notalapage
MOV npage, #02H
ACALL preala ;时钟调整页准备
notalapage:
MOV A, cmode
MOVC A, @A + DPTR
MOV dmask, A ;设置时闪烁
modeleave:
POP DPH
POP DPL
POP PSW
POP ACC
RET
5)模式设置程序
对时间量执行加1,特别的闹铃开关执行开关设置。

conf: ;conf
;SETB P3.3
PUSH ACC
PUSH PSW
MOV PSW, #00H
MOV A, cmode
PUSH DPL
PUSH DPH
JNB bAlaIng, confskip
;SETB bKick ;stop alarm
;CLR bAlaIng
SJMP confleave
confskip:
MOV DPTR, #confset
RL A
JMP @A + DPTR
set1: ;时设置
MOV A, h
INC A
DA A
MOV h, A
CJNE A, #24H, notset
MOV h, #00H
SJMP notset
set2: ;分设置
MOV A, m
INC A
DA A
MOV m, A
CJNE A, #60H, notset
MOV m, #00H
SJMP notset
set3: ;秒设置
MOV A, s
INC A
DA A
MOV s, A
CJNE A, #60H, notset
MOV s, #00H
SJMP notset
setae:
CPL bAlaOn ;闹钟开关
SJMP notseta
setah:
MOV A, ah ;闹钟时设置
INC A
MOV ah, A
CJNE A, #24H, notseta
MOV ah, #00H
SJMP notseta
setam:
MOV A, am ;闹钟分设置
INC A
DA A
MOV am, A
CJNE A, #60H, notseta
MOV am, #00H
notseta:
ACALL preala
CLR bKick
SJMP confleave
notset:
ACALL prepare
confleave:
POP DPH
POP DPL
POP PSW
POP ACC
RET
confset:
SJMP confleave
SJMP set1
SJMP set2
SJMP set3
SJMP setae
SJMP setah
SJMP setam
6)功能执行程序
执行程序负责执行被登记的功能,功能由主循环扫描键盘并登记。

主循环中,当扫描到有键盘按下时,登记下将被执行的功能,然后启动定时器1,定时器1的中断服务程序即是功能执行程序,中断程序分析并执行被登记的功能。

encperform:
CLR TR1 ;act once
PUSH ACC
PUSH PSW
MOV A, funclog
CJNE A, #01H, encconf
JNB keym, encperformleave ;action just at button up;
ACALL mode ;do 'mode' function
SJMP encperformleave
encconf:
CJNE A, #02H, encperformleave
JNB keyc, encperformleave ;action just at button up;
ACALL conf ;do 'config' function
encperformleave:
POP PSW
RETI
四、完整源代码
s EQU 30H
m EQU 31H
h EQU 32H
dmask EQU 33H
cmode EQU 34H
ft EQU 36H
prebuf EQU 37H ;8 byte buffer prebufend EQU 3EH
am EQU 3FH ;alarm minite
ah EQU 40H ;alarm hour
npage EQU 41H ;function page
funclog EQU 42H ;func to act
stack EQU 4FH
;pin
led EQU P0
lmask EQU P2
beep EQU P3.3
keym EQU P1.6 ;key 'mode'
keyc EQU P1.7 ;key 'config'
;bit addr
bPalse EQU 00H
bAlaIng EQU 01H
bAlaOn EQU 02H
bKick EQU 03H
;metrix element
m_none EQU 0AH
m_o EQU 0BH
m_f EQU 0CH
m_n EQU 0DH
org 0000H
LJMP start
org 0003H
LJMP modelogger ;INT0 to mode
org 000BH
LJMP act ;timer
org 0013H
LJMP conflogger ;INT1 to config
org 001BH
LJMP encperform ;performer
org 0100H
start:
MOV SP, #stack
MOV TMOD,#11H
MOV TH0,#3CH
MOV TL0,#0B0H
MOV R2, #14H ;R2 used by T0 MOV s, #00H
MOV m, #00H
MOV h, #00H
MOV dmask, #00H
MOV cmode, #00H
MOV npage, #00H
MOV ah, #23H
MOV am, #59H
SETB EA
SETB ET0 ;T0
SETB PT0
SETB TR0
SETB ET1 ;T1
SETB EX0 ;INT0
SETB IT0
SETB EX1 ;INT1
SETB IT1
SETB P3.2
SETB P3.3
SETB keym
SETB keyc
CLR bAlaIng
CLR bAlaOn
CLR bKick
loop:
MOV B, #01111111B
MOV R0, #prebuf - 01H
nextnum:
ACALL keyscan
INC R0
MOV A, @R0
PUSH ACC
MOV A, B
RL A
MOV B, A
JB bPalse, show
ORL A, dmask
JNB bAlaIng, show
MOV led, #0FFH ;clr led when alarm ACALL beeponce
DEC SP
SJMP loop
show:
PUSH ACC
ACALL displayone
DEC SP
DEC SP
ACALL delay
CJNE R0, #prebufend, nextnum
SJMP loop ; end start beeponce:
CPL beep
MOV R5, #02H
beeploop2:
MOV R6, #0FFH
beeploop1:
NOP
DJNZ R6, beeploop1
DJNZ R5, beeploop2
RET ;end beeponce
;=====================
;;display one character
;
;@param char Character to display
;@param mask Position character to display
;=====================
displayone:
PUSH ACC
PUSH PSW
MOV A, R0
PUSH ACC
PUSH B
MOV PSW, #00H
MOV A, SP
SUBB A, #07H
MOV R0, A
MOV A, @R0
INC R0
MOV B, @R0
PUSH DPL
PUSH DPH
MOV DPTR, #metrix
MOVC A, @A + DPTR
JNB bPalse, noft
ANL A, ft
noft:
MOV lmask, B
MOV led, A
POP DPH
POP DPL
POP B
POP ACC
MOV R0, A
POP PSW
POP ACC
RET ;end displayone delay:
PUSH ACC
MOV A, R5
PUSH ACC
MOV A, R6
PUSH ACC
MOV R5, #03H
dloopo:
MOV R6, #0FFH
dloop:
NOP
DJNZ R6, dloop
DJNZ R5, dloopo
POP ACC
MOV R6, A
POP ACC
MOV R5, A
POP ACC
RET ;end delay
ORG 0200H
;=====================
;
;prepare time datas
;to the display buffer
;
;=====================
prepare:
MOV ft, #11011111B;enable ft
PUSH ACC
PUSH PSW
PUSH B
MOV A, R1
PUSH ACC
MOV R1, #prebuf
MOV @R1, #m_none
INC R1
MOV @R1, #m_none
INC R1
MOV A, h ;h
MOV B, A
SW AP A
ANL A, #0FH
MOV @R1, A
ANL B, #0FH
INC R1
MOV @R1, B
MOV A, m ;m
MOV B, A
SW AP A
ANL A, #0FH
INC R1
MOV @R1, A
ANL B, #0FH
INC R1
MOV @R1, B
MOV A, s ;s
MOV B, A
SW AP A
ANL A, #0FH
INC R1
MOV @R1, A
ANL B, #0FH
INC R1
MOV @R1, B
POP ACC
MOV R1, A
POP B
POP PSW
POP ACC
RET ;end prepare ;=====================
;
;prepare alarm datas
;to the display buffer
;
;=====================
preala:
MOV ft, #0FFH ;no ft
PUSH ACC
PUSH PSW
MOV R1, #prebuf
MOV @R1, #m_o
INC R1
JNB bAlaOn, alaoff
MOV @R1, #m_n
INC R1
MOV @R1, #m_none
SJMP alacon
alaoff:
MOV @R1, #m_f
INC R1
MOV @R1, #m_f
alacon:
INC R1
MOV @R1, #m_none
MOV A, ah
SW AP A
ANL A, #0FH
INC R1
MOV @R1, A
MOV A, ah
ANL A, #0FH
INC R1
MOV @R1, A
MOV A, am
SW AP A
ANL A, #0FH
INC R1
MOV @R1, A
MOV A, am
ANL A, #0FH
INC R1
MOV @R1, A
POP PSW
POP ACC
RET ;end preala
ORG 0300H
;=====================
;
;perform action
;
;=====================
encperform:
CLR TR1 ;act once
PUSH ACC
PUSH PSW
MOV A, funclog
CJNE A, #01H, encconf
JNB keym, encperformleave ;action just at button up;
ACALL mode ;do 'mode' function SJMP encperformleave
encconf:
CJNE A, #02H, encperformleave
JNB keyc, encperformleave ;action just at button up;
ACALL conf ;do 'config' function encperformleave:
POP PSW
POP ACC
RETI
;=====================
;
;prepare to do function
;
;=====================
funcperform:
MOV TH1, #0D8H
MOV TL1, #0F0H
SETB TR1
RET
;=====================
;
;log function 'mode'
;
;===================== modelogger:
MOV funclog, #01H
ACALL funcperform
RETI
;=====================
;
;log function 'config'
;
;===================== conflogger:
MOV funclog, #02H
ACALL funcperform
RETI
ORG 0400H
;=====================
;
;mode
;
;to change function
;or stop alarm when
;alarming
;
;=====================
mode: ;mode
;SETB P3.2
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
JNB bAlaIng, modeskip
SETB bKick ;stop alarm
CLR bAlaIng
SJMP modeleave
modeskip:
MOV npage, #00H
MOV DPTR, #maskdat
MOV A, cmode
INC A
CJNE A, #07H, enmode
MOV A, #00H
enmode:
MOV cmode, A
ANL A, #04H
JZ notalapage
MOV npage, #02H
ACALL preala
notalapage:
MOV A, cmode
MOVC A, @A + DPTR
MOV dmask, A
modeleave:
POP DPH
POP DPL
POP PSW
POP ACC
RET ;end mode
;=====================
;
;conf
;
;to change setting
;that the 'mode' decided
;
;=====================
conf: ;conf
;SETB P3.3
PUSH ACC
PUSH PSW
MOV PSW, #00H
MOV A, cmode
PUSH DPL
PUSH DPH
JNB bAlaIng, confskip
;SETB bKick ;stop alarm
;CLR bAlaIng
SJMP confleave
confskip:
MOV DPTR, #confset
RL A
JMP @A + DPTR
set1:
MOV A, h
INC A ;h
DA A
MOV h, A
CJNE A, #24H, notset
MOV h, #00H
SJMP notset
set2:
MOV A, m
INC A ;m
DA A
MOV m, A
CJNE A, #60H, notset
MOV m, #00H
SJMP notset
set3:
MOV A, s
INC A ;s
DA A
MOV s, A
CJNE A, #60H, notset
MOV s, #00H
SJMP notset
setae:
CPL bAlaOn ;ala enable
SJMP notseta
setah:
MOV A, ah ;ala h
INC A
DA A
MOV ah, A
CJNE A, #24H, notseta
MOV ah, #00H
SJMP notseta
setam:
MOV A, am ;ala m
INC A
DA A
MOV am, A
CJNE A, #60H, notseta
MOV am, #00H
notseta:
ACALL preala
CLR bKick
SJMP confleave
notset:
ACALL prepare
confleave:
POP DPH
POP DPL
POP PSW
POP ACC
RET
confset:
SJMP confleave
SJMP set1
SJMP set2
SJMP set3
SJMP setae
SJMP setah
SJMP setam ; end conf
ORG 0500H
keyscan:
JNB keym, keymode
JNB keyc, keyconf
RET
;=====================
;
;log function 'mode'
;
;=====================
keymode:
MOV funclog, #01H ;key act
ACALL funcperform
RET
;=====================
;
;log function 'config'
;
;=====================
keyconf:
MOV funclog, #02H
ACALL funcperform
RET
ORG 0600H
act: ;main timer actor
CJNE R2, #0BH, con
CLR bPalse ;palse per second
con:
DJNZ R2, leave
MOV R2, #14H
PUSH ACC
PUSH PSW
MOV PSW, #00H
MOV A, s ;s
INC A
DA A
MOV s, A
CJNE A, #60H, incn
MOV s, #00H
MOV A, m ;m
INC A
DA A
MOV m, A
CJNE A, #60H, incn
MOV m, #00H
MOV A, h ;h
INC A
DA A
MOV h, A
CJNE A, #24H, incn
MOV h, #00H
incn:
SETB bPalse
JNB bAlaOn, alarmoff
ACALL checkala ;check alarm when alarm is ON
alarmoff:
MOV A, npage
ANL A, #02H
JNZ skip
ACALL prepare
skip:
POP PSW
POP ACC
leave:
MOV TH0,#03CH
MOV TL0,#0B0H
RETI ;end act
checkala:
MOV A, m
CJNE A, am, alashut
MOV A, h
CJNE A, ah, alashut
JB bKick, notala ;ala stop
SETB bAlaIng
SJMP notala
alashut:
CLR bAlaIng
CLR bKick
notala:
RET
maskdat:
DB 00000000B, 00001100B, 00110000B, 11000000B, 00000111B, 00110000B, 11000000B metrix:
;DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
DB 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60 DB 0xFF ;0X0A: NONE
DB 0X27 ;0X0B: 'O'
DB 0XB1 ;0X0C: 'F'
DB 0X37 ;0x0D: 'n'
END。

相关文档
最新文档