基于单片机的电子秒表的设计.docx
《基于单片机的电子秒表的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子秒表的设计.docx(15页珍藏版)》请在冰点文库上搜索。
![基于单片机的电子秒表的设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/a21af079-b012-4006-ab14-dc7f5ccc0c1d/a21af079-b012-4006-ab14-dc7f5ccc0c1d1.gif)
基于单片机的电子秒表的设计
电子秒表的设计
一、设计目的
掌握定时器使用方法,掌握单片机管理键盘、显示器的方法。
二、技术指标
1.6位LED:
5
9
5
9
9
9
分
秒
1/10秒
1/100秒
2.按键启动、停止秒表计数。
三、设计方案
基本定时时间为100us。
中断10000次为1秒。
秒和分逢60进1。
1/1000秒不显示,做四舍五入处理。
参考实验十八电子钟程序。
设计任务
设计任务:
利用LAB6000单片机实验箱实现数字秒表设计
1.设计电子秒表,精度为0.01秒
2.具有启动、停止、清零功能
3.每到1秒蜂鸣提示,此功能可关闭。
基本定时时间为100us。
中断10000次为1秒。
秒和分逢60进1。
1/1000秒不显示,做四舍五入处理。
利用数码管扫描显示,将数据显示在数码管上。
程序是从左边开始显示,然后显示下一位,四位显示完后返回。
不断的循环扫描,由于扫描时间小于20ms,人眼有时间暂留现象,能看到同时亮。
还利用了键盘扫描程序,能够设置键盘按钮控制程序,本课程设计利用了15个按键,0~9十个数字输入按键,一个开始按键,一个暂停按键,一个复位清零按键,一个控制输入按键。
程序流程图
程序模块功能
1、主程序Start:
设置初始化,包括初值的设置,计数器的设置和中断的设置。
2、中断程序T0Int、T1Int:
分别实现正数计时和倒数计时功能。
3、数码管扫描及显示程序DisplayLED:
利用数码管扫描显示,将数据显示在数码管上。
4、键盘扫描及读键值程序TestKey、GetKey:
利用了键盘扫描程序,设置键盘按钮控制,一个开始按键,一个暂停按键,一个复位清零按键,一个控制输入按键。
程序清单
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
INequ08001h;键盘读入口
LEDBufequ60h;显示缓冲
Minuteequ40h
Secondequ41h
NSecondequ42h
MSecondequ43h
C100usequ44h
Tickequ100
T100usequ206
org0000h
ljmpStart
org000bh
ajmpt0int
org1bh
ajmpt1int
T0Int:
pushPSW
pushACC
decC100us
mova,C100us
jnzExit
movC100us,#Tick
incMsecond
mova,Msecond
cjnea,#10,Exit
movMsecond,#0
incNsecond
mova,Nsecond
cjnea,#10,Exit
movNsecond,#0
incSecond
mova,Second
cjnea,#60,Exit
movSecond,#0
incMinute
mova,Minute
cjnea,#60,Exit
movMinute,#0
popACC
popPSW
reti
T1Int:
pushPSW;恢卸?
倒数计时
pushACC
decC100us
mova,C100us
jnzExit
movC100us,#Tick
DECMsecond
mova,Msecond
cjnea,#0,Exit
movMsecond,#9
DECNsecond
mova,Nsecond
cjnea,#0,Exit
movNsecond,#9
DECSecond
mova,Second
cjnea,#0,Exit
JZWW
WW:
CLRTR1
SETBP1.0
movr4,#255
qq1:
calldisplayled
djnzr4,qq1
CLRP1.0
Exit:
popACC
popPSW
reti
Delay:
;延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
DisplayLED:
movr0,#LEDBuf
movr1,#6;共6个八段管
movr2,#00100000b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
ret
TestKey:
movdptr,#OUTBIT
mova,#0;
movx@dptr,a;输出线置为0
movdptr,#IN
movxa,@dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
KLoop:
mova,r1;找出键所在列
cpla
movx@dptr,a
cpla
rra
movr1,a;下一列
movxa,@r0
cpla
anla,#0fh
jnzGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpExit1
Goon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
LoopC:
rrca;移位找出所在行
jcExit1
incr2;r2=r2+行值
djnzr1,LoopC
Exit1:
mova,r2;取出键码
movdptr,#KeyTable
movca,@a+dptr
movr2,a
WaitRelease:
movdptr,#OUTBIT;等键释放
clra
movx@dptr,a
movr6,#10
callDelay
callTestKey
jnzWaitRelease
mova,r2
ret
ToLED:
movdptr,#LEDMap
movca,@a+dptr
ret
Start:
movLEDBuf,#3fh
movLEDBuf+1,#0bfh
movLEDBuf+2,#3fh
movLEDBuf+3,#0bfh
movLEDBuf+4,#3fh
movLEDBuf+5,#3fh
movTMOD,#00100010b;模式2,定时器
movTH0,#T100us
movTL0,#T100us
movTH1,#T100us
movTL1,#T100us
movIE,#10001010b;EA=1,IT0=1
movMinute,#0
movSecond,#0
movNSecond,#0
movMSecond,#0
movC100us,#Tick
clrp1.0
MLoop:
callDisplayLED
callloopd
callTestkey
jzMLoop
callGetkey
cjnea,#11h,L0
callss
ajmpMloop
l0:
cjnea,#15h,L1
setbTR0
L1:
cjnea,#16h,L2
clrTR0
clrc
mova,C100us
subba,#50
jcL4
ljmpMLoop
L2:
cjnea,#0ffh,L3
movMinute,#0
movSecond,#0
movNSecond,#0
movMSecond,#0
movC100us,#Tick
ljmpMLoop
L4:
ljmpNLoop
L3:
ljmpMLoop
NLoop:
incMsecond
mova,Msecond
cjnea,#10,MLoop
movMsecond,#0
incNsecond
mova,Nsecond
cjnea,#10,MLoop
movNsecond,#0
incSecond
mova,Second
cjnea,#60,MLoop
movSecond,#0
incMinute
mova,Minute
cjnea,#60,MLoop
movMinute,#0
ret
Loopd:
mova,Minute
movb,#10
divab
callToLED
movLEDBuf,a
mova,b
callToLED
orla,#80h
movLEDBuf+1,a
mova,Second
movb,#10
divab
callToLED
movLEDBuf+2,a
mova,b
callToLED
orla,#80h
movLEDBuf+3,a
mova,NSecond
callToLED
movLEDBuf+4,a
mova,MSecond
callToLED
movLEDBuf+5,a
RET
DLOOP:
callDisplayLED
callloopd
callTestkey
jzDLoop
callGetkey
CJNEA,#15H,l000
setbTR1
L000:
cjnea,#16h,L222
clrTR1
clrc
mova,C100us
subba,#50
jcL444
ljmpDLoop
L222:
cjnea,#0ffh,L333
movMinute,#00
movSecond,#00
movNsecond,#0
movMSecond,#0
movC100us,#Tick
ljmpstart
L444:
ljmpELoop
L333:
ljmpDLoop
ELoop:
decMsecond
mova,Msecond
cjnea,#0,DLoop
movMsecond,#9
decNsecond
mova,Nsecond
cjnea,#0,DLoop
movNsecond,#9
decSecond
mova,Second
cjnea,#00,DLoop
ret
ss:
calltestkey
jzss
callgetkey
movledbuf+2,a
calltoled
ss1:
calltestkey
jzss1
callgetkey
movledbuf+3,a
calltoled
MOVA,LEDBUF+2
MOVB,#10
MULAB
ADDA,LEDBUF+3
movMinute,#0
MOVSECOND,A
movNSecond,#9
movMSecond,#9
movC100us,#Tick
qq:
calldisplayled
callDLOOP
ret
end
硬件资源分配表
存储单元、寄存器
用途
备注
8002H
位控制口
8004H
段控制口
8001H
键盘读入口
60H
显示缓冲
数码管显示
40~44H
数据存放区
分别存放分、秒、1/10秒、1/100秒所对应数据