|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机多功能闹钟仿真加源程序
+ o/ Z h+ I5 ^4 p/ D6 V' w1 {6 C0 I, z
) O4 p' x0 d$ I t' D1 ^1.时分秒的正常显示7 z0 Z3 D1 D( y: J& P
2.可单独调整时钟的分十秒
. Y0 A% J' ]- t( J" Y& o: E3.闹钟功能4 [9 W' N, l! W- W! E2 l f
4,键功能说明 @4 V" d! m5 ]* h' o2 u
second--正常显示和闹钟状态时调整秒位# \9 K+ K. C9 h8 T* T8 ^7 h6 F
minute--正常显示和闹钟状态时调整分位
8 i7 `2 b$ ?& h( t& Z. f, D" |4 y$ \hour--正常显示和闹钟状态时调整分位! Q0 |9 D, |9 [* k# n& A
alARM--开启和关闭闹钟功能(变量alarm_is_ok,1为open,0为close)( y, a4 a* I- |2 u
stop-set-open-close: R8 `" L: R/ T
部分源码预览:5 L1 i( \' }3 _/ ]
#include "Key.h"
& [4 G5 j/ N5 b+ I#include "led.h"* N5 d: n4 F/ f& D3 o- U8 ]
uchar timeSetBuff[8]={'0','0',LED_MODE_COUNT,'0','0',LED_MODE_COUNT,'0','0'};//时钟数据缓冲区
5 _% E# z- u; }) R: u! D$ Xuchar alarmSetBuff[8]={'0','0',LED_MODE_ALARM,'0','0',LED_MODE_ALARM,'0','0'};//闹钟时间数据缓冲区
: {# t$ F9 T! l. H; |uchar timeDisMod=0x24; //00100100
+ \$ q+ v" P, q1 Quchar secondTemp,minuteTemp,hourTemp;) `1 X0 m8 X; R1 e* t: p' Y: l3 H" k: R7 q
uchar secondAlarm,minuteAlarm,hourAlarm; l1 L6 t$ @5 ]
uchar timer0Temp;5 e. `; A3 `& Z. J7 [
uchar alarmKeyCount; //闹钟起停键计数 0 n1 U9 J4 m4 b
bit alarm_is_ok; //闹钟起停状态 # H, d4 K9 ]7 W! V+ p
bit time_is_ok; //时间是否到
& E' ^3 O& }) h2 F1 P3 f2 xbit inteRFace_mod; // 显示界面模式,0为主时间界面,1为设置界面 ' k/ Y% b% W# a
/********************************************************************************************
" a/ ]9 r6 B/ Z* 函数名称:定时器0* C- f7 }* x" P6 O( y
* 功 能:定时器0初始化/ V1 Y' @6 `$ D* V+ }: y1 ?
* 入口参数:无
) q+ F$ Z7 ^# ]: C; B- i* 出口参数:无7 x' S' ]* D9 `5 S' [( ^9 q. t
*********************************************************************************************/ 6 J' U4 X3 |1 V% l
void initTimer0(void) //定时10ms
" E3 a* [' m& ^; o4 w) ~{
5 t: @/ ?, P$ l4 @ TMOD |= 0x01; //GATE=0,TR=1运行;C/T=1,counter,0,timer;01十六进制 ! |7 @ B( G! w3 G4 r2 q: e
TH0 = 0xdc;. \; F: j6 t( F+ ]$ \
TL0 = 0x00;
# D2 j0 d# |- e2 x% v# F- o; ~ TR0 = 1; //timer0 控制位,为1时启动timer0
8 t! e% u8 S0 x5 O% A8 v: a ET0 = 1; //timer0 中断使能 ( w% i# _. M; g, A K! d6 e/ T7 I0 P
}* \6 z; g! |! I
/********************************************************************************************
. V8 S$ ^3 U9 ]- `4 y* 函数名称:时钟比较
5 e, F& ]- e# U) H* 功 能:比较时钟和闹钟的时间缓冲区,只比较时和分 y7 T% S0 Z; q5 S& `4 a. U
* 入口参数:无
s+ Q6 I+ G4 v* 出口参数:无
9 B# M: J5 O% E* A*********************************************************************************************/
8 X: v3 L6 `/ l$ Qvoid timeCompare(void) 2 {8 z% H; S# l* j6 S, [4 a8 P' `, _
{
* C( Y# }4 i1 s0 z7 T if((minuteTemp == minuteAlarm) && (hourTemp == hourAlarm))
( R: r0 p! s* \. h$ b {' P0 {, g E5 }: ^+ a" c
time_is_ok = 1;
/ K: `/ X. Q8 h alarm_is_ok = 0;
/ K# p8 N6 @1 b% m( _ interface_mod = 1;
5 N% X2 i# q6 b' S' D5 X0 Y3 n+ I }
' X2 @! N% F; \# N}
- }3 y6 [+ Q0 C/********************************************************************************************
% R. b- C& p3 X" k/ V9 s; Y. @( V" H* 函数名称:主函数! Q9 B5 F: o3 r. u3 F# ?) U0 J ]3 \
* 功 能:调用并执行各个子函数, A# F7 I9 p. x, q2 c5 K1 P
* 入口参数:无
" Y; f( H6 F L' X, c' p* 出口参数:无% j; W+ `$ s) }& Q, }& y- ~% j1 a
*********************************************************************************************/
! L4 U: }" i/ z/ C+ f& e1 A0 D4 E3 dvoid main()
" \& h3 x) f& r( Q0 e{% T! J( k& G& I2 V6 D# e4 V
uchar keyRead;
6 G+ C& |! z% } init_led();
! W- V( |7 z" O3 j8 B9 W" f init_key();2 a7 M9 n, {7 J% f
initTimer0();' u) m. }- j5 F3 H- L
timer0Temp = 0x00; J" k% Q7 N1 i' ^
secondTemp = 0x00;
/ K0 @/ f/ C% m' ^, T8 G% _8 n minuteTemp = 0x00;, D; }$ h# }% e# g' M( c+ A, r F
hourTemp = 0x00;1 @+ D5 Q1 t& J. x
secondAlarm = 0x00;
8 r5 d9 b7 l" L/ D: N/ k; B6 r minuteAlarm = 0x00;
h* v7 m- g3 F hourAlarm = 0x00;
: B& q, }0 X7 o alarmKeyCount = 0x02;8 b8 O6 y. c" O' H5 I J& d# \
alarm_is_ok = 0; //默认状态停止 - K; `: q0 S) z* @8 ^! k/ r0 P$ `
time_is_ok = 0; //默认时间未到
: W2 ^, w2 t3 W interface_mod = 0;: ] b8 A) p% j. X
sei(); m# v+ O) J a# P7 M0 }
while(1)
* K( v$ Z+ `2 _ {
" ?" ~1 Z* y' |0 Z6 Z9 V5 Y
. Q& H. r. n7 A1 u4 ^; F if(interface_mod == 1)
. ?$ C1 l9 s, {5 m8 Y6 J; U ledSweepDisplay(alarmSetBuff,timeDisMod);
5 L: v: V) k0 d; n' Y( } else0 }, x0 O s; g/ ?( z0 M2 [/ t6 u
ledSweepDisplay(timeSetBuff,timeDisMod);
* v; b9 m% Y- u if(alarm_is_ok == 1)
# K9 ~( R% f5 O( `4 q timeCompare();
$ B6 \' J5 ~' Z8 N
5 J9 z8 K7 D7 l4 x0 ` keyRead = get_key_value();' c/ y" i6 H( L* d7 n
if(keyRead == KEY_ALARM), Q' P0 a0 m& J% Q* ]# r) O9 T
{
, e' L4 N8 x! q6 x; V8 | if(alarm_is_ok == 1 || time_is_ok == 1)0 A+ M8 K& L/ A6 g6 n
{+ E! Z% C- h# I) m, b) E
alarm_is_ok = 0;
1 v! p! m, f% a# R" z% h1 s5 ~( h( c time_is_ok = 0;2 ], |6 ~+ A9 ^' ?/ b( \
interface_mod = 0;
( S3 }/ r0 U2 V- _ alarmKeyCount = 0x00;
x8 ]5 e8 ~& M* R4 L }& D3 Q0 Z# q( q H- \7 u
else
% P! A9 J0 n8 H8 r {% u$ u- Y: N8 X0 h. g3 I* D
if(alarmKeyCount < 0x02)* e0 N% b- a0 t' R6 o* B# K
alarmKeyCount++;1 Y! b1 E( q, B: d* z3 F
else
3 p/ p" } Y; C# Q alarmKeyCount = 0x00;
+ J ^: B. Q- s7 x0 e# L) { if(alarmKeyCount == 0x01)
& }3 f+ o) m: W" p5 H- `* v. @# O interface_mod = 1;7 k) j' {$ l+ V+ c- E2 n
if(alarmKeyCount == 0x02)5 y+ Q: f1 o' ~
{
" D- G2 [7 F4 p$ V alarm_is_ok = 1;
' q" v" _9 \$ G; w0 E1 x5 N interface_mod = 0;
6 T6 m, j$ U. ^ }
/ ~) d. [% `5 t& c% B2 u } 6 Y, A. B2 |+ i1 p( c
}
6 O g; l8 T* J& t if(keyRead == KEY_SECOND)5 f$ d! m7 x# s8 a4 e
{ if(interface_mod == 1)
1 G i/ p8 ~' a S U- y {$ t* N: b& g- k. g
if(secondAlarm < 59)
: S8 d( c' ^/ n$ e( O1 } secondAlarm++;
5 }$ n) D6 l# h) r9 i. f% Y0 E else
# S: X/ U3 {; R" U. B secondAlarm = 0x00;, [8 P2 {+ f2 J2 C( ?
alarmSetBuff[S_L] = secondAlarm % 10 + '0';
& H: d* X$ g% p# C% n3 | alarmSetBuff[S_H] = secondAlarm / 10 + '0';
1 e' @+ W+ t1 q. ? }% n" O0 j0 L- E* x+ s- k2 [
else
0 G1 S. p3 `9 z, ~2 ?4 `2 ^" r {. \# {! g! A9 p5 v+ p
if(secondTemp < 59)4 K& c7 D: x5 o% a! o4 M+ B
secondTemp += 1;" j' A% F @# b
else
' M1 [- T3 y6 k V: H% D secondTemp = 0x00;
/ O/ a- ]# d% B* F( x timeSetBuff[S_L] = secondTemp % 10 + '0';1 R9 O S' Q" l1 n! \( G& U4 s# ]
timeSetBuff[S_H] = secondTemp / 10 + '0'; 6 z5 K! L5 X% K$ f
}
7 [. i" p2 r4 n }7 s5 `0 B# m6 Y7 Y( e- I% _
if(keyRead == KEY_MINUTE)
6 Y" j1 s% F: W X { if(interface_mod == 1)$ q- f; G* W8 X' X W+ j. q
{5 {$ H* {& d' ?8 C( J" u- A7 E
if(minuteAlarm < 59)
+ d, Q# K$ Y: |! o0 M! y minuteAlarm++;
* y. A: l5 X! a# m( S. l else- O% z0 M( g$ j' r. X
minuteAlarm=0x00;
! J, l" y' m' Z% W* l5 X, F alarmSetBuff[M_L]=minuteAlarm%10+'0';# i8 D1 ~% A! W" W6 F( R
alarmSetBuff[M_H]=minuteAlarm/10+'0';
/ P! N: H e1 u5 [$ h0 a }& ]$ N9 _, Q; w; r+ A8 ?8 w0 k0 H
else
" Z5 G. G& T( \8 r1 s0 f {
* B. R* D; {8 n3 k1 A% O if(minuteTemp < 59)
R# @2 t- h3 Z8 h7 \ minuteTemp += 1;
# @# _3 V: u: c+ Z+ i% q else
' B5 G4 B" x# {3 e minuteTemp = 0x00;
5 I* i& K" A( e& `' S timeSetBuff[M_L] = minuteTemp % 10 + '0';
- S) D; L. M" O" ]. b timeSetBuff[M_H] = minuteTemp / 10 + '0'; + K) Y, w/ |+ u% R" t/ t# i- W r
}. J1 D( H" h. k% K4 D
9 {: R" V$ \ P' c* X4 j/ d0 V }
, ~8 r5 m/ y+ m6 U ^' @( A if(keyRead == KEY_HOUR)
3 C8 C: B3 p. J( r% I: d" W; G {2 ^/ T' j1 U9 d2 o6 t
if(interface_mod == 1)- i8 h; C0 t& o
{
( e8 M# L- L( B" n if(hourAlarm < 23)0 y6 v9 M2 w0 W3 F3 r1 f9 a0 [
hourAlarm++;8 N8 d: P" \$ X
else3 @: A9 M& G I+ _, H& Z9 w) D2 J: l
hourAlarm = 0x00;2 I& d& \# W6 A R4 d- p
alarmSetBuff[H_L] = hourAlarm % 10 + '0';
" Z; b* g/ E" Q; q7 N+ |! X alarmSetBuff[H_H] = hourAlarm / 10 + '0';" M% @; Y5 H8 t7 n% q' U$ d
}# P9 U2 [& ?1 \2 \
else $ d; m1 C8 v+ C
{
8 \7 W. h; ]( Y5 S) F" q" N9 F if(hourTemp < 23)0 e8 [ P& E8 g5 i% }0 q& `% W; ~8 H5 B
hourTemp += 1;
* Y8 m$ C5 z; C' J* X8 ` else
0 x8 A0 O' c) s hourTemp = 0x00;5 c& d; t$ s- V$ j* U: {
timeSetBuff[H_L] = hourTemp%10+'0';
; n s: F) P% H K# c5 R timeSetBuff[H_H] = hourTemp/10+'0';
9 R. V& \& t% ^0 d0 j }
! G" s/ w! r, n5 | ' A* g# D' u( A- c$ Y7 s0 h. U
}5 N* K9 R; f. q7 g
" r1 E4 e/ I; { ]7 Y n
}7 k. V4 L% d& _& R; F
}
% a5 W$ E. y! a% { }4 z- N
1 G( U5 S% }# N+ F/*, */
5 h8 b$ p/ Q6 Y+ v: z/********************************************************************************************
* {7 \' v# g, G1 U" @# D* 函数名称:定时器0中断函数
8 u& |* ^) s6 H* 功 能:定时器0溢出中断入口处,定时10ms
( V( o8 J2 U: p$ `; s% A* 入口参数:无1 a8 }: h! j+ F) A9 W' L
* 出口参数:无. g% m% C$ Y, a& m: [7 x6 W
*********************************************************************************************/
4 k8 R% [0 Q$ O$ _void timer0_overflow(void) interrupt 1 9 w0 c7 M6 m( ~! P% r3 y2 c/ y
{
8 M# M* J7 w! p, p( Q9 I TH0 = 0xdc;0 T. B) Y+ L7 @ m: w
TL0 = 0x00;
6 @; Y1 Q( ~% z7 ` if(time_is_ok == 1) //报警 . { `/ l# {9 W+ h+ B
WARN_TRUMPET = ~WARN_TRUMPET;: z+ Z. G2 m; E! c
if(timer0Temp < 99) //判断1s是否到
) P0 M) p4 R2 q S# E2 _ timer0Temp++;
! a+ n9 j. y$ G else //进中断100次 . f& d+ ?( ^# b/ v: M
{% Z8 |; x1 C( o4 F
timer0Temp = 0x00;
$ s( X( {+ i9 v: S p$ x$ j if(secondTemp < 59) //判断1min是否到
8 {1 s' \* K' z* t {
& Z. ^0 \1 ~1 s! y1 u$ J secondTemp++;
8 \* { n/ _% [& B* L9 p9 [6 C) m. | } V, o4 c. e6 \: }0 L
else
0 M% v/ n5 P) _+ r {. M+ J4 V' ~& M. [
secondTemp = 0x00;& D) f8 h( E4 v' J" \& o% A) `
if(minuteTemp < 59) //判断1hour是否到 ! x, Q( I; Q3 m9 b% D0 J
minuteTemp++;
# \/ M/ y" |* @6 T" |( X; J else8 |/ ]; K& u( A0 h
{
: V$ }( }4 [' M/ a! c6 s minuteTemp = 0x00;# K D, l) ~+ w/ x4 j {
if(hourTemp < 23)
! G, V! P1 Z9 m+ K7 a* F hourTemp++;
; b4 `( c8 c" |/ Z2 Y else
6 I0 e# x' H Y& _7 C, f hourTemp = 0x00;
7 S$ l: ^6 R% I9 s7 m) R }6 o6 P8 {, Y: A: n! x
} * z" r# ~3 S8 i F2 W2 P
}$ S. U' `/ `% i7 |. _; t3 U
timeSetBuff[S_L] = secondTemp%10+'0';( D3 N( I* k4 Z# [- N
timeSetBuff[S_H] = secondTemp/10+'0';7 k0 r0 e6 L: H( U* M
timeSetBuff[M_L] = minuteTemp%10+'0';
1 [2 V: ^' m# T" j- ~6 P timeSetBuff[M_H] = minuteTemp/10+'0';* `) h# O4 @, |; |- u. A
timeSetBuff[H_L] = hourTemp%10+'0';' w& R# W& Z6 v( l4 i! W$ ?
timeSetBuff[H_H] = hourTemp/10+'0';
3 a; u( W; J2 o1 R$ F8 @' @ sei();. Q- W) [0 l1 [& {% i! ~
}
+ ]* ]1 V+ n2 g5 J+ N! K( v6 {8 u3 i" k, J* r: Y3 g
3 }- b7 ]: h% i' l
下载:% H) F+ e" ]' C5 A, @. ?
1 P% X& r. E3 Q: z/ K: Q
+ y+ f+ P' `& w: K5 t |
|