⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock20090409.c

📁 单片机 时钟程序,包含秒表
💻 C
字号:
//---------------------------------------------------------
//Akey--select mode
//Bkey--add1
//Ckey--jian1&&alarm on/off&& stopwatch on/off
//Dkey--select position
//---------------------------------------------------------

#include<reg52.h>
#include<lcddriver.h>      //LCD1302驱动程序

#define uchar unsigned char
#define uint unsigned int
//==========================

sbit Ak=P1^4 ;
sbit Bk=P1^5  ;
sbit Ck=P1^6;
sbit Dk=P1^7;
sbit ring=P2^3;

uchar currentmode,keyset,count;

uchar tab_time[8]={0,0,10,0,0,10,0,0}; 
uchar tab_ymdw[9]={2,0,0,9,0,4,0,1,3};   //年月日星期
uchar code tab_t[]="Time ";
uchar code tab_d[]="Date ";
uchar sec,min,hour,day,mon,year,week;

uchar tab_alarm[8]={1,2,10,0,1,10,0,0};
uchar code tab_a[]="Alarm";
uchar nsec,nmin,nhour;
uchar alarmmode;

uchar tab_stopwatch[]={0,0,11,0,0,11,0,0};
uchar code tab_s[]="Timer";
uchar ssec,smin,sh,stopwatch,stopwatchon,stopcount;

uchar code tab_num[]="0123456789:- ";
uchar code tab_week[21]="MonTeuWedThuFriSATSUN";
uchar code tab_ampm[4]="AMPM";
uchar code table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31};
uchar code table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31};

//------- 函数声明 --------
void mcu_initial();
void lcd_disp();
void time0();
void time1();
void keyprocess();
void jishi();
void delay(uint);
void alarm();

//------ 主函数 -----------
void main()
{
	mcu_initial();	
	lcd_initial();             //LCD1602初始化
	
	while(1)
   	{
   		if(currentmode==0)//clockmode
   		{
   		tab_time[0]=hour/10;   //小时十位   
		tab_time[1]=hour%10;   //小时个位
	
		tab_time[3]=min/10;    //分十位
		tab_time[4]=min%10;    //分个位
	
		tab_time[6]=sec/10;    //秒十位
		tab_time[7]=sec%10;    //秒个位	
   		}
   		if(currentmode==1)//alarm mode
   		{
   		tab_alarm[0]=nhour/10;   //小时十位   
		tab_alarm[1]=nhour%10;   //小时个位
	
		tab_alarm[3]=nmin/10;    //分十位
		tab_alarm[4]=nmin%10;    //分个位
	
		tab_alarm[6]=nsec/10;    //秒十位
		tab_alarm[7]=nsec%10;    //秒个位	
   		}
   		if(currentmode==2)//stopwatch mode
   		{
   		tab_stopwatch[0]=smin/10;   //分十位   
		tab_stopwatch[1]=smin%10;   //分个位
	
		tab_stopwatch[3]=ssec/10;    //秒十位
		tab_stopwatch[4]=ssec%10;    //秒个位
	
		tab_stopwatch[6]=sh/10;    //百分之一秒
		tab_stopwatch[7]=sh%10;    //百分之一秒	
   		}
	
		tab_ymdw[2]=year/10;   //年十位
		tab_ymdw[3]=year%10;   //年个位
	
		tab_ymdw[4]=mon/10;    //月十位
		tab_ymdw[5]=mon%10;    //月个位
	
		tab_ymdw[6]=day/10;    //日十位
		tab_ymdw[7]=day%10;    //日个位
	 
		tab_ymdw[8]=week;      //星期
	lcd_disp();
	
	keyprocess();
	
	alarm();
    
    	delay(50);//////////////////////////////////
   	}
}

