|
我是从电子制作实验室网站上改编的,电路图是51单片机试验板的电路图,只要保留P1.0的LED、4位拨码按钮、蜂鸣器、K1、K2开关、显示电路、稳压电路和单片机最小系统就行了
" ?4 {" }) X% s/ ~3 @. @;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时
( X1 P/ G0 V; i) G7 E;倒计时时间由四位拨码开关的2/3/4位来控制,6 M* Z3 F6 |4 I+ `+ m" B
;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,7 K! N: k; a3 W# o- F- g/ r
;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时0 l2 i5 A; L; L) {. x A* D' K
1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁* {& {8 Q$ W) I; v7 T! H; F, C
;K1为开始按钮,K2为停止按钮; w4 G. z& k9 n# q
, w! s0 M0 H* Y5 r" T$ Q2 na_bit equ 20h ;数码管个位数存放内存位置
8 K& I' f9 b/ c! z4 E, xb_bit equ 21h ;数码管十位数存放内存位置
% j7 \: q& ^ g! P/ F3 V. k+ f; g3 Htemp equ 22h ;计数器数值存放内存位置0 F4 X. e l6 K
' @% K d. y9 l: t3 {; S' z4 x
;开机初始化 B! ^5 [6 Q* ]
MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
! f; D: q- K7 ?: v4 V" L: o8 Q" Q9 VMOV P0,#0FFH;使显示时间数码管熄灭& C# l0 v: R; P# ]% R( j }
CLR P1.0;点亮LED指示灯
! e2 E, [$ g6 k9 M
/ u% n* X5 n" x* b. @;等待键盘输入
2 D0 z, t" g' l- \! ESTART:JB P3.6,$;循环判断开始按钮K1是否按下?
$ j) q& J! ]9 x, kACALL DELAY10;延时10毫秒触点消抖& l4 s- E& a0 V! N* U+ J
JB P3.6,START;如果是干扰就返回# A5 Y# g6 q6 c9 G1 l
JNB P3.6,$;等待按键松开
* Q/ j( P! e0 k8 }2 H
: ?, ?+ F' T9 m1 H* l;读拨码开关的状态,获得倒计时时间/ ?9 B" @; M9 W- O
SET:MOV A,#0;首先对A清零& O! Y' n$ s( @% X4 B. r# I
JB P2.0,A1;判断拨码开关的第2位是否接通,接通就对A加5(此处数值可自行修改)7 u9 D1 M, U2 P
ADD A,#5, U, z. d6 k' A* o4 s4 k6 x
A1:JB P2.1,A2;判断拨码开关的第3位是否接通,接通就对A加15(此处数值可自行修改)
0 n) k8 I4 B. l* b. s/ xADD A,#15
3 O% \2 I- ?" }3 o8 yA2:JB P2.2,A3;判断拨码开关的第4位是否接通,接通就对A加30(此处数值可自行修改)
' y9 Y: I# `% W, J3 [' w* ?! mADD A,#30/ T( ~4 ]8 c9 T$ T) `3 Y& A
A3:MOV TEMP,A6 s7 Z1 ^, V$ y$ a3 f" w6 z
;这时TEMP中的值就是倒计时时间7 T1 S9 G6 h) h; M/ i2 K
, D4 D+ ?% D. d- B;数码管显示定时时间的程序" D: w' K6 P4 `" f/ e6 q6 w9 G* M
display:CLR P2.4;使继电器1释放,开始定时(开机时继电器处于吸合状态)(既然你是比赛用倒计时提醒器就不需要继电器,可以忽略)
/ s3 E6 p, y6 w- w% Y9 bCLR P2.3;使继电器2释放,开始定时(开机时继电器处于吸合状态)' M# t6 v6 J2 @6 M- T
MOV R2,#1203 a' L0 Q# e8 B4 l
AB:MOV R3,#2503 s& Y1 @! I5 c% |
TIME1:mov a,temp ;将temp中的十六进制数转换成10进制 : V! z h+ r+ r0 x9 C" ]/ I7 y) K5 A
mov b,#10 ;10进制/10=10进制" F5 H; A L. L. R9 u
div ab N. O) F- k( B8 s
mov b_bit,a ;十位在a. M5 d* z$ M6 q5 ?. g0 H0 j
mov a_bit,b ;个位在b
( t A8 W' p$ b$ v
% R' W9 w+ J* {5 g: U1 ` I8 C8 rmov dptr,#numtab ;指定查表启始地址
. h2 N( J; r p/ R, q8 a' [- Omov r0,#4 2 R1 E( X5 i; U# J
dpl1: mov r1,#250 ;
* T+ K2 n2 x h$ F$ D" [; Vdplop: mov a,a_bit ;取个位数; Z: W- @2 ^' o) v" D7 U
MOVC A,@A+DPTR ;查个位数的7段代码
2 M+ ]; G- M' \! K( `) V3 dmov p0,a ;送出个位的7段代码' l) c, ? N0 v
clr p2.7 ;开个位显示
& l! g1 \% d: t' j4 ^ACALL DELY1;显示1毫秒
9 k1 P6 X6 s" G6 a0 d1 csetb p2.7;关闭个位显示,防止鬼影, _% [- t9 [$ a: I( h& m* }( H9 z, f
mov a,b_bit ;取十位数
; f3 N9 |, q# R" c2 T6 i# sMOVC A,@A+DPTR ;查十位数的7段代码
8 H; D/ S! g7 N% u$ a* W/ @mov p0,a ;送出十位的7段代码3 U. U9 Y! N# i3 m; f/ z. X% N+ i3 B
clr p2.6 ;开十位显示4 x( q; j: z( b8 o* n3 z$ v
ACALL DELY1;显示1毫秒
% u) v' C0 H/ J) Y! R8 |setb p2.6;关闭十位显示,防止鬼影. f- e* x8 p. V3 S1 K
. l$ \- a$ y! r7 l& K N8 T) G
;插入一段判断定时过程中是否有按键输入的程序段/ P3 f: o7 T3 |7 w3 W2 n( D2 ]
C1:JB P3.6,B1
+ \# P1 _* o# ~% ~" A+ R5 sACALL DELAY10;延时10毫秒消抖
0 E# m7 K0 u- z& w- P' SJB P3.6,C1
k/ h; d. Y0 T, V, h1 `6 EJNB P3.6,$;等待按键松开
: P: B0 [4 @, j6 G- |AJMP SET: s- s6 r1 v. u+ A! |# p9 U
B1:JB P3.7,M336 K3 R. G, K2 f" q1 ]
ACALL DELAY10;延时10毫秒消抖1 H' Y8 W9 I# N% I( x6 j& \
JB P3.7,B1/ U: P0 r t! i G) T: r: p' G
JNB P3.7,$;等待按键松开
( U* b" q, o8 p; {0 E/ [AJMP OVER# Y- {% W% B: x. `% R3 [5 Z
# @* N5 R/ S" o0 L v4 gM33:djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
& X D3 ~9 N7 q( V. OCPL P1.0;使LED每1秒闪烁一次
: G4 r( w2 e. `7 ydjnz r2,AB ;循环执行120次,时间为1分钟8 j4 t. }3 o' w7 ~
" V& F x1 R8 G) M8 U
DEC TEMP;满一分钟对定时时间减1& I9 y b5 B, C, o# j
MOV A,TEMP7 g/ O$ P2 p7 r0 I
JNZ DISPLAY;判断TEMP的数值是否为0?不为0循环
/ Y# M# v2 d" l8 V* p* ~1 C, d
+ Q" E3 _$ w! ]$ E8 E;结束定时
3 |" P- n" h, N$ I! f7 D; MOVER:CLR P1.0;LED指示灯常亮
2 O8 Q* w3 F" P$ j( s( ?" _SETB P2.4;继电器1吸合,定时结束,退回到开机时的状态
, z" I8 T' Y- d- U* a6 oSETB P2.3;继电器2吸合,定时结束,退回到开机时的状态
' F+ ^4 u+ s+ ~5 X- L2 }SETB P2.5;你要提醒器所以我给你在定时时间到时喇叭鸣叫,当然你还可以自定义一些提醒方式 B3 {9 i; a2 `* o( ]6 @
ACALL DELAY10;& v$ }+ c5 H1 L) [
ACALL DELAY10;
1 f5 h6 K0 A z* \1 Z) [ACALL DELAY10;
" H* _' c, U* C( MACALL DELAY10;
3 y% f3 V- K# k, q% c5 pACALL DELAY10;& W- b+ ?3 Q' d+ d8 k- D1 N
AJMP START;退到开机初始化状态
% X0 l4 G- A8 D3 z) J8 B3 R; k/ }, S) D5 Q+ n$ |' p$ N
;1毫秒延时子程序+ m1 V6 o6 \ l% @( a, _
DELY1:MOV R4,#2
+ P) C) f0 q- E- V1 p2 dD1:MOV R5,#248
% J* A5 V7 Q; [/ [DJNZ R5,$
W, P5 o- w1 ADJNZ R4,D1
, q# Z, z0 {' n2 C" e$ ]% kRET
2 W# n' ]7 s) k7 Q% `6 c4 S. M( h# @* K1 K1 o- \3 O: y, K. }
;10毫秒延时子程序
5 G* `, X" a, e4 R* a3 e) b* M% @6 YDELAY10:MOV R4,#20: t! d7 J$ q& ^# l
D2:MOV R5,#248
: \0 e# b3 _! n2 yDJNZ R5,$; d$ Y1 l1 b- s2 V# h
DJNZ R4,D27 x9 r( K0 Z; {/ `( G
RET* L4 H8 n# C% ~4 q! B7 r
0 h1 N+ \- U; _! b# T;实验板上的7段数码管0~9数字的共阴显示代码! j9 e- P7 Y% `4 }; B
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH |
|