EDA365电子论坛网

标题: 定时器电子钟程序,按键没用作用,哪位大虾帮忙看一下。 [打印本页]

作者: szwsu    时间: 2012-2-21 13:48
标题: 定时器电子钟程序,按键没用作用,哪位大虾帮忙看一下。
以下是我写的定时器电子钟程序,按键功能不起作用,哪位帮忙看一下。
2 Z5 H" N8 g9 X  O! Y3 E/***************************************************************************
$ S& A' r( Y: _- ^* V名称:用定时器定时做时钟
& b" D1 @5 O/ a. ?内容,自动从00-00-00开始,有按键功能
" G  F4 l% @5 m5 n- M芯片型号:STC89C52RC) I6 s) t9 M  ~
功能脚说明: P0为段选脚,P3为位选脚,所有引脚低电平有效.
  j8 I) N2 [* S9 R) g% i2 K8 j程序员:玄溪$ [7 p, Q9 T9 w$ ]
日期:2012.2.6; ^0 L6 a# _( o6 o7 r
/***************************************************************************/- U$ D3 h" l) h) ~2 o
#include <reg52.h>
/ N% X; k3 E2 G0 C$ w#define uchar unsigned char
, D9 h- M( |% h+ T#define uint  unsigned int
' W7 A1 T6 V0 T( a5 R+ h7 T8 b) f) A; b, v$ w# Q. {5 ?# i
uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};" x* [& [8 C3 P) w9 M, k
sbit K1=P1^0;                          //分+
" e6 |5 T  t; `! Esbit K2=P1^1;                          //分-
) N$ [: ]1 l8 `, w9 W  L( Ksbit K3=P1^2;                          //时+; r! A8 b1 d$ Q# @, B+ l9 Z
sbit K4=P1^3;                          //时-
- g$ C1 T( t& u9 J: z
2 l5 l* C* P6 X' a% ?' B6 B) cuchar time;                                   //定义中断时间次数
4 w0 F8 w4 \: c& Buchar second;                           //定义秒9 y- O% S( a; c4 V. _
uchar minute;                           //定义分
1 ?. T! a( ~& V5 }  B1 ~uchar hour;                                   //定义时
: b: v4 K1 i! A. Y1 }! Y$ y//===========延时函数============//
6 m& r: [# w* ~% q$ N6 E1 Q( gvoid delay()
4 ?3 ?# m$ i% O# b. l' ^7 u{( `# V& E7 z( e. m
        uchar j;& p) |  Y+ q: ^7 Y- c
                for(j=0;j<200;j++);
