bkash77
Newbie level 3
i am having a problem in makin a project for my college ...i started a project with some c code in keil but its not working in proteus and even in the hardware...plz help me...my c code for this project is:
// Program to make a digital clock with time and alarm setting features
#include<reg51.h>
sbit dig_ctrl_4=P1^0; //Declare the control pins for the seven segments
sbit dig_ctrl_3=P1^1;
sbit dig_ctrl_2=P1^2;
sbit dig_ctrl_1=P1^3;
sbit buzzer=P3^7;
sbit resetalarm=P1^5; //Reset alarm pin to reset the alarm.
sbit resetclock=P1^4; //Reset clock pin to reset the clock.
sbit start=P3^3; // Start pin for starting the clock after time setting
sbit incr=P1^7; // Increment pin to increase the digits during time setting.
sbit set=P1^6; // Set pin to set the time.
int sel_seg_to_incr=0;
int ret_seg_to_incre=0;
int recnt_incr_seg;
int begin;
unsigned char dig_disp=0;
int min2=0;
int min1=0;
int sec2=0;
int sec1=0;
int minalarm2=0;
int minalarm1=0;
int secalarm2=0;
int secalarm1=0;
int alarmmin2=0;
int alarmmin1=0;
int alarmsec2=0;
int alarmsec1=0;
int keepmin2=0;
int keepmin1=0;
int keepsec2=0;
int keepsec1=0;
int loop=0;
int mode;
char dig_val[10]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x00,0x10}; // Hex values corresponding to digits 0 to 9
void delay(int time) //Function to provide time delay.
{
int i,j;
for(i=0;i<time;i++)
for(j=0;j<1275;j++);
}
int setfn() // Function to select miniute and seconds digit set time.
{
while(set==0)
{
switch(recnt_incr_seg)
{
case 1:
if(set==0) //Select the min2 digit
{
dig_ctrl_4=1;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=1;
ret_seg_to_incre=1;
P2=dig_val[minalarm2];
delay(100);
}
case 2:
if(set==0) //Select the min1 digit
{
dig_ctrl_4=0;
dig_ctrl_3=1;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=2;
ret_seg_to_incre=2;
P2=dig_val[minalarm1];
delay(100);
}
case 3:
if(set==0) //Select the sec 2 digit
{
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=1;
dig_ctrl_1=0;
recnt_incr_seg=3;
ret_seg_to_incre=3;
P2=dig_val[secalarm2];
delay(100);
}
case 4:
if(set==0) //Select the sec1 digit
{
recnt_incr_seg=1;
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=1;
ret_seg_to_incre=4;
P2=dig_val[secalarm1];
delay(100);
recnt_incr_seg=1;
}
}
}
return(ret_seg_to_incre);
}
void increase(int a) //Function to set the minutes or seconds digit
{
while(incr==0)
{
switch(a)
{
case 1: // Set the min2 digit.
P2=dig_val[minalarm2];
delay(100);
minalarm2++;
if(minalarm2==6)
minalarm2=0;
P2=dig_val[minalarm2];
delay(20);
break;
case 2: //Set the min1 digit.
P2=dig_val[minalarm1];
delay(100);
minalarm1++;
if(minalarm1==10)
minalarm1=0;
P2=dig_val[minalarm1];
delay(20);
break;
case 3: // Set the sec2 digit.
P2=dig_val[secalarm2];
delay(100);
secalarm2++;
if(secalarm2==6)
secalarm2=0;
P2=dig_val[secalarm2];
delay(20);
break;
case 4: //Set the sec1 digit.
//recnt_incr_seg=4;
P2=dig_val[secalarm1];
delay(100);
secalarm1++;
if(secalarm1==10)
secalarm1=0;
P2=dig_val[secalarm1];
delay(20);
break;
}
}
}
void resetfn(mode) // Function to bring the clock to reset or set mode.
{
begin=1;
dig_ctrl_4=1; //Enable the min2 digit and disable others
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
if(mode==0) //Check if clock is in set alarm mode
{
IE=0x88; //Disable Timer0 interrupt to stop the display of clock.
sel_seg_to_incr=1;
recnt_incr_seg=1;
P2=dig_val[keepmin2];
delay(100);
minalarm2=keepmin2;
minalarm1=keepmin1;
secalarm2=keepsec2;
secalarm1=keepsec1;
}
if(mode==1) //Check if clock is in set clock mode
{
IE=0x80; //Disable Timer0 interrupt to stop the clock.
minalarm2=min2;
minalarm1=min1;
secalarm2=sec2;
secalarm1=sec1;
sel_seg_to_incr=1;
recnt_incr_seg=1;
P2=dig_val[min2];
delay(100);
}
while(1)
{
if(start==0) //Check if start pin is pressed
{
if(mode==0)
{
keepmin2=minalarm2;
keepmin1=minalarm1;
keepsec2=secalarm2;
keepsec1=secalarm1;
alarmmin2=minalarm2;
alarmmin1=minalarm1;
alarmsec2=secalarm2;
alarmsec1=secalarm1;
}
if(mode==1)
{
min2=minalarm2;
min1=minalarm1;
sec2=secalarm2;
sec1=secalarm1;
}
TMOD=0x11; //Reset the timer0
TL0=0xf6;
TH0=0xFf;
IE=0x8A; //Enabling Timer0 interrupt to start the display of clock
TR0=1;
break;
}
if(set==0) //Check if set pin is pressed
sel_seg_to_incr=setfn();
if(incr==0) //Check if incr pin is pressed
increase(sel_seg_to_incr);
}
}
void display() interrupt 1 // Function to display the digits on seven segment using the concept of seven segment multiplexing.
{
TL0=0x36; //Reload Timer0
TH0=0xf6;
P2=0xFF;
dig_ctrl_1 = dig_ctrl_3 = dig_ctrl_2 = dig_ctrl_4 = 0;
dig_disp++;
dig_disp=dig_disp%4;
switch(dig_disp)
{
case 0:
P2=dig_val[sec1];
dig_ctrl_1 = 1;
break;
case 1:
P2= dig_val[sec2];
dig_ctrl_2 = 1;
break;
case 2:
P2= dig_val[min1];
dig_ctrl_3 = 1;
break;
case 3:
P2= dig_val[min2];
dig_ctrl_4 = 1;
break;
}
}
void moveclock() interrupt 3 // Function to increment clock digits
{
loop++;
if(loop==20)
{
sec1++;
if(sec1==10)
{
sec1=0;
sec2++;
if(sec2==6)
{
sec1=0;
sec2=0;
min1++;
if(min1==10)
{
sec1=0;
sec2=0;
min1=0;
min2++;
if(min2==6)
{
sec1=0;
sec2=0;
min1=0;
min2=0;
}
}
}
}
loop=0;
}
}
void main()
{
mode=0;
set=1; //Initialize set, reset, start and incr pins as input
resetalarm=1;
resetclock=1;
start=1;
incr=1;
begin=0;
TMOD=0x11; //Intialize Timer 0
TL0=0xf6; //Load timer0
TH0=0xFf;
IE=0x8A; //Enable Timer0 interrupt
TR0=1; //Start Timer0
TL1=0xFD;
TH1=0x4B;
TR1=1; // Start Timer1
while(1)
{
h
if(resetalarm==0) //Check if reset alarm pin is pressed
{
resetfn(0);
}
if(resetclock==0)//Check if reset clock pin is pressed
{
resetfn(1);
}
if(min2==alarmmin2&&min1==alarmmin1&&sec2==alarmsec2&&sec1==alarmsec1&&begin==1)// Check for Alarm condition
{
buzzer=0;
delay(500);
buzzer=1;
}
}
}
// Program to make a digital clock with time and alarm setting features
#include<reg51.h>
sbit dig_ctrl_4=P1^0; //Declare the control pins for the seven segments
sbit dig_ctrl_3=P1^1;
sbit dig_ctrl_2=P1^2;
sbit dig_ctrl_1=P1^3;
sbit buzzer=P3^7;
sbit resetalarm=P1^5; //Reset alarm pin to reset the alarm.
sbit resetclock=P1^4; //Reset clock pin to reset the clock.
sbit start=P3^3; // Start pin for starting the clock after time setting
sbit incr=P1^7; // Increment pin to increase the digits during time setting.
sbit set=P1^6; // Set pin to set the time.
int sel_seg_to_incr=0;
int ret_seg_to_incre=0;
int recnt_incr_seg;
int begin;
unsigned char dig_disp=0;
int min2=0;
int min1=0;
int sec2=0;
int sec1=0;
int minalarm2=0;
int minalarm1=0;
int secalarm2=0;
int secalarm1=0;
int alarmmin2=0;
int alarmmin1=0;
int alarmsec2=0;
int alarmsec1=0;
int keepmin2=0;
int keepmin1=0;
int keepsec2=0;
int keepsec1=0;
int loop=0;
int mode;
char dig_val[10]={0x40,0xF9,0x24,0x30,0x19,0x12,0x02,0xF8,0x00,0x10}; // Hex values corresponding to digits 0 to 9
void delay(int time) //Function to provide time delay.
{
int i,j;
for(i=0;i<time;i++)
for(j=0;j<1275;j++);
}
int setfn() // Function to select miniute and seconds digit set time.
{
while(set==0)
{
switch(recnt_incr_seg)
{
case 1:
if(set==0) //Select the min2 digit
{
dig_ctrl_4=1;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=1;
ret_seg_to_incre=1;
P2=dig_val[minalarm2];
delay(100);
}
case 2:
if(set==0) //Select the min1 digit
{
dig_ctrl_4=0;
dig_ctrl_3=1;
dig_ctrl_2=0;
dig_ctrl_1=0;
recnt_incr_seg=2;
ret_seg_to_incre=2;
P2=dig_val[minalarm1];
delay(100);
}
case 3:
if(set==0) //Select the sec 2 digit
{
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=1;
dig_ctrl_1=0;
recnt_incr_seg=3;
ret_seg_to_incre=3;
P2=dig_val[secalarm2];
delay(100);
}
case 4:
if(set==0) //Select the sec1 digit
{
recnt_incr_seg=1;
dig_ctrl_4=0;
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=1;
ret_seg_to_incre=4;
P2=dig_val[secalarm1];
delay(100);
recnt_incr_seg=1;
}
}
}
return(ret_seg_to_incre);
}
void increase(int a) //Function to set the minutes or seconds digit
{
while(incr==0)
{
switch(a)
{
case 1: // Set the min2 digit.
P2=dig_val[minalarm2];
delay(100);
minalarm2++;
if(minalarm2==6)
minalarm2=0;
P2=dig_val[minalarm2];
delay(20);
break;
case 2: //Set the min1 digit.
P2=dig_val[minalarm1];
delay(100);
minalarm1++;
if(minalarm1==10)
minalarm1=0;
P2=dig_val[minalarm1];
delay(20);
break;
case 3: // Set the sec2 digit.
P2=dig_val[secalarm2];
delay(100);
secalarm2++;
if(secalarm2==6)
secalarm2=0;
P2=dig_val[secalarm2];
delay(20);
break;
case 4: //Set the sec1 digit.
//recnt_incr_seg=4;
P2=dig_val[secalarm1];
delay(100);
secalarm1++;
if(secalarm1==10)
secalarm1=0;
P2=dig_val[secalarm1];
delay(20);
break;
}
}
}
void resetfn(mode) // Function to bring the clock to reset or set mode.
{
begin=1;
dig_ctrl_4=1; //Enable the min2 digit and disable others
dig_ctrl_3=0;
dig_ctrl_2=0;
dig_ctrl_1=0;
if(mode==0) //Check if clock is in set alarm mode
{
IE=0x88; //Disable Timer0 interrupt to stop the display of clock.
sel_seg_to_incr=1;
recnt_incr_seg=1;
P2=dig_val[keepmin2];
delay(100);
minalarm2=keepmin2;
minalarm1=keepmin1;
secalarm2=keepsec2;
secalarm1=keepsec1;
}
if(mode==1) //Check if clock is in set clock mode
{
IE=0x80; //Disable Timer0 interrupt to stop the clock.
minalarm2=min2;
minalarm1=min1;
secalarm2=sec2;
secalarm1=sec1;
sel_seg_to_incr=1;
recnt_incr_seg=1;
P2=dig_val[min2];
delay(100);
}
while(1)
{
if(start==0) //Check if start pin is pressed
{
if(mode==0)
{
keepmin2=minalarm2;
keepmin1=minalarm1;
keepsec2=secalarm2;
keepsec1=secalarm1;
alarmmin2=minalarm2;
alarmmin1=minalarm1;
alarmsec2=secalarm2;
alarmsec1=secalarm1;
}
if(mode==1)
{
min2=minalarm2;
min1=minalarm1;
sec2=secalarm2;
sec1=secalarm1;
}
TMOD=0x11; //Reset the timer0
TL0=0xf6;
TH0=0xFf;
IE=0x8A; //Enabling Timer0 interrupt to start the display of clock
TR0=1;
break;
}
if(set==0) //Check if set pin is pressed
sel_seg_to_incr=setfn();
if(incr==0) //Check if incr pin is pressed
increase(sel_seg_to_incr);
}
}
void display() interrupt 1 // Function to display the digits on seven segment using the concept of seven segment multiplexing.
{
TL0=0x36; //Reload Timer0
TH0=0xf6;
P2=0xFF;
dig_ctrl_1 = dig_ctrl_3 = dig_ctrl_2 = dig_ctrl_4 = 0;
dig_disp++;
dig_disp=dig_disp%4;
switch(dig_disp)
{
case 0:
P2=dig_val[sec1];
dig_ctrl_1 = 1;
break;
case 1:
P2= dig_val[sec2];
dig_ctrl_2 = 1;
break;
case 2:
P2= dig_val[min1];
dig_ctrl_3 = 1;
break;
case 3:
P2= dig_val[min2];
dig_ctrl_4 = 1;
break;
}
}
void moveclock() interrupt 3 // Function to increment clock digits
{
loop++;
if(loop==20)
{
sec1++;
if(sec1==10)
{
sec1=0;
sec2++;
if(sec2==6)
{
sec1=0;
sec2=0;
min1++;
if(min1==10)
{
sec1=0;
sec2=0;
min1=0;
min2++;
if(min2==6)
{
sec1=0;
sec2=0;
min1=0;
min2=0;
}
}
}
}
loop=0;
}
}
void main()
{
mode=0;
set=1; //Initialize set, reset, start and incr pins as input
resetalarm=1;
resetclock=1;
start=1;
incr=1;
begin=0;
TMOD=0x11; //Intialize Timer 0
TL0=0xf6; //Load timer0
TH0=0xFf;
IE=0x8A; //Enable Timer0 interrupt
TR0=1; //Start Timer0
TL1=0xFD;
TH1=0x4B;
TR1=1; // Start Timer1
while(1)
{
h
if(resetalarm==0) //Check if reset alarm pin is pressed
{
resetfn(0);
}
if(resetclock==0)//Check if reset clock pin is pressed
{
resetfn(1);
}
if(min2==alarmmin2&&min1==alarmmin1&&sec2==alarmsec2&&sec1==alarmsec1&&begin==1)// Check for Alarm condition
{
buzzer=0;
delay(500);
buzzer=1;
}
}
}
Last edited: