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

单片机数字闹钟仿真(自动值班打铃系统)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数字闹钟仿真(自动值班打铃系统). J! ?, h& w. C
- v0 ~3 I8 B1 W5 D, q

6 M: ]3 W9 Y4 ^3 c. K * j7 a2 g8 z  q" k; F4 b

- ^+ Z! D# I' c. a. b
/ y3 k/ a8 C& l& r" s
单片机源程序:
2 K& G3 L7 d& w  g; l( q. A( }#include <reg51.h>
  j: U7 P+ q3 X5 \% H2 ~4 s" ]4 w#include <intrins.h>                                                                                                                                                                                                                 , s/ l! c1 F% f5 z4 `- I% l
#define uchar unsigned char                                                                                                                                                                                                : f2 f+ a  ]5 M- k# M
#define uint unsigned int
9 _' l8 R# h& x6 iuchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极总段//' L) M5 m; t; o4 i# ?  L
uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xff,0,0};//时间显示时-分 模式
; v3 _; l+ \) D4 Luchar DSY_BUFFER1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //模式显示段//
0 _5 ^0 ~9 ~) G$ ?9 R+ Guchar Scan_BIT;//位选择//7 j: a$ S& |# P3 _% V7 A, d
uchar DSY_IDX;//段选择//
8 A/ Q, J4 x. T: suchar Key_State; //按键控制//8 v$ h, H6 K* V7 I9 b. f$ ~9 B6 K
uchar s,s100,h1        ; 9 a( E5 \  F9 c* \0 I4 I$ k: n4 m
char  h,m;* k# b+ H8 ~1 k0 U$ T5 h
sbit dd=P1^7;        //喇叭和led输出端口//- u2 o1 b4 f7 O& a" t( [0 Q0 U" }
sbit cc=P1^6;9 w7 \9 J* B: M$ n4 ^1 I
sbit ss=P1^5; //时间和秒转换显示键//. ?5 ~/ q& P2 _# W# @! s# k
void DelayMS(uchar x)" w5 f7 Z9 M: B( w* G/ w! Q
{& ~6 T1 x0 ^0 e2 J2 r# _
  uchar i;
7 x6 F# z+ j6 g' R! k  while(x--) for(i = 0;i<120;i++);% l+ a; m9 A  n6 ~& B/ l: I$ L& u
  }, m, m$ E& M  @1 y' V) c
void Increase_Hour(), X$ u& D9 {, G0 }# p
  {  S: [2 a! d6 Z- t! d6 X
     if (++h>23) h=0;( F7 s) g% L% d; f4 a
         DSY_BUFFER[0] =DSY_CODE[h/10];
" z$ b+ n6 G  e0 i# E         DSY_BUFFER[1] =DSY_CODE[h%10];+ [# B& G9 T+ C4 }5 v6 i
         }
3 p: k5 j  ~0 ?, C! B" ?$ {void Decrease_Hour()* D5 T0 e. `! G3 |( R4 ~
  {         h--;2 w. G) o; m8 Q  K/ F2 c
     if (h<0) h=23;
4 z0 n: h0 Q0 h' G+ Q         DSY_BUFFER[0] =DSY_CODE[h/10];& b/ t; a/ ]& Z( ^3 w' H
         DSY_BUFFER[1] =DSY_CODE[h%10];5 l" y: @" O# m
         }
: r% b7 Y3 D3 ?3 @: I( D2 m
6 p- w0 G7 D/ }" z9 ?5 K
8 ?, {; w' C5 j1 D8 o4 q
void Increase_Minute()
  h4 b; x2 P$ [  {
- q4 g+ c1 O2 e' B2 \) _     if(++m>59)& W! I. m6 Y. P5 A! Y! y) B
         {
2 q6 C! d7 Y' w& l, c/ q# j           m=0;Increase_Hour();
7 k/ p- W) w' O6 E8 |           }+ w* v, ^& {) ]2 h$ Y. f
                 DSY_BUFFER[3] =DSY_CODE[m/10];0 U% p0 m9 \9 i4 z
             DSY_BUFFER[4] =DSY_CODE[m%10];3 S4 @2 n7 R  v- d& Y3 o! j: |. U
                 }
9 W1 f" \* B3 Z  n$ q( p% ]void Decrease_Minute()
/ {3 z& a% S# Q  {           m--;! ]" m- `; |% e6 Z  s( B. t& ~5 Z
     if(m<0)           m=59;
, G$ ^. Y! s2 T' o+ x                 DSY_BUFFER[3] =DSY_CODE[m/10];
/ Q( r) e0 F& z8 S4 a' O( c             DSY_BUFFER[4] =DSY_CODE[m%10];
- y. B, m0 o) W8 f/ T' r1 N                 }  ! \6 |; M! A$ @7 `- K
void Increase_Hour1()
1 A7 ]  v# Z' O  {( x: _, f$ Q! r- w
     if (++h1>7) h1=1;
0 y- F) ?  G: ?+ f) t; e         DSY_BUFFER[6] =DSY_CODE[h1/10];- E, E0 }) Y# R
         DSY_BUFFER[7] =DSY_CODE[h1%10];7 }& ^1 m# P3 D, L' }5 C
         }& d: K5 F( g0 k8 D
void Increase_Second()
' D0 n, y( Z2 j+ z: U5 S  {# J0 r% D; N8 W( n
     if(++s>59)- e; c) g2 c% Q/ ]6 ~& h
         {  a9 x; J# J% v- S0 `0 Y" C1 C
           s=0;Increase_Minute();; e: a7 Z5 Z7 Y5 n
           }
