Real-Time clock con AT89C4051

Un orologio/datario con visualizzazione su display LCD realizzato con un AT89C4051. In figura 1 è riportato lo schema elettrico. Lo switch SW3 permette di selezionare il parametro da modificare mentre con SW1 ed SW2 rispettivamente si decrementa o si incrementa il parametro selezionato. Il listato 4 riporta alcune delle funzioni per l’implementazione dell’orologio.

/*----------------------------------------------------
****** port and bit assignment for LCD *******
----------------------------------------------------*/
typedef unsigned char bit_8;
sbit rs=P3^5;                           // register select is port 3.5
sbit rw=P3^4;                           // read/write is port 3.4
sbit en=P3^3;                           // enable is port 3.3
sbit d7=P1^7;                           // busy flag is port 1.7
sbit sel_param=P3^2;               // select switch to select the clock parameter
sbit chg_param_inc=P3^1;           // change switch to change the clock parameter
sbit chg_param_dec=P3^0;
bit_8 code *days[]={"*Sun*","*Mon*","*Tue*","*Wed*","*Thu*","*Fri*","*Sat*"};   // days array
bit_8 code *val[]={"0","1","2","3","4","5","6","7","8","9","10","11","12"};          // digit
array
bit flag;
bit_8 month=1,date=1,hh,lmin,hmin,hsec,lsec,day=0,lyear=5,hyear=0,date_count;
/*-------------------------
*** Function Prototypes ***
-------------------------*/
void ini(void);
void command(bit_8);
void data_in(bit_8*);
void busy(void);
void sec1(void);
void month_select(bit_8);
void date_in(bit_8);
void set_clock();
void delay(void);
/*-----------------
*** some macros ***
-----------------*/
#define DISABLE_INT IE=0x0;
#define ENABLE_INT IE=0x81;
/*----------------------
*** one second delay ***
----------------------*/

void sec1()//can be fine tuned by changing the for loop values
{
         bit_8 i,j;
         TMOD=0x11;
         for(i=0;i<230;i++)
                 _nop_();
         for(i=0;i<7;i++)
         {
                TH1=0;
                TH0=1;
                TL1=0;
                TL0=0;
                TR1=1;
                for(j=0;j<119;j++)
                        _nop_();
                while(TF1!=1)
                {
                        for(j=0;j<255;j++);
                                _nop_();
                }
                TF1=0;
                TR0=1;
                TR1=0;
                while(TF0!=1)
                {
                        for(j=0;j<120;j++)
                                _nop_();
                }
                TF0=0;
                TR0=0;
          }
}
/*---------------------
*** selecting month ***
---------------------*/
void month_select(bit_8 mon)
{
         bit_8 year;
         switch(mon)
         {
               case 1:
                      date_count=31;
                      break;
               case 2:
                      year=hyear*10+lyear;
                      if(year%4==0)
                              date_count=29;
                      else
                              date_count=28;
                      break;
               case 3:
                      date_count=31;
                      break;
               case 4:
                      date_count=30;
                      break;
               case 5:
                      date_count=31;
                      break;
               case 6:
                      date_count=30;
                      break;
               case 7:
                      date_count=31;
                      break;
               case 8:
                      date_count=31;
                      break;
               case 9:
                      date_count=30;
                      break;
              case 10:
                      date_count=31;
                      break;
              case 11:
                      date_count=30;
                      break;
              case 12:
                      date_count=31;
                      break;
           }
}
Listato 4
▲ Figura 1

▲ Figura 1: schema elettrico

5 Comments

  1. Maurizio Maurizio 2 aprile 2016
    • f.amantea 4 aprile 2016
  2. Emanuele Principi 3 aprile 2016

Leave a Reply