; F! ?, }+ m* q) L. J2 R6 f}
* X& f( c# {9 }: x& h//=========显示秒函数=======//
2 L( w: A( ^- h* A7 f7 F5 Evoid displaysecond(uchar s)                         //带返回值
1 k) q8 x: s1 ^, R7 @{# a# t& W, H' [% P
        P3=0xbf;
: k$ I. H# @/ C/ H0 U, H" G! d        P0=du[s/10];( O5 \( |7 R0 _" s0 }
        delay();
7 o, H# x- B/ t$ T0 V1 W' X        P3=0x7f;% o" ~* W( N9 `
        P0=du[s%10];
0 E( H# g% v: K! k2 E; f# E7 k        delay();
7 _: G! K/ n+ U' x" J' ~) f2 \        P3=0xff;
( K0 U3 N1 K" V. O5 s  a+ h        if(K2==0), H# n4 Z" _, P+ V
        {! s" D* t9 m1 b
                s++;" B: g4 v5 n7 U% j; p
                if(s==60)3 e# g* f7 _- q9 Z% N
                {6 u  y9 W$ I3 L1 K$ k
                        s=0;
3 N" L# ~9 V( S                }4 W$ g4 Z9 q' }& m1 K& [4 a
        }# x0 O6 u" d/ j5 j, A% d
}
" r/ Q6 b& q' N, m$ L6 s$ O//========显示分函数=============//- f. V% U5 k3 \7 {
void displayminute(uchar m)
1 H/ b- W6 ]- k3 ?/ ^{$ k( V/ Q$ E! X* w- t3 u& {2 U
        P3=0xf7;
, N% r& j) m4 x4 }0 @& u; H) p) [. H        P0=du[m/10];) U  o) l3 k1 h5 Q0 ~
        delay();
9 v. J# }; W$ l: Q$ ^6 w        P3=0xef;: ^4 y5 q0 P1 m) u
        P0=du[m%10];
2 `, B% a( d, n2 E/ z2 H        delay();1 B) Z( |/ `3 w& F
        P3=0xdf;
) j7 L3 f8 z7 x' A9 R- a        P0=0xbf;6 G( T6 J$ C* @1 H2 ^* \2 [3 w
        delay();  ]5 B# ?2 y3 W, s/ @# w9 [& w( o
        P3=0xff;4 g& C+ l  T$ z' i
        if(!K1)7 y0 H( ^# h$ C8 {8 q" }1 L5 b
        {
1 i* r5 a- T  H( P                delay();( r. a8 \' \* k5 L9 m$ T
                if(!K1): v6 g& [% q* I4 g8 c$ m: s
                {2 n0 y( }6 q" S# T/ S
                        TR0=0;2 m# G( l$ v, u5 a
                        m++;8 G- ?6 d  r4 D2 T& U
                        if(m==60)
4 h) T1 N2 n: n- U9 |: ~: R  Y" o" H                        m=0;# k/ B/ f( W) c0 V( @6 E
                }
3 C. z" K$ ]: r3 K" r        }& K; F! Q" O6 ~) P
        if(!K2)
6 t7 D5 F2 o' j* x. O        {
0 \' {6 m* @: n% P                delay();2 X# p' l- ^. {" C+ u
                if(!K2)
' F% ?" n: i' d/ h1 E4 a                {8 K  f- v, }) L, V0 E
                        TR0=0;
. a! f7 c7 u6 e7 a0 `% @2 x                        m--;6 G; z4 E2 i, e. e2 d- Y
                        if(m==0)
( _1 V, S. \! z6 O: Q( a                        m=59;
& d" k# h9 o0 ]6 @3 H3 J: }4 F( S                }4 ~6 I/ U- l2 K! t; Y  P
        }
% l- Y. t7 Z4 d! s: z3 S        TR0=1;
2 c# f; W% m6 S; r$ ?) ~! w}0 |# S" z$ ]$ W4 X4 s
//========显示时函数==============//
' p8 ^) O" q) j% H- evoid displayhour(uchar h)7 c+ w0 a1 D6 a1 w$ H% K# q
{% ^' m" u# g2 d
        P3=0xfe;
$ l) t5 R2 c; k) x9 E        P0=du[h/10];/ L: e" X0 e' K% W( l
        delay();
, i1 R- [4 Y& X/ L" \        P3=0xfd;
  s* z, [, P$ N6 P        P0=du[h%10];
, r% u5 b4 M# w7 @8 J' M9 P: B8 |) u        delay();
1 P5 d7 x- _7 H5 E1 S. X        P3=0xfb;
5 q; g! q  {9 `( [; w0 }0 k; w        P0=0xbf;
! G! F% ]4 y; T& u        delay();* e) f1 D. B( D$ v/ ?
        P3=0xff;
+ W: _7 M8 r: s; l3 h        if(!K3)2 M" Y- P6 H$ }$ b$ j
        {
- v; x2 l! s! t1 V, ]& k) x                delay();
( r) ~4 o" U9 G6 H, C4 I& Q                if(!K3)
5 G4 N7 }9 y3 v% N# A9 r7 a                {% W4 [4 j1 B  u1 \. Z" p
                        TR0=0;
# j# o! H& T/ u. S" P' ^, b2 c                        h++;7 E! @! J2 p/ @) T  H" n* O# H0 E- S1 y! I
                        if(h==24)
5 V/ b' U7 k% C, W                        h=0;! _$ I( D, _5 A0 t, Q! M+ I
                }
& }# l  W5 Q  x9 D5 b" j& n1 o        }
: {+ n8 J7 c" X2 [, g$ ~, U  d9 P        if(!K4)& j; I8 h' s/ N  ?# @
        {
3 d% K9 U6 m8 ]! A8 G                TR0=0;* e- h+ k9 D. |1 d& l) K
                delay();2 s+ [, P( p# B6 _
                if(!K4)
; S8 Y( V0 F9 m& }5 X9 Y  d" n                {
. R4 r! H: |; c- _* G, Y. Y4 n$ l                        h--;
; z2 G9 `" y0 Z/ V                        if(h==0)8 ^( E+ \) `, i1 I% q, C" s1 z
                        h=23;7 _% a$ C6 j* b6 A3 Z: f
                }
% w: I! M1 S9 L. D        }( w7 j( m. R( m0 j& g2 ~( A7 {2 ]
        TR0=1;
* t& O0 C: ^0 k( u}7 e. q* U) n8 ~1 h+ H$ ]; H
7 X& l+ Z/ v6 k" _8 \! h
//=============主函数============//
, E" ^, X4 R( R9 H: X  K  Z& Jvoid main(void): X5 _0 y$ i/ k  j6 |  G# w0 e
{* I2 A5 n+ o* ^6 a9 k  X6 a
        TMOD=0x01;
- ]' F0 f/ [& L  W        EA=1;. o" ]" I# E# Y5 y
        ET0=1;
5 z" {' Z1 F& r. x        TH0=(65536-46083)/256;                          //赋初值" d3 e( T% e/ Z* r7 N
        TL0=(65536-46083)%256;       
" F7 f8 f# y1 t% o6 w        TR0=1;
3 ], j2 ?3 j2 A5 F9 r$ X% I) {        while(1), }. O3 Q  M0 f6 T
        {4 ]8 ^/ }) T$ N1 L) a) G. m
                displaysecond(second);2 k! G" x* d, G6 i# v, h4 v
                delay();  q& U/ K, e  \2 u8 ~- _% @7 ?
                displayminute(minute);% D9 E* F+ i2 U. z, x! N
                delay();
