找回密码
 注册
关于网站域名变更的通知
查看: 2152|回复: 10
打印 上一主题 下一主题

单片机电子秒表仿真及源程序 实现0.01S~59分的计时 带3按键

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-17 13:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

4#
发表于 2019-11-24 20:37 | 只看该作者
需要!非常感谢6 @3 k: x7 `6 s+ }4 @

该用户从未签到

5#
发表于 2020-5-21 10:34 | 只看该作者
真的很棒,写的很细致

该用户从未签到

6#
发表于 2020-5-24 12:29 | 只看该作者

该用户从未签到

7#
发表于 2020-6-8 21:04 | 只看该作者
多谢分享                   + j0 y) ]! T7 G8 n8 q1 a2 h' j' o

该用户从未签到

8#
发表于 2020-12-15 22:24 | 只看该作者
厉害呀,大神。。。
0 O: I+ D; O4 }& z; F# }' }+ W, E- N

该用户从未签到

9#
发表于 2020-12-16 09:11 | 只看该作者

该用户从未签到

10#
发表于 2020-12-25 23:43 | 只看该作者
感谢楼主分享

该用户从未签到

11#
发表于 2020-12-26 16:51 | 只看该作者
:):):):):)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 20:34 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表