void keyprocess()
{	//-----------------------------------------------------
	//设置时候,控制光标闪烁
	if(keyset==1)//sec
    	{write_instruction(0x80+12);
      	write_instruction(0x08|0x04|0x01);
      	write_instruction(0x80+11);
      	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==2)//min
     	{write_instruction(0x80+9);
      	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==3)//hour
     	{write_instruction(0x80+6);
      	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==4)//day
     	{write_instruction(0x80+12+0x40);
     	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==5)//mon
     	{write_instruction(0x80+10+0x40);
      	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==6)//year
     	{write_instruction(0x80+8+0x40);
      	write_instruction(0x08|0x04|0x01);
	}
	if(keyset==7)//week
     	{write_instruction(0x80+13+0x40);
      	write_instruction(0x08|0x04|0x01);
	}

	
//-------------------------------------------------------------
//Akey,模式选择,currentmode=0 时钟 =1 闹钟 =2秒表
	if(Ak==0)  
	{
		delay(2);
		if(Ak==0)
		{
		currentmode++;
			if(currentmode>=3)
			{
				currentmode=0;
			}	
		}
	}	
	while(Ak==0) ;
	
//-----------------------------------------------
//Dkey 设置的位置选择,=0没有,=1秒,=2分,=3小时,=4day,=5mon,=6year,=7week
	if(Dk==0)
	{
		delay(2);
		if(Dk==0)
		{
		keyset++;
			if(keyset==8)
			{
			keyset=0;	
			}		
		}	
	}
	while(Dk==0);
//-------------------------------------------------
//时钟模式,按键处理	
	if(currentmode==0)//clockmode
	{
		if(Bk==0)///+1按键
		{
		delay(2);
			if(Bk==0)
			{
				if(keyset==1)//sec
				{
				sec++;
					if(sec>=60)
					{
					sec=0;	
					}
					if(sec<0)
					{
					sec=60;	
					}
		
				}	
				if(keyset==2)//min
				{
				min++;
					if(min>=60)
					{
					min=0;	
					}
					if(min<0)
					{
					min=60;	
					}
				}
				if(keyset==3)//hour
				{
				hour++;
					if(hour>=24)
					{
					hour=0;	
					}
					if(hour<0)
					{
					hour=24;	
					}
				}
				if(keyset==4)//day
				{
				day++;
					if(day>=31)
					{
					day=0;	
					}
					if(day<0)
					{
					day=31;	
					}
				}
				if(keyset==5)//mon
				{
				mon++;
					if(mon>=31)
					{
					mon=0;	
					}
					if(mon<0)
					{
					mon=31;	
					}
				}
				if(keyset==6)//year
				{
				year++;
					if(year>=99)
					{
					mon=0;	
					}
					if(mon<0)
					{
					mon=99;	
					}
				}
				if(keyset==7)//week
				{
				week++;
					if(week>=99)
					{
					week=0;	
					}
					if(week<0)
					{
					week=99;	
					}
				}
				
			}	
		}
		while(Bk==0);
		
		if(Ck==0)//减一按键
		{
		delay(2);
			if(Ck==0)
			{
				if(alarmmode==1)
				{
				ring=0;
				alarmmode=0;	
				}
				if(alarmmode==0)
				{
				if(keyset==1)
				{
				sec--;
					if(sec>=60)
					{
					sec=0;	
					}
					if(sec<0)
					{
					sec=60;	
					}
		
				}	
				if(keyset==2)
				{
				min--;
					if(min>=60)
					{
					min=0;	
					}
					if(min<0)
					{
					min=60;	
					}
				}
				if(keyset==3)
				{
				hour--;
					if(hour>=24)
					{
					hour=0;	
					}
					if(hour<0)
					{
					hour=24;	
					}
				}
				if(keyset==4)
				{
				day--;
					if(day>=31)
					{
					day=0;	
					}
					if(day<0)
					{
					day=31;	
					}
				}
				if(keyset==5)
				{
				mon--;
					if(mon>=31)
					{
					mon=0;	
					}
					if(mon<0)
					{
					mon=31;	
					}
				}
				if(keyset==6)
				{
				year--;
					if(year>=99)
					{
					mon=0;	
					}
					if(mon<0)
					{
					mon=99;	
					}
				}
				if(keyset==7)
				{
				week--;
					if(week>=99)
					{
					week=0;	
					}
					if(week<0)
					{
					week=99;	
					}
				}
				
			}	
		}
		}
		while(Ck==0);	
	}
	//-------------------------------------------------
	if(currentmode==1)//alarmmode
	{
		if(Ck==0)
		{
		delay(2);
			if(Ck==0)
			{
			alarmmode=1;//Ck open alarm set alarmmode=1	
			}	
		}
		while(Ck==0);
				
		if(keyset>=4)
		{
		keyset=0;	
		}
		
		if(Bk==0)
		{
			delay(2);
			if(Bk==0)
			{
				
				if(keyset==2)
				{
				nmin++;
					if(nmin>=60)
					{
					nmin=0;	
					}	
				}
				if(keyset==3)
				{
				nhour++;
					if(nhour>=24)
					{
					nhour=0;	
					}
					
				}
			}	
		}
		while(Bk==0);
		
		if(Ck==0)
		{
			delay(2);
			if(Ck==0)//alarm off
			{
				if(alarmmode==1)
				{
				ring=0;
				alarmmode=0;
				}		
			}
		}
		while(Ck==0);
	}
	
	//--------------------------------------------------------------------
	if(currentmode==2)
	{
		if(Bk==0)
		{
		delay(2);
			if(Bk==0)
			{
			stopwatch=1;
			stopwatchon=0;
			sh=0;
			ssec=0;
			smin=0;
			}
		}
		while(Bk==0);
		
		if(keyset>=1)
		keyset=0;
		
		if(Ck==0)
		{
		delay(2);
			if(Ck==0)
			{
				stopwatchon++;
				
				if(stopwatch==1&&(stopwatchon%2)!=0)
				{
				TR1=1;
				}	
				else
				{
				TR1=0;	
				}
			}	
		}
		while(Ck==0);		
	}
	
}

