求用单片机设计一个秒表AT89C51
要求1、按开关K1秒表开始计时,再按开关K1计时暂停,按开关K2秒表复位。
2、电路图
3、汇编编写程序
;--------------------------------------------------------
;说明:为了提高精度,下列给出的程序和电路图,比楼主提出的要求
; 增加了一位0.1秒的计数和显示功能,所以计时范围是00.0~99.9s。
; 想得到以00~99形式计秒的网友,可到原题的网址去看原文。
;--------------------------------------------------------
;汇编程序如下。
;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示
;使用外部中断0、1,用于控制启动和清零
;========================================================
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP X0_INT
ORG 000BH
AJMP T0_INT
ORG 0013H
AJMP X1_INT
MAIN:
MOV TMOD,#01H ;T0定时方式1
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
MOV TL0, #(65536-50000) MOD 256;
SETB TR0
SETB ET0 ;开启定时中断
SETB EX0
SETB EX1
SETB EA ;开中断
MOV R1, #0 ;0~99秒计数
MOV R2, #0 ;0.1秒数
MOV R7, #1 ;50ms计数
MOV P0, #0C0H ;显示00.0
MOV P2, #0C0H
mov p1, #0C0H
LOOP:
SJMP LOOP
;-----------------------------------------------------------
DELAY: ;延时子程序.
MOV R4, #0
DJNZ R4, $
DJNZ R4, $
RET
;-----------------------------------------------------------
X0_INT: ;启动/停止
CPL F0
RETI
;-----------------------------------------------------------
X1_INT: ;清零
MOV R1, #0
MOV P0, #0C0H
MOV P2, #0C0H
mov p1, #0C0H
RETI
;-----------------------------------------------------------
T0_INT: ;50ms中断执行一次.
MOV TL0, #(65536-50000) MOD 256;
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
DJNZ R7, T0_END ;中断不到20次.
MOV R7, #2 ;#20
JNB F0, T0_END
mov a, r2
add a, #1
da a
anl a, #0fh
mov r2, a
jnz disp
MOV A, R1
ADD A, #1
DA A
MOV R1, A
disp:
mov a, r2
anl a, #0fh
movc a, @a+dptr ;查出段码
mov p1, a ;显示0.1秒
MOV A, R1
ANL A, #0FH
MOV DPTR, #TAB
MOVC A, @A+DPTR ;查出段码
MOV P2, A ;显示个位
MOV A, R1
SWAP A
ANL A, #0FH
MOVC A, @A+DPTR ;查出段码
MOV P0, A ;显示十位
T0_END:
RETI
;-----------------------------------------------------------
TAB:
DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H, 90H
END
;-----------------------------------------------------------
;PROTEUS仿真截图如下:

本文介绍了如何使用AT89C51单片机设计一个秒表,具备开始、暂停和复位功能。通过按下开关K1启动和暂停计时,开关K2用于复位。提供了电路图和汇编语言编程实现,同时附有PROTEUS仿真实例。

1万+

被折叠的 条评论
为什么被折叠?



