电子秒表的设计

  • 格式:doc
  • 大小:258.50 KB
  • 文档页数:9

实验二:电子秒表的设计

一、功能分析

1.6位LED:

5 9 5 9 9

9

分 秒 1/10秒 1/100秒

2.按键启动、停止秒表计数,可以清零。

二、硬件设计

1. 硬件电路图

2. 元器件清单

伟福Lab6000综合实验/仿真系统一台套;微机一台;导线若干

三、程序设计

1.程序:

OUTBIT equ 08002h ; 位控制口

OUTSEG equ 08004h ; 段控制口 - 1 - IN equ 08001h ; 键盘读入口

LEDBuf equ 60h ; 显示缓冲

Hour equ 40h

Minute equ 41h

Second equ 42h

C100us equ 43h

Speaker equ P1.2

Tick equ 200

T100us equ 256-50

ljmp Start

org 000bh

ljmp T0Int

T0Int:

push PSW

push ACC

mov a, C100us+1

jnz Goon0

dec C100us

Goon0:

dec C100us+1

mov a, C100us

orl a, C100us+1

jnz Exit

mov C100us, #high(Tick)

mov C100us+1, #low(Tick)

inc Second

mov a, Second

cjne a, #60, Exit

mov Second, #0

inc Minute

call lightup

mov a, Minute

cjne a, #60, Exit

mov Minute, #0

inc Hour

mov a, Hour

cjne a, #24, Exit

mov Hour, #0

Exit:

pop ACC

pop PSW - 2 - reti

Delay:

mov r7, #0

DelayLoop:

djnz r7, DelayLoop

djnz r6, DelayLoop

ret

TestKey:

mov dptr, #OUTBIT

mov a, #0

movx @dptr, a ; 输出线置为0

mov dptr, #IN

movx a, @dptr ; 读入键状态

cpl a

anl a, #0fh ; 高四位不用

ret

KeyTable: ; 键码定义

db 16h, 15h, 14h, 0ffh

db 13h, 12h, 11h, 10h

db 0dh, 0ch, 0bh, 0ah

db 0eh, 03h, 06h, 09h

db 0fh, 02h, 05h, 08h

db 00h, 01h, 04h, 07h

GetKey:

mov dptr, #OUTBIT

mov P2, dph

mov r0, #Low(IN)

mov r1, #00100000b

mov r2, #6

KLoop:

mov a, r1 ; 找出键所在列

cpl a

movx @dptr, a

cpl a

rr a

mov r1, a ; 下一列

movx a, @r0

cpl a

anl a, #0fh

jnz Goon1 ; 该列有键入

djnz r2, KLoop

mov r2, #0ffh ; 没有键按下, 返回 0ffh

sjmp Exit3

Goon1: - 3 - mov r1, a ; 键值 = 列 X 4 + 行

mov a, r2

dec a

rl a

rl a

mov r2, a ; r2 = (r2-1)*4

mov a, r1 ; r1中为读入的行值

mov r1, #4

LoopC:

rrc a ; 移位找出所在行

jc Exit3

inc r2 ; r2 = r2+ 行值

djnz r1, LoopC

Exit3:

mov a, r2 ; 取出键码

mov dptr, #KeyTable

movc a, @a+dptr

mov r2, a

WaitRelease:

mov dptr, #OUTBIT ; 等键释放

clr a

movx @dptr, a

mov r6, #10

call Delay

call TestKey

jnz WaitRelease

mov a, r2

ret

LEDMAP: ; 八段管显示码

db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h

db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h

DisplayLED:

mov r0, #LEDBuf

mov r1, #6 ; 共6个八段管

mov r2, #00100000b ; 从左边开始显示

LOOP:

mov dptr, #OUTBIT

mov a, #0

movx @dptr, a ; 关所有八段管

mov a, @r0

mov dptr, #OUTSEG

movx @dptr,a

mov dptr, #OUTBIT

mov a, r2 - 4 - movx @dptr, a ; 显示一位八段管

mov r6, #1

call Delay

mov a, r2 ; 显示下一位

rr a

mov r2, a

inc r0

djnz r1, Loop

ret

LIGHTUP:

jb p1.3,lightstop

setb Speaker

mov b,#0ffh

LIGHTDELAY:

nop

nop

djnz b,lightdelay

clr speaker

LIGHTSTOP:

ret

ToLED:

mov dptr, #LEDMap

movc a, @a+dptr

ret

START:

mov LEDBuf+0, #07ch

mov LEDBuf+1, #03fh

mov LEDBuf+2, #07fh

mov LEDBuf+3, #05bh

mov LEDBuf+4, #05bH

mov LEDBuf+5, #05bH

call displayled

call testkey

jz start

call getkey

cjne a,#0ah,start

START1:

mov TMOD, #02h ; 模式2, 定时器

mov TH0, #T100us

mov TL0, #T100us

mov IE, #10000010b

mov Hour, #0

mov Minute, #0

mov Second, #0 - 5 - mov C100us, #high(Tick)

mov C100us+1, #low(Tick)

setb TR0

MAIN:

JB P1.0,stop

JB P1.1,clear

Call testkey

call getkey

mov b,a

xrl a,#0bh

jz stop0

mov a,b

cjne a,#0ch,main2

ljmp clear0

MAIN2:

mov a, Hour

mov b, #10

div ab

call ToLED