void mcu_initial(void)
{
	
	TMOD=0x11;
	
	TH0=0x94;
	TL0=0x94;
	TH1=0xd8;
	TL1=0xef;
	
	EA=1;
	ET0=1;
	ET1=1;
	
	TR0=1;
		
	year=9;
	mon=4;
	day=11;
	hour=0;
	min=0;
	sec=0;
	week=6;
	ring=0;
	currentmode=0;	
}

void alarm()
{
	if(min==nmin&&hour==nhour&&alarmmode==1)
	{
	ring=1;	
	}	
}

void lcd_disp()
{
uchar i,j;
write_instruction(0x80);           //LCD1602写命令函数,从第一行开始显示
//-------------------------
	if(currentmode==0)
	{
		for(i=0;i<5;i++)
		{
		write_data(tab_t[i]);	
		}	
		write_instruction(0x80+5);
		for(i=0;i<8;i++)
		{
			j=tab_time[i];
			write_data(tab_num[j]);
		}
	}
	if(currentmode==1)
	{
		for(i=0;i<5;i++)
		{
		write_data(tab_a[i]);	
		}	
		write_instruction(0x80+5);
		write_data(' ');
		write_instruction(0x80+6);
		for(i=0;i<5;i++)
		{
			j=tab_alarm[i];
			write_data(tab_num[j]);
		}
		write_instruction(0x80+6+5);	
		if(alarmmode==0)
		{
			for(i=0;i<2;i++)
			write_data(' ');
		}
		if(alarmmode==1)
		{
		write_data(tab_ampm[0]);
		write_data(' ');
			
		}
	}
	if(currentmode==2)
	{
		for(i=0;i<5;i++)
		{
		write_data(tab_s[i]);	
		}	
		write_instruction(0x80+5);
		for(i=0;i<8;i++)
		{
			j=tab_stopwatch[i];
			write_data(tab_num[j]);
		}	
	}
	
write_instruction(0x80+5+8);
//------------------
write_data(' ');

if(hour<12)
{
   write_data(tab_ampm[0]);
   write_data(tab_ampm[1]);
}
else
{
   write_data(tab_ampm[2]);
   write_data(tab_ampm[3]);
}

write_instruction(0x80+0x40);

for(i=0;i<5;i++)
{
   write_data(tab_d[i]);      //显示'Date '
}
//---------------------
write_instruction(0x80+0x40+5);
for(i=0;i<8;i++)
{
    j=tab_ymdw[i];            //显示日期
    write_data(tab_num[j]);   //LCD1602写数据函数,显示年月日星期
}
//----------------------
write_instruction(0x80+0x40+5+8);
for(i=0;i<3;i++)
   {
    j=tab_ymdw[8];           //星期
    write_data(tab_week[(j-1)*3+i]);
   }
}

void time1() interrupt 3
{
	TH1=0xdb;
	TL1=0Xef;   //0.001s	
	sh++;
	if(sh==100)
	{
	sh=0;
	ssec++;
		if(ssec==60)
		{
		ssec=0;
		smin++;
			if(smin>=60);
			{
			smin=0;
			}	
		}
	}
	 	
}

void time0() interrupt 1
{
	TH0=0xb1;
	TL0=0Xdf;   ////20ms初值,12MHZ
	count++;
	if(count==50)
	{
	count=0;
	sec++;
	jishi();
	}
}


void jishi()      //计时函数
   {
   	
     if(sec==60)
      {
       sec=0;
       min++;
         if(min==60)
           {
             min=0;
             hour++;
               if(hour==24)
                  { hour=0;
                    day++;
                    week++;
                     if(week==8)
                       {week=0;}
                 if(year%4==0&&year%100!=0||year%400==0)     //闰年
                        {
                           if(day==table1[mon]+1)
                         {
                                day=0;
                                mon++;
                                   if(mon==13)
                                      {mon=0;year++;}
                             }
                         }
                     else                                //非闰年
                        {
                           if(day==table2[mon]+1)
                         {
                           day=0;
                           mon++;
                                  if(mon==13)
                                     {
                                     	mon=0;
                                     	year++;}
                         	}
                        }

                  }
           }
      }
  
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -