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

定时器电子钟程序,按键没用作用,哪位大虾帮忙看一下。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2012-2-21 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
以下是我写的定时器电子钟程序,按键功能不起作用,哪位帮忙看一下。
. W, ~( ~7 e% w/***************************************************************************0 W4 \& d+ ^4 F/ W0 {. Z
名称:用定时器定时做时钟' }% h7 e& s, S) O) T- |: I( d+ n* K
内容,自动从00-00-00开始,有按键功能# G; s: u: v2 m% B( G
芯片型号:STC89C52RC
( ?7 u7 Y$ f/ q" \. n+ q( g, u功能脚说明: P0为段选脚,P3为位选脚,所有引脚低电平有效.
% ~! Y: n: X7 H2 x程序员:玄溪
+ U) C7 M3 s# o, U8 Q日期:2012.2.6: t  F2 r% W. C) g% ?! {/ w3 f
/***************************************************************************/
- J) S) J1 z& p/ w% O* ~$ Y#include <reg52.h>8 ]" l* g$ j  u- I
#define uchar unsigned char . R" x! k9 R+ m2 d
#define uint  unsigned int) K0 |- z5 v" J' R  y' d9 Y7 v
2 a8 z9 l, {! \! Y" m
uchar code du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};* e, a* S5 U" o( U6 \0 g; H
sbit K1=P1^0;                          //分+
; G% I1 m# y9 Msbit K2=P1^1;                          //分-& ?, Z2 g$ C: ]
sbit K3=P1^2;                          //时+% v! v! Z" p1 v# ~5 O8 z, r0 O' Q2 n
sbit K4=P1^3;                          //时-
5 g' w: Y. z2 y2 p% I# A( O
1 d$ }- C' E' r7 r" Puchar time;                                   //定义中断时间次数
' R+ b! C3 a& P: U0 ]' @uchar second;                           //定义秒
/ Y, u; }2 s3 l0 \# O5 Huchar minute;                           //定义分0 {2 U$ f' y: o4 z# O3 B6 i3 v6 o
uchar hour;                                   //定义时, P2 P, x- m4 K  G0 L% e& h
//===========延时函数============//0 C- N0 n/ {2 w+ l
void delay()' F+ K  Y' d$ ]$ w# H; W
{# Z: R% j0 b1 H7 U! f9 P. |' c/ `
        uchar j;
. t4 `0 u9 L+ A# k                for(j=0;j<200;j++);1 H0 z* @- v6 ]. Q" m- z9 b" W
}
  a8 F% l* v7 `+ r; u//=========显示秒函数=======//. P6 A: \" u) [# Y; g
void displaysecond(uchar s)                         //带返回值& z5 y# B- N9 f/ O
{
9 K, H/ ^2 q$ ?9 e! R8 b        P3=0xbf;
0 n2 a0 B2 i* c$ B- I+ [" K        P0=du[s/10];0 ^4 C' }1 z. W3 j) ^
        delay();
$ `+ O4 l$ N1 d" @        P3=0x7f;
# |0 E* {! U+ ]- X        P0=du[s%10];
9 d, d, l' F/ [5 F3 V1 d        delay();9 i% a; b  k! P& m7 h
        P3=0xff;
" G/ i  B' _$ U  y! ]1 j        if(K2==0)) K$ Y) P5 a. O
        {5 L$ m5 M7 [2 B) ^( j, ^. o
                s++;
6 ?2 }" P0 Y4 }( @; I                if(s==60)5 I6 [+ Z4 _; W  D2 S  U$ f4 B1 c
                {
# }- J2 \  W4 s! V) I0 l( K/ [6 T                        s=0;/ Y; H, a' e2 A
                }9 K; o8 |0 J8 g. m. T
        }
# y3 Z% y9 `$ I! c}" f- o/ {3 R. H+ S6 R. B
//========显示分函数=============//
2 m7 n& m$ \* A. P9 ~void displayminute(uchar m)6 J7 S1 {( K% S1 k. E. L
{
0 H) l8 r2 a5 n        P3=0xf7;
$ R& |9 ?% B# L; b$ L( f9 O3 B        P0=du[m/10];
# ^& a+ @3 k0 S( D6 I        delay();3 S! C* q9 p; M6 P6 o# h2 g) v
        P3=0xef;3 g4 k' C; D& w% ~
        P0=du[m%10];
$ ^9 e0 s8 @) T) H* h( Q        delay();
- e9 b3 C$ O9 U0 j1 C        P3=0xdf;2 [, F# U# g4 u- x2 M9 t
        P0=0xbf;
9 v+ _) ]' ^' Q3 s* A        delay();+ [6 j( |7 {6 G* J
        P3=0xff;3 ]7 r/ L' k1 D5 }( b
        if(!K1)
% ?4 k9 m% m4 C7 s        {
& l9 {; P; O) E' w- e" q+ h- n                delay();
1 f4 X: g6 x: P# y/ i5 f  O                if(!K1)' q4 x; n+ a" l6 x7 w) q
                {
: I; r& [- K0 t# M6 @                        TR0=0;
- m9 g9 @) X8 w& ]1 d) G                        m++;2 T8 c9 L" C  q& A; p% L" L- h
                        if(m==60), t' i  o9 z% Y2 p: B: [' T. G! x% v
                        m=0;. C) f7 O  ~/ A3 k
                }8 R. l+ t% f! D! K4 x
        }
2 V) `( ?4 M* Q        if(!K2)
$ M" B0 o9 z5 o3 J# C        {6 r' C' A, ^% C0 J3 H/ v7 P
                delay();
4 {+ i- b. D2 m3 Q7 U0 K6 O+ ^                if(!K2)0 e. r: A3 Y  a7 n2 m3 a
                {1 x& h% e% u# |7 l, Q
                        TR0=0;
7 U2 K  w5 k( f" X4 {                        m--;
6 ~# k  C0 M' D* n: M( ^                        if(m==0). A& ~' L  w9 F/ a( l! O0 u- p
                        m=59;( H7 O+ d" N5 K
                }7 Y8 ]% I3 L: n( \( |! U
        }) v. F5 a$ a9 j% {; h7 T4 L6 v4 W
        TR0=1;
* W$ w% Y  H7 C8 X! P* L6 z: V- o( y}0 X  N$ {  Z1 h  J. m
//========显示时函数==============//
/ |6 T2 y4 [. R# Fvoid displayhour(uchar h), _0 T5 A* F9 K. \% H0 C& |2 U
{
0 u9 v0 o# D8 v        P3=0xfe;
5 }$ `3 N6 K" P: f. W. w; \/ f        P0=du[h/10];
' d+ \9 W% }0 J' y6 O        delay();
# s* ]) v: ^$ }) F5 ]        P3=0xfd;
& X3 U' y; q! J( j0 h6 C' o0 u        P0=du[h%10];
/ g8 q0 I; [* F! X        delay();3 k+ W, o1 c) `5 I8 e1 |* u
        P3=0xfb;
/ ?$ y" v8 s" P/ L' p8 e$ C        P0=0xbf;+ Q) ]( J3 y# w0 f1 H9 v8 t
        delay();
1 n& v/ t9 B, S- }% `3 e2 d        P3=0xff;
1 C" r9 T/ j. l, z& T* d, w        if(!K3)# x5 J; {, }' P+ ^6 x1 Z
        {
& }1 b4 m; ]( D1 w* a                delay();; n. o5 o: w+ D8 F7 m2 Z
                if(!K3)
! [) Z# F4 O9 k6 s! @                {: d( @8 p  P+ |7 w" Q( {
                        TR0=0;
1 |+ O6 [  R1 V; w$ D                        h++;
8 b* L/ U" E( P2 K9 N' o! f                        if(h==24)5 [0 q$ y2 @/ V2 u9 ^) ^
                        h=0;' I& `" y! L0 Z
                }& c9 q; {1 f4 @% m
        }4 {# \+ E$ L8 y, j# e
        if(!K4)
! x! s. N9 G# E, G5 I* J        {
& `5 w1 f$ S8 R  U7 C* z8 g1 N                TR0=0;
' N, P1 `1 ^( W& J! h                delay();& z3 q1 l! ^8 \
                if(!K4)$ S9 {+ c4 I: t8 m( K
                {
; X$ m% v: C, a; N( w' x                        h--;
, N# s6 [& g. [5 |5 Z0 N9 W                        if(h==0)2 e$ I0 E* K* K$ U4 r0 A
                        h=23;8 @2 F" P( K* j! H. X  B
                }5 }& o! R) ~' D4 n* K2 m( i- `
        }) k1 N& e& i0 p6 t" E8 u
        TR0=1;
! e  N3 E2 q- g6 |' M8 X% @}* e1 Q' I. f. ^
& A4 |, X! ?9 E2 M1 t3 ^, h
//=============主函数============//
' g) H: K+ X  Uvoid main(void)( W! j) n1 M/ B5 q. n/ k" K4 ^
{1 p! }. O- l' j' K5 ?
        TMOD=0x01;
' s) g( I. Y& V5 B: a3 m  H        EA=1;
( T8 Y, b/ q' U! J" x        ET0=1;
5 s1 H- }9 b- B. x        TH0=(65536-46083)/256;                          //赋初值
9 m/ L0 j* @3 X        TL0=(65536-46083)%256;        ; F2 ^6 k3 a2 ?: v
        TR0=1;* i7 ?- H9 ?" Z
        while(1)/ s; ^5 T8 W2 U3 k! y/ t3 p& j. l
        {9 u& p6 M5 U, x, s, D/ Z' |% k
                displaysecond(second);
. `# D' |, A) Q3 D# B                delay();
" z3 Z: d, g6 w. N3 g7 l0 W8 g. J                displayminute(minute);4 k  P  ^: l- ^6 z$ g
                delay();
) z3 u* i+ N2 ]% x! s' p3 g                displayhour(hour);8 w& u( b. {- b/ p, t# }
                delay();
4 S6 ?% k$ z  W$ a        }% n  V& l  Y+ B: r1 \6 k
}
5 s. g. J$ p1 N! y! f! E! t" [5 X//=======定时器中断子函数=================//- E8 P" ]$ W1 h  m$ }
void inter0()interrupt 1
0 D3 {7 o: g' X7 Y! L$ q, B{4 h8 u- `6 l/ M+ m
        time++;
; X( O' `( U1 F$ G# a5 y# A2 J        if(time==20)0 K7 c* B/ h  {& M$ n
        {5 A  \- B8 U$ k
                time=0;  s4 n7 k4 D3 h( p$ q2 v& h
                second++;: G7 [8 n' s$ q( D, _! c
        }
3 K- \$ i: f- ^        if(second==60)5 y) [" D/ B# U! Q- u9 G" ~4 V, _
        {% ~+ v- Q2 Q. I
                second =0;
$ }) m: T5 T: q, }% J* Q                minute++;
# q1 E& z/ ~8 u- [) o        }* s9 Y$ K3 |; o% b' u7 k( B
        if(minute==60)
; ~5 T+ `7 |* x        {8 ?) q9 ?) \$ r* c& X
                minute=0;
4 |0 {6 Y" _0 A, ^7 s                hour++;- F" @* T+ k/ g$ E$ V
        }
# E3 O& \0 Q5 t/ b1 Z4 [% Z# R        if(hour==24)4 i  ~  s% B( v, Z) C$ E# I" J( T
        {/ u& h' O1 C+ N% K3 z8 x
                hour=0;* [; n) `6 C! d* F4 R4 b9 [. _0 N( X
        }
, l; E- C/ G& J1 H% `        TH0=(65536-46083)/256;                          //赋初值* g9 d7 O6 N% i4 j" B; D( L  I$ |
        TL0=(65536-46083)%256;       
  K1 N8 y* H1 M) S& B, Z}

该用户从未签到

2#
发表于 2012-2-21 20:06 | 只看该作者
本帖最后由 ArthurGXH 于 2012-2-21 22:39 编辑 , e0 ~$ m" O7 b, T
  Q  B9 O2 b& w" d7 h$ y
兄弟,我来说说你的问题: 
. X0 M/ b$ q* y- g& I0 k3 q( z  displaysecond、displayminute、displayhour几个函数的参数请用指针吧。C语言的函数是传值的。比如:hour = 10;  displayhour(hour)  == displayhour(10)。是将当hour为10时,就将10传到displayhour函数。7 |( O: Z+ q' |  s3 A, a
  改成如下: 定义时:   displaysecond(unsigned char *pucData)& J# e4 f0 V0 ?$ \) J
                     调用时这样:displaysecond(&second);
+ d- V5 u* ?! |
0 D7 ^, n; _' N, K& \  请好好学一下C语言吧。0 J3 i! E2 r  g( p4 h
; e' Q, Q, _+ D
还有几个问题:
) i/ Q. ~5 |0 R! R  1. 定时器,请用自动重装载的工作模式。程序在每次中断赋值会有误差,会积累啊。" F$ G2 a% B3 f- n) ]
  2. 读按键的程序应该与显示的分开,不要写在显示里面。
2 s4 h/ E7 s% B9 U  3. 按键的去抖动不充分。& S$ q. d- W8 b& J, B
       4. 定义uchar 最好用typedef。! D$ Z- o1 i: O  U
        # ]7 {! i8 y  u# ~8 c/ N/ o" ?, ^

2 g4 J( s5 @/ S8 }0 ~5 r) O+ P( Y8 U2 v0 N+ D7 x  c
! _* I6 o( P1 J$ Z; A
8 F% N0 O3 ~5 ?' f' |

该用户从未签到

3#
 楼主| 发表于 2012-3-3 10:05 | 只看该作者
谢谢你的建议,新手很多不足的地方。以后一定加强

该用户从未签到

4#
发表于 2012-5-10 12:48 | 只看该作者
我可以给你发一个  我自己写的 简单易懂   秒用发光二级管显示   分 时  用4为一体共阳极数码管显示

该用户从未签到

5#
发表于 2012-5-10 12:49 | 只看该作者
你看看吧,我是新来的 以后多多关照

Text1.c

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

代码

该用户从未签到

6#
发表于 2012-10-25 16:24 | 只看该作者
楼上的程序可以用

评分

参与人数 1贡献 +2 收起 理由
阿宽 + 2

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-11 03:11 , Processed in 0.125000 second(s), 27 queries , Gzip On.

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

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

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