51单片机简易数字钟设计

小学期课程设计的一个小作品,肝了16个小时。这是我第一次能够独立完成课程设计。(以前都是靠别人带)不过首先我选的题目比较简单,再加上老师说我的数字钟没有用RTC,这是一个极大的扣分点。所以最终老师只给打了个D+。D+就是65到70的水平吧。

首先来演示下。(本次课设用的普中开发板。)

通电,下载程序后,数字钟从00:00:00开始计时:

51单片机简易数字钟设计_第1张图片

 

按K1加一分钟,K2加一小时,K3加一秒。

51单片机简易数字钟设计_第2张图片

 

按K4切换模式,下一个模式是闹钟,(其实是倒计时读秒,到00:00:00蜂鸣器响起)同样按K1,K2,K3调整时间,如果我按下K1,蜂鸣器将在1分钟后响起。

51单片机简易数字钟设计_第3张图片

 

接下来还有秒表模式。(老师说我的作品只有这个功能做的亮眼一点)

按K4切换至秒表。为了区分我把秒表的数字间隔改了一下。

51单片机简易数字钟设计_第4张图片

 

按下S1开始计时,再按一次S1就暂停计时。

51单片机简易数字钟设计_第5张图片

 

然后按下S2可以将秒表数字清零。

主要功能就这么多,接下来展示下代码作为参考。

#include 
#include
sbit u5A = P2^2;
sbit u5B = P2^3;
sbit u5C = P2^4;
sbit beep=P2^5;
sbit AddHour=P3^0;//加一小时
sbit AddMin=P3^1;//加一分钟
char num=0;//时钟计数
char NewNum=0;//闹钟计数
char Pattern=0;//模式计数
char SecCount=0;//秒表启动/暂停控制计数
unsigned char Nixie[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f};//数码管0~9
//时钟用					
unsigned char i = 0;//秒(个位)
unsigned char k = 0;//秒(十位)
unsigned char l = 0;//分(个位)
unsigned char m = 0;//分(十位)
unsigned char n = 0;//时(个位)
unsigned char z = 0;//时(十位)
//闹钟用
unsigned char x = 0;//秒(个位)
unsigned char c = 0;//秒(十位)
unsigned char v = 0;//分(个位)
unsigned char b = 0;//分(十位)
unsigned char w = 0;//时(个位)
unsigned char q = 0;//时(十位)
//秒表用
unsigned char hg= 0;//毫秒(个位)
unsigned char hs= 0;//毫秒(十位)
unsigned char mg= 0;//秒(个位)
unsigned char ms= 0;//秒(十位)
unsigned char fg= 0;//分(个位)
unsigned char fs= 0;//分(十位)

void Delay10ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 117;
	j = 184;
	do
	{
		while (--j);
	} while (--i);
}

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
					
void Delay400us()		//@12.000MHz
{
	unsigned char i, j;

	i = 5;
	j = 168;
	do
	{
		while (--j);
	} while (--i);
}

void Delay30ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 2;
	j = 95;
	k = 43;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void TimerAndInterruptInit(void)		//定时器0:50毫秒,定时器1:10毫秒@12.000MHz
{		
	TMOD = 0x11;		
	TL0 = 0x01;		
	TH0 = 0x4C;	
  TL1 = 0xF0;
	TH1 = 0xD8;
	TCON = 0x55;
  IE = 0x8F;	
}

