|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机电子秒表仿真及源程序 实现0.01S~59分的计时 带3按键) \: f" B. d9 o( ?5 r/ w
5 R9 X0 T. A+ n3 t" r1 o
/ O0 J3 O0 W" i5 l& r2 c
给论坛的朋友们分享一个51单片机做的电子秒表程序,带开始和停止和清除3个按键,可以实现0.01S~59分的计时。下面是该电子秒表的仿真原理图:- H/ K* R, ?7 T% a+ M8 s, k/ b; C
0 A( w X" i! A" b" d
+ F. Y' k. J6 n- r; U9 k单片机秒表主程序:/ k# [: k3 o# Z) z) F- @3 T9 N1 Q
/****************************************************
y. Z( C6 z9 j) K*实例名称:秒表- a. v7 F5 i$ z* ~
*实例说明:本实例实现0.01S~59分的计时。按下Start键时. i$ U' c% Z) E" y# W
开始计数,此时按下Stop键时停止计时,按下Clear键时清零7 {1 \ v1 l0 g' Y, Y# X; d
显示屏。Start键和Stop键分别通过外部中断0和外部中断1来" ^5 M+ @9 I5 n* J j3 t: q$ w
实现操作- l" `& f2 c4 ~
*作者:kxm
1 X+ T3 L9 T2 ?* ?' O/ Q# _8 g*时间:09.06.13
K$ J4 e A# q3 @( D****************************************************// e0 u9 M* P' N: o& E! ?# Y$ t
#include "target.h"
( ^9 m' C U8 w- E" y#include "led.h"
) D9 ^1 b) F2 i( s1 ]5 \/*时钟显示数字区,从左至右为:分高位,分低位;秒高位,秒低位;毫秒高位,毫秒低位*/9 U0 r/ z0 c1 n% ? C
uchar clock_time[8]={'0','0',0x01,'0','0',0x01,'0','0'};, R. C( [( b" E
const uchar displayMode=0x24;
: ^! H R2 r% n- c- Jvoid main()( y! F5 S+ n+ M3 b
{
7 E! Y* ` }0 H uchar i;
" V2 v" c8 W1 v+ x& h* W9 [# g target_init();* u2 H" Y4 t+ e& g7 U1 s0 B y
led_init();9 L' o3 s' F, I+ C8 }% C( [
sei();
: t1 X: \( k! A4 [' h+ F* l% W+ { while(1)
3 k7 I# I9 Z ]; f- w! T {6 A7 L! r! ~# n, {; D9 {
if(CLEAR_KEY==0), b$ G8 ?5 o f8 c/ N- y
{
8 b; O( W9 k5 Z/ E2 Y( Z for(i=0;i<200;i++);8 m, e X0 c. R I$ [; G
if(CLEAR_KEY==0)
6 ~3 Q* { e7 p+ T0 f V# S3 h {
' S0 p; M' Z( K. L/ r clock_time[MS_H]='0';1 _+ h! o8 e+ O# k
clock_time[MS_L]='0';
1 W& @) [& w0 w+ c- u5 y6 ~0 ? clock_time[S_H]='0';
' o6 Z* M$ V4 k( n1 }; I5 ` clock_time[S_L]='0';4 X5 @' t1 W0 ?3 J+ ], S
clock_time[MIN_H]='0';
# {8 c' U# E/ B. a clock_time[MIN_L]='0';
! M2 _. q- M5 ~( ]+ O. W }
% q8 e+ U* T! `+ _6 H% s- B }
m) A$ F5 x6 n7 ~" x ledSweepDisplay(clock_time,displayMode,0x08);
1 `9 \6 `) w w, H5 z+ p }
: I& q/ g+ h( b}
7 e/ F( K7 }3 x+ _9 N+ h: Q8 Tvoid T0_OveRFlow(void) interrupt 1 //定时器0溢出中断,延时10ms# a% E6 Z- B& v
{' M( E6 u9 d' L& f' L8 G3 A2 M: R
TH0=0xDC;, }/ k- o8 c1 \' K, D
TL0=0x00;- w' @" Q0 C) Q& c, c$ G$ r
if(clock_time[MS_L]<'9')4 P4 a$ A* X, X) a
clock_time[MS_L]++;
/ w6 l- x4 ]3 k+ e. Q2 l$ V2 I! w else
! n% K7 `) x; W9 q( t0 y {
8 s8 R3 ?0 i+ s1 ?( w( Y clock_time[MS_L]='0';
7 K6 r5 o+ w6 J5 p if(clock_time[MS_H]<'9')
5 a7 V4 w; s; N3 w1 p$ j clock_time[MS_H]++;
' r [& m5 @! L else; B5 f9 n. M& B. X2 L- G
{, g+ B* X* K3 G( @ a# |
clock_time[MS_H]='0';
0 c- B- m" t4 S4 p9 b- H ms_to_s(clock_time);
; M( X) S9 }, x$ O1 Q! F) { }
% x+ c7 }3 Y7 x$ A }
/ A) i% J. z+ y, Q! o+ l}
4 A' T/ g/ a f, d+ Q, H3 t w/ u% pvoid StartInt(void) interrupt 0 //启动按键通过外部中断0+ h: h. Y( I/ {2 {% u7 ?1 o2 ]
{0 G8 R, y& J4 V6 t C+ ]3 r$ U
TR0=1;
4 A, y0 n" x# g f9 Q( D}. b) s& p9 N& h/ j( b0 f* v
void StopInt(void) interrupt 2 //停止按键通过外部中断18 s5 g/ H( `. P M
{/ [9 V* g9 P/ F) F
TR0=0;
% J* r8 o8 g1 h) L}! b% m' ^9 G" C, X0 L2 p' P. U
; B, D b& u1 B+ t# [! a2 y
" F& m) y- X [6 h& P7 {电子秒表的target.c源码:
% P+ a2 L; L/ A#define TARGET_GLOBAL 1) \# Z7 e" L) Q4 f& t1 Z' w
#include "target.h"+ Z3 @; _; M4 y' w+ W+ q- r0 S
/****************************************/ R- f/ M1 ~2 l% h/ q2 V; g+ x
*函数名称:target_init(void): ~! T- }; q/ z% m( {- r
*函数功能:包含本文件中初始化函数和变量
0 S! v2 o# b8 j. L& K! a2 j9 L*函数入口:无
7 p4 w, w+ t, ]7 a' l% ~*函数出口:无% U% E3 R+ x0 k* k) d( t; @
****************************************/0 l( T8 N+ q% A
void target_init(void)
/ b$ I# l1 v u' d" Z( u{ u/ U/ y2 x [+ ?
timer0_init(); //timer0初始化2 K5 x+ ~& I8 y2 C# `4 G
int0_init(); //外部中断0初始化
( |8 {4 C5 ~) i( z- G int1_init(); //外部中断1初始化 K- L) p7 {+ [; b6 [
}
7 `2 Z M$ [8 b" n. L/****************************************# M6 F: X4 x- {! Q8 w3 f6 d
*函数名称:timer0_init(void)
2 J; V* [1 K& m6 P9 O- t1 E: B, n*函数功能: 定时器0初始化,11.0592Mhz晶振,# k5 q: a6 z8 [ Q2 _$ e* ~1 R
定时10ms
; f K( f9 v6 M% o*函数入口:无
; [+ ?3 K' j7 c7 S*函数出口:无9 [5 a% W+ i I9 ]: H- E/ H
*****************************************/! r: e# n) E8 o6 E: @8 L" Z
void timer0_init(void) 4 x9 g0 J7 G2 Y. V& Y
{
6 _2 n9 d% n6 }: C$ y TMOD|=0x01; //MODEL1,timer% `9 D# C% u7 l/ B! U- G
TH0=0xDC; //定时10ms
; t( _ z+ @5 x- G TL0=0x00;
8 e# x! v) ]/ y ~9 W- ?( E+ l ET0=1; //中断使能* z8 ^1 M$ |" a' n! d( H# r
TR0=0; //关闭定时器06 ?! u* T( n: k6 q' M) p7 L( o3 S4 d
}
2 f$ Z. K1 J1 `3 U) e4 g, g/****************************************
( O1 H4 k) @8 o* ?*函数名称:int0_init(void)
+ ^8 C9 z: G2 z' X*函数功能: 外部中断0中断初始化
a# p y" G+ B9 i! Z, g& ] q% O4 H$ p*函数入口:无
* M* [2 S; b0 x0 }; K$ {0 r* W*函数出口:无
+ w1 p+ @ `4 {$ q4 R*****************************************/- e$ ~( b3 X- |0 _) S
void int0_init(void)
o* i7 V9 \. Y7 [9 |' V{4 r5 z; A) S8 k
EX0 = 1; //外部中断0使能2 r8 N7 x" N+ f; \" B, r7 M# D, [
T0 = 1; //外部中断0跳变中断(下降沿跳变)% i' {* t7 L% q& W6 s2 K4 H8 t
}
: U* |$ B+ J6 u/ s& _2 o/****************************************
. d% t4 ~" r. ]4 d; N; c6 {! @9 I*函数名称:int1_init(void)+ _4 |1 m% f [; H+ [+ \
*函数功能: 外部中断0中断初始化
9 g- ?, F4 w4 x& H, e9 i*函数入口:无$ a0 O4 B* M3 E- K% V; Z
*函数出口:无
2 h$ {8 c4 h2 d3 L6 \1 C: d. K( i) d/ h*****************************************/
' `1 z- Q1 R) I, q8 Y' {9 v6 Hvoid int1_init(void)
% O" v7 c# ~( F" `# e0 e( b3 s* ^' A{
: O) P, ]1 F+ q7 c9 l EX1 = 1; //外部中断1使能6 e* Z+ D+ {) I8 `6 ]
IT1 = 1; //外部中断1跳变中断(下降沿跳变)
S- m' h2 z9 y3 o}
6 ]9 v, l6 a7 p7 e. `( [$ ~/*******************************************
9 q7 o+ j3 n5 a, E( S*函数名称:ms_to_s(uchar *clockS)3 R: \, P5 Q7 u
*函数功能:实现毫秒级向秒级进位$ C+ y9 E* T( D$ N" `5 A6 q1 z
*函数入口:*clockS,指向时间数组的指针
8 W( ]& p; v& z$ _+ B3 T, c5 T: V*函数出口:无5 ]% G7 k" _0 C" T% e# T) P
说明:说明:毫秒级和秒级计数均为两位BCD码,4 m9 j4 |* _( _& A
毫秒最大值为99,秒最大值为59
& {8 O X- H2 f7 z*******************************************/4 J* e6 F0 h9 O% ~2 I. b
void ms_to_s(uchar *clockS)
; S& g- E" b0 v. m- p{$ W. p& G. H- h- J
if(clockS[S_L]<'9')
/ W* U* c* ~5 z( q7 V$ U0 Y clockS[S_L]++;
, H: ?4 x1 A t% Z1 O else5 _) |9 }) Q# ~* N4 ~" X
{: U+ D$ ?) U' Q: A
clockS[S_L]='0';7 D! @; o8 H- c& }# F& m/ R# b
if(clockS[S_H]<'5')
7 V! [9 k. {0 n8 l4 H* N5 v8 Z clockS[S_H]++;
+ x ] I7 z5 i' u4 R1 o; g# @% N9 } else
9 C! G/ F3 F! b6 f( `' ~# S, ? {
( E2 k& V& E' S9 b2 r, V9 I. X clockS[S_H]='0';
$ y. D! K* h2 [; Y s_to_min(clockS);3 W0 o9 r# Q- ]
}
* ^; U& w. c# Z# |' O1 ]6 Q6 H. | }
. A1 a, N' R7 V. _}, u$ U" ~9 N7 {7 k4 W! `5 Z
/*******************************************
" I+ F6 j7 y9 ?; D( f*函数名称:s_to_min(uchar *clockMin)+ y8 ^6 ]# i! b! Z4 ~, F
*函数功能:实现秒级向分钟级进位- @9 k- ]( g, |7 x
*函数入口:*clockMin,指向时间数组的指针/ m% @ E* j3 A( Z
*函数出口:无% c: P. T5 }* Z% t& X
*说明:秒级和分钟级计数均为两位BCD码,/ B/ y# L3 k7 F
秒最大值59,分最大值99
2 y) Q% u! D F9 n2 u0 x*******************************************/
5 Q$ O$ F4 }4 S% H8 w: avoid s_to_min(uchar *clockMin)0 V: h! Z$ ~8 Q2 d. r
{
3 s8 U I, X6 ~; F if(clockMin[MIN_L]<'9')
6 _1 H# p7 E0 p# V G) W- r clockMin[MIN_L]++;; {9 w$ o$ p0 `6 f e3 y
else
) _, T7 T m8 S) `4 N {& D2 l& }! v8 D/ t
clockMin[MIN_L]='0';9 `5 ]& @, X. `
if(clockMin[MIN_H]<'9')0 I2 C* H3 ` q) k& \
clockMin[MIN_H]++;% ^8 e$ C: R M3 m
else2 _5 l% z# g4 b" n4 E' L5 T
{0 g& u8 T z& b% i
clockMin[MIN_H]='0';
& A! Q4 `9 m$ D( y( w }
- l3 {, a) Y) i1 O4 q- _0 S }
4 |7 y3 j9 b+ U! y6 j$ e}6 _" o! v- U' s) p' @7 Q
9 B, V; S+ y3 t3 h. C
- H6 w/ ~! Q$ |4 m仿真工程文件和源码下载:1 j% N8 g9 \9 O; S9 E+ H
1 I9 k: p1 g1 V' ?1 R7 N& b. `/ e6 ~6 e. z, D* U3 ^
! T/ E& M6 k2 m8 @6 ?; g7 C) e7 B |
|