51单片机简单时钟

Posted 一心向月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机简单时钟相关的知识,希望对你有一定的参考价值。

仿真这里插入图片描述
仿真和程序请点这里
提取码:azxy

#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;

sbit P20=P2^0;												//时,分,秒切换
sbit P21=P2^1;												//根据stan的值分别对时,分,秒加一
sbit P22=P2^2;												//根据stan的值分别对时,分,秒减一

u8 code duan[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
				  0x7d,0x07,0x7f,0x6f,0x00,0x40};	        //数码管段选

u8 code wala[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};	//数码管位选
u8 smg_cout[8];
														 
u8 i=0;														//i=1为50ms i=20为1s
u8 hour=0,min=0,s=0;										//时,分,秒

u8 stan=0;													//时间设置
															//stan=0  时间显示
															//stan=1  小时设置
															//stan=2  分钟设置
															//stan=3  秒设置

/*****************************************************
*********************延迟函数*************************
*****************************************************/
void delay(u16 i)	
{
	while(i--);
}
/*****************************************************
*********************中断函数*************************
*****************************************************/
void Timer0Init()		
{
	TMOD=0x01;					
	TH0=(65536-50000)/255;
	TL0=(65536-50000)%255;	
	TR0=1;		
	ET0=1;
	EA=1;
}
/*****************************************************
*******************数码管显示函数*********************
*****************************************************/
void smg_display()
{
	static u8 num=0;
	while(num<8)
	{
		P1=wala[num];
		P0=smg_cout[num];
		num++;
		delay(200);
	}
	if(num==8) num=0;	
}
/*****************************************************
*********************时钟界面显示*********************
*****************************************************/
void clock_display()
{
	if(stan==0)
	{
		smg_cout[7]=duan[hour/10];
		smg_cout[0]=duan[hour%10];
		smg_cout[1]=duan[11];
		smg_cout[2]=duan[min/10];
		smg_cout[3]=duan[min%10];
		smg_cout[4]=duan[11];
		smg_cout[5]=duan[s/10];
		smg_cout[6]=duan[s%10];
		smg_display();
	}
	if(stan==1)
	{
		if(s%2==1)
		{
			smg_cout[7]=duan[hour/10];
			smg_cout[0]=duan[hour%10];
		}
		else
		{
			smg_cout[7]=duan[10];
			smg_cout[0]=duan[10];	
		}
		smg_cout[1]=duan[11];
		smg_cout[2]=duan[min/10];
		smg_cout[3]=duan[min%10];
		smg_cout[4]=duan[11];
		smg_cout[5]=duan[s/10];
		smg_cout[6]=duan[s%10];
		smg_display();	
	}
	if(stan==2)
	{
		if(s%2==1)
		{
			smg_cout[2]=duan[min/10];
			smg_cout[3]=duan[min%10];	
		}
		else
		{
			smg_cout[2]=duan[10];
			smg_cout[3]=duan[10];	
		}
		smg_cout[7]=duan[hour/10];
		smg_cout[0]=duan[hour%10];
		smg_cout[1]=duan[11];
		smg_cout[4]=duan[11];
		smg_cout[5]=duan[s/10];
		smg_cout[6]=duan[s%10];
		smg_display();	
	}
	if(stan==3)
	{
		if(s%2==1)
		{
			smg_cout[5]=duan[s/10];
			smg_cout[6]=duan[s%10];	
		}
		else
		{
			smg_cout[5]=duan[10];
			smg_cout[6]=duan[10];	
		}
		smg_cout[7]=duan[hour/10];
		smg_cout[0]=duan[hour%10];
		smg_cout[1]=duan[11];
		smg_cout[2]=duan[min/10];
		smg_cout[3]=duan[min%10];
		smg_cout[4]=duan[11];
		smg_display();	
	}		
}
/*****************************************************
*********************按键设置时间*********************
*****************************************************/
void key_down()
{
	if(P20==0)
	{
		delay(100);
		if(P20==0)
		{
			stan++;
			if(stan==4) stan=0;
		}
		while(P20==0) clock_display();
	}
	if(P21==0)
	{
		delay(100);
		if(P21==0)
		{
			if(stan==1)
			{
				hour++;
				if(hour==24) hour=0;
			}
			if(stan==2)
			{
				min++;
				if(min==60) min=0;
			}
			if(stan==3)
			{
				s++;
				if(s==60) s=0;
			}
		}
		while(P21==0) clock_display();
	}
	if(P22==0)
	{
		delay(100);
		if(P22==0)
		{
			if(stan==1)
			{
				hour--;
				if(hour==-1) hour=23;
			}
			if(stan==2)
			{
				min--;
				if(min==-1) min=59;
			}
			if(stan==3)
			{
				s--;
				if(s==-1) s=59;
			}
		}
		while(P22==0) clock_display();
	}
}
/*****************************************************
**********************主函数**************************
*****************************************************/
void main()
{
	Timer0Init();
	while(1)
	{
		key_down();
		clock_display();			
	}	
}
/*****************************************************
********************中断服务函数**********************
*****************************************************/
void timer0() interrupt 1
{	i++;
	TH0=(65536-50000)/255;
	TL0=(65536-50000)%255;
	if(i==20)
	{
		i=0;
		s++;
	}
	if(s==60)
	{
		s=0;
		min++;
	}
	if(min==60)
	{
		min=0;
		hour++;
	}
	if(hour==24)
	{
		hour=0;
		min=0;
		s=0;
	}				
}


以上是关于51单片机简单时钟的主要内容,如果未能解决你的问题,请参考以下文章

51单片机简单时钟

基于51单片机+DS1302时钟模块+LCD1602显示

基于51单片机+DS1302时钟模块+LCD1602显示

基于51单片机+DS1302时钟模块+LCD1602显示

时钟程序单片机

单片机时钟程序中Msecond==255啥意思