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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
由于经常用感光法做电路板,对曝光时间的控制非常重要,总是看表计时感到非常麻烦。于是用单片机做了个定时器,采用了6位数码管显示,前3位显示分钟,后2位显示秒钟,并已倒计时的方式显示剩余时间,(灵感来自微波炉。)时间到蜂鸣器响,同时继电器吸合,切断曝光灯的电源。

$ }; w, t+ h7 i1 m源码如下:
* V3 U7 E: K3 S% n$ I# l  T0 |3 k4 D* ^# H- ?5 Q! W0 ^9 t
#include<reg51.h>
2 }" t. S' @7 t$ e#define KeyPort P1' M% b5 m$ Q4 [& ^5 G9 Y7 ?: F
sbit Key_UP=P1^4;! U4 I) [4 q! T1 }: S2 O1 n+ c' W
sbit Key_DOWN=P1^5;
/ x* r3 H" u3 p6 ~& f% c4 `unsigned char KeyV,TempKeyV,num;                                                            
5 h) E7 L& f' V9 j' @, lsbit P25=P2^5;//数码管第1位3 @. n: F' N7 V# }
sbit P26=P2^4;//数码管第2位1 _+ u& y2 l5 L
sbit P29=P2^3; //数码管第3位
, d' [. i  q9 p( o& ksbit gang=P2^0;          ///分隔符
) E6 R& A3 M+ B# lsbit P27=P2^1;//数码管第3位
$ O0 _( a; ?# _- g' K* {sbit P28=P2^2;// 数码管第4位
! D6 C6 C0 H2 b. d# Qsbit P12=P1^6;//时间加3 U/ g: {: O- h* X  d
sbit P13=P1^7; //时间减
/ H9 w. D8 g" `0 b* u) n8 _- o2 @
sbit JDQ=P3^4;//继电器
  S) V& i" I% w. B! l7 ?) {/ F: t+ }
