基于51单片机的数字钟设计—数码管显示

基于51单片机的数字钟设计

(仿真+程序+原理图+设计报告)

功能介绍

具体功能:

1.自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。

2.自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。

3.具备校准功能,可以直接由按键设置当前时间。

4.具有调整闹钟功能、整点报时功能。

演示视频:

基于51单片机的数字钟设计

/***************51单片机数字钟 设计*************

*********************原创设计******************/
#include <REGX52.H>

#define uint unsigned int
#define uchar unsigned char
/***************定义  数码管*****************/
#define	SMG_XS	P0				//数码管数据显示
#define	SMG_KZ	P2				//数码管控制显示
#define Speak	P3_7			//定义蜂鸣器接口
#define	LED1	P3_4			//定义LED1接口(走时提示指示灯)
#define LED2	P3_5			//定义LED2接口(闹钟指示灯亮)
#define LED3	P3_6			//定义LED3接口(整点报时指示灯)
 
#define Key1	P1_0			//时间调整允许 按键
#define Key2	P1_1			//时、分加  按键 
#define Key3	P1_2			//时、分减  按键
#define Key4	P3_1			//闹钟时间调整允许 按键
#define Key5	P3_2			//开/关闹钟 按键		
#define Key6	P3_3			//开/关整点报时 按键

uchar code Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//没有小数点
//定义数组  数码管   0    1    2    3    4    5    6    7    8    9    -
uchar code Data1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x3F};//带小数点
//定义数组  数码管   0    1    2    3    4    5    6    7    8    9    -


uchar hour=12,min=0,sec=0;		//系统上电默认时间是 12.00.00
uchar hour1=6,min1=0,sec1=0;	//系统上电默认闹铃是 06.00.00
char num=0;						//时间基数 num
uint t=3;						//数码管动态扫描延时时间基数  源数据3
uchar flag=0;					//显示标志位(0:走时正常 1:调整时钟 2:调整分钟)				
uint i=0;j=0;					//循环变量i,j
bit nao_z=0;					//闹钟标志位(0:关闭闹钟  1:开启闹钟)
uchar flag_nao_z=0;				//闹钟显示模式(0:显示正常走时时间  1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
bit bao_shi=0;					//整点报时标志位(0:不允许整点报时 1:允许整点报时)
			
void delay(uint time)			//扫描延时函数
{
	uint x,y;
	for(x=time;x>0;x--)
	for(y=110;y>0;y--);		
}

void delay_fmq(uint time)		//延时函数(蜂鸣器)
{
	uint x,y;
	for(x=time;x>0;x--)
	for(y=5;y>0;y--);
}

void fmq()						//蜂鸣器函数(按键提示)
{
	for(i=0;i<100;i++)
	{
		Speak=0;
		delay_fmq(10);
	}
	Speak=1;
}
void Time0_init()				//定时器0初始化函数
{
	TMOD=0x01;					//定时器0为方式1
	TL0=(65536-50000)%256;
	TH0=(65536-50000)/256;		//12M晶振 定时时间50ms
	ET0=1;						//开定时器0中断
	EA=1;						//开总中断
	TR0=0;						//先不启动定时器0
}
void Time0() interrupt 1		//定时器0中断服务函数
{
	TH0=(65536-50000)/256;		//重新载装初值,设置50ms中断一次
	TL0=(65536-50000)%256;
	num++;						//时间基数加1
	while(num==20)				//1秒时间到
	{
		num=0;					//num清0
		sec++;					//秒加1
	
		if(flag_nao_z!=0)		//闹钟显示模式不等于0(不显示正常走时时间,即显示闹钟时间)
		{
			LED1=~LED1;			//指示灯按照2Hz频率闪烁(在调整闹钟时间时,提示正在走时)
		}
		else					//否则闹钟显示模式等于0(显示正常走时时间)
		{
			LED1=1;				//在正常走时的时候,指示灯不亮
		}
		
		if(nao_z==1)			//当闹钟标示位为1:开启闹钟
		{
			LED2=0;				//闹钟指示灯亮
			if(hour==hour1&min==min1)	//当时,分和闹钟时,分相同
			{
				Speak=~Speak;			//蜂鸣器接口取反(2Hz频率响)
			}
			else						//否则时,分和闹钟时,分不相同
			{
				Speak=1;				//关闭蜂鸣器
			}
		}
		else					//否则关闭闹钟
		{
			LED2=1;				//闹钟指示灯不亮
		}	
	}
	while(sec==60)				//1分时间到
	{
		sec=0;					//秒清0
		min++;					//分加1
	}
	while(min==60)				//1小时时间到
	{		
		min=0;					//分清0
		hour++;					//时加1
	}
	while(hour==24)				//24小时到
	{
		hour=0;					//时清0
	}
}

