题目:秒表
要求:
a.用 8051 单片机设计秒表,用 2 位显示秒、2 位显示 1/100 秒;
b.按开始键时,开始计时,显示秒、1/100 秒;再次按开始键停止计时显示秒、1/100 秒;
c.按复位键时,显示全零。
附加功能:
添加一个计时指示灯,开始计时时灯亮,停止计时时灯灭。
单片机的简单介绍:
AT89C51 是一种低功耗、高性能的片内含有 4KB 快闪可编程/擦除只读存储器 (FPEROM-Flash
Programmable and Eraseable Read Only Memory)的 8 位 CMOS 微控制器, 使用高密度、非易
失存储技术制造,并且与 80C51 引脚和指令系统完全兼容。
主要性能: 与 MCS-51 微控制器产品系列兼容。 片内有 4KB 可在线重复编程的快闪擦写存储器
存储数据保存时间为 10 年 宽工作电压范围:Vcc 可为 2.7V 到 6V 全静态工作:可从 0Hz 至
16MHz 程序存储器具有 3 级加密保护 128*8 位内部 RAM 32 条可编程 I/O 线 两个 16 位定时
器/计数器 中断结构具有 5 个中断源和 2 个优先级 可编程全双工串行通道 空闲状态维持低功
耗和掉电状态保存存储内容
设计说明:
晶振电路为 6MHz,机器周期为 2us,定时器每 100us 中断一次,在中断服务程序中,对中断次数进
行比较,100us 计数 100 次就是 1/100 s.然后再对 1/100 s 进行计数 100 次得到秒,并送入显示
缓冲区。当启动外部中断 0(开始键)时,开始计数,显示秒、1/100 秒;再次启动外部中断 0(开
始键)时,暂停计数,显示秒、1/100 秒。当启动外部中断 1(复位键)时,秒和 1/100 秒都显示
“00.00”.
把单片机系统区域中的 P3.2/INTO*用导线连接到按键“开始/暂停”端口上;按键为启动、暂停键
在外部中断 0 中通过控制 TRO 来实现开始与暂停的功能,即每进一次中断取反一次 TR0.
把单片机系统区域中的 P3.2/INT1*用导线连接到按键“清零”端口上,按键为复位键.没进一次外
部中断 1,将储存秒和毫秒地址里的内容清零,并且关闭 TRO 停止计数。
实验箱模拟 p1 口接 LED 灯实现开始/暂停指示功能。
硬件原理图:
实验箱显示部分原理图:
主程序流程图:
开始
制定时器模式及常数
设置初始常数
暂停定时器
读取秒值
转换成显示数据
显示数据送缓冲
读取毫秒值
转换成显示数据
显示数据送缓冲
调用显示子程序
T0 中断服务程序框图
中断入口
保护现场
100 次计数值减 1
计 数 值 为
设置下次 100 次计数值
ms 加 1,送出显示
是
到
ms=100?
否
ms 清零,second 加 1,送出显
示
否
否
否
second=99?
second 清零
恢复现场
中断返回
外部中断 0 流程图:
中断入口
保护现场
将 TR0 取反实现
开始\暂停
取反 p1
点亮/熄灭指示灯
外部中断 1 流程图:
恢复现场
中断返回
中断入口
保护现场
将秒毫,秒清零
并关闭 TRO 停止数
恢复现场
中断返回
仿真后寄存器截图:
程序代码:
ORG
0000H
AJMP
start
ORG
0003H
AJMP X0_INT
ORG
000BH
AJMP T0Int
ORG
0013H
AJMP X1_INT
OUTBIT
OUTSEG
IN
equ 08002h
equ 08004h
equ 08001h
; 位控制口
; 段控制口
; 键盘读入口
LEDBuf
second
ms
C1us
equ
equ
equ
60h
41h
42h
equ
43h
; 显示缓冲
;秒
;毫秒
Tick
T1us
equ
100
equ
256-50
T0Int:
push
push
PSW
ACC
mov
jnz
dec
a, C1us+1
Goon
C1us
Goon:
dec
C1us+1
mov
orl
jnz
mov
mov
inc
mov
cjne
mov
inc
mov
cjne
a, C1us
a, C1us+1
Exit
C1us, #high(Tick)
C1us+1, #low(Tick)
;
ms
a, ms
a, #100, Exit
ms, #0
second
a, second
a, #99, Exit
mov
second,#0
Exit:
ACC
PSW
pop
pop
reti
Delay:
mov
DelayLoop:
r7, #0
; 延时子程序
r7, DelayLoop
r6, DelayLoop
djnz
djnz
ret
LEDMAP:
; 八段管显示码
db
db
3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
DisplayLED:
mov
mov
mov
Loop:
r0, #LEDBuf
r1, #6
r2, #00100000b ; 从左边开始显示
; 共 6 个八段管
; 关所有八段管
; 显示一位八段管
; 显示下一位
mov
mov
movx
dptr, #OUTBIT
a, #0
@dptr, a
mov
a, @r0
mov
movx
mov
mov
movx
dptr, #OUTSEG
@dptr,a
dptr, #OUTBIT
a, r2
@dptr, a
mov
call
r6, #1
Delay
mov
rr
mov
a, r2
a
r2, a
inc
r0
djnz
r1, Loop
; ===============================================
ToLED:
dptr, #LEDMap
a, @a+dptr
mov
movc
ret
start:
jnb p1.0 ,start
mov
TMOD, #02h
; 模式 2, 定时器