Program for Digital Clock Using RTC DS12C887

14
//Program for Digital Clock using RTC DS12C887 & 8051 microcontroller (AT89C51) with alarm set function /*24 hr clock set p3^3=0,then start=0 them set time by dig_hr1 & dig_min1, then remove p3^3 & start*/ #include<reg51.h> #include<absacc.h> #define dataport P2// Dataport for LCD #define port P1 #define alarm P3 sbit reset = port^0; sbit rs = port^1; sbit rw = port^2; sbit e = port^3; sbit dig_hr1=port^4; sbit dig_min1=port^5; sbit digalarm_hr1=alarm^4; sbit digalarm_min1=alarm^5; sbit alarmport=alarm^0; sbit start=port^6; int min1=0,hr1=0,alarmmin1=0,alarmhr1=0; int min0=60,hr0=25; unsigned char sec0=60,min00,hr00,hr,min,sec,alarmmin,alarmhr; void delay(unsigned int msec ) { int i ,j ; for(i=0;i<msec;i++) for(j=0; j<1275; j++); } unsigned char num(int d) { switch(d) { case 0:{ return 0x00;

Transcript of Program for Digital Clock Using RTC DS12C887

Page 1: Program for Digital Clock Using RTC DS12C887

//Program for Digital Clock using RTC DS12C887 & 8051 microcontroller (AT89C51) with alarm set function/*24 hr clockset p3^3=0,then start=0 them set time by dig_hr1 & dig_min1, then remove p3^3 & start */#include<reg51.h>#include<absacc.h>#define dataport P2// Dataport for LCD#define port P1#define alarm P3

sbit reset = port^0;sbit rs = port^1;sbit rw = port^2;sbit e = port^3;sbit dig_hr1=port^4;sbit dig_min1=port^5;sbit digalarm_hr1=alarm^4;sbit digalarm_min1=alarm^5;sbit alarmport=alarm^0;sbit start=port^6;

int min1=0,hr1=0,alarmmin1=0,alarmhr1=0;int min0=60,hr0=25;unsigned char sec0=60,min00,hr00,hr,min,sec,alarmmin,alarmhr;

void delay(unsigned int msec ){

int i ,j ;for(i=0;i<msec;i++)for(j=0; j<1275; j++);

}

unsigned char num(int d){

switch(d){

case 0:{return 0x00;break;}

case 1:{return 0x01;break;}

case 2:{

Page 2: Program for Digital Clock Using RTC DS12C887

return 0x02;break;}

case 3:{return 0x03;break;}

case 4:{return 0x04;break;}

case 5:{return 0x05;break;}

case 6:{return 0x06;break;}

case 7:{return 0x07;break;}

case 8:{return 0x08;break;}

case 9:{return 0x09;break;}

case 10:{return 0x10;break;}

case 11:{return 0x11;break;}

case 12:{return 0x12;break;}

case 13:{return 0x13;break;

Page 3: Program for Digital Clock Using RTC DS12C887

}case 14:{

return 0x14;break;}

case 15:{return 0x15;break;}

case 16:{return 0x16;break;}

case 17:{return 0x17;break;}

case 18:{return 0x18;break;}

case 19:{return 0x19;break;}

case 20:{return 0x20;break;}

case 21:{return 0x21;break;}

case 22:{return 0x22;break;}

case 23:{return 0x23;break;}

case 24:{return 0x24;break;}

case 25:{

Page 4: Program for Digital Clock Using RTC DS12C887

return 0x25;break;}

case 26:{return 0x26;break;}

case 27:{return 0x27;break;}

case 28:{return 0x28;break;}

case 29:{return 0x29;break;}

case 30:{return 0x30;break;}

case 31:{return 0x31;break;}

case 32:{return 0x32;break;}

case 33:{return 0x33;break;}

case 34:{return 0x34;break;}

case 35:{return 0x35;break;}

case 36:{return 0x36;break;

Page 5: Program for Digital Clock Using RTC DS12C887

}case 37:{

return 0x37;break;}

case 38:{return 0x38;break;}

case 39:{return 0x39;break;}

case 40:{return 0x40;break;}

case 41:{return 0x41;break;}

case 42:{return 0x42;break;}

case 43:{return 0x43;break;}

case 44:{return 0x44;break;}

case 45:{return 0x45;break;}

case 46:{return 0x46;break;}

case 47:{return 0x47;break;}

case 48:{

Page 6: Program for Digital Clock Using RTC DS12C887

return 0x48;break;}

case 49:{return 0x49;break;}

case 50:{return 0x50;break;}

case 51:{return 0x51;break;}

case 52:{return 0x52;break;}

case 53:{return 0x53;break;}

case 54:{return 0x54;break;}

case 55:{return 0x55;break;}

case 56:{return 0x56;break;}

case 57:{return 0x57;break;}

case 58:{return 0x58;break;}

case 59:{return 0x59;break;

Page 7: Program for Digital Clock Using RTC DS12C887

}}

}

