|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数字闹钟仿真(自动值班打铃系统)* z' O% }/ p( k' M
5 K( \) U( n, Y2 y# e3 v: R5 C3 T( D4 D! o
( u( t8 X5 m8 p$ h9 |8 u( y" J2 N- l6 c3 Q0 V- a& @: h& I
& `0 C- g' M# L- N$ h. l+ ^. }
单片机源程序:
) G1 [* ^, ]) x#include <reg51.h>
( o( W I) p% `- r#include <intrins.h> 0 a$ ~! o+ q: s/ p' u# l0 o6 |
#define uchar unsigned char s' o) h& J1 P3 @ q- n) S- Q
#define uint unsigned int , M2 g/ G' d% v- V5 d( X' N; ^ d8 g
uchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极总段//, a0 s1 K: S( Y0 a( J/ ~ t" a5 R
uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xff,0,0};//时间显示时-分 模式
2 b* O. t7 V K) ]( [+ huchar DSY_BUFFER1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //模式显示段//8 }6 r, i6 J* K( \' e& U' c i4 b v
uchar Scan_BIT;//位选择//
; E1 m/ z( u) Y2 G' w( Z0 huchar DSY_IDX;//段选择//; R. r2 M& D# l
uchar Key_State; //按键控制//2 y2 `4 Q$ B* _, a/ o- j
uchar s,s100,h1 ; * o! c9 y! i% l( C& {
char h,m;8 E4 ]5 B7 U: Q1 H
sbit dd=P1^7; //喇叭和led输出端口//
$ R. v% T+ \& [ I# b- k! psbit cc=P1^6;. e9 V, x3 \( h4 h t. d- b: `
sbit ss=P1^5; //时间和秒转换显示键//
% l$ N9 L8 Y0 n8 Yvoid DelayMS(uchar x)
6 F2 N5 W: p3 w; z8 o: A{7 F( l& q. d, I, Z# |
uchar i;
0 V) Q2 N7 h% \0 m. D while(x--) for(i = 0;i<120;i++);
7 O* _- l4 l7 |# w6 c4 `) P; L }
! d$ ?5 j# s) h* Q( P) C+ y7 A1 bvoid Increase_Hour()
2 W7 o% z$ h8 ~* g7 m8 M0 K8 C {3 q* c7 ]+ F& V- r) e
if (++h>23) h=0;
* k: y0 E% {5 ~/ O DSY_BUFFER[0] =DSY_CODE[h/10];
# Q$ l9 V5 C0 A1 S DSY_BUFFER[1] =DSY_CODE[h%10];
0 X% s; B$ P& j! c5 y) \ }6 n' r3 P* d3 F6 p' W% o( p
void Decrease_Hour()
8 E" M7 @2 z0 {6 c' F { h--;; K' x: b) B& w6 S6 L6 ?# w
if (h<0) h=23;1 m! j( k' K$ t0 b, Z
DSY_BUFFER[0] =DSY_CODE[h/10];
" P% o F2 p$ [+ t* H DSY_BUFFER[1] =DSY_CODE[h%10];
6 q) r/ j; i7 H; g) [9 p }' z! ^+ W0 i" W: t4 T
. `$ v; N7 b3 L' y1 N b
: m% N6 z' u/ M& Q$ F1 tvoid Increase_Minute()
: C/ a1 `3 \! ^ {
) P; k& N+ Q) P) l2 D% g6 k( j1 M if(++m>59)& W9 Z' ?, z. r; b% W+ H
{
: V6 f3 x0 U; }& d5 c m=0;Increase_Hour();
5 [. R1 U! |/ |1 S$ d m' ? }
. X; I, {0 @+ f0 p, p DSY_BUFFER[3] =DSY_CODE[m/10];
7 k0 Y$ H5 F6 D0 W& i: }, j! g! Y DSY_BUFFER[4] =DSY_CODE[m%10];
( k5 Y7 [2 ]3 b9 I( @* R2 ? }) A( k3 w! Z W* X' I
void Decrease_Minute()" e6 N) Q6 o. H9 G* ~7 h# J; o
{ m--;4 U5 P N) x% V6 f: _1 {7 i
if(m<0) m=59;
- p, o6 d* ?; s: }$ [( [0 a, ~" n DSY_BUFFER[3] =DSY_CODE[m/10];
7 Q1 Z9 B% E$ A" { DSY_BUFFER[4] =DSY_CODE[m%10];
1 M1 t5 W- N/ ?! ~; f' a }
, k' V& p; ~# i/ V/ s! tvoid Increase_Hour1()
4 L6 H! f- ~' k' O {5 E# b& U2 F) E+ ^
if (++h1>7) h1=1;" E d0 e& W/ H. {8 k& L
DSY_BUFFER[6] =DSY_CODE[h1/10];
( W5 f+ t3 t# T9 K- X DSY_BUFFER[7] =DSY_CODE[h1%10];
- |, I* h; f) p, e }
# A3 a1 H7 b t: F- J% fvoid Increase_Second()
2 G* y1 G; u$ Q" O. b {
8 G' m7 E2 A1 g if(++s>59)
$ G$ M9 c3 d+ u& I; s4 m. m {4 {& }; [$ g* @ G
s=0;Increase_Minute();0 H# G5 s6 Q( }9 x g( H
}
6 r# v; P U4 u* \ L9 @ DSY_BUFFER1[0] =DSY_CODE[s/10];
1 Z6 {" h6 ]% Z0 n0 {6 { DSY_BUFFER1[1] =DSY_CODE[s%10];
, v- E1 d; H, C2 X* A! E6 U/ N2 _ }
9 K6 Z! Q- Q8 T0 [+ r$ E+ \ L void T0_INT() interrupt 1 //显示屏显示//
6 }& l( q/ {) G {
# n& g; h9 n2 q! Q TH0=(65536-1000)/256;
0 L: u4 Q: h. O7 F% I; ] TL0=(65536-1000)%256;. I) t; C$ l5 O& c5 [
if(ss==1) //P1.5键没按下,显示时间//
5 I' t: L$ B) O4 R. c2 a: @ } {
1 a" ] a- h2 `$ q P3=Scan_BIT;& h0 {$ s( d! Q6 C1 h& [
P2=~DSY_BUFFER[DSY_IDX];' Y- W ]4 c+ ?1 W! e2 N3 ]
}) s) \1 i+ V0 U5 z
else { //P1.5键按下,闪//
, ]/ `. Z# j0 y* B P3=Scan_BIT;
4 V! e+ @$ ?# l* T6 ?- b5 h) s P2=~DSY_BUFFER[DSY_IDX];$ T2 K+ _2 a+ p6 b; h( o/ [
}
0 `8 I. X2 j" d; o8 u: J Scan_BIT=_crol_(Scan_BIT,1);//位显示移动//3 |+ ]0 p% g/ p; J* [$ m; f0 @
DSY_IDX=(DSY_IDX+1)%8; //段选择每次变化//
$ z% z! K: v' |- }) u1 J# ^
: j5 `4 F2 s- b# W- _$ Z if(h1==3) e( n3 R9 A: \8 @ u
{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
' q; n x0 e% j( }' f1 n9 T if(h==6&m==15)cc=dd=0; else cc=dd=1;4 t' f+ F( Q7 b! T' M% ~9 k2 a
if(h==7&m==0)cc=dd=0; else cc=dd=1;
4 D1 x9 k" H/ K6 U5 k9 n6 Iif(h==12&m==30)cc=dd=0; else cc=dd=1;7 k/ B+ k3 \4 y- J
if(h==14&m==0)cc=dd=0; else cc=dd=1;
0 X3 ~9 R4 t; p7 j Qif(h==16&m==30)cc=dd=0; else cc=dd=1;
, r, y: l# |/ D" ]- ~. bif(h==18&m==0)cc=dd=0; else cc=dd=1;# P2 w% v8 X$ T/ R/ [" N
if(h==18&m==45)cc=dd=0; else cc=dd=1;
( ^/ d6 l8 S- _- L7 i0 [: Iif(h==19&m==30)cc=dd=0; else cc=dd=1;+ Y% K% O4 A( q' r: i* w$ A
if(h==21&m==30)cc=dd=0; else cc=dd=1;6 V' v6 y; B3 O- \. l& Y4 t/ r
if(h==22&m==0)cc=dd=0;else cc=dd=1; }4 j( a# D. h) d4 Y
else cc=dd=1;) N- _# b t2 t( s) S( A4 h
4 P, A8 ` A7 D& P! Z4 Y0 n9 \
7 p4 G* r) R$ I( j {9 g
if(h1==1|h1==4|h1==2|h1==5)
" Y5 w6 o* I$ R/ p8 C8 g6 ?) a{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//7 Z7 E( |& a5 j+ g/ F
if(h==7&m==0)cc=dd=0; else cc=dd=1;
; Q) g* K, [4 r3 gif(h==12&m==30)cc=dd=0; else cc=dd=1;
% k, J# W$ F! z' r4 vif(h==14&m==0)cc=dd=0; else cc=dd=1;. M% b" [. d$ a
if(h==16&m==30)cc=dd=0; else cc=dd=1;
+ @2 _) H8 ~/ y$ _! \if(h==18&m==0)cc=dd=0; else cc=dd=1;
" q# s7 l; D3 G: M. t; @if(h==18&m==45)cc=dd=0; else cc=dd=1;
- N E0 c# o' h! C& ]4 _, n1 L7 Vif(h==19&m==30)cc=dd=0; else cc=dd=1;# P6 e0 g+ d$ ?
if(h==21&m==30)cc=dd=0; else cc=dd=1;
) p0 x: m5 z/ w) I6 z1 ]. rif(h==22&m==0)cc=dd=0;else cc=dd=1; }
# X8 {% P0 q9 m |# F else cc=dd=1;
1 N# K: \: s0 A. }/ I! ?$ |- N: p: h: e! i
5 g D3 v+ E6 v9 z if(h1==6); J$ y6 Y5 @0 J! _
{ if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//# j4 ^: R. h& ]7 X
if(h==7&m==0)cc=dd=0; else cc=dd=1;
, m* ~$ N: {0 xif(h==12&m==30)cc=dd=0; else cc=dd=1;* ` ~9 `$ J8 `0 v/ J
if(h==14&m==30)cc=dd=0; else cc=dd=1;
( r6 {, u* L9 Y8 D& X: l Z; A2 D* dif(h==18&m==0)cc=dd=0; else cc=dd=1;
) |1 u6 f l5 `8 h2 i8 O! ]/ Bif(h==21&m==0)cc=dd=0; else cc=dd=1;/ A* k3 n6 l( \, x# {8 C: t
if(h==21&m==30)cc=dd=0; else cc=dd=1;
. e6 m D) t# Aif(h==22&m==30)cc=dd=0;else cc=dd=1; }
) Q5 p7 [. U. h, J# ~9 W else cc=dd=1;
9 V9 r C7 s2 C! k- B @& B8 y0 `
7 U! T7 L" L( b) E7 x8 e& b if(h1==7)
) ~0 b, S* L K: x; x* A3 f9 |/ e{ if(h==6&m==30)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
. R( F6 ^$ O4 E) O: {9 O if(h==7&m==0)cc=dd=0; else cc=dd=1;
3 g% C: v. G% V: Q* l/ B G2 X7 i% Tif(h==11&m==30)cc=dd=0; else cc=dd=1;
; d; m; l9 j* }. V8 b: d8 Nif(h==12&m==30)cc=dd=0; else cc=dd=1;- `8 f" ] p5 [7 ?5 E" w: y- \+ t
if(h==15&m==30)cc=dd=0; else cc=dd=1;& z2 b7 \% O7 \8 q* I, q5 h
if(h==16&m==30)cc=dd=0; else cc=dd=1;- [6 ?: m, o- E; l+ X
if(h==18&m==0)cc=dd=0; else cc=dd=1;) V5 c$ f& Y3 y- D- P# l6 @
if(h==18&m==40)cc=dd=0; else cc=dd=1;
# B+ p Z. w8 @! z2 Lif(h==20&m==0)cc=dd=0; else cc=dd=1;
3 ]7 O! B3 g0 v" D; gif(h==20&m==30)cc=dd=0; else cc=dd=1;5 V1 [: i5 C# K I3 [
if(h==21&m==30)cc=dd=0; else cc=dd=1;$ ~* D7 F; W# Y3 b4 i. d
if(h==22&m==0)cc=dd=0;else cc=dd=1; }
" `* S0 I3 a. C* d& ^4 B: p; w" b else cc=dd=1;1 k4 P$ e. d! Z" i
- a9 m$ k9 c8 `! t
}, g# b9 e6 f; O7 D, T! I3 M
7 ~& f5 Q$ ?: t- n+ E
, m- E/ b3 B1 L) \2 n% l+ f# j
6 A+ \7 ~; R; s4 \3 t
' T" j2 u& H" m$ O0 U void T1_INT() interrupt 3//时间秒自动加一,走时//9 g u! l0 f, `8 {
{- Z6 h) H! ?. D" a. B7 l2 ~' b4 n
TH1=(65536-50000)/256;
2 `: A( \- S% B2 K. j3 N8 O7 S4 [ TL1=(65536-50000)%256;//延时50毫秒//
7 ?5 z6 k' N! }- _: u# i3 _. | if (s100==20)
# a/ T) s' n' v$ u) R3 f' Y* ? { : n: q$ U9 q4 s5 f, k; F
s100=0;
9 K! f9 `3 F4 q) X) ~ Increase_Second();
. r. G- z5 E* \- `* a- h }
( [* w0 C6 S5 s9 A- ?7 } else s100++;
/ |# ?& `0 j" ^ }
) J7 ~0 ]8 k% I, N/ m; u, V' K) B void main ()
% }& ~, J( z4 H$ K) r' ~ {
8 v5 w1 f, c6 _5 U _' C! s8 m P2=P3=0xFF;. b% F0 g& ]8 a
TMOD=0x11;: p$ {$ w, @. k1 s% \
TH0=(65536-1000)/256;# }: T. J4 w, k
TL0=(65536-1000)%256;
, V/ }2 {" \" U$ m2 U TH1=0XDC;
4 A' B* o- P& c# s* a6 X TL1=0;
# |' a. I; v6 P/ g$ n% D0 m; y" x TCON=0x01;
7 g' F o. w# d4 [. L8 n EA=1;% U! z0 h8 a! Y4 }& O u
ET0=1;
7 q" ^0 N& `# O- s! ~5 f4 i$ _; | ET1=1;
/ S5 a' n, [( M7 c8 n3 W h=05,m=55,s=s100,h1=1; //时间和闹钟初值//+ r# T7 F5 ]$ Z4 s' {
DSY_BUFFER[0]=DSY_CODE[h/10]; //时间初值赋给时间段码显示组//
' p& T; l; Y( s" G3 b0 Q9 {2 Q2 O DSY_BUFFER[1]=DSY_CODE[h%10];
: \$ [5 ?3 q, z" _3 S$ f9 K DSY_BUFFER[3]=DSY_CODE[m/10];7 a7 }' e" Q" M- @- b& I
DSY_BUFFER[4]=DSY_CODE[m%10];
" O4 R2 T* V4 A# k DSY_BUFFER[6]=DSY_CODE[h1/10];( H8 p0 F+ l' Q/ L( ^: O I5 o
DSY_BUFFER[7]=DSY_CODE[h1%10];
( r: D/ I* ^* H9 B DSY_BUFFER1[0]=DSY_CODE[h1/10]; //闹钟初值赋给闹钟段码显示组//# d5 u4 L1 R$ C5 b" s# J4 D
DSY_BUFFER1[1]=DSY_CODE[h1%10];
, E/ e1 [, C Q/ }9 T Scan_BIT=0xFE; //给位选择赋初值为二进制数 11111110,即只有最后一位为低电平,之后每次左移一位,依次为11111101,11111011......01111111,11111110循环移动//2 f2 E7 ?$ k& h
DSY_IDX=0; //段码显示组的选择变量//
/ [. g, l" n! J9 }6 A TR0=TR1=1;
7 y' p" p4 c: C4 { Key_State=0xFF;
( W; E2 w6 i% f# B c! V. C6 `/ B while(1)
2 z& _: { W2 P8 n; L6 m {' C* b4 V% A# I7 D+ L/ _4 J
if (P1^Key_State) //判断按键是否有按下//
$ c5 }6 r2 \1 } {
% k! ~ t" {/ k9 q% Z DelayMS(10);
- D9 x1 C' d% n+ Z+ Y if (P1^Key_State)
0 n z8 A; J6 U4 l+ s {
; Z q( C/ r, J, C8 H6 x+ b; C/ Q Key_State=P1; EA=0;
8 v9 V3 P" K: V+ {. r$ C2 k if((Key_State&0x01)==0) Increase_Hour(); //小时加一//: M% }7 z/ D7 ^9 p+ ?4 P- E* i, R
else if ((Key_State&0x02)==0) Decrease_Hour(); //小时减一//5 [1 a5 a$ D7 y+ E
else if ((Key_State&0x04)==0) Increase_Minute(); //分钟加一//6 i$ p0 K- G. s" t
else if ((Key_State&0x08)==0) Decrease_Minute(); //分钟减一//: x9 v5 s) ], f2 {6 {
else if ((Key_State&0x10)==0) //复位按键//; z9 C( R4 F9 _, t
{h=05,m=55,s=0,h1=1;' R# o l( d1 \6 q
DSY_BUFFER[0]=DSY_CODE[h/10];
- {* w, s- V [5 _* `' Q DSY_BUFFER[1]=DSY_CODE[h%10];* \9 W z4 Y2 I3 S' l9 a6 ]5 L
DSY_BUFFER[3]=DSY_CODE[m/10];
* w2 Z( n+ V6 k/ p DSY_BUFFER[4]=DSY_CODE[m%10];
# p x, r" w- L; |$ n1 q DSY_BUFFER[6]=DSY_CODE[h1/10];
4 `! h! n+ _) \# s! q/ ^. p& O DSY_BUFFER[7]=DSY_CODE[h1%10];
/ u4 f4 S1 t$ t8 X: T" Z% d/ F4 a3 A% x4 O0 w3 h
l1 p5 R) q! g5 W: {( \3 x" {5 _; ]# v }8 i: r# V/ [# V/ y
else if ((Key_State&0x20)==0)Increase_Hour1(); //模式加一//
; l! h N8 l6 t4 Q5 E EA=1;
3 j1 \5 m# _2 |# s }
6 \. o0 `( E" E W: a6 g }
5 T/ }# o: P' m8 w9 L( {3 {/ o- U }8 w. z" j! t& P( `6 q* h
}
$ a; K0 M- f) ?- C; p, Z! q2 X2 U# V6 O8 X" f
下载:
5 R: R3 E$ @# A3 `& f
& I- d, a4 l7 A5 {
$ ^) ^! u: n1 u7 l! ?, e |
|