void disp(hour,min,sec)			//数码管正常显示模式		
{
	SMG_XS=Data[hour/10];		//小时十位
	SMG_KZ=0xdf;				//控制第1个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data1[hour%10];		//小时个位				
	SMG_KZ=0xef;				//控制第2个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[min/10];		//分十位
	SMG_KZ=0xf7;				//控制第3个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data1[min%10];		//分个位
	SMG_KZ=0xfb;				//控制第4个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[sec/10];		//秒十位
	SMG_KZ=0xfd;				//控制第5个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[sec%10];		//秒个位
	SMG_KZ=0xfe;				//控制第6个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
}

void disp1(hour,min,sec)		//数码管模式1:调小时模式(时钟在数码管上闪烁)
{
	j++;						//j加1
	while(j==40) {j=0;}			//j为40时,j清0
	if(j<20)					//j小于20  时,分,秒 都显示
	{
		SMG_XS=Data[hour/10];	//小时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮			
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;	
		SMG_XS=Data1[hour%10];	//小时个位			
		SMG_KZ=0xef;			//控制第2个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min/10];	//分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min%10];	//分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec/10];	//秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec%10];	//秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}
	else						//否则20<j<40	时不显示;分,秒 都显示			
	{
		SMG_XS=Data[hour/10];	//小时十位
		SMG_KZ=0xff;			//控制第1个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[hour%10];	//小时个位				
		SMG_KZ=0xff;			//控制第2个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min/10];	//分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min%10];	//分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec/10];	//秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec%10];	//秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}	
}

void disp2(hour,min,sec)		//数码管模式2:调分钟模式(分钟在数码管上闪烁)		
{
	j++;						//j加1		
	while(j==40) {j=0;}			//j为40时,j清0
	if(j<20)					//j小于20  时,分,秒 都显示			
	{
		SMG_XS=Data[hour/10];	//小时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮			
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;	
		SMG_XS=Data1[hour%10];	//小时个位			
		SMG_KZ=0xef;			//控制第2个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min/10];	//分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min%10];	//分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec/10];	//秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec%10];	//秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}
	else						//否则20<j<40	时显示,分不显示,秒显示	
	{
		SMG_XS=Data[hour/10];	//小时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;	
		SMG_XS=Data1[hour%10];	//小时个位				
		SMG_KZ=0xef;			//控制第2个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min/10];	//分十位
		SMG_KZ=0xff;			//控制第3个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min%10];	//分个位
		SMG_KZ=0xff;			//控制第4个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec/10];	//秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮				
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec%10];	//秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}		
}

void disp3(hour1,min1,sec1)		//数码管模式3(显示闹钟时间)		
{
	SMG_XS=Data[hour1/10];		//闹钟 时十位
	SMG_KZ=0xdf;				//控制第1个数码管亮				
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data1[hour1%10];		//闹钟 时个位				
	SMG_KZ=0xef;				//控制第2个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[min1/10];		//闹钟 分十位
	SMG_KZ=0xf7;				//控制第3个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data1[min1%10];		//闹钟 分个位
	SMG_KZ=0xfb;				//控制第4个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[sec1/10];		//闹钟 秒十位
	SMG_KZ=0xfd;				//控制第5个数码管亮
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
	SMG_XS=Data[sec1%10];		//闹钟 秒个位
	SMG_KZ=0xfe;				//控制第6个数码管亮			
	delay(t);					//延时一下(消隐)
	SMG_KZ=0xff;
}

void disp4(hour1,min1,sec1)		//数码管模式4: 调整闹钟时钟(闹钟时钟在数码管上闪烁)
{	
	j++;						//j加1
	while(j==40) {j=0;}			//j为40时,j清0
	if(j<20)					//j小于20  闹钟 时,分,秒 都显示
	{
		SMG_XS=Data[hour1/10];	//闹钟 时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮			
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[hour1%10];	//闹钟 时个位		
		SMG_KZ=0xef;			//控制第2个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min1/10];	//闹钟 分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min1%10];	//闹钟 分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1/10];	//闹钟 秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1%10];	//闹钟 秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}
	else						//否则20<j<40	闹钟 时不显示,分显示,秒显示
	{
		SMG_XS=Data[hour1/10];	//闹钟 时十位
		SMG_KZ=0xff;			//控制第1个数码管不亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[hour1%10];	//闹钟 时个位				
		SMG_KZ=0xff;			//控制第2个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min1/10];	//闹钟 分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min1%10];	//闹钟 分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1/10];	//闹钟 秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1%10];	//闹钟 秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}	
}

void disp5(hour1,min1,sec1)		//数码管模式5: 调整闹钟分钟(闹钟分钟在数码管上闪烁)
{
	j++;						//j加1
	while(j==40) {j=0;}			//j为40时,j清0
	if(j<20)					//j小于20  闹钟 时,分,秒 都显示	
	{
		SMG_XS=Data[hour1/10];	//闹钟 时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮			
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[hour1%10];	//闹钟 时个位				
		SMG_KZ=0xef;			//控制第2个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min1/10];	//闹钟 分十位
		SMG_KZ=0xf7;			//控制第3个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min1%10];	//闹钟 分个位
		SMG_KZ=0xfb;			//控制第4个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1/10];	//闹钟 秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1%10];	//闹钟 秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}
	else						//否则20<j<40	闹钟 时显示,分不显示,秒显示
	{
		SMG_XS=Data[hour1/10];	//闹钟 时十位
		SMG_KZ=0xdf;			//控制第1个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[hour1%10];	//闹钟 时个位				
		SMG_KZ=0xef;			//控制第2个数码管亮	
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[min1/10];	//闹钟 分十位
		SMG_KZ=0xff;			//控制第3个数码管不亮			
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data1[min1%10];	//闹钟 分个位
		SMG_KZ=0xff;			//控制第4个数码管不亮
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1/10];	//闹钟 秒十位
		SMG_KZ=0xfd;			//控制第5个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
		SMG_XS=Data[sec1%10];	//闹钟 秒个位
		SMG_KZ=0xfe;			//控制第6个数码管亮		
		delay(t);				//延时一下(消隐)
		SMG_KZ=0xff;
	}
}

void key_cl()						//按键处理(调整时间)					
{
	if(Key1==0)						//当时间调整允许 按键按下					
	{
		delay(5);					//延时去抖
		if(Key1==0)					//再判断时间调整允许 按键是否按下
		{
			TR0=0;					//关闭定时器0
			num=0;					//时间基数清0
			sec=0;					//秒清零
			TL0=(65536-50000)%256;
			TH0=(65536-50000)/256;	//12M晶振 定时时间50ms
			flag++;					//显示标志位加1(0:走时正常 1:调整时钟 2:调整分钟)
			if(flag==3)				//当flag为3
			{
				flag=0;				//flag清0
			}
		}
		SMG_KZ=0xff;				//关闭数码管显示		
		fmq();						//按键提示音
		while(Key1==0);				//等待按键松开
	}
	if(flag==1)						//当flag为1 (调整时钟)
	{
		if(Key2==0)					//当时、分加  按键按下			
		{
			delay(5);				//延时去抖
			if(Key2==0)				//再判断时、分加  按键是否按下
			{
				hour++;				//时加1
				while(hour==24) {hour=0;}	//当hour为24,hour清0
			}
			SMG_KZ=0xff;			//关闭数码管显示	
			fmq();					//按键提示音	
			while(Key2==0);    		//等待按键松开
		}
		if(Key3==0)					//当时、分减  按键按下	
		{	
			delay(5);				//延时去抖
			if(Key3==0)				//再判断时、分减  按键是否按下
			{	
				hour--;				//时减1
				while(hour==-1)	{hour=23;}	//当hour为-1,hour设置为23
				
			}
			SMG_KZ=0xff;			//关闭数码管显示	
			fmq();					//按键提示音
			while(Key3==0);			//等待按键松开
		}
	}
	if(flag==2)						//当flag为2 (调整分钟)
	{
		if(Key2==0)					//当时、分加  按键按下	
		{
			delay(5);				//延时去抖	
			if(Key2==0)				//再判断时、分加  按键是否按下		
			{
				min++;				//分加1
				while(min==60) {min=0;}	//当min为60,min清0
		
			}
			SMG_KZ=0xff;			//关闭数码管显示
			fmq();					//按键提示音					
			while(Key2==0);    		//等待按键松开
		}
		if(Key3==0)					//当时、分减  按键按下		
		{
			delay(5);				//延时去抖
			if(Key3==0)				//再判断时、分减  按键是否按下		
			{
				min--;				//分减1
				while(min==-1) {min=59;} //当min为-1,min设置为59					
		
			}
			SMG_KZ=0xff;			//关闭数码管显示
			fmq();					//按键提示音
			while(Key3==0);			//等待按键松开
		}			
	}		
}

void key_cl1()				//按键处理1(闹钟设置)
{
	if(Key4==0)				//当闹钟时间调整允许 按键按下		
	{
		delay(5);			//延时去抖
		if(Key4==0)			//再判断闹钟时间调整允许 按键是否按下	
		{
			flag_nao_z++;	//闹钟显示模式加1(0:显示正常走时时间  1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
			if(flag_nao_z==4) {flag_nao_z=0;}	//当flag_nao_z为4,flag_nao_z清0	
		}
		SMG_KZ=0xff;		//关闭数码管显示
		fmq();				//按键提示音		
		while(Key4==0);		//等待按键松开
	}	
	if(flag_nao_z==2)		//当进入调整闹钟时钟
	{
		if(Key2==0)			//当 时、分加 按键按下
		{
			delay(5);		//延时去抖	
			if(Key2==0)		//再判断时、分加 按键是否按下
			{
				hour1++;	//闹钟时钟加1
				while(hour1==24) {hour1=0;}	//当闹钟时钟为24,闹钟时钟清0
		
			}
			SMG_KZ=0xff;	//关闭数码管显示
			fmq();			//按键提示音						
			while(Key2==0); //等待按键松开
		}
		if(Key3==0)			//当 时、分减 按键按下	
		{
			delay(5);		//延时去抖
			if(Key3==0)		//再判断时、分减 按键是否按下
			{
				hour1--;	//闹钟时钟减1
				while(hour1==-1) {hour1=23;} //当闹钟时钟为-1,闹钟时钟设置为23
			}
			SMG_KZ=0xff;	//关闭数码管显示	
			fmq();			//按键提示音
			while(Key3==0);	//等待按键松开
		}			
	}
	if(flag_nao_z==3)		//当进入调整闹钟分钟
	{
		if(Key2==0)			//当 时、分加 按键按下
		{
			delay(5);		//延时去抖	
			if(Key2==0)		//再判断时、分加 按键是否按下
			{
				min1++;		//闹钟分钟加1
				while(min1==60) {min1=0;}	//当闹钟分钟为60 闹钟分钟清0
		
			}
			SMG_KZ=0xff;	//关闭数码管显示
			fmq();			//按键提示音						
			while(Key2==0); //等待按键松开
		}
		if(Key3==0)			//当 时、分减 按键按下	
		{
			delay(5);		//延时去抖	
			if(Key3==0)		//再判断时、分减 按键是否按下
			{
				min1--;		//闹钟分钟减1
				while(min1==-1)	{min1=59;}	//当闹钟分钟为-1 闹钟分设置为59
		
			}
			SMG_KZ=0xff;	//关闭数码管显示
			fmq();			//按键提示音
			while(Key3==0);	//等待按键松开
		}			
	}
}

void key_cl2()				//按键处理2(闹钟,整点报时按键处理)
{
	if(Key5==0)				//当闹钟 按键按下
	{
		delay(5);			//延时去抖
		if(Key5==0)			//再判断闹钟 按键是否按下
		{
			nao_z=~nao_z;	//闹钟标志位取反(0:关闭闹钟  1:开启闹钟)	
		}
		SMG_KZ=0xff;		//关闭数码管显示
		fmq();				//按键提示音
		while(Key5==0);		//等待按键松开
	}
	if(Key6==0)				//当整点报时 按键按下
	{
		delay(5);			//延时去抖
		if(Key6==0)			//再判断整点报时 按键是否按下
		{
			bao_shi=~bao_shi;	//整点报时标志位取反(0:不允许整点报时 1:允许整点报时)
		}
		SMG_KZ=0xff;		//关闭数码管显示	
		fmq();				//按键提示音
		if(bao_shi==1)		//当整点报时标志位为1:允许整点报时
		{
			LED3=0;			//整点报时指示灯亮		
		}
		else				//否则整点报时标志位为0:不允许整点报时	
		{
			LED3=1;			//整点报时指示灯不亮
		}
		while(Key6==0);		//等待按键松开
	}		
}

void SMG_disp()				//数据显示(时 分 秒)
{
	if(flag==0)				//显示标志位为0(0:走时正常 1:调整时钟 2:调整分钟)						
	{
		disp(hour,min,sec);	//数码管正常显示模式
	}
	if(flag==1)				//显示标志位为1(0:走时正常 1:调整时钟 2:调整分钟)
	{
		disp1(hour,min,sec);//数码管模式1:调小时模式(时钟在数码管上闪烁)	
	}
	if(flag==2)				//显示标志位为2(0:走时正常 1:调整时钟 2:调整分钟)
	{
		disp2(hour,min,sec);//数码管模式2:调分钟模式(分钟在数码管上闪烁)
	}	
}

void SMG_disp1()		//数据显示1(闹钟 时 分 秒)			
{
	if(flag_nao_z==1)	//闹钟显示模式为1(0:显示正常走时时间  1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)			
	{
		disp3(hour1,min1,sec1);	//数码管模式3: 显示闹钟时间		
	}
	if(flag_nao_z==2)	//闹钟显示模式为2(0:显示正常走时时间  1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
	{
		disp4(hour1,min1,sec1);	//数码管模式4: 调整闹钟时钟(闹钟时钟在数码管上闪烁)
	}
	if(flag_nao_z==3)	//闹钟显示模式为3(0:显示正常走时时间  1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
	{
		disp5(hour1,min1,sec1);	//数码管模式5: 调整闹钟分钟(闹钟分钟在数码管上闪烁)
	}
}

void bao_shi_cl()  		//整点报时处理(0:不允许整点报时 1:允许整点报时) 
{
	if(bao_shi==1)		//开启整点报时
	{
		if(TR0==1)		//当TR0为1(表示正常走时的时候)
		{
			if(min==0&sec==0)	//分为0 秒为0
			{
				SMG_KZ=0xff;	//关闭数码管显示
				fmq();			//提示音
				while(sec==0);	//当秒为0,继续等待
			}
		}
	}
}

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

USB接头(母头);自锁开关;

电解电容10u;电阻10K;

瓷片电容30P;晶振12M;

电阻4.7K;电阻470(贴片);

三极管8550;4位共阳数码管;

2位共阳数码管;LED(红发红);

有源蜂鸣器;DIP40;

按键;9*15CM万能板;

USB公对公线;排针2P;

导线:若干;

流程图:

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

一万四千字设计报告,具体如下!

05 设计资料

全部资料包括仿真源文件 、程序(含注释)、AD原理图、参考论文、流程图等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

  • 29
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
8051单片机数字钟(完整)(包括原理图,c语言源代码) 键盘8为显示功能键: 按第一次——显示时间 按第二次——显示日期 按第三次——显示星期 键盘0为调节功能键: 按第一次-----1,2两位闪烁 按第二次-----4,5两位闪烁 按第三次-----7,8两位闪烁 键盘1为增加键: 1,2两位闪烁时,按一下加1 4,5两位闪烁时,按一下加1 7,8两位闪烁时,按一下加1 键盘2为减少键: 1,2两位闪烁时,按一下减1 4,5两位闪烁时,按一下减1 7,8两位闪烁时,按一下减1 上电初始时数码管显示为00-00-00 按第一次键盘8——显示时间 显示模式为:时-分-秒 在显示时间的时候按键盘0调节功能键: 按第一次-----秒的两位闪烁 按第二次-----分的两位闪烁 按第三次-----时的两位闪烁 按第四次-----秒,分,时均不闪烁,时间正常显示 当秒的两位闪烁时,按键盘1一下秒加1,按键盘2一下秒减1 当分的两位闪烁时,按键盘1一下分加1,按键盘2一下分减1 当时的两位闪烁时,按键盘1一下时加1,按键盘2一下时减1 按第二次键盘8——显示日期 显示模式为:年-月-日 在显示日期的时候按键盘0调节功能键: 按第一次-----日的两位闪烁 按第二次-----月的两位闪烁 按第三次-----年的两位闪烁 按第四次-----年,月,日均不闪烁,日期正常显示 当日的两位闪烁时,按键盘1一下日加1,按键盘2一下日减1 当月的两位闪烁时,按键盘1一下月加1,按键盘2一下月减1 当年的两位闪烁时,按键盘1一下年加1,按键盘2一下年减1 按第三次键盘8——显示星期 显示模式为:最后一位显示1—7 在显示日期的时候按键盘0调节功能键: 按第一次-----星期闪烁 按第二次-----星期正常显示 当星期闪烁时,按键盘1一下星期加1,按键盘2一下星期加减1 按第四次键盘8返回显示时间
### 回答1: 基于51单片机的电子时钟是一种数字时钟,它使用51单片机作为控制器,通过数码管显示时间。它可以实现时间的显示、闹钟功能、定时功能等。它的优点是精度高、稳定性好、易于制作和维护。同时,它也是一种很好的电子制作项目,可以帮助人们提高电子制作技能。 ### 回答2: 基于51单片机的电子时钟是一个常见的电子制作项目,主要利用51单片机作为控制器,通过连接数码管显示模块完成时刻的显示。我们可以将电子时钟分为硬件和软件两个部分来进行讨论。 硬件部分主要包括电路连接和硬件设计。首先,我们需要选用51单片机作为主控芯片,由于51单片机的应用广泛,其价格低廉且易于操作,因此成为了电子时钟设计首选芯片。其次,我们需要选用数码管模块完成时刻的显示,通常数码管有共阳和共阴两种类型,我们需要根据选用的数码管类型选择相应的接线。同时,电子时钟还需要时钟发生器模块,以便产生固定的时钟信号。最后,我们需要加入电源模块,以保证电子时钟的正常工作。 软件部分主要包括程序设计和调试。首先,我们需要对51单片机的程序进行编写,主要实现时钟信号的接收和处理,并将结果显示在数码管上。其次,根据不同的设计需求,我们可以考虑加入闹钟、温度显示等功能。最后,我们需要对电子时钟进行调试,确保其正常工作。 总体而言,基于51单片机的电子时钟设计不仅可以帮助我们了解电子制作的基本原理,同时还可以提高我们的编程能力和电路调试能力。除此之外,随着科技的发展,电子时钟还可以发扬其创意性,加入更多的功能,使其更加实用和有趣。 ### 回答3: 基于51单片机的电子时钟是一种常见的电子制品,同时也是学习单片机编程的好项目之一。电子时钟通过使用51单片机作为核心控制器,驱动数码管来显示时间和日期信息。以下是基于51单片机的电子时钟的制作过程和工作原理的详细介绍。 1.硬件设备 (1)单片机芯片:51单片机系列中的AT89C51或AT89S51芯片 (2)时钟电路:蜂鸣器 (3)显示模块:4位共阳数码管 (4)时钟模块:DS1302实时时钟模块 (5)电源:9V电池或直流电源 2.电路原理 电子时钟的电路原理非常简单,由单片机、实时时钟模块、数码管和蜂鸣器组成。单片机通过时钟信号源和编程逻辑,从实时时钟模块获取时间和日期信息,之后将其显示在数码管上。蜂鸣器用于发出警报声,提醒用户设定的闹钟时间已到达。 3.电路连接 首先,将DS1302实时时钟模块连接到单片机上。SCLK、RST和DAT引脚连接到单片机的P2.2、P2.3和P2.4引脚上。接下来,将4个共阳数码管连接到单片机上。将位置1的数码管连接到P0.1~P0.7引脚,位置2的数码管连接到P0.8~P0.14引脚,位置3的数码管连接到P1.5~P1.1引脚,位置4的数码管连接到P1.0~P1.7引脚。最后,将蜂鸣器连接到单片机的P3.5引脚上。 4.编程实现 使用Keil C编译器和51单片机对程序进行编译。程序的主要功能是获取实时时钟模块的时间和日期信息,并将其显示在数码管上,同时定时发出警报声。 5.总结 基于51单片机的电子时钟是一种简单易用的电子制品,它能够通过使用单片机来实现时间和日期的显示,具有较高的准确性和稳定性。此外,它还有其他功能,如定时闹钟、警报提醒等,能够满足用户的多种需求。对于想要学习单片机编程的人来说,基于51单片机的电子时钟是一个不错的入门项目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值