×
单片机 > 单片机程序设计 > 详情

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

发布时间:2023-03-01 发布时间:
|

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


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

#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++;

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址