반응형

[다시 쓰는 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.
}
반응형

+ Recent posts