void lcd_cmd(unsigned char item){

dataport = item;rs= 0;rw=0;e=1;delay(1);e=0;return;

}

// DATA SENDING FUNCTIONvoid lcd_data(unsigned char item){

dataport = item;rs= 1;rw=0;e=1;delay(1);e=0;return;

}

void lcd_data_string(unsigned char *str){

int i=0;while(str[i]!='\0'){

lcd_data(str[i]);i++;delay(1);

}return;

}

void lcd_data_int(int time_val){

int int_amt;int_amt=time_val/10;lcd_data(int_amt+48);int_amt=time_val%10; lcd_data(int_amt+48);

Page 8: Program for Digital Clock Using RTC DS12C887

}

void lcd() // Function to initialize LCD{

lcd_cmd(0x38); delay(5);lcd_cmd(0x0C); delay(5);lcd_cmd(0x80);delay(5);

}

void set_rtc_time( int q) {

XBYTE[10]=0x20;XBYTE[11]=0x82;XBYTE[0]=0x00;if(q==1){

XBYTE[2]=min;XBYTE[4]=hr;

}XBYTE[7]=0x01;XBYTE[8]=0x01;XBYTE[9]=0x10;XBYTE[1]=0xff;if(q==2){

XBYTE[3]=alarmmin;XBYTE[5]=alarmhr;

}XBYTE[11]=0x22;

}

//function to set hoursvoid set_hr1(char a,int b){

if(b==1){

hr1++;if(hr1>23)hr1=0;lcd_cmd(a);lcd_data_int(hr1);lcd_data(':');

}

Page 9: Program for Digital Clock Using RTC DS12C887

else{

alarmhr1++;if(alarmhr1>23)alarmhr1=0;lcd_cmd(a);lcd_data_int(alarmhr1);lcd_data(':');

}}

//function to set minutevoid set_min1(char a,int b){

if(b==1){

min1++;if(min1>59)min1=0;lcd_cmd(a);lcd_data_int(min1);

}else{

alarmmin1++;if(alarmmin1>59)alarmmin1=0;lcd_cmd(a);lcd_data_int(alarmmin1);

}}

void set_time() interrupt 0{

reset=0;lcd_cmd(0x01);if(start==0){

lcd_data_string("SET TIME");lcd_cmd(0x8A);lcd_data_int(hr1);lcd_data(':');lcd_data_int(min1);lcd_cmd(0xc0);while(start==0){

Page 10: Program for Digital Clock Using RTC DS12C887

delay(10);if(dig_hr1==0)set_hr1(0X8a,1);if(dig_min1==0)set_min1(0X8d,1);

}}lcd_cmd(0x01);hr=num(hr1);min=num(min1);set_rtc_time(1);lcd_cmd(0x01);lcd_cmd(0x80);lcd_data_string("TIME:");hr0=25;min0=60;

}

void set_alarm() interrupt 2 // Time set function{

reset=0;lcd_cmd(0x01);if(start==0){

lcd_data_string("SET ALARM");lcd_cmd(0x8b);lcd_data_int(alarmhr1);lcd_data(':');lcd_data_int(alarmmin1);while(start==0){

delay(10);if(digalarm_hr1==0)set_hr1(0X8b,2);if(digalarm_min1==0)set_min1(0X8e,2);

}}lcd_cmd(0x01);alarmhr=num(alarmhr1);alarmmin=num(alarmmin1);set_rtc_time(2);lcd_cmd(0x01);lcd_cmd(0x80);lcd_data_string("TIME:");

Page 11: Program for Digital Clock Using RTC DS12C887

hr0=25;min0=60;

}

bcdconv(unsigned char mybyte){

unsigned char x,y;x= mybyte & 0x0F;x=x | 0x30;y= mybyte & 0xF0;y=y>>4;y=y | 0x30;lcd_data(y);lcd_data(x);

}

void alarm1() // Function to check alarm {

reset=0;reset=1;lcd_cmd(0xc3);lcd_data_string("alarm");delay(100);lcd_cmd(0xc3);lcd_data_string(" ");

}

void read_rtc_display() //Function to read RTC{

hr00=num(hr0);min00=num(min0);XBYTE[11]=0x22;hr=XBYTE[4];lcd_cmd(0x87);min=XBYTE[2];sec=XBYTE[0];if(hr!=hr00){

lcd_cmd(0X87);bcdconv(hr);lcd_data(':');hr0=hr;

}if(min!=min00){

Page 12: Program for Digital Clock Using RTC DS12C887

lcd_cmd(0X8A);bcdconv(min);lcd_data(':');min0=min;

}if(sec!=sec0){

lcd_cmd(0x8D);bcdconv(sec);sec0=sec;

}}

void main(){

reset=1;lcd();XBYTE[10]=0x20;lcd_cmd(0x01);IE=0x85;lcd_cmd(0x80);lcd_data_string("TIME:");while(1){

read_rtc_display();if(alarmhr ==hr && alarmmin ==min ){

alarm1();}

}}