|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机多功能闹钟仿真加源程序
* e8 ~+ c7 z' }: r5 J( K/ `
: `# Z2 K( S3 z s0 \* g6 W8 c% A+ d- S$ Y7 v* T, o% Y
1.时分秒的正常显示# P0 D* V; R0 ]& L8 U' r1 B
2.可单独调整时钟的分十秒& V) p- s( G8 G+ f7 |$ f
3.闹钟功能
' g" b+ U# t) Z3 T4,键功能说明4 k9 v/ d, t/ Q% B2 k4 W
second--正常显示和闹钟状态时调整秒位; R. f. s: x" M0 q0 @& N# ]
minute--正常显示和闹钟状态时调整分位$ T# w5 k4 d; ]2 ]; T$ u
hour--正常显示和闹钟状态时调整分位! m4 P. [# Q4 X# c6 L9 N$ J# k
alARM--开启和关闭闹钟功能(变量alarm_is_ok,1为open,0为close)' F1 D* A3 o3 u+ a, ^
stop-set-open-close
5 X; A2 D4 r. g7 R8 i5 G部分源码预览:
; A* K5 D- J8 V4 V' `" _* u; k#include "Key.h"
5 y; [# h( R6 E6 h D#include "led.h"7 H' t" V- a7 J1 W- X8 c5 \
uchar timeSetBuff[8]={'0','0',LED_MODE_COUNT,'0','0',LED_MODE_COUNT,'0','0'};//时钟数据缓冲区
# o7 i$ S& G6 [- f; h+ _5 Puchar alarmSetBuff[8]={'0','0',LED_MODE_ALARM,'0','0',LED_MODE_ALARM,'0','0'};//闹钟时间数据缓冲区
; H! f# W6 y/ `8 i$ y, e7 x5 vuchar timeDisMod=0x24; //001001000 ^( H& m8 m; [! @1 L: Y
uchar secondTemp,minuteTemp,hourTemp;
. v1 b( U7 x# c5 \; P/ Quchar secondAlarm,minuteAlarm,hourAlarm;7 y4 L7 P& @6 ?0 I0 \
uchar timer0Temp;, F0 z% j# F3 z$ @
uchar alarmKeyCount; //闹钟起停键计数
0 `' L0 @; Q2 obit alarm_is_ok; //闹钟起停状态 $ ?! D* m0 _/ ]- a( @
bit time_is_ok; //时间是否到
" ?1 i# `. z4 q$ E" [! ?* qbit inteRFace_mod; // 显示界面模式,0为主时间界面,1为设置界面
, N$ _; [" G$ t3 u3 i1 z/********************************************************************************************
* y& J7 v2 E( ^! A8 r$ X* 函数名称:定时器05 j9 B0 u9 T S* J/ P& f' D! x3 c
* 功 能:定时器0初始化
0 r2 W; j4 ], z4 O* g% s) W* 入口参数:无
: Q l y8 l& L4 k7 k6 C2 d2 K* 出口参数:无5 {* ]9 Q) T+ ?
*********************************************************************************************/ $ `$ c; g0 M; U/ C# I
void initTimer0(void) //定时10ms
! O7 Z/ P4 `6 m& I4 O{+ h ?2 z% D) R
TMOD |= 0x01; //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制 , [# D+ ^1 R- s6 I
TH0 = 0xdc;
; A( N/ \# Q" g TL0 = 0x00;
4 R- j4 n! g* j; Q2 w& n TR0 = 1; //timer0 控制位,为1时启动timer0$ C) C% n7 u: B' _4 C* z
ET0 = 1; //timer0 中断使能 $ ?) @# e. d4 E' H" V
}1 U& L& F0 N3 U- |4 ]5 }
/********************************************************************************************
7 L% ^4 O. D- n Q" @4 |0 ^/ w5 [: x* 函数名称:时钟比较
$ L9 W% ]0 }5 @* 功 能:比较时钟和闹钟的时间缓冲区,只比较时和分! K. E$ E3 I8 I/ p9 W. ^
* 入口参数:无
! [3 M' ^. ?% H* L8 |$ T# P* 出口参数:无$ t% x+ j" a5 x) |" U3 E/ @
*********************************************************************************************/4 p, G" F6 V* n. U. [. b
void timeCompare(void) $ w. {2 D( A. z
{1 I$ W7 |9 z _
if((minuteTemp == minuteAlarm) && (hourTemp == hourAlarm))" x! s* o5 g8 c" i3 r! F2 S
{6 \7 }6 j1 h) i8 x
time_is_ok = 1;$ Y/ V. Q9 i' ^& F- ]0 c
alarm_is_ok = 0;
: B% N% l' B4 X$ w- M$ I* ~ interface_mod = 1;
K; [! R. E, ~, ` e ~ }
7 k- N1 V$ ]" r$ K- F0 ?6 P7 L}
8 F0 u: \, k3 _7 \. i* _$ I/********************************************************************************************, A! D7 `; ]9 b5 O2 y& H& p' y
* 函数名称:主函数9 g; |7 b1 d5 G" R5 r
* 功 能:调用并执行各个子函数
! h% x$ H. _( J& O* 入口参数:无
4 G4 b) \, h ^' E' ^* 出口参数:无
+ d1 s) k) e# D*********************************************************************************************/
3 T' a! C, ~2 kvoid main()
- V2 G8 {. _8 B: [' t+ J; j7 w{
b% j/ j: d. x5 S! C& M" ]% u2 I uchar keyRead;
8 `) e' a% L& a0 x: o& t$ s init_led();
* `3 v8 F1 o, E+ c" L init_key();4 r( d8 a' k" t V4 r
initTimer0();
8 j" X1 j9 Y7 s" t* | timer0Temp = 0x00;$ O, T2 r% @0 N9 m, O
secondTemp = 0x00;) o- {+ m; `( H6 B8 i! C ?
minuteTemp = 0x00;
# _5 N5 M O6 x! p hourTemp = 0x00;
, @% M1 J- m* j9 T, Y secondAlarm = 0x00;& F$ _0 k' R `2 |+ i
minuteAlarm = 0x00;
% G- W8 c. J/ }, a& @1 ?! q( v hourAlarm = 0x00;
- H! ^4 B: E8 P3 Q alarmKeyCount = 0x02;2 `5 f; O' L5 w. ]7 O% K" W) u
alarm_is_ok = 0; //默认状态停止 ( Q" o) x5 j" }/ f4 M
time_is_ok = 0; //默认时间未到 , |3 Y4 n" ]; ^
interface_mod = 0;4 `( U! [; k- j0 |
sei();8 z6 i7 c0 J. b+ R& f1 h
while(1)
! Z5 J; u- ^0 Q. G8 o) R {
/ q5 d( x- f N 8 i) _% I, s; _0 G* S2 m S1 O
if(interface_mod == 1)
- k& b$ h5 a8 z. H ledSweepDisplay(alarmSetBuff,timeDisMod);
& N/ O/ ^& P$ d4 a$ O5 t else
* a/ `5 Q r; i8 z ledSweepDisplay(timeSetBuff,timeDisMod);
! U& O* J+ x9 T0 S' X" ?* G' h5 l a4 g if(alarm_is_ok == 1)" M$ B; o/ [3 ?5 d% x0 o
timeCompare();
5 H, x# o/ C( W3 O5 N* S: e
! E3 W$ |5 f: p9 {9 U' F keyRead = get_key_value();
) \; S$ ^8 L; E" L* x! ]3 K$ f if(keyRead == KEY_ALARM)1 q/ K- R9 S4 _, ?) Q- E4 q/ [
{
{8 @0 Y% @+ h7 q* g, I V. u if(alarm_is_ok == 1 || time_is_ok == 1)
9 }; L D! ^) ?4 M {6 P) m, K% I% A6 D( g- U$ Y+ P! x& ?
alarm_is_ok = 0;
3 H, D7 W' A5 c time_is_ok = 0; ]* q% u; d6 s, J; B4 w8 x
interface_mod = 0;
# P9 t, V: @6 N1 V3 @. {+ Z* X alarmKeyCount = 0x00;7 K1 \5 I Y5 j& r4 r& ~1 t2 X3 {
}5 @3 z. B: ?$ R& |/ p; W
else% z6 j2 v( r" O7 X
{* ]% V9 [- B* y5 y9 r3 w# d
if(alarmKeyCount < 0x02)
/ K+ Y: Q& @/ N& ^* _ alarmKeyCount++;+ R7 G6 B' @* y. n9 O
else, J) r. C$ H3 I5 y
alarmKeyCount = 0x00;& D, Y5 ?+ k1 v/ ~0 y
if(alarmKeyCount == 0x01)& I4 m9 U3 W' F% R+ R
interface_mod = 1;) ?: ?! w( V X$ f C1 F
if(alarmKeyCount == 0x02)
: P7 f+ G; K0 {2 S; k& p; Z. k8 b {0 R9 J# x5 a H) f( p2 e8 o7 [
alarm_is_ok = 1;
9 \. s8 R3 ^; q3 _1 S interface_mod = 0;
6 P* q% A. y9 ~- v( a4 y$ Y }
: E# l; t+ O& c9 Z5 G9 x' V } ) _' ]# c7 e4 _ L( @5 t1 A6 t
}
4 E) }* U1 G& n, u if(keyRead == KEY_SECOND)
; J+ C9 s* Q5 l: y/ x$ s" |: Q { if(interface_mod == 1) e; X. x* i# l8 T, m1 P
{' x W: l/ L# i9 F$ v; ^4 ]. ~
if(secondAlarm < 59)# B* @# j3 E m: H
secondAlarm++;9 q0 ~; D3 Z! y; y/ Z
else
5 }' n- w7 K- m/ @+ L1 C secondAlarm = 0x00;9 i* X! ~4 H: B$ b, ?% p
alarmSetBuff[S_L] = secondAlarm % 10 + '0';
0 s5 j- `9 j6 [; W3 | alarmSetBuff[S_H] = secondAlarm / 10 + '0';5 w* @) q$ R! J0 e
}
1 d# r' A/ r" w6 w6 I else * `8 n: k1 j9 {
{
) ^% C- S, L, |& R3 E5 A( i if(secondTemp < 59)& N. E! H2 ?7 \+ Q9 b* i5 n
secondTemp += 1;
4 Y9 e/ {0 j L; t& i! j8 J else
) W; q( g4 @8 k8 q4 L secondTemp = 0x00;. z. F/ g) c1 a
timeSetBuff[S_L] = secondTemp % 10 + '0';1 l) Z9 ?" q8 c, U7 X
timeSetBuff[S_H] = secondTemp / 10 + '0'; 2 n4 z" u* ^) { ` \4 j q0 c
} ( d" {# P0 S J
}
9 e- F1 [6 n( I, o if(keyRead == KEY_MINUTE)
9 b/ {. a1 x6 n+ J ` { if(interface_mod == 1)
. V( S, p, V! G& t$ M3 ]" k$ o {/ i, ~2 H6 m2 d1 N, T; m/ H3 J
if(minuteAlarm < 59)- T7 R8 R/ X+ g! w! [5 f# m
minuteAlarm++;
# [& l6 {: b9 ~7 S. x- { else1 p, M. [+ @( O6 a7 @
minuteAlarm=0x00;1 b) }' u5 {/ H: X' J9 G
alarmSetBuff[M_L]=minuteAlarm%10+'0';
$ c2 O; Z5 a! O; k5 J9 \+ E1 T alarmSetBuff[M_H]=minuteAlarm/10+'0';
% e4 t. w7 \! O' } }
! {. x( E2 t& N else 0 Y+ l; o; C, T6 j; I. Z
{% z3 q! m1 S* p- V6 b( ~
if(minuteTemp < 59)
% D6 ^' d4 k1 s7 k4 m6 b minuteTemp += 1;
$ `' _- v5 e( h else
/ ^, \! d2 R) P4 Z; W minuteTemp = 0x00;6 s. N: d2 A, X1 O
timeSetBuff[M_L] = minuteTemp % 10 + '0';
K: N4 {7 ]$ I: J p timeSetBuff[M_H] = minuteTemp / 10 + '0'; 5 S: d& q# R. i
}7 ?) t, T5 W# c- }; x2 {
5 O/ }7 d5 Q! h6 M9 h# \
}# x! J6 g+ e5 d& X
if(keyRead == KEY_HOUR)4 a$ |0 N+ G; ^% ?
{/ c& L3 e- K0 s- o$ X
if(interface_mod == 1)
7 O# r0 a9 F9 m! h& N- R {; l0 h ~% s5 L- w$ Y# ^& b# R0 `
if(hourAlarm < 23)
' H" ~4 P- ~ W. F) A- G8 l1 x hourAlarm++;( k$ t1 r+ Y4 M/ y0 v4 p
else
) t8 l( x. l- O hourAlarm = 0x00;
( o6 q8 S6 j2 I: m* }& G alarmSetBuff[H_L] = hourAlarm % 10 + '0';
- s/ n5 f5 P' H& c+ Q+ l alarmSetBuff[H_H] = hourAlarm / 10 + '0';3 ^+ }8 e2 Z, o+ Y# s1 g, `
}
. @9 S5 A' g$ E else : s+ x# G2 `6 K1 o' A1 q
{
; ^8 M' a- Y1 b! Q$ E6 x if(hourTemp < 23)! S' V. h( O; L' K1 `9 z- x. ~
hourTemp += 1;0 w) r6 o' U8 W7 w/ [5 I9 J
else
# _" z! U0 B: R' \) `: G) t hourTemp = 0x00;
! I' w p4 R2 v; I l4 g timeSetBuff[H_L] = hourTemp%10+'0';
8 w& a% ?" H. O9 Y7 c! s" i timeSetBuff[H_H] = hourTemp/10+'0'; - U( K& A+ R4 z* |* D5 ~
}
5 l$ Q* B% w# c- h
' ]& Y4 M# S9 h4 }0 ~ }2 N+ C! B- r7 Y) r1 }( N+ B# f9 k4 G
6 O0 `/ |' B$ `5 v2 @/ d }6 D4 `0 M m% V1 S0 ?
}
$ }9 u, i9 m# w% a. D2 e, s+ E7 {% V5 O9 a& Q
/*, */
/ e, Z0 f$ r ?/********************************************************************************************5 w0 |3 C% i/ V- ], n
* 函数名称:定时器0中断函数4 g3 H7 x j- T, r; @. {. N1 ^8 W R
* 功 能:定时器0溢出中断入口处,定时10ms- A- j9 d' a5 e1 z5 ]# ^% V
* 入口参数:无
/ i2 f" d% N6 w: q& H1 i* 出口参数:无! U# b0 ^: R: Q( |6 Y4 ]
*********************************************************************************************/+ p- a+ ^2 ^+ W5 N
void timer0_overflow(void) interrupt 1
% E3 J) t6 r9 g+ b5 u{
7 K) i* e" s+ }( H6 V4 h( r TH0 = 0xdc;; j: S/ D) O- a) a
TL0 = 0x00;3 n7 l5 l, L1 M) l2 M
if(time_is_ok == 1) //报警
' ^( g, y& J( u- ? WARN_TRUMPET = ~WARN_TRUMPET;
& z; l5 u/ V% `" ]+ h' W5 H% D if(timer0Temp < 99) //判断1s是否到 * o# g0 H& u( p# }9 ?
timer0Temp++;1 ?+ b7 |3 N+ o" a" j
else //进中断100次 ! h8 s+ {2 u2 u. L b9 A2 v4 u" @
{
- T% [3 q+ I" F7 p9 j timer0Temp = 0x00;
. Y8 ^/ M) P/ h8 F4 j" m4 } if(secondTemp < 59) //判断1min是否到 9 _/ s/ e' i a3 F( G
{, G6 j; q4 x+ \
secondTemp++;+ f& q$ Y( A0 @: o0 n" v; y k
}1 V9 d, t8 L3 T8 q) L6 L) C
else# l2 n- h3 G; K! I8 E$ W
{# l" k/ h1 j: A% y d4 Q
secondTemp = 0x00;. ?9 \8 p C) K
if(minuteTemp < 59) //判断1hour是否到
% m* j4 s5 m( @$ [ v. j. W minuteTemp++;0 B0 r! U3 _$ i9 h3 _6 a
else
0 P8 v Z: z6 K" \8 z! @ {/ O8 P9 a T6 s4 @7 a
minuteTemp = 0x00;
2 i1 S3 ]( ?5 R) D' H7 @ if(hourTemp < 23) z2 s6 W/ C7 |) W1 p$ T! w+ x
hourTemp++;8 f8 ^7 F2 }2 [3 Q1 x5 d9 `
else3 i& Y7 W, d' \/ K$ X
hourTemp = 0x00; $ ]% O0 _2 k( x# x. i% V5 l) e
}
0 H6 o1 z7 H d1 o, t }
7 |- `5 k1 A1 B& r" \9 m) y9 V }
) I9 A/ l5 k6 i0 x! W timeSetBuff[S_L] = secondTemp%10+'0';$ l, E8 G: n! A0 @
timeSetBuff[S_H] = secondTemp/10+'0';
( ]# O$ q9 ~. o) q2 T# {1 r timeSetBuff[M_L] = minuteTemp%10+'0';$ }0 B5 v( b3 f( O
timeSetBuff[M_H] = minuteTemp/10+'0';
2 U; ^' x% I/ |& m: w timeSetBuff[H_L] = hourTemp%10+'0'; q8 j. F+ R* B. W5 U! C
timeSetBuff[H_H] = hourTemp/10+'0';2 ]$ Y& s3 } d$ @. r
sei();
# w1 n+ G0 H8 a# |: l}
X; z$ W, k- Y8 f2 ^& ^ I' v+ m) Q3 E" Y9 M" S! a2 _
: W& f+ r4 z+ v& Z; I$ i+ h
下载:
! p" o/ p5 F2 r* u" Y% R( F. f+ u$ ~& d" E, s. e
1 m/ i5 K, M5 U1 w" V& J+ A |
|