$ f; Y/ C- r' D1 S5 W                displayhour(hour);
8 s. L4 c+ n8 {/ m                delay();
# }% m* m$ u# Y% L) J1 ~9 T& a        }
  r& U9 W: y3 _- i( U% N}
  D" O$ c4 F. g5 g+ M. I* m, N//=======定时器中断子函数=================//
1 A% I, ^7 Q1 ?6 _void inter0()interrupt 1
9 X1 k+ C! N8 X- n{
8 U0 R- T/ [, A( W: r  N        time++;
1 }( a8 A) ~& e- T" X" W        if(time==20)
3 Y1 E* x' D' Z2 H! ~        {
& [9 i1 `) w" w) V" y# U- h; O" Z                time=0;
9 ^1 j( ^+ K* f                second++;
; L4 R5 [/ w* o/ E9 G2 r5 D* k. `        }- u+ Y- z9 q( R7 \
        if(second==60), j+ E$ z4 S! g* x# Q
        {
2 K* y; U* W9 S) }0 _  a. ~; N                second =0;8 `( L7 }+ U; P1 B) Z# ?7 u' n5 h; Z
                minute++;
$ ?" k7 Z" z3 I( P% c        }
( K% z  B; Q; i) R7 D% a& u3 o        if(minute==60)4 r% V; l8 B( h4 z$ u9 j1 N
        {
3 N1 i1 A4 W/ p+ m                minute=0;
% f; X7 J. f: T                hour++;& b9 n0 ^. \' n' u) P
        }
8 _4 a  H9 a+ }" A        if(hour==24)
/ ]4 C1 \# V* ~0 X        {
6 D; g1 Z4 p0 t7 w$ Y4 x5 t                hour=0;
5 h& r- ?3 Z* P: w; f        }
. h$ K/ ?4 |. C. f4 V        TH0=(65536-46083)/256;                          //赋初值1 p" Y/ ]! S( H7 U
        TL0=(65536-46083)%256;       
& v; i' H  s$ {+ O( `9 ]}
作者: ArthurGXH    时间: 2012-2-21 20:06
本帖最后由 ArthurGXH 于 2012-2-21 22:39 编辑 & L$ v0 Y) }' ~8 ^0 r3 u
( h/ h) U8 Y. o& x, R9 N
兄弟,我来说说你的问题: 
3 y1 v/ F* a; E: u  displaysecond、displayminute、displayhour几个函数的参数请用指针吧。C语言的函数是传值的。比如:hour = 10;  displayhour(hour)  == displayhour(10)。是将当hour为10时,就将10传到displayhour函数。
1 q+ p) `' Z0 v  改成如下: 定义时:   displaysecond(unsigned char *pucData)
+ n, l9 [* [$ T( s8 c- u                     调用时这样:displaysecond(&second);
- v( p1 G! n# _; x$ `( q  x3 V$ q* e7 U7 _1 f, T
  请好好学一下C语言吧。# B. `3 b; Y7 T! l

# {5 J% J6 @# c- H# X' a$ H还有几个问题:1 `) A9 o2 \2 ^/ `5 r
  1. 定时器,请用自动重装载的工作模式。程序在每次中断赋值会有误差,会积累啊。* K9 `1 m8 _8 u/ b( }: a1 i3 L
  2. 读按键的程序应该与显示的分开,不要写在显示里面。( z  p+ c* W/ c* f
  3. 按键的去抖动不充分。7 y; M/ J1 A) k" t) m  |
       4. 定义uchar 最好用typedef。9 I6 a& H, ]6 h5 W0 Q' {. b8 R
        8 ~4 t( O/ g& n+ e' x
. y0 v) l! W' Q4 X4 ~) g0 n
: S1 p" p8 y' ~( \+ k& F2 \
; Y' s1 ^; A7 l  i& U: H, K

, j- ?! j5 _% h1 O' r- G5 y
作者: szwsu    时间: 2012-3-3 10:05
谢谢你的建议,新手很多不足的地方。以后一定加强
作者: 阿宽    时间: 2012-5-10 12:48
我可以给你发一个  我自己写的 简单易懂   秒用发光二级管显示   分 时  用4为一体共阳极数码管显示
作者: 阿宽    时间: 2012-5-10 12:49
你看看吧,我是新来的 以后多多关照

Text1.c

1.54 KB, 下载次数: 42, 下载积分: 威望 -5

代码


作者: wangting    时间: 2012-10-25 16:24
楼上的程序可以用




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2