利用89c51单片机编写可调万年历

最近需要编写我学单片机一个星期以来最大的一个项目,目前感觉相当有挑战性,题目如下:

1)         项目一(远程时钟控制系统)

项目背景:时间对于每个人都很重要,特别是对于高速发展的今天。每个城市都有中央LED显示,上面一般包含有时间,天气相应的信息。说近一点,比如我们学校体育馆的LED屏。对于这些显示系统,我不可能每次调整信息都爬到那么高的位置去调节。为此,我们需要设计一个远程时钟控制系统。

项目要求:

1,  能够在开发板上的液晶1602上设计出电子钟万年历。

2,  设计串口通信协议。

3,  通过串口协议,能够通过串口将时钟信息发送到PC机上。

4,通过串口协议,设置的时钟的年,月,日,时,分,秒。

5,  通过串口协议,可以向液晶实时动态的发布广告信息,并且在广告与时钟自动切换。

6,  通过串口协议,可以控制液晶上显示的效果,例如,左移右移以及移动的速度。

7,  通过串口协议,设置实时闹钟。

项目说明:

这里对于串口通信协议进行一些说明。串口通信协议就是通过串口实现人机交互的一种功能。这里给大家介绍一种简单实用的协议。大家也可以自己重新设计协议。例如:

我们可以通过在串口输入命令:menu,激活一个控制菜单。菜单内容如下:

【a】       change time //修改系统时间

【b】       ads       //发布广告

【c】       Good look    //修改特效

……..

q quit        //退出

然后输入:a,就可以进入你设计修改系统时间的菜单中,然后你在修改系统时钟菜单中进行系统时钟修改。

为了体现系统的健壮性,大家需要设计防错机制,例如当你输入menu的时候,你输入了menn,那么你的系统应该提示:input error!

除了修改系统时间,时钟可以停止,其他的时候,时钟都必须是运行的

现在只完成成型的万年历部分,如下

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
char shi, fen, miao,yue,ri;
uchar num;
uint count,s1num,nian;
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
uchar code table[]="  2012-11-30";
uchar code table1[]="  23:59:55";
void delay(uint z)	//延时函数
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
void write_com(aa)	 //写命令
{
	rs=0;
	rw=0;
	P0=aa;
	delay(5);
	en=1;
	delay(5);
	en=0;
}
//
void write_data( bb)  //写数据
{
	rs=1;
	rw=0;
	P0=bb;
	delay(5);
	en=1;
	delay(5);
	en=0;
}
void write_sfm(uchar add,uchar bb)	 //写时间
{
	uchar shi,ge;
	shi=bb/10;
	ge=bb%10;
	write_com(0x80+0x40+add);
	write_data(0x30+shi);
	write_data(0x30+ge);
}
void write_yr(uchar add1,uchar bb) //写日期
{
	uchar s,g;
	s=bb/10;
	g=bb%10;
	write_com(0x80+add1);
	write_data(0x30+s);
	write_data(0x30+g);
}
void write_n(uchar add2,uchar bb) //写年
{
	uchar qi,ba,sh,gg;
	qi=bb/1000;
	ba=bb%1000/100;
	sh=bb%100/10;
	gg=bb%10;
	write_com(0x80+add2);
	write_data(0x30+qi);
	write_data(0x30+ba);
	write_data(0x30+sh);
	write_data(0x30+gg);
}
//
void init()			//初始化
{
	miao=55;
	fen=59;
	shi=23;
	nian=2012;
	yue=11;
	ri=30;
	en=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01); 	
	write_com(0x80);
	for(num=0;num<12;num++)
		{
			write_data(table[num]);
			delay(5);
		}
	 write_com(0x80+0x40);
		for(num=0;num<10;num++)
		{
			write_data(table1[num]);
			delay(5);
		}
	
   	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	EA=1;
	ET0=1;
	TR0=1;

}
/