void ShowClock()//闹钟显示
{
	unsigned char j;
	beep=0;
	for(j=0;j<8;j++)
	{
		switch(j)
		{
			case 0:u5A=1;u5B=1;u5C=1;break;
			case 1:u5A=0;u5B=1;u5C=1;break;
			case 2:u5A=1;u5B=0;u5C=1;break;
			case 3:u5A=0;u5B=0;u5C=1;break;
			case 4:u5A=1;u5B=1;u5C=0;break;
			case 5:u5A=0;u5B=1;u5C=0;break;
			case 6:u5A=1;u5B=0;u5C=0;break;
			case 7:u5A=0;u5B=0;u5C=0;break;
		}
		if(j==2 || j==5)
		{
		P0=0x40;
		}
		else if(j==7)
		{
			P0=Nixie[x];
		}
		else if(j==6)
		{
			P0=Nixie[c];
		}
		else if(j==4)
		{
			P0=Nixie[v];
		}
		else if(j==3)
		{
			P0=Nixie[b];
		}
		else if(j==1)
		{
			P0=Nixie[w];
		}
		else if(j==0)
		{
			P0=Nixie[q];
		}
		Delay400us();
	}
	if(x==0 && c==0 && v==0 && b==0 && w==0 && q==0)
	{
			beep=1;
		  Delay1ms();
			beep=0;
		  Delay1ms();                     
	}
}
void ShowTime() //时钟显示
{
	unsigned char j;
	beep=0;
	for(j=0;j<8;j++)
	{
		switch(j)
		{
			case 0:u5A=1;u5B=1;u5C=1;break;
			case 1:u5A=0;u5B=1;u5C=1;break;
			case 2:u5A=1;u5B=0;u5C=1;break;
			case 3:u5A=0;u5B=0;u5C=1;break;
			case 4:u5A=1;u5B=1;u5C=0;break;
			case 5:u5A=0;u5B=1;u5C=0;break;
			case 6:u5A=1;u5B=0;u5C=0;break;
			case 7:u5A=0;u5B=0;u5C=0;break;
		}
		if(j==2 || j==5)
		{
		P0=0x40;
		}
		else if(j==7)
		{
			P0=Nixie[i];
		}
		else if(j==6)
		{
			P0=Nixie[k];
		}
		else if(j==4)
		{
			P0=Nixie[l];
		}
		else if(j==3)
		{
			P0=Nixie[m];
		}
		else if(j==1)
		{
			P0=Nixie[n];
		}
		else if(j==0)
		{
			P0=Nixie[z];
		}
		Delay400us();
	}
}

void SecondChronograph() //秒表显示
{
	unsigned char j;
	beep=0;
	for(j=0;j<8;j++)
	{
		switch(j)
		{
			case 0:u5A=1;u5B=1;u5C=1;break;
			case 1:u5A=0;u5B=1;u5C=1;break;
			case 2:u5A=1;u5B=0;u5C=1;break;
			case 3:u5A=0;u5B=0;u5C=1;break;
			case 4:u5A=1;u5B=1;u5C=0;break;
			case 5:u5A=0;u5B=1;u5C=0;break;
			case 6:u5A=1;u5B=0;u5C=0;break;
			case 7:u5A=0;u5B=0;u5C=0;break;
		}
		if(j==2 || j==5)
		{
		P0=0x5C;
		}
		else if(j==7)
		{
			P0=Nixie[hg];
		}
		else if(j==6)
		{
			P0=Nixie[hs];
		}
		else if(j==4)
		{
			P0=Nixie[mg];
		}
		else if(j==3)
		{
			P0=Nixie[ms];
		}
		else if(j==1)
		{
			P0=Nixie[fg];
		}
		else if(j==0)
		{
			P0=Nixie[fs];
		}
		Delay400us();
	}
}

