반응형
[다시 쓰는 8051 따라하기] 디지탈 시계 소스 - 개략적으로만 ...
+------------------------------------------------------+
게시장소 : 개인블로그와 다음카페 로봇자작천국
작 성 자 : Timy(me^^;)
작 성 일 : 2004.11.3
문 의 : 다음카페 http://cafe.daum.net/tinyrobo 혹은
개인블로그 http://electoy.cafe24.com/blog
+------------------------------------------------------+
[시작]
## 디지탈 시계 소스 - 개략적으로만 ...
우선 간단하게 디지탈 시계를 LED 로 보는 것이 아니라, 연결되어 있는 시리얼포트를 통해 이야기창에서 시간이 변하는 것을 살피는 것만 보았다. 시간과 분, 요일도 표시된다. 간단하게 요일은 1부터 7까지로 표시하고, 시간은 24시간, 분은 60분, 초도 60초로 하였다. 여기에 약간만 추가하면 누구나 어렵지 않게 LCD 창에서 뜨는 혹은 8 Segment LED 를 사용한 디지탈시계제작이 가능하리라고 본다. 소스는 급하게 만드느라 보기에 지저분하긴 하지만 워낙 짧은 것이라 별로 해석이 어려움은 없을 것이다.
/*====================================================================
;
; =====================================================
;
;
;
;
;=====================================================================*/
#include "at89x52.h"
#define LF 0x0a
#define CR 0x0d
typedef unsigned char u08;
typedef char s08;
u08 count = 0 ;
void w_rs232(u08 c);
u08 r_rs232(void);
void serial9600init(void);
void init_T0 (void);
void T0_int (void) interrupt 1 using 1 // Using RegisterBank1 (can use 0 to 3)
{ // Never Complicated in ISR space.
count ++ ;
}
void main(void){
s08 k;
u08 i, j, sec, min, hr, wday;
serial9600init();
init_T0 () ; // initialize timer
i=j=sec=min=hr=0;
w_rs232('\n');
w_rs232('T');
w_rs232('i');
w_rs232('m');
w_rs232('e');
w_rs232('r');
w_rs232('\n');
w_rs232('1');
w_rs232('2');
w_rs232('\n');
while(1) {
if (count >= 100) { j++; i++; count = count - 100;
if (i >= 100) { sec += 1; i=i-100;}
if (sec >= 60) { min += 1; sec = sec-60;}
if (min >= 60) { hr += 1; min = min-60;}
if (hr >= 24) { wday += 1; hr = hr - 24;}
if (wday >= 7) { wday = wday-7;}
if (i%2==0) {
w_rs232('1'+wday);
w_rs232(':');
k = hr%10;
w_rs232('0'+hr/10); w_rs232('0'+k);
w_rs232(':');
k = min%10;
w_rs232('0'+min/10); w_rs232('0'+k);
w_rs232(':');
k = sec%10;
w_rs232('0'+sec/10); w_rs232('0'+k);
w_rs232(CR);
// w_rs232(LF);
}
}
}
}
void w_rs232(u08 c)
{
while (!TI); // TI 가 1이 될때까지 기다림
SBUF = c;
TI =0;
}
u08 r_rs232(void)
{
u08 c;
while(!RI); // 수신 버퍼
c = SBUF;
RI=0;
return c;
}
void serial9600init(void) //initialie serial and timer
{
ET1 = 0;
TMOD = 0x25;
SCON = 0x52;
PCON = 0x80;
TH1 = 243;
TR1 = 1;
}
void init_T0 (void) // 24MHz X-TAL
{
IE = 0x9A; // Interrrupt Enable : Serial, Timer0, Timer1
IP = 0x02; // priority Timer0;
TMOD = 0x22; // timer mode initialize. T0 & T1 8bit Timer Set
TH0 = 56; // 100us timer set
TH1 = 243; // TIMER1 FOR SERIAL COMMUNICATION
IE = 0x9A; // enable interrupt
ET0 = 1; // interrupt overflow
ET1 = 1;
TR0 = 1; // start counting the timer0
TR1 = 1; // Later I want to use this with Serial Communication.
}
반응형