unsigned int js;. y* j1 `8 j" A0 x4 j8 `
unsigned int ds=1000,x,y;//倒计时初始时间,加时,减时  30分钟) f) _/ w& Q4 V3 J2 [; y
unsigned char jsflag;
" ^, f. \3 v2 z& y  A) v) Qstatic unsigned int i;
1 j7 j( |6 y8 Q+ Lunsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};+ R( ~, X- X. b. e3 w% ?% K" O2 e: i
  unsigned char KeyScan(void);//键盘扫描" l  X! l( O( ]4 P+ U/ N
  void tiaojie(void);
# ], N* x; i$ I* J9 U# y, Gvoid Delay(unsigned int ii)        //1MS
5 \- H/ v/ ?1 ]; s. X{9 X' D7 O. q3 k8 Z5 h
unsigned int jj;
2 p, H. Q7 _) s5 {! d9 W" W4 Afor(;ii>0;ii--)
' T) |- O. F% ?! o4 _: O0 cfor(jj=0;jj<125;jj++);
) ^* }- {- r" O: x9 R, L- H}  a8 E; D- O0 L8 _4 S# ^  n! f
void main()! n/ [$ l5 j& _+ Y2 B7 K) R
{" F, q' A; Z5 O
           EA = 1;                                        //允许CPU中断
1 h$ P3 H/ M; i. [1 W9 `. W$ h; J        ET0 = 1;                                 //定时器0中断打开6 n( T! o( T7 z1 A  k4 B' j
        ET1=1;                                        //定时器1中断打开. j& a, i" k# F' V" m
        TMOD = 0x11;                        //设定时器0 1为模式1,16位模式" K( F5 K/ M& V# t/ S1 @4 W6 z" \
        TH0=0xB8;1 ]) A/ W" [7 v7 Z7 s5 c  \/ D- \
        TL0=0x00;                                //设定时值为(20ms)
5 l6 X6 O+ ~1 G- g0 u        TH1=0xdc;                                        //设定时值为(10ms)
' r) V, p5 T- |% W        TL1=0x00;+ M/ [: T0 U1 w/ {5 a5 F
        TR0 = 1;& h6 x- ^/ W! ^
        TR1=1;4 |/ j& J  ]1 \0 W7 d2 h
& N" Y: O/ b5 E' ?; Q1 ^
        KeyV = 0;% _0 ]- R8 X: j9 T' U1 F0 A$ j
        TempKeyV = 0;
' Q4 M  G: O- A& K# v. e2 R        jsflag=0;
9 A' _1 r6 v  w, f, k- gwhile(1);
3 ^: Y2 l- u7 T/ m8 {}
" o+ u, \- h0 \( W" w( N- o- ~5 `8 u3 v
//定时器0中断外理中键扫描和显示9 d7 e% K8 W8 y) N& S
void Key_Time0(void) interrupt 1 using 2
, H& w4 |6 `1 n! w{
( W. E( e0 ?5 j9 q( t/ k# Q/ q& E: X, L  TH0=0xB8;6 E$ h/ F6 h* J$ ~  g, C7 C
        TL0=0x00;                                //设定时值为20000us(20ms)" l2 d$ x% f$ `
  if (!Key_UP)  f1 H( r. l8 O: x% d! a4 u( x. D
    KeyV = 1;  X0 k% I' ^0 h. r! Q, e' m
  if (!Key_DOWN)
3 z/ d8 G, u$ M  J4 }    KeyV = 2;
9 q, _; B! H1 y1 F' e- F2 O" D3 n        . {4 }# s/ h. Q1 ?( }  S4 K8 G
          if(P12==0)
  }% e$ j( c" i7 d$ M          {
. t  Q6 l, Q1 P( J& }           Delay(20);
' T4 X% y4 c$ S" \3 Z! y           if(P12==0)
# o2 u7 o* Y3 z+ J* a* r$ a6 ?            ds=ds+100;//定时加1分钟         (调节精度)2 e; ^) `, v7 ^! |; i
                while(!P12);9 W' Y$ `7 U8 ?; M7 A; i
          }6 w. c$ A- n% B# l. h7 y/ b
          if(P13==0). D( x, x" Z4 Z1 c
          {
2 \* m1 R. I/ ?           Delay(20);
8 e3 e. `* r3 F3 }; ^% c5 D, G           if(P13==0)$ b' F+ p2 e% s" R! R1 |. X
           ds=ds-100; //定时减1分钟
  W: u2 I; N% E0 g# E  o+ v/ X           while(!P13);
  k- H* J6 h! o  h) s          }$ x$ q' T2 A' U1 J
   if (KeyV!= 0)      //有键按下
1 Y6 F2 o3 h# g6 `2 N    {
! _6 }. ~6 C$ {. I  o( B" J. k% i      Delay(10);   //延时防抖  按下10ms再测$ a- E) P- C. ]
      if (!Key_UP)% l7 X" U) S$ d; u/ q
        TempKeyV = 1;
' |: Y- c: l" L% m# v, Z: Q. N      if (!Key_DOWN)9 ]5 A. e: r0 P+ S
        TempKeyV = 2;7 M- b1 R# @$ c2 k
                 if (KeyV == TempKeyV)   //两次值相等为确定接下了键, @# ?+ p; x! V) d2 ^0 ]7 u$ b
           {
+ p. D6 r) C. G$ S( m9 O0 Z                      if (KeyV == 1)
& q- y6 h! o  t/ r" V9 X: `                   {
4 Z- q: M% S7 l. E) d- `) q; j                                   jsflag=0;
/ e2 O8 D1 M# t& B9 b2 ^                                                      if(ds==0)4 @" |6 D* M& H- u7 f( _
                                                   {/ z; o  w; I5 t$ v1 f
                                                   ds=100;
; ]+ Z- L* V$ b0 i: d( p                                                   }
9 |0 N" N/ G6 U7 |8 E5 |                                                         js=js+1;, z6 [3 o& H1 P& H) n& b: h% H
                                                        JDQ=1;   //继电器吸合
/ R" r' }7 P6 ~: i: n, z                                                3 |0 E# o  ^! l$ E8 m9 Q6 V5 o
                               if(js==50)4 P  g8 X. D' j: [# B
                                   {
( L, d! ^& s9 G8 l                                 js=0;
' t$ Z- M" z2 v. a8 U" S; I$ y. \                                 ds=ds-1;
) D3 n  R8 t! N3 \2 V! G         8 N& N+ h9 J4 j2 c* b+ R
                             }
" M7 d% ], S  r" e/ ?9 Z2 v           }' F1 R$ @& C5 u- a4 h5 ^4 p$ z; X
if(KeyV==2)- @, R' C& C0 A% ^
{6 y$ B' I! ?4 W) ~6 B8 d
          jsflag=1;' ~3 ]# x9 ]' k* W9 N: q5 U# d" t6 ?$ W
        }
, G( g1 I8 M( o  P4 o4 V}
1 N, ?! r( u  K) q9 q}
/ e% q% ?- ^" i- P1 @2 b1 J   if(jsflag==1)
  o7 t, w/ e. N' l   {1 Z3 d( o9 G3 r/ r# v) f! ]! J# f9 Z9 D% g
   JDQ=0;
! x; N( Q: O9 H# n9 V" S$ S  c   }, ~( i" s# Y" u, b, ?
   if(ds==0)
! M6 `0 k+ K' m* R" p   {
/ M4 \' J! ~: f/ @3 C: R, Z1 A* K   JDQ=0;/ N8 E/ v  K4 G3 y1 t
   jsflag=1;/ H9 U' ?5 F5 F7 H7 D
   KeyV=0;4 n; \7 n- q% o( k' B& o
   }
: C& l8 s( I1 @/ |. ]9 Q2 ^) P& u# t
; x' E  A# P. R- x& B/ U* S8 A}
! t- g) ?* i, J6 z( \6 w1 D0 x, j  a9 Y6 }( ?- `/ c
void disp_Time1(void) interrupt 3 using 3" @, n! v1 @7 ^7 s$ Q5 g8 b( }
{( c/ m0 U5 p+ Q. h+ F; `+ L$ p
        TH1=0xdc;& d4 @! v3 e. M2 [$ l- T' N: _* |) Y
        TL1=0x00;) t5 \4 q! w4 O! V0 ?: @! v
        x=ds/10000;
2 \  V2 f4 Z5 y' w  v
$ i0 |" B; k8 i0 Z  I/ j4 w% ?' I           P0=LEDDis[x]; //分钟百位
9 O1 T. b  o* Z$ w9 ]0 G     P25=0;8 n3 |: {: C6 w: q3 [% v& D# ?; z% C
     Delay(2);
  H9 N6 Z" R5 p  m         P25=1;! u! P5 t; v8 a5 i

* d$ @, x8 N+ }0 d! W          y=(ds%10000)/1000;//分钟十位, J- ~- e) P( [& v+ ~& Q
      P0=LEDDis[y];3 ^+ _: N: c( d5 n  a4 |) G( K  F3 I
      P26=0;7 {+ Q/ E5 B  u! s& [9 C7 n2 J, v
      Delay(2);, E! G3 p* G" ^+ F# \
      P26=1;
# o7 U6 Y: b5 K4 q9 N8 i. G, D- k  p3 _' M1 s
     P0=LEDDis[((ds%10000)%1000)/100];//分钟各位
9 `, G" D! c5 V) g) r4 _     P29=0;
& B0 E6 t: O4 e3 y4 `" c     Delay(2);
; c- l/ q* v- y     P29=1;                                . z1 u* l7 Y- x& T# h
% d8 k; F4 E9 y0 F; v
P0=0xbf; //分钟与秒的间隔符
* M! c, A, {+ ?gang=0;0 D" |6 ^0 I1 u8 B5 W
Delay(2);) _4 S0 J. u4 t' V! l. T
gang=1;
4 L' e+ @1 t9 G: ^3 T9 Z2 D% A: L9 u' K+ r( L5 [
  P0=LEDDis[(((ds%10000)%1000)%100)/10]; //秒十位
, o! t9 W/ |8 w+ Y1 y0 l, a  if(((ds%1000)%100)/10>=6)          //满60,百位减一, N& B- l  R/ r5 `& `; |
  {
( Y% [) z  W/ Y3 N9 `  ds=ds-10;
8 w4 G- D' J& \7 `, p  P0=LEDDis[6];+ a+ h3 t8 n1 V
  }! @1 N" x0 ?0 [) x
  P27=0;7 V3 b: M& `+ b( o8 y  f& t
  Delay(2);
; z3 t2 w& J3 L- c  P27=1;7 ]  Z( f# @; V5 X3 V5 E

- m% R8 V9 T2 k: c! v  P0=LEDDis[(((ds%10000)%1000)%100)%10]; //秒个位
# z) y7 X8 h/ O* ?+ d( y3 u  P28=0;4 }- _* L5 @  k4 e( L" e9 c
  Delay(2);: _! \) a" g$ i2 C! R3 a
  P28=1;5 Z7 P4 E( W1 m( m% M1 _1 K: T0 B% L
}
: c' P8 W1 r9 u- [4 M
" {0 i$ b. d& {4 T. l3 g/ d  [% G$ @) T* E. J( J! ?
" _* Y3 w  Y% t$ F5 ^/ {
绿色的为秒显示,红色的为分显示,也可以随自己喜欢重新定义,改一下I/O口就行了。
0 s8 p, y# D: s7 z  ~! U! ^

该用户从未签到

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

该用户从未签到

3#
发表于 2021-9-9 11:02 | 只看该作者
学习了  感谢分享
' B0 t2 T5 F/ Y* E: P

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 07:02 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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