void SecondChronographSet() //秒表开启/暂停,清零控制
{
	P1=0x7F;
	if(P1!=0x7F)
	{
		Delay10ms();
		if(P1==0x77)
		{
			SecCount=!SecCount;
		}
		else if(P1==0x7B)
		{
			hg= 0;
			hs= 0;
			mg= 0;
			ms= 0;
			fg= 0;
			fs= 0;
		}
	}
	while(P1!=0x7F);
}
void HourSet() //加一小时
{
	if(AddHour==0)
	{
		if(Pattern==0)
		{
			Delay30ms();
			if(n<9)
			{
				n++;
				if(z==2 && n==4)
				{
					n=0;
					z=0;
				}
			}
			else
			{
				n=0;
				if(z<2)
				{
					z++;
				}
			}
		}
		else if(Pattern==1)
		{
			Delay30ms();
			if(w<9)
			{
				w++;
				if(q==2 && w==4)
				{
					q=0;
					w=0;
				}
			}
			else
			{
				w=0;
				if(q<2)
				{
					q++;
				}
			}
		}
	}
}
void MinSet()//加一分钟
{
	if(AddMin==0)
	{
		if(Pattern==0)
		{
			Delay30ms();
			if(l<9)
			{
				l++;
			}
			else
			{
				l=0;
				if(m<5)
				{
					m++;
				}
				else
				{
					m=0;
				}
			}
		}
		else if(Pattern==1)
		{
			Delay30ms();
			if(v<9)
			{
				v++;
			}
			else
			{
				v=0;
				if(b<5)
				{
					b++;
				}
				else
				{
					b=0;
				}
			}
		}
	}
}
void main()
{
	beep=0;
	TimerAndInterruptInit();
	while(1)//模式0:时间,模式1:闹钟,模式2:秒表
	{
		if(Pattern==2)
		{
			SecondChronograph();
			SecondChronographSet();
		}
		else if(Pattern==0)
		{
			ShowTime();
		}
		else if(Pattern==1)
		{
			ShowClock();
		}
		HourSet();
		MinSet();
	}
}

void TimeAndClockGoes() interrupt 1//时间流动和闹钟运行
{
	TL0 = 0x01;		
	TH0 = 0x4C;
	num=num+1;
	NewNum+=1;
	if (num==20)
	{
		if(i<9)
		{
			i++;
		}
		else
		{
			i=0;
			if(k<5)
			{
				k++;
			}
			else
			{
				k=0;
				if(l<9)
				{
					l++;
				}
				else
				{
					l=0;
					if(m<5)
					{
						m++;
					}
					else
					{
						m=0;
						if(n<9)
						{
							n++;
							if(z==2 && n==4)
							{
								i=0;
								k=0;
								l=0;
								m=0;
								n=0;
								z=0;
							}
						}
						else
						{
							n=0;
							if(z<2)
							{
								z++;
							}
						}
					}
				}
			}
		}
		
		num=0;
	}
	if(NewNum==20)
	{
		if(x>0)
		{
			x--;
		}
		else
		{
			if(c>0)
			{
				c--;
				x=9;
			}
			else
			{
				if(v>0)
				{
					v--;
					c=5;
					x=9;
				}
				else
				{
					if(b>0)
					{
						b--;
						v=9;
						c=5;
						x=9;
					}
					else
					{
						if(w>0)
						{
							w--;
							b=5;
							v=9;
							c=5;
							x=9;
						}
						else
						{
							if(q>0)
							{
								q--;
								w=9;
								b=5;
								v=9;
								c=5;
								x=9;
							}
						}
					}
				}
			}
		}
		NewNum=0;
	}
}

void SecSet() interrupt 0  //加一秒
{
	if(Pattern==0)
	{
		if(i<9)
		{
			i++;
		}
		else
		{
			i=0;
			if(k<5)
			{
				k++;
			}
			else
			{
				k=0;
			}
		}
	}
	else if(Pattern==1)
	{
		if(x<9)
		{
			x++;
		}
		else
		{
			x=0;
			if(c<5)
			{
				c++;
			}
			else
			{
				c=0;
			}
		}
	}
}
void SwitchPattern() interrupt 2 //切换模式
{
	Pattern++;
	if(Pattern>2)
	{
		Pattern=0;
	}
}
void SecondChronographRun() interrupt 3 //秒表运行
{
	TL1 = 0xF0;
	TH1 = 0xD8;
	if(SecCount==1)
	{
		if(hg<9)
		{
			hg++;
		}
		else
		{
			hg=0;
			if(hs<9)
			{
				hs++;
			}
			else
			{
				hs=0;
				if(mg<9)
				{
					mg++;
				}
				else
				{
					mg=0;
					if(ms<5)
					{
						ms++;
					}
					else
					{
						ms=0;
						if(fg<9)
						{
							fg++;
						}
						else
						{
							fg=0;
							if(fs<9)
							{
								fs++;
							}
							else
							{
								fs=0;
							}
						}
					}
				}
			}
		}
	}
}

各位有什么意见欢迎指出。

你可能感兴趣的:(嵌入式学习,51单片机)