51单片机数码管时钟电路的设计AT89C51Word格式文档下载.docx
《51单片机数码管时钟电路的设计AT89C51Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机数码管时钟电路的设计AT89C51Word格式文档下载.docx(34页珍藏版)》请在冰点文库上搜索。
![51单片机数码管时钟电路的设计AT89C51Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/5a3de0ff-52a9-44c8-a877-e13f5059e177/5a3de0ff-52a9-44c8-a877-e13f5059e1771.gif)
主循环流程图大致如下:
图
(一)主循环流程图
定时器1中断服务程序流程图如下:
图
(二)定时器1中断服务程序流程图
3.系统主要程序的设计
1)主程序
本设计中的主程序主要负责对键盘扫描及显示数据,还包括判断是否闹钟正在活动。
若键盘中的P1.6(模式键)或P1.7(设置键)被按下,登记将被执行的功能,主循环不负责功能模块的执行。
若闹钟正在活动,调用蜂鸣函数。
其中bPalse标识了一秒的前半秒和后半秒,是为了控制显示数据的半秒闪烁。
主函数还包含初始化操作,以下省略。
loop:
MOVB,#01111111B;
位选通信号
MOVR0,#prebuf-01H;
数据缓冲区
nextnum:
ACALLkeyscan;
扫描键盘
INCR0
MOVA,@R0
PUSHACC
MOVA,B
RLA
MOVB,A
JBbPalse,show
ORLA,dmask
JNBbAlaIng,show
MOVled,#0FFH
ACALLbeeponce若闹铃活动,调用蜂鸣函数
DECSP
SJMPloop
show:
PUSHACC
ACALLdisplayone在特定数码管显示数据。
ACALLdelay
CJNER0,#prebufend,nextnum
keyscan:
JNBkeym,keymode;
若切换键被按下,登记“切换”功能
JNBkeyc,keyconf;
若设置键被按下,登记“设置”功能
RET
;
=====================
logfunction'
mode'
keymode:
MOVfunclog,#01H;
keyact
ACALLfuncperform;
激活“功能执行模块”(见下文),
config'
keyconf:
MOVfunclog,#02H
激活“功能执行模块”(见下文)
2)显示子程序
在特定数码管显示数据,通过堆栈传递参数。
第一个参数是待显示的字符,第二个参数是位选通信号。
函数通过查字形码表将字形显示至数码管。
displayone:
PUSHPSW
MOVA,R0
PUSHB
MOVPSW,#00H
MOVA,SP
SUBBA,#07H
MOVR0,A
MOVB,@R0
PUSHDPL
PUSHDPH
MOVDPTR,#metrix
MOVCA,@A+DPTR
JNBbPalse,noft
ANLA,ft
noft:
MOVlmask,B
MOVled,A
POPDPH
POPDPL
POPB
POPACC
POPPSW
3)定时器TO中断服务程序
电子钟的计秒程序,负责计算时间。
act:
;
maintimeractor
CJNER2,#0BH,con
CLRbPalse;
palsepersecond
con:
DJNZR2,leave
MOVR2,#14H
MOVA,s;
s
INCA
DAA
MOVs,A
CJNEA,#60H,incn
MOVs,#00H
MOVA,m;
m
MOVm,A
MOVm,#00H
MOVA,h;
h
MOVh,A
CJNEA,#24H,incn
MOVh,#00H
incn:
SETBbPalse
JNBbAlaOn,alarmoff
ACALLcheckala;
checkalarmwhenalarmisON
alarmoff:
MOVA,npage
ANLA,#02H
JNZskip
ACALLprepare
skip:
leave:
MOVTH0,#03CH
MOVTL0,#0B0H
RETI
4)模式切换程序
切换设置模式,包括时间时设置、时间分设置、时间秒设置、闹铃开关设置、闹铃时设置、闹铃分设置。
mode:
mode
SETBP3.2
JNBbAlaIng,modeskip
SETBbKick;
stopalarm
CLRbAlaIng
SJMPmodeleave
modeskip:
MOVnpage,#00H
MOVDPTR,#maskdat
MOVA,cmode
CJNEA,#07H,enmode
MOVA,#00H
enmode:
MOVcmode,A
ANLA,#04H
JZnotalapage
MOVnpage,#02H
ACALLpreala;
时钟调整页准备
notalapage:
MOVdmask,A;
设置时闪烁
modeleave:
5)模式设置程序
对时间量执行加1,特别的闹铃开关执行开关设置。
conf:
conf
SETBP3.3
JNBbAlaIng,confskip
SETBbKick;
CLRbAlaIng
SJMPconfleave
confskip:
MOVDPTR,#confset
JMP@A+DPTR
set1:
;
时设置
MOVA,h
CJNEA,#24H,notset
SJMPnotset
set2:
分设置
MOVA,m
CJNEA,#60H,notset
set3:
秒设置
MOVA,s
MOVs,A
setae:
CPLbAlaOn;
闹钟开关
SJMPnotseta
setah:
MOVA,ah;
闹钟时设置
MOVah,A
CJNEA,#24H,notseta
MOVah,#00H
setam:
MOVA,am;
闹钟分设置
MOVam,A
CJNEA,#60H,notseta
MOVam,#00H
notseta:
ACALLpreala
CLRbKick
notset:
confleave:
confset:
SJMPset1
SJMPset2
SJMPset3
SJMPsetae
SJMPsetah
SJMPsetam
6)功能执行程序
执行程序负责执行被登记的功能,功能由主循环扫描键盘并登记。
主循环中,当扫描到有键盘按下时,登记下将被执行的功能,然后启动定时器1,定时器1的中断服务程序即是功能执行程序,中断程序分析并执行被登记的功能。
encperform:
CLRTR1;
actonce
MOVA,funclog
CJNEA,#01H,encconf
JNBkeym,encperformleave;
actionjustatbuttonup;
ACALLmode;
do'
function
SJMPencperformleave
encconf:
CJNEA,#02H,encperformleave
JNBkeyc,encperformleave;
ACALLconf;
encperformleave:
四、完整源代码
sEQU30H
mEQU31H
hEQU32H
dmaskEQU33H
cmodeEQU34H
ftEQU36H
prebufEQU37H;
8bytebuffer
prebufendEQU3EH
amEQU3FH;
alarmminite
ahEQU40H;
alarmhour
npageEQU41H;
functionpage
funclogEQU42H;
functoact
stackEQU4FH
pin
ledEQUP0
lmaskEQUP2
beepEQUP3.3
keymEQUP1.6;
key'
keycEQUP1.7;
bitaddr
bPalseEQU00H
bAlaIngEQU01H
bAlaOnEQU02H
bKickEQU03H
metrixelement
m_noneEQU0AH
m_oEQU0BH
m_fEQU0CH
m_nEQU0DH
org0000H
LJMPstart
org0003H
LJMPmodelogger;
INT0tomode
org000BH
LJMPact;
timer
org0013H
LJMPconflogger;
INT1toconfig
org001BH
LJMPencperform;
performer
org0100H
start:
MOVSP,#stack
MOVTMOD,#11H
MOVTH0,#3CH
MOVR2,#14H;
R2usedbyT0
MOVdmask,#00H
MOVcmode,#00H
MOVah,#23H
MOVam,#59H
SETBEA
SETBET0;
T0
SETBPT0
SETBTR0
SETBET1;
T1
SETBEX0;
INT0
SETBIT0
SETBEX1;
INT1
SETBIT1
SETBP3.2
SETBP3.3
SETBkeym
SETBkeyc
CLRbAlaIng
CLRbAlaOn
CLRbKick
MOVB,#01111111B
MOVR0,#prebuf-01H
ACALLkeyscan
MOVled,#0FFH;
clrledwhenalarm
ACALLbeeponce
ACALLdisplayone
SJMPloop;
endstart
beeponce:
CPLbeep
MOVR5,#02H
beeploop2:
MOVR6,#0FFH
beeploop1:
NOP
DJNZR6,beeploop1
DJNZR5,beeploop2
RET;
endbeeponce
displayonecharacter
@paramcharCharactertodisplay
@parammaskPositioncharactertodisplay
enddisplayone
delay:
MOVA,R5
MOVA,R6
MOVR5,#03H
dloopo:
dloop:
DJNZR6,dloop
DJNZR5,dloopo
MOVR6,A
MOVR5,A
enddelay
ORG0200H
preparetimedatas
tothedisplaybuffer
prepare:
MOVft,#11011111B;
enableft
MOVA,R1
MOVR1,#prebuf
MOV@R1,#m_none
INCR1
SWAPA
ANLA,#0FH
MOV@R1,A
ANLB,#0FH
MOV@R1,B
MOV@R1,A
MOVR1,A
endprepare
preparealarmdatas
preala:
MOVft,#0FFH;
noft
MOV@R1,#m_o
JNBbAlaOn,alaoff
MOV@R1,#m_n
SJMPalacon
alaoff:
MOV@R1,#m_f
alacon:
MOVA,ah
MOVA,am
endpreala
ORG0300H
performaction
preparetodofunction
funcperform:
MOVTH1,#0D8H
MOVTL1,#0F0H
SETBTR1
modelogger:
MOVfunclog,#01H
ACALLfuncperform
conflogger:
ORG0400H
tochangefunction
orstopalarmwh