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

来源:互联网 发布:金山强力卸载软件 编辑:程序博客网 时间:2024/04/30 15:45

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

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 charchar 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++;} 


 

 

原创粉丝点击