4 Z1 f" b( b. H) `3 [' K                 DSY_BUFFER1[0] =DSY_CODE[s/10];/ P  ]  ?1 W% h! g3 ]
             DSY_BUFFER1[1] =DSY_CODE[s%10];0 A6 Z5 T7 C, z; @6 a
                 }
! T; ^! s" t" B& C2 n  void T0_INT() interrupt 1         //显示屏显示//& C# W: m% D' v5 p7 \- @
  {
2 B) L) {5 g6 w# c' {    TH0=(65536-1000)/256;
5 f1 [# o1 {8 f4 H        TL0=(65536-1000)%256;4 ?! Z! K5 w+ c1 p0 n+ o, n8 `
        if(ss==1)                          //P1.5键没按下,显示时间//1 I& `$ s4 `! v5 _& F! Y$ W  w
        {3 E" P4 p2 N8 J# S& Q2 A
        P3=Scan_BIT;- e- L3 V+ h& {& w% n5 }- N
        P2=~DSY_BUFFER[DSY_IDX];9 H$ p) ?: Q7 y0 b
        }
* d5 P/ j6 q+ Y+ ]- N& K        else {                                 //P1.5键按下,闪//
( c3 d3 d, Q' i) _                 P3=Scan_BIT;/ D4 |( X$ q1 W' q4 Z, z
                P2=~DSY_BUFFER[DSY_IDX];
2 _  c5 _" Y! z& H            }1 e  a, l# @3 X- B+ ?8 w1 Z
        Scan_BIT=_crol_(Scan_BIT,1);//位显示移动//
2 c7 Z% w) T& T  R        DSY_IDX=(DSY_IDX+1)%8;         //段选择每次变化//
/ i# t. C; r' W$ I% ~6 e  p% O" u        7 t9 Y9 e, S. y8 m4 R8 \
        if(h1==3)
$ Z, _  }' G* i6 T{        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
  M. @$ [4 y) X' I        if(h==6&m==15)cc=dd=0; else cc=dd=1;6 Q% `0 [7 S; e4 t' S
        if(h==7&m==0)cc=dd=0; else cc=dd=1;
- B: l8 p2 X6 G: wif(h==12&m==30)cc=dd=0;         else cc=dd=1;$ I5 r. d0 I! M/ i3 B4 E9 |
if(h==14&m==0)cc=dd=0;         else cc=dd=1;
% N* a9 k0 ^5 K. v7 d# }1 Fif(h==16&m==30)cc=dd=0;         else cc=dd=1;
# D0 S+ a7 c3 aif(h==18&m==0)cc=dd=0;          else cc=dd=1;
# B) g9 u4 q* |0 Z  c5 Dif(h==18&m==45)cc=dd=0;          else cc=dd=1;
5 a! L" P+ U- \) U5 s- {if(h==19&m==30)cc=dd=0;                else cc=dd=1;9 \1 I0 J: F/ {8 [
if(h==21&m==30)cc=dd=0;          else cc=dd=1;, F: |9 O* J: {3 @2 b# Q/ y
if(h==22&m==0)cc=dd=0;else cc=dd=1;        }
& [5 Y' R) z. Y- _2 p; f        else cc=dd=1;
, [6 |: y5 `; _% x; Q' _/ {
0 o7 G: d8 S- W5 q4 z/ p6 W

2 g/ V5 [$ a4 c! O; f7 z$ b        if(h1==1|h1==4|h1==2|h1==5)/ m- i% ~- O4 A' R* n
{        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//: F. z! q. Z  V. @5 o5 D- E
        if(h==7&m==0)cc=dd=0; else cc=dd=1;
$ ]. E4 C2 ~. `- N( h$ Z% u: Z$ l: aif(h==12&m==30)cc=dd=0;         else cc=dd=1;
9 S$ w, W/ p8 l; U" @if(h==14&m==0)cc=dd=0;         else cc=dd=1;
5 v  Q5 X, h, [* R+ J. a: W4 l% aif(h==16&m==30)cc=dd=0;         else cc=dd=1;. n% Y7 Y5 c+ h( A  |  X  y& G, t/ @
if(h==18&m==0)cc=dd=0;          else cc=dd=1;
7 }8 ~% g2 `3 e6 c1 F) pif(h==18&m==45)cc=dd=0;          else cc=dd=1;' A$ F6 r4 R( N# U* e2 f3 F* p+ c0 F
if(h==19&m==30)cc=dd=0;                else cc=dd=1;/ T, Q% g1 I- f
if(h==21&m==30)cc=dd=0;          else cc=dd=1;
2 ]+ e! r: U" g+ a9 M; J/ zif(h==22&m==0)cc=dd=0;else cc=dd=1;        }7 Y$ D- o3 t8 `' K: |. _
        else cc=dd=1;1 D% s; v  r- j

9 L, l: P/ V7 H
! |8 r% Y6 c+ A# ^/ P
          if(h1==6)$ S7 e9 p9 h7 |
{        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//5 Q$ d5 B% W7 M3 Q+ B
        if(h==7&m==0)cc=dd=0; else cc=dd=1;
9 N0 y) u+ k( G2 V, ?if(h==12&m==30)cc=dd=0;         else cc=dd=1;
0 ]9 }9 ~/ ]" ^% K1 xif(h==14&m==30)cc=dd=0;         else cc=dd=1;) _) W$ q' |8 `% K. _
if(h==18&m==0)cc=dd=0;          else cc=dd=1;& c$ ~+ m' j, v7 u, i8 I7 o
if(h==21&m==0)cc=dd=0;                else cc=dd=1;
7 K3 _  Q9 B0 x  Y1 Gif(h==21&m==30)cc=dd=0;          else cc=dd=1;
( J1 I6 C0 v# O( f- d% p% `if(h==22&m==30)cc=dd=0;else cc=dd=1;        }3 M9 Q4 ~# ^6 |9 e! ~
        else cc=dd=1;" F8 |+ K7 J8 J/ g; r7 c7 a
3 a6 \( S5 |, B5 |
5 p' w# I  j9 a5 W' ]7 x' ]! L7 }
        if(h1==7)4 U* D; O$ Z4 u+ [# C2 u/ H
{        if(h==6&m==30)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
1 f( ]! D2 A  W                if(h==7&m==0)cc=dd=0; else cc=dd=1;
7 i5 A& y( C0 y) l; \9 ?6 jif(h==11&m==30)cc=dd=0;         else cc=dd=1;
" u* p3 a4 H+ u9 K) h/ fif(h==12&m==30)cc=dd=0;         else cc=dd=1;
1 t3 r0 k' n- k! V; z: ]if(h==15&m==30)cc=dd=0;         else cc=dd=1;
- T$ Q+ W+ u: ?' c7 M& @if(h==16&m==30)cc=dd=0;          else cc=dd=1;
1 a8 r/ M( ^% dif(h==18&m==0)cc=dd=0;          else cc=dd=1;% Y* d* M9 T$ M* w
if(h==18&m==40)cc=dd=0;                else cc=dd=1;
% j$ u+ ?9 Q4 b' p# j& zif(h==20&m==0)cc=dd=0;          else cc=dd=1;! B* G; m: j* }0 c
if(h==20&m==30)cc=dd=0;          else cc=dd=1;
! n4 A/ t# L5 F6 I9 }if(h==21&m==30)cc=dd=0;          else cc=dd=1;
7 }7 |. l$ o: `# t2 Y$ a, t. nif(h==22&m==0)cc=dd=0;else cc=dd=1;        }% Q, y- g- K( P: H' O" A6 R( t
        else cc=dd=1;
+ \- ^5 i- @, ~" f& c, O) e# F7 y           1 ^0 n1 @  M1 p' i8 L  l, ?; m
  }
6 r' T8 K+ r( Q1 g8 G8 v7 T1 K
3 x6 U3 g' _1 p3 {* K. W( x
' [+ _4 l# p3 Z5 K
  k4 w6 q! P0 Q

2 z, j' m! T' A        void T1_INT() interrupt 3//时间秒自动加一,走时//3 {) R3 q+ w& }) \+ d
        {3 Z2 u7 x! M6 ~% L2 }0 w: N  r* h
          TH1=(65536-50000)/256;$ V6 N: x) w" n7 n$ Y. i
          TL1=(65536-50000)%256;//延时50毫秒//
7 {6 @, A" |) G0 v8 v: \          if (s100==20)
/ A8 ~  d# S  B  L$ S9 C' s6 z# i! B          {
+ H* O/ T) V5 f            s100=0;' b- |( e/ J* R/ v5 O2 V9 F3 y" L- i5 g
                Increase_Second();
+ h; v) u# H4 M' o      }! t  W4 O# N! y/ ~) u2 v
        else s100++;
! ~4 ?, H5 W) u8 s        }8 @) c9 b( `  E
        void main ()
- P6 r) d" [1 @) T3 P" u+ V        {
2 E, ~( v( z" N          P2=P3=0xFF;
  i! a3 i5 X! N$ R/ n          TMOD=0x11;& b3 W: P# j, n9 s
          TH0=(65536-1000)/256;
- t0 u* X$ d" n" o: Q          TL0=(65536-1000)%256;/ w6 q0 S; ~2 ?8 z) F& m, q
          TH1=0XDC;
+ |; c3 `; M8 ^: |          TL1=0;2 j/ u# d: A1 p2 H0 j$ ]" B
          TCON=0x01;, E& U2 u- V" y; l; g3 \9 R( ^; G7 @
          EA=1;
5 t2 z4 T9 t3 J; K          ET0=1;
' {8 J. N$ n% U, X          ET1=1;# ?2 Z: n5 F3 i0 h9 c
          h=05,m=55,s=s100,h1=1;  //时间和闹钟初值//7 d/ N6 D- O& d
          DSY_BUFFER[0]=DSY_CODE[h/10];           //时间初值赋给时间段码显示组//* H1 b9 i4 G, m) N, B. M
          DSY_BUFFER[1]=DSY_CODE[h%10];
" E' P9 X  R0 _( P  P- ^2 r  q          DSY_BUFFER[3]=DSY_CODE[m/10];0 [6 s# I! s% h: k* g- n$ Y
          DSY_BUFFER[4]=DSY_CODE[m%10];
) ^3 q9 A! W7 _  R8 {          DSY_BUFFER[6]=DSY_CODE[h1/10];
7 |! x5 R: P9 P3 E+ I          DSY_BUFFER[7]=DSY_CODE[h1%10];- P' {# S: }( g7 v; _5 e
          DSY_BUFFER1[0]=DSY_CODE[h1/10];        //闹钟初值赋给闹钟段码显示组//* }1 f, j, j9 W" ?" W- S
          DSY_BUFFER1[1]=DSY_CODE[h1%10];" P, u2 \& A. r
          Scan_BIT=0xFE;  //给位选择赋初值为二进制数 11111110,即只有最后一位为低电平,之后每次左移一位,依次为11111101,11111011......01111111,11111110循环移动//5 c, s8 X* p8 A! u7 J8 Q% x, B
          DSY_IDX=0;         //段码显示组的选择变量//: r. W( `" q1 C7 b* T
          TR0=TR1=1;, e2 f2 K/ c7 Y1 }7 X- Q
          Key_State=0xFF;: q% h8 I+ A- G/ y" O; V8 \
          while(1)+ `9 m: G# u- h
          {
! h- i- X* z; r+ G8 }4 \            if (P1^Key_State)         //判断按键是否有按下//
1 a2 B9 A1 L" k  S# e: k$ Y  f                 {
$ p! G( ^" r5 D                   DelayMS(10);
. D* W2 V  T, y) _  f                   if (P1^Key_State)
  x' {2 @, d+ D8 p                   {
: \. `& j2 g: V- }" F' s4 ?                     Key_State=P1; EA=0;
, b' b: o& N+ o4 X8 q9 U                         if((Key_State&0x01)==0) Increase_Hour();           //小时加一//
9 A; [0 g  g" Y+ G9 V! l6 [/ m/ I                         else if ((Key_State&0x02)==0) Decrease_Hour();   //小时减一//; r3 w) g# M$ H8 b! u
                            else if ((Key_State&0x04)==0) Increase_Minute();        //分钟加一//) T! D0 X  V( T7 @# ^, L" K( Q
                                else if ((Key_State&0x08)==0) Decrease_Minute(); //分钟减一//
$ J0 Z2 {% |- s' ?5 k                                else if ((Key_State&0x10)==0)                                         //复位按键//& u" }' I) `' |* e% P( K, |4 s
                                {h=05,m=55,s=0,h1=1;/ K5 [! i3 q3 M( l6 V3 W2 l
                                        DSY_BUFFER[0]=DSY_CODE[h/10];* A$ b" e4 o+ H$ ~9 R2 D# u/ F2 l
                                        DSY_BUFFER[1]=DSY_CODE[h%10];7 t; [9 j% M/ y5 t+ A$ r1 z
                                        DSY_BUFFER[3]=DSY_CODE[m/10];
( G9 q/ M; M8 X                                        DSY_BUFFER[4]=DSY_CODE[m%10];* p3 `/ X& T' i+ i
                                        DSY_BUFFER[6]=DSY_CODE[h1/10];5 e" R- Q9 B, O9 y/ |- W
                                        DSY_BUFFER[7]=DSY_CODE[h1%10];
; ?/ x, @: n5 X. B; B) T# r) y/ i
+ k0 B( i; U8 q; n7 |! X4 E& I
7 G3 j9 M1 |/ _
                                }
1 f' |( K: L2 X( r- e) s: Q                           else if ((Key_State&0x20)==0)Increase_Hour1();        //模式加一//; |& E. Q: J" V" ?2 u- Z4 q1 `0 s$ h
                           EA=1;" y6 _: r: |1 q. e
                           }
0 J/ t2 r* X( j               }
  e6 p8 Q7 k; Z. j# w                           }
/ j& K" B3 x, S8 r                           }
" J8 ?+ D2 s& v( `
- m$ G. Q, Z& h0 `7 ?下载:; N' ]. w& x1 A1 {5 F- m
游客,如果您要查看本帖隐藏内容请回复

# R  I  i  L& s/ A0 X+ d- Q/ R, {) B! S1 G* o/ X" M) s5 U. z3 [0 R. d

该用户从未签到

2#
发表于 2019-1-18 11:20 | 只看该作者
看看楼主怎么弄的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 04:52 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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