|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机电子秒表仿真及源程序 实现0.01S~59分的计时 带3按键
* B' Z$ L, U0 R: p' A( N2 P! ^" J. O, M0 H
$ ^- t: G; ]( `+ E: L' c0 C% c0 k1 t- G给论坛的朋友们分享一个51单片机做的电子秒表程序,带开始和停止和清除3个按键,可以实现0.01S~59分的计时。下面是该电子秒表的仿真原理图:
& h7 y4 r$ n: c$ G) _
1 m6 ?; R; R8 R2 J
X1 r. Q+ s' R" H, m2 y6 o
单片机秒表主程序:
# w0 k# U7 k9 L5 n% O/****************************************************
2 f( ]. n, } d*实例名称:秒表
; p* x, R9 X/ M; h, g*实例说明:本实例实现0.01S~59分的计时。按下Start键时
. M* b8 ^- L$ j# y1 L m. q开始计数,此时按下Stop键时停止计时,按下Clear键时清零2 q/ f! g/ f% _6 S
显示屏。Start键和Stop键分别通过外部中断0和外部中断1来
! y/ w# B4 Q# f4 J实现操作
+ i. v+ h7 q* R8 N*作者:kxm5 p3 f# I( M% O, x( B# r. k9 w+ ?
*时间:09.06.13
" ?) `- Y% U# c****************************************************/
. u* n I, z5 Y5 |+ y' }( X#include "target.h"$ P8 v) Q* Q/ S
#include "led.h"# r4 q- p2 H& F6 c9 j, Y; p
/*时钟显示数字区,从左至右为:分高位,分低位;秒高位,秒低位;毫秒高位,毫秒低位*/+ r) u7 a; b; @, m- P" ~- Z0 a, f
uchar clock_time[8]={'0','0',0x01,'0','0',0x01,'0','0'};! j/ J H R& b g7 Z
const uchar displayMode=0x24;
+ A/ r3 u0 q% j: l+ M) u- Bvoid main()
, U% \" a$ y! h" ]/ C{, s: M1 o/ Y" k. L& r2 p6 [
uchar i;
: [8 Q# O$ d. n) J3 F" ~ target_init();9 a& L, q2 d3 ~0 j& h. [+ h/ L7 s
led_init();
8 Y4 C) V- x3 K# r2 h' Q9 w sei();
$ A' g" T2 f* h# n. Z while(1)* I( i# t. P d" e; B2 [
{! i" P4 Q% |$ p4 K3 l% H) {9 S# l
if(CLEAR_KEY==0)# i4 p" i& `% T4 S" R: ?' E) w
{
, a. Q0 U& X1 @3 j* W4 [ for(i=0;i<200;i++);# M- g- I2 Q5 P; h& R! u; Z
if(CLEAR_KEY==0)
4 }. R4 G# E+ h5 Y' Z {
* C' m0 y+ Z+ y/ }: W8 I( f clock_time[MS_H]='0';
0 ~4 E5 u1 V' n& V. I clock_time[MS_L]='0';
e0 R' K' o0 _, n+ ^ M clock_time[S_H]='0';1 K- ~$ o1 ^, a) F1 \* M; L$ d
clock_time[S_L]='0';# \9 y8 Y8 K0 N1 q
clock_time[MIN_H]='0';
2 {% b; W2 D: I1 w) x% W clock_time[MIN_L]='0';
7 H# ^$ l3 [ @ }
( w3 j& w8 k, s% F: f. Y }9 `! }! K g3 P$ ?0 H/ D& n
ledSweepDisplay(clock_time,displayMode,0x08);
; r" l4 m: [* i s7 _# \6 l1 E& | }
3 n: C9 c7 b! Z; s; l7 m' c}
f1 l3 v |: jvoid T0_OveRFlow(void) interrupt 1 //定时器0溢出中断,延时10ms" J8 Y8 ?0 e Z7 z/ X4 n
{# x- s5 {/ v; X `
TH0=0xDC;5 ?# g9 ]/ d$ _0 J6 _8 e: K
TL0=0x00;
5 r5 O/ w. e# h1 c5 m* X1 T5 U if(clock_time[MS_L]<'9')
4 Y$ Y4 R2 U9 G0 i5 c clock_time[MS_L]++;5 j9 Q; c8 K6 D# ?
else2 r, z3 L9 R- h& V2 Z' d* b7 P2 O: c
{
' O+ s, q. d0 h( r9 b% B+ ?- u clock_time[MS_L]='0';
" P6 C5 ]9 n5 L8 S" W if(clock_time[MS_H]<'9')
, B. o* r! C' r7 A( G clock_time[MS_H]++;
, r1 X/ e' b9 W# E# Z0 A else! A. Y e& l; k
{
( w) ^. `. D, \( Z& j- M clock_time[MS_H]='0';
@5 P) x7 T1 t. X$ t4 \" f3 ? ms_to_s(clock_time);9 f8 g6 q, E* E: I- A4 B
}+ s: S* X) c$ N* X, P1 y
}; U* [4 ~2 y6 O% W
}4 f [" q( [/ W5 Z8 y! p
void StartInt(void) interrupt 0 //启动按键通过外部中断0
4 S' u% f- p/ j2 B: X) o' d{
- {" x& W# M( Z- S: P TR0=1;: ?1 \/ `" a a7 [0 Z0 D0 t
}
o2 Z% X3 Z/ d& d/ C8 n1 B( t( ~void StopInt(void) interrupt 2 //停止按键通过外部中断18 G. L! ]% t, K0 c' Y8 y7 l
{
6 f- e+ p v! L1 }6 Q4 s TR0=0;* }/ z' y) o+ D
}+ ]% o1 `, E+ E0 M
, T c6 [7 ?2 n( @2 s; d
" \% D6 I7 J# s l电子秒表的target.c源码:1 k9 Q0 o- H5 I
#define TARGET_GLOBAL 1* a6 x0 Y$ M9 W9 E8 n2 d
#include "target.h"$ p7 J5 v+ N+ Y
/****************************************
' I& A9 m3 i2 F5 w( l*函数名称:target_init(void)
Y- U$ x0 O9 k% `$ D*函数功能:包含本文件中初始化函数和变量. e- `5 ]) j1 y, @) ^
*函数入口:无
% N$ B8 x0 o2 C# Q5 e" L*函数出口:无' j/ E8 u) ^& _) a/ N' T3 [! l
****************************************/
- W0 P; Z& h6 tvoid target_init(void)( Z) ]: ^, F6 }( z8 @$ R! o
{! f" t1 c9 S& v4 F' h5 U4 ~- f
timer0_init(); //timer0初始化
+ H- {4 z5 A9 F' N int0_init(); //外部中断0初始化
$ Q- J: ^# R, Q+ w& b j" x; p int1_init(); //外部中断1初始化
+ n0 n# V7 o: ]; q! F& M( z}/ J! x! C: p' [7 ~7 X9 h/ E9 |
/****************************************/ K% w4 k, |- g
*函数名称:timer0_init(void)* f& H! G! J' w& I
*函数功能: 定时器0初始化,11.0592Mhz晶振,
" p6 I& f+ A) r6 k$ r5 Z 定时10ms
$ ]9 k1 e3 w/ h0 G# [9 S0 t0 [*函数入口:无+ M$ [% n4 D& R. F
*函数出口:无
( V0 z. P. U* A, `+ O& F*****************************************/1 r: }2 i. W' J# X! i p' U
void timer0_init(void)
; f% w8 c H" G" o{& x& }1 P* s) E$ ]2 Y* X
TMOD|=0x01; //MODEL1,timer
. c( \) u. H8 \' Q& K5 T4 P TH0=0xDC; //定时10ms% e( [' u' V [
TL0=0x00;: ~( s$ H. F8 T4 x! H6 h5 J' b
ET0=1; //中断使能
, t; t. F9 X9 L2 K' @' z TR0=0; //关闭定时器0) `2 e( {: ^/ Z4 r; [6 ~9 _
}
8 i O0 N' ]& }% Z8 a/ Z+ w; \% g/****************************************
8 H/ \/ u- `& e) {1 J/ S5 X*函数名称:int0_init(void) g& g4 h2 U# @" B1 @' x* D. K
*函数功能: 外部中断0中断初始化
9 o8 H7 a5 P2 V. F*函数入口:无6 }" q8 ^1 k: D* r8 o# p+ Z
*函数出口:无
; u% Z: j& @( V1 T7 u( x) h) ?9 f*****************************************/
& L# f9 A- e7 V1 A- ^7 X2 l/ gvoid int0_init(void)+ ?; ^! B# ^6 W! c4 n2 t
{
O6 c/ H+ \% Z, y$ P; o3 g EX0 = 1; //外部中断0使能6 _( O1 Q2 X# T, P
T0 = 1; //外部中断0跳变中断(下降沿跳变)2 ?- g0 @4 Y" P4 ^/ Z4 ~2 G7 `! E
}/ Q% x; ^0 l. @+ ^
/****************************************
- Y0 P# s6 Y1 ]8 T*函数名称:int1_init(void)- v- }* S1 `. r8 v. L4 C/ K1 K
*函数功能: 外部中断0中断初始化5 A2 S! ~$ I& `
*函数入口:无
# C% T) y1 n3 k, [- p*函数出口:无 u4 ]3 Y" A# ^# }7 Y
*****************************************/2 |& a- N$ e* R2 q7 w0 [
void int1_init(void)8 i0 h! x$ H2 y8 @% Q
{
- x, {) _, U, I EX1 = 1; //外部中断1使能
' Q. e6 X: `: m) u* M1 \1 | IT1 = 1; //外部中断1跳变中断(下降沿跳变) 6 N2 _: N- m2 y5 O" F, A
}
- a7 _3 d7 _/ w% J/*******************************************
) K& G0 O' ] m: {& F*函数名称:ms_to_s(uchar *clockS)$ m3 S* P4 w0 l
*函数功能:实现毫秒级向秒级进位
1 o- B! ^ q% c; r*函数入口:*clockS,指向时间数组的指针6 J. s) ^/ q/ a$ f" i, ~
*函数出口:无/ {5 t0 t& W# ?# ?: `, |7 W
说明:说明:毫秒级和秒级计数均为两位BCD码,- s I* A; y, q& Y( `- J: k
毫秒最大值为99,秒最大值为59& G3 d, N8 q! M6 S! [0 [
*******************************************/
* G8 z0 V) [3 A) C9 J6 x. u7 E8 A* nvoid ms_to_s(uchar *clockS)
/ T* m5 x- P0 B0 s2 J{
- M, h# a- V. p6 \/ \ if(clockS[S_L]<'9')4 v8 D0 u+ ]) I3 ?# ]" T1 U6 p
clockS[S_L]++;
4 n. X8 ^% p1 ~% M else/ V ~* {5 g1 A) i0 X3 p
{& C0 N4 E; O; J: z8 V, l) P( S
clockS[S_L]='0';8 {5 L6 I" c% q) b) Y) z
if(clockS[S_H]<'5')
# M" |8 H% C1 Q( U9 h% Q% _ clockS[S_H]++;
! A' m" G+ E# E else
+ W9 Z$ D2 h$ A, D {4 P' ]5 d1 e: v0 w: v# ^
clockS[S_H]='0'; K& ^1 O, i% v! z) l$ Z9 d
s_to_min(clockS);
9 m6 w% u$ I# s3 d' b }
N+ `* B+ V8 W1 x' e2 ~ }/ C* d: z; L, n& S6 k' m/ e% U" d
}
- E4 `; K' b6 c2 u/ `4 ~, n8 z7 `/*******************************************
3 Y( l5 d9 d" z2 s% [, {*函数名称:s_to_min(uchar *clockMin)
! w/ l- B, ^5 z# J2 F2 g*函数功能:实现秒级向分钟级进位+ j/ |1 I; k6 N+ ?
*函数入口:*clockMin,指向时间数组的指针
. @% Y% Q& g0 v4 @0 c; P. M! x*函数出口:无
( Z! Q0 I s3 M- ~7 i+ y*说明:秒级和分钟级计数均为两位BCD码,2 B& p) Q, O# X' M$ A; v
秒最大值59,分最大值99
+ H" h$ O+ b; K0 _, y1 Y% \* l*******************************************/
( B% f( b) B r5 c1 T9 Evoid s_to_min(uchar *clockMin)
2 R0 n' H1 Z' u: `" m7 v6 j! I6 Z: L{, l$ x" F" t5 b+ m+ q
if(clockMin[MIN_L]<'9')/ E, K/ E6 E. `, L: Y2 F2 H
clockMin[MIN_L]++;" f; B; D5 \4 S2 o0 Y3 S
else
; ^+ o0 F5 _4 p) H {
9 K Y) W7 q+ g8 l9 ~( d# b# @ clockMin[MIN_L]='0';
% I" A u. f- r4 {' | if(clockMin[MIN_H]<'9')' i* ]& E1 \) q/ J% ?$ \# F
clockMin[MIN_H]++;( p- [& {! B7 j; \! w) L
else& f8 f$ g$ ]; F% K0 H8 K* W0 F& y
{
: O$ S# b4 }6 X2 d0 f clockMin[MIN_H]='0';/ l# s" G/ V8 D4 L
} B$ A9 w; J3 `! Q9 C3 F9 f
}- x# B* l- ]0 Y; o7 w
}
, H( Y4 ]' m2 L9 n$ D' S% W
3 K% I' e2 n+ K& B8 o. t5 ]
& Y0 ~* w% L+ o# o0 g, Q仿真工程文件和源码下载:1 ?: i& q0 n5 c) _. P
# a q4 y8 X2 X' `+ Y k
, R6 \) B# a( ^9 x
& `- s( x/ P- }& k
|
|