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

📄 lesson3_c.c

📁 基于AT89C51的数字时钟
💻 C
字号:

/************************************************/
/*单位名称:华南理工大学电信学院*/
/*模块:1位共阴数码管*/
/*创建人:景永年   日期:2006年4月25日*/
/*修改人:*/

/*功能描述:6个LED数码管显示的数字时钟*/
/*其他说明:*/
/*版本号:*/
/*************************************************/
#include "reg52.h"
#include "stdio.h"
#define uchar unsigned char

//unsigned char volatile xdata g_sec_disp _at_ 0xFFFF;
//unsigned char volatile xdata g_min_disp _at_ 0xEFFF;
//unsigned char volatile xdata g_hr_disp  _at_ 0xDFFF;

unsigned char xdata g_sec_disp _at_ 0xFFFF;
unsigned char xdata g_min_disp _at_ 0xEFFF;
unsigned char xdata g_hr_disp  _at_ 0xDFFF;
void time0_init(void);

unsigned char uc_sec_cnt,uc_min_cnt,uc_hr_cnt,uc_ms_cnt;



main()
{
	
	
	time0_init();
	
	uc_sec_cnt = 0;
	uc_min_cnt = 0;
	uc_hr_cnt = 0;
	uc_ms_cnt = 0;
	
	SP = 0x60	;//Initiate stack
	ET0 = 1;
	TR0 = 1;
	
	while(1)
	{
		
	}
	
}


/*************************************************/
/*time0_init*/
/*************************************************/
void time0_init(void)
{
	TMOD = 0x01 ;//定时中断的初始化,定时器0工作在定时器模式
	IE = 0x80   ;//开总中断;由TR0启停,16bit(模式1)
	TH0 =0x3C   ;//初值15536
	TL0 =0xB0   ;//100ms=0.1s
	
}


/*************************************************/
/*time0_interrupt*/
/*************************************************/
void time0_interrupt(void) interrupt 1 using 3
{
	TH0 =0x3C   ;//重新装入初值15536
	TL0 =0xB0   ;//100ms=0.1s
	
	uc_ms_cnt++;
	if(uc_ms_cnt==10)
	{
		uc_ms_cnt = 0;		
		uc_sec_cnt++;
		if((uc_sec_cnt&0x0F)>9)	/*变量uc_sec_cnt为16进制数,显示应该为10进制*/
		{
			uc_sec_cnt += 6;	/*(uc_sec_cnt&0x0F)按位与运算*/
		}						/*若没有if语句,则只能是到9以后,继续数到F才进位*/		
		g_sec_disp = uc_sec_cnt;
		g_min_disp = uc_min_cnt;
		g_hr_disp = uc_hr_cnt;
	
		if((uc_sec_cnt)>=0x60)/*注意使用0x60*/
		{
			uc_sec_cnt = 0;
			uc_min_cnt++;
			if((uc_min_cnt&0x0F)>9)		/*变量uc_min_cnt为16进制数,显示应该为10进制*/
			{
				uc_min_cnt += 6;		/*(uc_min_cnt&0x0F)按位与运算*/
			}							/*若没有if语句,则只能是到9以后,继续数到F才进位*/	
			g_sec_disp = uc_sec_cnt;
			g_min_disp = uc_min_cnt;
			g_hr_disp = uc_hr_cnt;

			if((uc_sec_cnt)>=0x60)/*注意使用0x60*/
			{
				uc_min_cnt = 0;
				uc_hr_cnt++;

				if((uc_hr_cnt&0x0F)>9)		/*变量uc_hr_cnt为16进制数,显示应该为10进制*/
				{
					uc_hr_cnt += 6;			/*(uc_hr_cnt&0x0F)按位与运算*/
				}							/*若没有if语句,则只能是到9以后,继续数到F才进位*/

				g_sec_disp = uc_sec_cnt;
				g_min_disp = uc_min_cnt;
				g_hr_disp = uc_hr_cnt;
				
				if((uc_hr_cnt)>=0x24)/*注意使用0x24*/
				{
					uc_hr_cnt = 0;
				}
			}
		}
	}
}

⌨️ 快捷键说明

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