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

📄 clock.c

📁 51单片机的电子钟程序,带整点报时,可设置时间,若要掉点保存功能.单片机时钟用12M,经测试很准的.
💻 C
字号:



#include "at89x52.h"
#include "ES51_II.h"
#include "es51_ii_lib.h"



unsigned char Hour;		//	
unsigned char Mint;		//
unsigned char Sec;		//

//	设置标志位
bit bSetFlag;			
//	秒进位标志位
bit bCarryFlag;		

//	设置指示灯,进入设置时,LED2亮,
#define SETSHOW LED1

//	T2初始化程序,	50ms定时
void Init_T2(void)
{
	RCAP2H = 0x3c;
	RCAP2L = 0xb0;
	TH2	= RCAP2H;			//工作方式1,timer2
	TL2	= RCAP2L;

	T2MOD = 0x00;
	ET2 = 1;
	TR2 = 1;

}

//	数码管显示缓冲区刷新函数
void SMG_ReDisplay(void)
{
	SMG_BUFF[0] = SMG_TABLE[Hour/10];
	SMG_BUFF[1] = SMG_TABLE_DP[Hour%10];
	SMG_BUFF[2] = SMG_TABLE[Mint/10];
	SMG_BUFF[3] = SMG_TABLE[Mint%10];
}

//	60秒定时到,分钟加1,并刷新数码管显示
void ChangeTime(void)
{	
	static bit bSecFlag = TRUE;
	bit  bAlarmFlag = FALSE;

	bCarryFlag = FALSE;

	bSecFlag = !bSecFlag;		//	用于小数点闪烁

	if( ++Sec == 60 )			//	进位,分钟
		{
		Sec = 0;
			
		if( ++Mint == 60 )		//	进位,小时	
			{
			Mint = 0;
			bAlarmFlag = TRUE;	//	小时进位,需要整点报时
			if( ++Hour == 24 )	//	进位,24小时
				Hour = 0;			
			}
		}

	if( bSecFlag == TRUE )		//	以下代码实现第二位数码管小时点的闪烁
		SMG_ReDisplay();		//	显示小数点
	else					
		{						//	不显示小数点
		SMG_BUFF[0] = SMG_TABLE[Hour/10];
		SMG_BUFF[1] = SMG_TABLE[Hour%10];
		SMG_BUFF[2] = SMG_TABLE[Mint/10];
		SMG_BUFF[3] = SMG_TABLE[Mint%10];
		}
	if( bAlarmFlag == TRUE )	//	判断是否需要整点报时
		{
		bAlarmFlag = FALSE;
		Buzzer(1,0);			//	蜂鸣器发一声长声
		}
}


//	设置电子钟时间函数
void SetClock(void)
{
	
	SETSHOW = 0;				//	设置指示灯亮
	ET2 = 0;
	TR2 = 0;

	KeyVal = 0x0f;				//	丢弃键值,


	while( bSetFlag == TRUE )	//	等待按设置键以完成设置
		{								
		switch( KeyVal )		//	根据键值的不同进行不同的操作
			{
			case KEY1VAL:		//	设置:小时减1
					if( --Hour == 255 )
						Hour = 23;
					SMG_ReDisplay();
					KeyVal = 0x0f;
					break;
			case KEY2VAL:		//	设置小时加1
					if( ++Hour == 24 )
						Hour = 0;
					SMG_BUFF[0] = SMG_TABLE[Hour/10];
					SMG_BUFF[1] = SMG_TABLE_DP[Hour%10];					
					//nowtime = Hour*1.0+Mint*0.01;//	计算当前时间	
					//SMGprintf("%f",nowtime);//	刷新数码管显示
					KeyVal = 0x0f;
					break;
			case KEY3VAL:		//	设置分钟减1
					if( --Mint == 255)
						{
						Mint = 59;
						if( --Hour == 255)
							Hour = 23;
						}
					SMG_ReDisplay();
					KeyVal = 0x0f;
					break;
			case KEY4VAL:		//	设置分钟加1
					if( ++Mint == 60)
						{
						Mint = 0;
						if( ++Hour == 24)
							Hour = 0;
						}
					SMG_ReDisplay();
					KeyVal = 0x0f;
					break;
			default:			//	不操作
					break;
			}
		}
	SETSHOW = 1;				//	设置指示灯灭,设置完成
	Sec = 0;
	ET2 = 1;
	TR2 = 1;
}

//	INT0键中断程序
void INT0_KEY(void) interrupt IE0_VECTOR using 0
{
	unsigned char i=250;
	while(i--);
	bSetFlag = !bSetFlag;
}

//	T2定时溢出中断
//		每次定时50ms,对溢出次数进行计数学,每溢出20次为1秒
void INT_T2(void) interrupt TF2_VECTOR using 0
{
	static unsigned char Count_50ms = 0;
	TF2 = 0;
	if( ++ Count_50ms >= 20 )		//	50ms计数加1;
		{
		Count_50ms = 0;
		bCarryFlag = TRUE;
		}
}

⌨️ 快捷键说明

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