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

📄 数字时钟.c

📁 用单片机定时器做的数字时钟程序
💻 C
字号:
#include<at89x52.h>

unsigned char code num[]={0xc0,0xdf9,0xa4,0xb0,0x99,
                    0x92,0x82,0xf8,0x80,0x90};
unsigned char hour=0,min=0,sec=0,dat,mon,year;
unsigned char sign=0,set=0;
unsigned int i=0,j=0;
void display();
void init();
void trans();
void delay(unsigned int);
void scan_key();
void set_min();
void set_hour();
void cov_data();
void display_data();
void set_dat();
void set_mon();
void set_year();

void main()
{
	init();
	year=9;mon=2;dat=11;
	while(1)
	{
		trans();
		display();
		scan_key();
		switch(set)
		{
			case 0:trans();break;
			case 1:set_hour();break;
			case 2:set_min();break;
			default :break;

		} 
		do 
		{
			trans();
			scan_key();
			switch(set)
		{
			case 3:set_dat();break;
			case 4:set_mon();break;
			case 5:set_year();break;
			case 6:display_data();break;
			default :break;
		}
		 }while(set!=0&&set!=1&&set!=2);
	}
}

/*---------------定时器T0初始化------------*/
void init()
{
	EA=1;						  //开启总中断
	TMOD=0X01;					  //设置定时器零工作方式为1
	ET0=1;						  //开启定时器0
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;		  //装入初值
	TR0=1;						   //开始定时
	
}

/*------------------定时中断-----------------*/
void set0_5() interrupt 1
{
	TH0=(65536-5000)/256;
	TL0=(65536-5000)%256;		  //装入初值
	i++;
}

/*------------时分秒转换---------------------*/
void trans()
{
	if(i<100)
	sign=0;
	else
	sign=1;
	if(i>=200)
	{
		sec++;
		i=0;
	}
	if(sec>=60)
	{
		min++;
		sec=0;
	}
	if(min>=60)
	{
		hour++;
		min=0;
	}
	if(hour>=24)
	{
		dat++;
		hour=0;
	}
}

/*-----------------显示函数----------------*/
void display()
{
	P0=num[hour/10];
	P2=0x7f;
	delay(1);
	P2=0xff;
	P0=num[hour%10];
	P2=0xbf;
	delay(1);
	P2=0xff;
	P0=num[min/10];
	P2=0xdf;
	delay(1);
	P2=0xff;
	P0=num[min%10];
	P2=0xef;
	delay(1);
	P2=0xff;
	P0=num[sec/10];
	P2=0xf7;
	delay(1);
	P2=0xff;
	P0=num[sec%10];
	P2=0xfb;
	delay(1);
	P2=0xff;
	if(sign==0)
	{
		if(P2_6==0)
			P0_7=0;
		else
			P0_7=1;
	}
	else P0_7=1;
}


/*------------    延时函数---------------------*/
void delay(unsigned int z)
{
	unsigned char b;
	unsigned int a;
	for(a=z;a>0;a--)
		for(b=150;b>0;b--);
}

/*--------------扫描设置----------------------*/
void scan_key()
{
	delay(1);
	if(P1_0==0)
	set++;
	if(set>=7)
	set=0;
	while(P1_0==0)display(); /*按键未释放,在此等候*/
}

/*--------------小时设定--------------------*/
void set_hour()
{
	unsigned char a;
	if(P1_1==0)
	delay(1);
	if(P1_1==0)
	{
	while(P1_1==0)display();
	hour++;
	}
	for(a=0;a<30;a--)
	{
		display();
			
		 delay(3);
		
	}

}

/*----------------分钟设定---------------------*/
void set_min()
{
	unsigned char a;
	if(P1_1==0)
	delay(1);
	if(P1_1==0)
	{
	while(P1_1==0)display();
	min++;
	}
	for(a=0;a<30;a--)
	{
		display();
		
		 delay(3);
	}

}

/*------------------设定日期-------------------*/
void set_dat()
{
	unsigned char a;
	if(P1_1==0)
	delay(1);
	if(P1_1==0)
	{
	while(P1_1==0)display_data();
	dat++;
	}
	for(a=0;a<30;a--)
	{
		display_data();
		
		 delay(3);
	}
}

void set_mon()
{
	unsigned char a;
	if(P1_1==0)
	delay(1);
	if(P1_1==0)
	{
	while(P1_1==0)display_data();
	mon++;
	}
	for(a=0;a<30;a--)
	{
		display_data();
		
		 delay(3);
	}
}

void set_year()
{
	unsigned char a;
	if(P1_1==0)
	delay(1);
	if(P1_1==0)
	{
	while(P1_1==0)display_data();
	year++;
	}
	for(a=0;a<30;a--)
	{
		display_data();
		
		 delay(3);
	}
}

/*-------------------日期显示函数---------------*/
void display_data()
{
	P2=0x7f; 
	P0=num[year/10];
	delay(1);
	P0=0xff;
	P2=0xbf; 
	P0=num[year%10];
	delay(1);
	P0=0xff;
	P2=0xdf; 
	P0=num[mon/10];
	delay(1);
	P0=0xff;
	P2=0xef; 
	P0=num[mon%10];
	delay(1);
	P0=0xff;
	P2=0xf7; 
	P0=num[dat/10];
	delay(1);
	P0=0xff;
	P2=0xfb; 
	P0=num[dat%10];
	delay(1);
	P0=0xff;
	cov_data();

}

/*---------日期转换函数----------------------*/
void cov_data()
{
	switch(mon)
	{
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
		{
			 if(dat>=31)
			 {
			 	mon++;
				dat=0;
			}
		}
		case 4:case 6:case 9:case 11:
		{
			if(dat>=30)
			{
				mon++;
				dat=0;
			}
		}
		case 2:
			if(year%4==0)
	        {
				if(dat>=29)
				{
					mon++;
					dat=0;
	
				}
			}
			if(year%4!=0)
	        {
				if(dat>=28)
				{
					mon++;
					dat=0;
	
				}
			}

	}
	if(mon>=12)
	{
		year++;
		mon=0;
	}
	if(year>=99)
	year=0;

}

⌨️ 快捷键说明

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