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

DIY 单片机自制倒计时定时器

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
由于经常用感光法做电路板,对曝光时间的控制非常重要,总是看表计时感到非常麻烦。于是用单片机做了个定时器,采用了6位数码管显示,前3位显示分钟,后2位显示秒钟,并已倒计时的方式显示剩余时间,(灵感来自微波炉。)时间到蜂鸣器响,同时继电器吸合,切断曝光灯的电源。
+ u# _( v+ e+ [) Q5 E* G9 g
源码如下:
1 y5 z$ n6 l9 \* q& J# B' G1 ?6 B
; P4 `- d* k4 e9 N# n#include<reg51.h>
0 T- y5 A8 l) {/ ~#define KeyPort P1" p, ]& O8 @6 ~' d# P: Q
sbit Key_UP=P1^4;
+ v0 O# @* {& [5 osbit Key_DOWN=P1^5;
+ @, z0 i0 _' y5 R5 _# o: z" f& Dunsigned char KeyV,TempKeyV,num;                                                            1 M% `0 U0 X8 P: i+ h. L
sbit P25=P2^5;//数码管第1位
/ c; P% p5 a2 E+ ]5 asbit P26=P2^4;//数码管第2位
( J. h2 @5 b* `0 A/ i( T1 vsbit P29=P2^3; //数码管第3位
2 f  a, P5 C7 w: v2 Q% K, Dsbit gang=P2^0;          ///分隔符
' S, b0 K3 [" ?  @, Isbit P27=P2^1;//数码管第3位
5 N* w& w9 E% M7 @. U( gsbit P28=P2^2;// 数码管第4位+ [7 z/ ^  l- t5 J% u: |. P
sbit P12=P1^6;//时间加
, j( `  i  C1 Y4 @9 h# h! `" ssbit P13=P1^7; //时间减3 n& O7 ^0 B* F* V

8 V3 b$ ?8 A6 t: b- G+ N7 ]sbit JDQ=P3^4;//继电器
8 c! m, F! `$ |" \! }  [* t: i
4 U. \9 C* B1 Kunsigned int js;
" \2 r7 E3 i& Y- C7 P  E* Dunsigned int ds=1000,x,y;//倒计时初始时间,加时,减时  30分钟
! `) F/ S7 m# R8 g& `8 T' Zunsigned char jsflag;
) a' c4 [8 W4 |. m1 b- N) fstatic unsigned int i;! e& C$ ~2 `0 E! L( a8 ~6 z, K
unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
* M2 f+ {& E' k' p  unsigned char KeyScan(void);//键盘扫描9 T8 Q% w! |$ R2 B8 T, M; a: V
  void tiaojie(void);
' E7 Q* F; |+ T% V5 \7 G% ivoid Delay(unsigned int ii)        //1MS- c9 ?* f  ^5 P" o- _
{2 T& w' d: c# P" Y7 ?/ H. x
unsigned int jj;- E7 y8 [* ]+ f+ e: u0 O" d
for(;ii>0;ii--)
  i; I! I( t* n# D+ ffor(jj=0;jj<125;jj++);4 E' Z0 |) K3 _0 P+ I8 j. I0 {; m& S
}
" {6 N& @+ W+ @! `4 @void main()7 e& L2 E: x7 e4 m" D
{
, Q, r% H. g/ `! O$ ~, E4 N           EA = 1;                                        //允许CPU中断/ W2 J# L+ j- n7 `
        ET0 = 1;                                 //定时器0中断打开% ?8 A6 W. n) G/ O3 v' |
        ET1=1;                                        //定时器1中断打开
7 G) F0 f. K1 W, e1 j2 C) Z        TMOD = 0x11;                        //设定时器0 1为模式1,16位模式: \0 |3 }$ }2 R4 ?
        TH0=0xB8;! C' D! [5 j: f/ Y" p. |" b: q
        TL0=0x00;                                //设定时值为(20ms)
9 z1 G1 [  g1 k        TH1=0xdc;                                        //设定时值为(10ms)
4 D& u8 n3 I; a& S' O# v. |# w        TL1=0x00;9 ~2 H/ Z/ I9 V5 ~1 q- D4 }
        TR0 = 1;
$ p4 l# P' ]8 F/ p4 i        TR1=1;
; ]% x$ [, j8 U
7 Z. N4 m& S: \8 F& E( D        KeyV = 0;% ^7 ^' Z7 v0 K" b  }% `
        TempKeyV = 0;# v1 B: u  l0 c
        jsflag=0;! p% s% ~+ i9 P- I: O) K
while(1);
( M) n. ]& @$ P# h: y7 b7 [}
+ M; k  t( o. Y7 |) X2 l" r( C$ a* K4 G7 r) Z) B$ G
//定时器0中断外理中键扫描和显示% g+ o% _  _+ i9 P1 j
void Key_Time0(void) interrupt 1 using 29 B& C; L; p7 a  `1 ^% L
{9 ]4 b# K0 ~* C$ B$ _5 H
  TH0=0xB8;
" o' h! C- s6 [5 P        TL0=0x00;                                //设定时值为20000us(20ms)
9 d- j( L+ A) k4 }5 A' l/ W  if (!Key_UP)
" k! M+ f7 ~# [- {' n) x$ I# r( }    KeyV = 1;
" o* v; P# a, ~1 @& i  if (!Key_DOWN)
7 `3 J& s% t! y% L$ ^    KeyV = 2;
! }0 p* W& M8 n9 r& ?. D; j        9 N4 p6 O) O2 t0 v* X+ i
          if(P12==0)
$ {6 U8 G( Y7 v% f# }" b          {! e0 q8 O' R( s4 x6 X5 r
           Delay(20);) T) }% F) v4 t8 @: n
           if(P12==0), ^3 g$ [& X. t, p/ R: g) Q
            ds=ds+100;//定时加1分钟         (调节精度)9 j; C/ h  M( G; j
                while(!P12);" |+ C/ M" d- H& s& b( \" y* Q* X
          }
) ]4 l1 @& ]  {  C5 \7 T2 S          if(P13==0)0 J2 T" g8 d- f: R
          {; l6 ?/ a# S' m" Z
           Delay(20);! C9 ?1 o. J! N1 e! r
           if(P13==0)+ Q7 R3 V" o: Z( m3 a; u1 O( h
           ds=ds-100; //定时减1分钟' j5 V, H$ E4 H
           while(!P13);
) O/ _$ i( d4 M" U2 g4 I& N          }% ~, H5 q  y$ E  a* w. j  V9 K
   if (KeyV!= 0)      //有键按下
/ B, |) n7 q! p    {, X5 F( e$ I! ?$ C
      Delay(10);   //延时防抖  按下10ms再测
0 U  f; O9 P& Y; Q8 [4 G      if (!Key_UP)7 Z4 H) ?  c# P& E3 Z0 d. Z
        TempKeyV = 1;
, {* l0 }, }' H( v      if (!Key_DOWN)
  R9 C8 f0 r! o        TempKeyV = 2;
3 r4 ?1 w& C! g  Y* f                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键' W' C, j+ t3 @7 [
           {6 S. N6 C6 {% {9 G8 _" z+ i
                      if (KeyV == 1)
9 N6 j+ e/ d, M8 |                   {
: P. k( `2 V5 f                                   jsflag=0;
# N( a; a* M3 _, |5 _                                                      if(ds==0)
: J# W( H: l/ D' G8 I                                                   {: F$ m. j) H! U! b* H$ r
                                                   ds=100;
  J% X. H% Z5 J/ `                                                   }
1 @+ p& L  a  \4 ^' _4 E! h                                                         js=js+1;7 _2 J1 W- T2 K+ I9 p4 N5 I3 h
                                                        JDQ=1;   //继电器吸合
. d  F2 {* q- D* I. }. a                                                
5 V1 R0 Z6 A( a2 p+ D" q6 W6 j                               if(js==50)0 e+ c( \: a; T/ @! m5 b) Y& c
                                   {
3 }( O" u. X0 |& t$ F  G                                 js=0;3 K0 ^- D, x' r
                                 ds=ds-1;& @0 N# d0 p7 h! |, |& S
         & M$ n8 z! U3 i3 L. v
                             }
, W6 @' S+ r' Q( D           }8 }: w0 n- m! _4 c% Y: M/ T. @/ U
if(KeyV==2)
% K7 U4 x* }% ?5 u; l{1 s4 U1 x  I% {" S( _
          jsflag=1;
3 C3 E) h6 @8 Z4 ~( o        }+ q6 M! J2 Y" i, s
}
6 q) ~/ ^% [2 }: p4 U# U' N' ?}
7 L% i9 _4 {0 h$ G+ B  k' J   if(jsflag==1)/ Q- ?' a% h7 C' {  ?9 L
   {
8 K! _) E. P  j   JDQ=0;' Z. B. [2 |' U; A# q7 ]
   }! a& q7 i. S& Y, u
   if(ds==0)
+ C+ U5 k& R" r7 U2 D3 e% A/ V0 u   {
6 {' D0 Z' L6 u  c7 c8 T$ g& R' B   JDQ=0;9 i) h* A, c' O
   jsflag=1;2 I8 _, S* I" ~' ~& U# n- @/ a1 c3 K
   KeyV=0;
2 R" v  n1 ~' j; M# k6 I7 D8 x; f   }
# s$ R6 |9 `  U7 a) Y: Z8 r% o! \+ H7 P( F
}! e. n7 ~: s, i, P! J' Q# `/ `

- K5 Y8 i$ U: p% ovoid disp_Time1(void) interrupt 3 using 3! Y' d  n, p8 W$ j) _, Z" W& `
{" ?  J5 H5 j$ y! z. s  _# q
        TH1=0xdc;
, [& k  D- \6 M& _3 `! H2 s. m        TL1=0x00;
+ U" a3 x% P7 E        x=ds/10000;
9 E; p2 ^% g4 i- p0 O
+ M0 `3 `8 P" s/ i* \           P0=LEDDis[x]; //分钟百位
6 `9 b/ E% K6 A6 `' P     P25=0;, @" a! W& K3 n
     Delay(2);
* o& `& B& q' S# M. U! m6 x  O         P25=1;
( N6 \& L6 |4 }4 x& E  k
2 _) H4 U5 f- o9 t. U, f7 |          y=(ds%10000)/1000;//分钟十位5 q* f' q3 ]9 R3 ]: u6 \
      P0=LEDDis[y];* W, _2 n0 u" r9 t
      P26=0;
" [, L! l+ Y6 [      Delay(2);( Y$ @" {/ @3 H0 o8 f- q
      P26=1;4 l% W+ p* o1 Z& o8 A  @; S# c9 V

  |. _" H2 r. ]5 r, k2 }9 a( V     P0=LEDDis[((ds%10000)%1000)/100];//分钟各位
& C- r9 }6 D! L. E2 z* n     P29=0;
2 \* h+ q) X. H, P9 v     Delay(2);4 i" x, b, ~: h. d# D& E+ N
     P29=1;                                2 f8 H: E  m7 B& R: P6 H( E
7 Z, z! d+ _, [4 r( d( |5 V# l
P0=0xbf; //分钟与秒的间隔符$ \$ z1 D' J1 I% T! T! t
gang=0;
/ O/ J8 |: H$ P" m! A% f, N- aDelay(2);5 a2 G5 l. d' O* |) ?" b2 g% O
gang=1;0 A. r1 z0 y% w5 m7 b
6 H, Q/ u; Y; `& G* P
  P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
7 K9 r8 F  c; _9 N2 R  \- L  if(((ds%1000)%100)/10>=6)          //满60,百位减一7 B3 t# f. G6 _# l8 ?$ |9 B
  {
1 U0 A/ g4 O/ U0 W- O3 T  m  ds=ds-10;3 M+ k1 K# \+ F* Y; q) G
  P0=LEDDis[6];
( Z( W2 a, y2 Z( M2 z" d) v- U6 t  }; P# S- Y# i$ e" ?7 N# R
  P27=0;
" |' P" ~2 }( R. D  Delay(2);
( l! i7 a" A7 `4 A9 i) m  P27=1;
! y6 E4 v4 m5 N
1 O9 ~. P- [! ?" X# k9 @' k  P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
, e+ q& {/ O6 Y% P  j! ]  P28=0;+ ~$ \2 o/ [2 q) M, H/ \
  Delay(2);
; y! Z" `1 Y; P0 k- x  P28=1;/ A% D$ Z% X9 h. o5 ^' z% C! ~  z
}
8 m7 Z  o% W! t% d
0 h" p0 j+ H% q+ d4 o4 l5 U  m3 c* Y* z5 P4 E2 t$ v9 \: |- N
& O, S/ R2 J! G
绿色的为秒显示,红色的为分显示,也可以随自己喜欢重新定义,改一下I/O口就行了。/ Y3 l3 o, m& t( {7 |. n. O' M

该用户从未签到

2#
发表于 2021-9-9 10:50 | 只看该作者
用8H系列单片机功能更强大些

该用户从未签到

3#
发表于 2021-9-9 11:02 | 只看该作者
学习了  感谢分享7 x- Q9 [" x' T3 X: m5 ]/ q: p) e) D+ k

该用户从未签到

4#
发表于 2021-9-9 11:30 | 只看该作者
好  对初学者很有帮助

该用户从未签到

5#
发表于 2021-9-9 12:03 | 只看该作者
厉害了,感觉大神了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-20 06:42 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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