///
void keyscan()		 //调节日期时间
{
	if(s1==0)	
	{
		delay(5);
		if(s1==0)
		{	s1num++;
			while(!s1);
			if(s1num==1)
			{
				TR0=0;
				write_com(0x80+0x40+8);
				write_com(0x0f);
			}
	}
			if(s1num==2)
			{
				write_com(0x80+0x40+5);
			}
			if(s1num==3)
			{
				write_com(0x80+0x40+2);
			}
			if(s1num==4)
			{
				write_com(0x80+10);
			}
			if(s1num==5)
			{
				write_com(0x80+7);
			}
			if(s1num==6)
			{
				write_com(0x80+2);
			}
			if(s1num==7)
			{
				s1num=0;
				write_com(0x0c);
				TR0=1;
			}

				
		}
		if(s1num!=0)
		{
			if(s2==0)
			{
				delay(5);
				if(s2==0)
				{
					while(!s2);
					if(s1num==1)
					{
						miao++;
						if(miao==60)
							miao=0;
						write_sfm(8,miao);
						write_com(0x80+0x40+8);
						
						
					}
					if(s1num==2)
					{
						fen++;
						if(fen==60)
							fen=0;
						write_sfm(5,fen);
						write_com(0x80+0x40+5);
					}
					if(s1num==3)
					{
						shi++;
						if(shi==24)
							shi=0;
						write_sfm(2,shi);
						write_com(0x80+0x40+2);
					}
					if(s1num==4)
					{
						ri++;
						if(ri==31)
							ri=1;
						write_yr(10,ri);
						write_com(0x80+10);
					}
						if(s1num==5)
					{
						yue++;
						if(yue==13)
							yue=1;
						write_yr(7,yue);
						write_com(0x80+7);
					}
						if(s1num==6)
					{
						nian++;
						if(nian==9999)
							nian=1;
						write_n(2,ri);
						write_com(0x80+2);
					}
				}
			}
			if(s3==0)
			{
				delay(5);
				if(s3==0)
				{
					while(!s3);
					if(s1num==1)
					{
						miao--;
						if(miao==-1)
							miao=59;
						write_sfm(8,miao);
						write_com(0x80+0x40+8);
					}
					if(s1num==2)
					{
						fen--;
						if(fen==-1)
							fen=59;
						write_sfm(5,fen);
						write_com(0x80+0x40+5);
					}
					if(s1num==3)
					{
						shi--;
						if(shi==-1)
							shi=23;
						write_sfm(2,shi);
						write_com(0x80+0x40+2);
					}
					if(s1num==4)
					{
						ri--;
						if(ri==0)
							ri=30;
						write_yr(10,ri);
						write_com(0x80+10);
					}
				    if(s1num==5)
					{
						yue--;
						if(yue==0)
							shi=12;
						write_yr(7,yue);
						write_com(0x80+7);
					}
					if(s1num==6)
					{
						nian--;
						if(nian==0)
							nian=1;
						write_n(2,nian);
						write_com(0x80+2);
					}
				}
			}
		}
}
 /
void main()	 //主函数
{
	init();
	while(1) 
	{
		 keyscan();
		 if(count==18)
		{
			count=0;
			miao++;
			if(miao==60)
			{
				miao=0;
				fen++;
				if(fen==60)
				{
					fen=0;
					shi++;
					if(shi==24)
					{
						shi=0;
						ri++;
						if(ri==31)
						{
							ri=1;
							yue++;
							if(yue==13)
							{
								yue=1;
								nian++;
								if(nian==9999)
								{
									nian=0;
							    }
								write_n(2,nian);
						    }
							write_yr(7,yue);
						}
						write_yr(10,ri);
					}
					write_sfm(2,shi);
				}
				write_sfm(5,fen);
			}
			write_sfm(8,miao);	 
		}							
	}
	
}
//
void timer0() interrupt 1 //定时器中断0
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	count++;
						
}	 


 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值