|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字闹钟仿真(自动值班打铃系统)2 r' B0 p( X& T( ~( s) E
4 K) Z* t! g8 n9 T" h' `3 R# F# g
+ W5 E2 {; F& m0 ~$ I) y P3 Q2 f
5 u# u) H2 L4 d5 [3 M5 n& L: Q, t: I- ?* W8 g) u! t n
单片机源程序:
: O6 K7 ?' @! T$ {( Q+ B6 d# `#include <reg51.h>( A0 S% |6 f" x% Z6 i+ O
#include <intrins.h>
' y; i( Q6 [- {, ~7 G. c#define uchar unsigned char
) J5 i2 T, t2 J6 p% {) G#define uint unsigned int
/ `3 V; ^0 z; ^uchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极总段//1 e4 x3 r) @6 ]1 e
uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xff,0,0};//时间显示时-分 模式) d4 i/ P4 w O8 B% a! f
uchar DSY_BUFFER1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //模式显示段//
0 n- z. K% F5 w# J0 Ouchar Scan_BIT;//位选择//
2 B: u5 e" r& ]6 Duchar DSY_IDX;//段选择//
1 A; }, m h4 ?5 K2 J$ E9 u5 M1 Huchar Key_State; //按键控制//
2 F- ~/ ^" Q6 ~) I0 K6 f) X( ruchar s,s100,h1 ;
* Z+ D, S6 U$ [+ L# hchar h,m;) a9 }% U) d! k' [ L4 `' C
sbit dd=P1^7; //喇叭和led输出端口//
- {" Y2 x( H- d b6 f! j0 Fsbit cc=P1^6;. ^, W" S3 q& o- i" x$ x
sbit ss=P1^5; //时间和秒转换显示键//
0 ]/ c0 W2 ? r7 s) o: Z4 qvoid DelayMS(uchar x)# o; |" P7 s. P1 [
{1 f7 F$ Q' n0 v9 e7 V
uchar i;7 [! r. S$ m9 j0 l0 ]9 \
while(x--) for(i = 0;i<120;i++); h+ d( I3 g; Y3 w( }, @
}
0 p0 i3 } ?# w7 P6 Yvoid Increase_Hour(): U) W, @, A% q4 B1 B/ C% U
{
; E+ r$ O2 z$ P* ]" F if (++h>23) h=0;% x Z& J1 w3 }# X% u* [
DSY_BUFFER[0] =DSY_CODE[h/10];4 w, }( h9 ^5 o# x3 \: n
DSY_BUFFER[1] =DSY_CODE[h%10];( W) Y" y; l* j, @% U
}! \8 U) K( w) F
void Decrease_Hour()
# @' A" Q9 L* {/ m, I { h--;
! v, L' M% p+ X7 x' _ if (h<0) h=23;4 p" @) r2 ^# E
DSY_BUFFER[0] =DSY_CODE[h/10];
* a4 t1 V% E' H6 I DSY_BUFFER[1] =DSY_CODE[h%10];3 x7 b* G& A: d" w) T# K7 \1 {
}
' U) q1 U/ n6 H+ P+ `- W* ^
3 a9 q* S' N2 m$ \, }
. q. r7 U: r, A" n `; {% m$ Gvoid Increase_Minute()
4 `- R# H9 k D+ X- I$ Y {
( K- i, Q, K) v6 ~% N if(++m>59)
8 p& W6 |. i4 k {
2 ~9 Y) D ^6 a2 z m=0;Increase_Hour();: f& N5 ? y* _8 }+ \
}' V0 b6 ~9 \0 D% F- U
DSY_BUFFER[3] =DSY_CODE[m/10];
$ A1 d& r ]' u0 [/ B3 \1 ^ DSY_BUFFER[4] =DSY_CODE[m%10];- {6 B/ F/ t, ^5 ^% X
}
1 ^2 L* _/ c) @; ~( Tvoid Decrease_Minute()0 ~& J6 s1 O2 t# R I3 S6 s4 Z
{ m--;
, k; J8 y% F/ T if(m<0) m=59;
# r$ w2 p7 p9 Y* Y9 l% w DSY_BUFFER[3] =DSY_CODE[m/10];
0 n9 v K. N# k/ B DSY_BUFFER[4] =DSY_CODE[m%10];9 g3 p2 o4 t3 P9 V+ }
}
. P# D7 P; t# B" fvoid Increase_Hour1()
& q6 Z; v# N+ L- u8 W) S {6 f3 R: n! S6 e) U- C- {* ?
if (++h1>7) h1=1;
9 X( f* }9 @5 b* n/ G DSY_BUFFER[6] =DSY_CODE[h1/10];6 y/ a) R6 k: J3 \5 {( d, ?
DSY_BUFFER[7] =DSY_CODE[h1%10]; ^7 M; J- ]4 e8 d' A) m4 w
}3 ^( Y% H+ v' e1 N* A8 I8 x; L
void Increase_Second()$ l; k; `# p! h; ?6 J, Q
{
6 e8 K" ?. d& R5 U2 e if(++s>59)
O5 u/ H$ }5 P- R* ] p& k3 I {/ I" u& `: k+ [: x
s=0;Increase_Minute();
?1 H8 V( v( `8 K0 h }
( w \. V) ?: ?; w; ?: T DSY_BUFFER1[0] =DSY_CODE[s/10];4 \2 Z3 r; h, i
DSY_BUFFER1[1] =DSY_CODE[s%10];5 O5 {' N4 I4 u+ g9 K
}: h: k. U: B8 ^/ B& a# n# v. a6 ^
void T0_INT() interrupt 1 //显示屏显示//* {; g/ L( Y( }
{. M* x+ ]/ `- X6 h3 U
TH0=(65536-1000)/256;
7 f9 Y0 m/ _+ y, ~- Z, d& T TL0=(65536-1000)%256;
! ~$ W6 p, c9 N% o0 z# {! z if(ss==1) //P1.5键没按下,显示时间//# c) L' b! H( z: _4 @$ I
{0 R4 S4 b4 B7 u0 S
P3=Scan_BIT;
/ C# q \0 z# s- B! U P2=~DSY_BUFFER[DSY_IDX];" }5 m' \8 |4 P, x. X
}+ j9 [# [' p2 {) {9 g
else { //P1.5键按下,闪//
- i" M! D4 Y7 i- p& F P3=Scan_BIT;
b5 V l6 h: E, r+ j( x P2=~DSY_BUFFER[DSY_IDX];, `2 b X; F& [5 d) u
}' H8 J9 ]: J' f4 t
Scan_BIT=_crol_(Scan_BIT,1);//位显示移动//* @ c* d I0 E% y8 ] @. ~) b5 @
DSY_IDX=(DSY_IDX+1)%8; //段选择每次变化//# S) k0 i5 ^5 o4 a$ A
6 t+ V- J3 d0 y, N if(h1==3)6 S% P8 ?" y& u4 A9 o" }. [7 n1 A& q
{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//. V0 D7 z" ^- Y( H
if(h==6&m==15)cc=dd=0; else cc=dd=1;
9 C5 M! |6 G8 l8 } if(h==7&m==0)cc=dd=0; else cc=dd=1;
( U' D. V% C& Sif(h==12&m==30)cc=dd=0; else cc=dd=1;4 k0 Y0 h5 g6 t/ B- @
if(h==14&m==0)cc=dd=0; else cc=dd=1;7 S1 ]% n% e5 c8 y
if(h==16&m==30)cc=dd=0; else cc=dd=1;
0 z2 z6 ~4 I6 T3 t# eif(h==18&m==0)cc=dd=0; else cc=dd=1;
, V$ @8 r# }2 o8 X0 sif(h==18&m==45)cc=dd=0; else cc=dd=1;( ]0 {7 P, A: n( O$ ^" f
if(h==19&m==30)cc=dd=0; else cc=dd=1;
: ]9 r' q0 ^! [- G/ gif(h==21&m==30)cc=dd=0; else cc=dd=1;- _' h1 t8 N! }! h
if(h==22&m==0)cc=dd=0;else cc=dd=1; }
! l6 K2 U; S# T- o/ h else cc=dd=1;- m" `. N" v4 a. d% |, u
7 K9 U6 k& W- `* x( K
9 S1 p, l V% \1 _" t# ^ if(h1==1|h1==4|h1==2|h1==5)( m! @& W9 L8 ?: x0 c& R6 v: o4 a
{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//. ^( d$ s* O# Q
if(h==7&m==0)cc=dd=0; else cc=dd=1;: w& v' K0 F# x
if(h==12&m==30)cc=dd=0; else cc=dd=1;
% U5 P/ G L5 d1 mif(h==14&m==0)cc=dd=0; else cc=dd=1;5 A& l1 V$ p, I S
if(h==16&m==30)cc=dd=0; else cc=dd=1;; j1 Q! H5 }9 m. c) _, l2 B9 P0 `+ z6 _
if(h==18&m==0)cc=dd=0; else cc=dd=1;! |8 c2 d D3 D |0 g
if(h==18&m==45)cc=dd=0; else cc=dd=1;
' o* E; \: [1 x! o2 Iif(h==19&m==30)cc=dd=0; else cc=dd=1; s" @6 q) o9 Z4 _7 ]/ D
if(h==21&m==30)cc=dd=0; else cc=dd=1;: G, F5 W5 h9 D2 h# Y2 m
if(h==22&m==0)cc=dd=0;else cc=dd=1; }+ u% s3 F4 y. U) ]# b9 @! g
else cc=dd=1;" c+ A8 O# g9 _! C7 G; C7 [
- c- F& C T' l$ a ^6 x$ z- L$ b1 L6 @6 r: U' W2 \' ]+ b* z
if(h1==6)
3 {( q- J+ z% }7 X' [{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//- e( j; l; ]3 N! G+ q# Y. i
if(h==7&m==0)cc=dd=0; else cc=dd=1;# d0 J+ b# D4 S; X
if(h==12&m==30)cc=dd=0; else cc=dd=1;' j$ T4 w! `4 }, u# P' X* G/ d
if(h==14&m==30)cc=dd=0; else cc=dd=1;6 b( L: w- H* I3 w/ ]
if(h==18&m==0)cc=dd=0; else cc=dd=1;
' b: `- E2 Y7 Xif(h==21&m==0)cc=dd=0; else cc=dd=1;6 e8 g ?' p6 \7 P9 L
if(h==21&m==30)cc=dd=0; else cc=dd=1;, Y% ]: P! x4 V6 s
if(h==22&m==30)cc=dd=0;else cc=dd=1; }
& G) N& u5 c3 H. W1 R. ^ else cc=dd=1;
) Y5 {8 A* o) W" @9 l3 k- l V8 r
9 |0 F5 A' d3 [6 F8 a if(h1==7)3 H. Z# C7 `5 R/ V) `
{ if(h==6&m==30)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//9 W; k; y! ]5 [: G- I
if(h==7&m==0)cc=dd=0; else cc=dd=1;. X: R: { }' }8 ^; R
if(h==11&m==30)cc=dd=0; else cc=dd=1;
* V; T1 E( ^& ^. H+ g. o1 I3 xif(h==12&m==30)cc=dd=0; else cc=dd=1;
8 `( X- S# L! T% ?2 ~1 Aif(h==15&m==30)cc=dd=0; else cc=dd=1;
- D5 R( t/ x0 lif(h==16&m==30)cc=dd=0; else cc=dd=1;
2 \2 V, q2 N; l5 p$ O' H3 s- u/ h, yif(h==18&m==0)cc=dd=0; else cc=dd=1;
' M; D, o, V$ H/ X$ mif(h==18&m==40)cc=dd=0; else cc=dd=1;
4 I* X. P- o( y! z$ Zif(h==20&m==0)cc=dd=0; else cc=dd=1;
; O" K K8 _9 y! W, j6 ?. }if(h==20&m==30)cc=dd=0; else cc=dd=1;5 w& A, O% Q( m3 G5 X
if(h==21&m==30)cc=dd=0; else cc=dd=1;
9 V( r. k3 k! R. vif(h==22&m==0)cc=dd=0;else cc=dd=1; }
2 @; l0 y9 I2 f6 [& ^4 h else cc=dd=1;
* V7 {! n1 f4 m) j . } J. i2 K" s$ g7 K B f
}# ]% ~, I' q# Y( c
1 q8 y4 }" C. g h; R, x# D' I
! n/ N1 j9 o2 U% s; ^. c+ u7 u( J% X8 @" A* q
3 \! @7 E( O/ ~9 `" o
void T1_INT() interrupt 3//时间秒自动加一,走时//* ~8 o/ I2 o+ R- _ \+ q0 D
{
2 o# s5 O' Y: S: q6 F3 Q! T TH1=(65536-50000)/256;4 U! a9 S- |1 D4 B7 N
TL1=(65536-50000)%256;//延时50毫秒//: z! l, M8 k% W
if (s100==20)5 l( w' m2 Y+ B
{ 2 e# c0 w$ S: O+ I' G
s100=0;
}7 D- b+ q: _& q! M) n1 V0 I ?6 a1 ^ Increase_Second();
3 Y( j, s8 L2 o3 N }
# a1 C, U: }8 S! @% i8 y else s100++;
8 e5 a, N# l# b1 Y }/ ^" m" G- J& ?% W
void main ()
1 M7 {# c0 W9 }- a9 [5 G {8 t7 g8 [# s+ i
P2=P3=0xFF;
% I) A/ _9 q2 f# v, T- w TMOD=0x11;
9 a; {$ D5 g4 p! k TH0=(65536-1000)/256;
* N: K" f3 ^% l8 d: H6 ~8 t" h% R TL0=(65536-1000)%256;- _0 b9 g7 Z2 ?
TH1=0XDC;
! c5 _9 h- ~6 _# O S TL1=0;
& {8 U& g. b* d# V* q6 l TCON=0x01;4 L, v; \) d* ?
EA=1;
2 f/ X& a5 C- G3 c& A/ A9 u ET0=1;
4 r8 S8 J% W$ r" Z% g0 b8 X* y ET1=1;! J' v: d6 `% b9 t1 C+ g# E
h=05,m=55,s=s100,h1=1; //时间和闹钟初值//2 k0 h7 U. l5 ^/ R
DSY_BUFFER[0]=DSY_CODE[h/10]; //时间初值赋给时间段码显示组//( S/ @9 d2 W( o0 N# D
DSY_BUFFER[1]=DSY_CODE[h%10];& I) {: \% }& u8 \" ^2 F
DSY_BUFFER[3]=DSY_CODE[m/10];: S. d: A( X2 M. I
DSY_BUFFER[4]=DSY_CODE[m%10];
3 i( G2 \9 H. P. M- B DSY_BUFFER[6]=DSY_CODE[h1/10];
4 @ N: ?. R7 ]: W/ }$ \$ a4 M8 Q DSY_BUFFER[7]=DSY_CODE[h1%10];7 D D8 v$ M5 `. q+ z- ^! z
DSY_BUFFER1[0]=DSY_CODE[h1/10]; //闹钟初值赋给闹钟段码显示组//. Y E. K* G% s% Q
DSY_BUFFER1[1]=DSY_CODE[h1%10];: U9 s# e+ n7 k
Scan_BIT=0xFE; //给位选择赋初值为二进制数 11111110,即只有最后一位为低电平,之后每次左移一位,依次为11111101,11111011......01111111,11111110循环移动//2 J# c) O$ k f+ T9 l4 [9 @
DSY_IDX=0; //段码显示组的选择变量//
; }' E: n: S6 \# N" v. x8 c TR0=TR1=1;
* b5 \) n1 Q1 Q# | Key_State=0xFF;
; j, h8 x% R" |0 y while(1)
* `% B" k5 r( i/ D$ Q {
- T6 j/ ]7 M o: h9 G if (P1^Key_State) //判断按键是否有按下//
$ E6 }9 ^3 Q9 a$ z {2 J7 _7 t2 Y% l2 t
DelayMS(10);
0 U( o/ o& \9 K0 c* }+ w if (P1^Key_State)
; E% t! l% c4 k" E { / k: J# H# V) c. G
Key_State=P1; EA=0;
! K! F7 R& A- p. r( E- v if((Key_State&0x01)==0) Increase_Hour(); //小时加一//4 @3 a" |, f/ ~+ g
else if ((Key_State&0x02)==0) Decrease_Hour(); //小时减一//
: i- a2 s; i; Y8 |3 ^ Y$ s else if ((Key_State&0x04)==0) Increase_Minute(); //分钟加一//4 s4 K% p$ [% r1 V8 m4 w' s* ~
else if ((Key_State&0x08)==0) Decrease_Minute(); //分钟减一//
- p- j; r- l B9 d else if ((Key_State&0x10)==0) //复位按键//7 C0 a: T! c" i1 O/ t' X
{h=05,m=55,s=0,h1=1;, @* D* ` X' E5 r5 ^
DSY_BUFFER[0]=DSY_CODE[h/10];$ B- e& }: _/ G9 s' d6 ~* j" C
DSY_BUFFER[1]=DSY_CODE[h%10];
5 B' {; e* p2 v6 v DSY_BUFFER[3]=DSY_CODE[m/10];8 N" n' `0 w: f& W, z: d$ [. H/ V
DSY_BUFFER[4]=DSY_CODE[m%10];: h. t: k2 c! w' O
DSY_BUFFER[6]=DSY_CODE[h1/10];/ t" U& J+ j1 F2 _
DSY_BUFFER[7]=DSY_CODE[h1%10];4 s" u2 }4 B; D) H( K
~* P- J1 n/ _
+ Z2 Z, E4 C8 a) ?7 f _2 I4 F! e }2 s5 b, z$ V; o F% r
else if ((Key_State&0x20)==0)Increase_Hour1(); //模式加一//: r! {2 W' I9 O+ Q+ _
EA=1;
1 P6 d) f7 M0 H3 ^& R7 j0 I$ B! k( j }7 B4 P$ M* O$ N% }$ O
}
; z6 Z6 G9 a* [) _$ C }4 n9 t3 f( h2 A' b' Z
}
' y- Q1 Q& Q6 b% g6 c6 ^8 t8 K M" A$ k& h6 ~( C( r8 b$ C
下载:
5 v D7 C; B J1 j! s: K$ M- G0 p; {# T' i' M% x$ y4 U
! g6 l0 W( t8 H$ k9 f! D
|
|