标题:
基于51单片机的万年历程序 一晚上误差差不多十二秒
[打印本页]
作者:
YSG
时间:
2019-3-16 13:52
标题:
基于51单片机的万年历程序 一晚上误差差不多十二秒
基于51单片机的万年历,电路很简单,程序三百多行。。可调时,走了一晚上误差差不多十二秒。有兴趣的可以下载来做做,闹钟的那部分代码懒得写了有兴趣的小伙伴可以加上去哦
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
原理图.png
(103.84 KB, 下载次数: 72)
下载附件
2019-3-16 13:46 上传
0.png
(9.46 KB, 下载次数: 65)
下载附件
2019-3-16 17:40 上传
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^7;
sbit RW=P2^6;
sbit EN=P2^5;
sbit buzzer=P2^4;
sbit DU=P2^0;
sbit WE=P2^1;
//*************************按键*************************
sbit key1=P1^0; //设置键*************
sbit key2=P1^4; //按键加***********
sbit key3=P3^0; //按键减*************
uchar code table[]="2019_03_07 THR";
uchar code table1[]="13:14:20";
uchar code table2[]="SUNMONTUSWENTHRFRISAT";
uchar code table3[]=">_<[]=_=";
uchar shi=15,fen=52,miao=0,time=0,week=4,ri=7,yue=3,nian=19,shiji=20;
uchar keyln;
//***********************延时函数***********************
void delay(uchar z)
{
uchar x;
while(z--)
{
for(x=110;x>0;x--);
}
}
//*********************写指令函数************************
void write_com(uchar com)
{
RS=0;
RW=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
//**********************写数据函数**********************
void write_date(uchar date)
{
RS=1;
RW=0;
P0=date;
delay(5);
EN=1;
delay(5);
EN=0;
}
//*********************初始化函数************************
void init()
{
uchar num;
EN=0;
RS=0;
RW=0;
write_com(0x38); //液晶工作模式
write_com(0x0c); //开显示不显示光标
write_com(0x06); //屏幕不移动,光标自右移动
write_com(0x01); //清屏
write_com(0x80+1); //从第二个开始
for(num=0;num<14;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40+4);
for(num=0;num<8;num++)
{
write_date(table1[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<4;num++)
{
write_date(table3[num]);
delay(5);
}
write_com(0x80+0x40+0x0c);
for(num=4;num<8;num++)
{
write_date(table3[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-18451)/256;
TL0=(65536-18451)%256;
EA=1;
ET0=1;
TR0=1;
}
//*******************时分秒处理及显示函数*****************
void jishi(uchar add,uchar haha)
{
uchar i,j;
i=haha/10;
j=haha%10;
write_com(0x80+0x40+add);
write_date(0x30+j);
write_com(0x80+0x40+add-1);
write_date(0x30+i);
}
//*****************日,月,年,世纪处理及显示函数*********
void qingchun(uchar add,uchar haha)
{
uchar i,j;
i=haha/10;
j=haha%10;
write_com(0x80+add);
write_date(0x30+j);
write_com(0x80+add-1);
write_date(0x30+i);
}
//*********************星期显示函数***********************
void xingqi(uchar z)
{
write_com(0x80+0x0c);
write_date(table2[3*z]);
write_com(0x80+0x0d);
write_date(table2[3*z+1]);
write_com(0x80+0x0e);
write_date(table2[3*z+2]);
}
//**********************闰年判断函数*************
uchar nianer(uchar b,uchar c)
{
uchar d;
if(((c*100+b)%4==0&&(c*100+b!=0)||(c*100+b)%4==0))
d=1;
else
d=0;
return d;
}
//************************调时函数***************
void keyscan()
{
if(key1==0)
{
delay(1);
if(key1==0)
{
buzzer=0;
delay(5);
buzzer=1;
while(!key1);
keyln++;
if(keyln==9)
keyln=1; // 设置按键八个功能,秒,分,时,星期,日,月,年,返回;
switch(keyln)
{
case 1:write_com(0x80+0x40+0x0b);write_com(0x0f);TR0=0; break; //miao
case 2:write_com(0x80+0x40+8); break; //fen
case 3:write_com(0x80+0x40+5); break; //shi
case 4:write_com(0x80+0x0e); break; //week
case 5:write_com(0x80+0x0a); break; //ri
case 6:write_com(0x80+0x07); break; //yue
case 7:write_com(0x80+0x04); break; //nian
case 8:write_com(0x0c); TR0=1; break; //fanhui
}
}
}
if(keyln!=0)
{
if(key3==0) //下调键
{
delay(1);
if(key3==0)
{
buzzer=0;
delay(5);
buzzer=1;
while(!key3);
switch(keyln)
{
case 1:miao--;
if(miao==60) miao=0;
jishi(11,miao);break;
case 2:fen--;
if(fen==60) fen=0;
jishi(8,fen);break;
case 3:shi--;
if(shi==24) shi=0;
jishi(5,shi);break;
case 4:week--;
if(week==8) week=1;
xingqi(week);break;
case 5:ri--;
if(ri==32) ri=1;
qingchun(10,ri);break;
case 6:yue--;
if(yue==13) yue=1;
qingchun(7,yue);break;
case 7:nian--;
if(nian==100) nian=0;
qingchun(4,nian);break;
}
}
}
}
if(keyln!=0)
{
if(key2==0) //上调键
{
delay(1);
if(key2==0)
{
buzzer=0;
delay(5);
buzzer=1;
while(!key2);
switch(keyln)
{
case 1:miao++;
if(miao==60) miao=0;
jishi(11,miao);break;
case 2:fen++;
if(fen==60) fen=0;
jishi(8,fen);break;
case 3:shi++;
if(shi==24) shi=0;
jishi(5,shi);break;
case 4:week++;
if(week==8) week=1;
xingqi(week);break;
case 5:ri++;
if(ri==32) ri=1;
qingchun(10,ri);break;
case 6:yue++;
if(yue==13) yue=1;
qingchun(7,yue);break;
case 7:nian++;
if(nian==100) nian=0;
qingchun(4,nian);break;
}
}
}
}
}
//*******************每月天数=_=****************
uchar yueer(uchar e)
{
uchar f;
switch(e)
{
case 1:f=31;break;
case 2:f=28;break;
case 3:f=31;break;
case 4:f=30;break;
case 5:f=31;break;
case 6:f=30;break;
case 7:f=31;break;
case 8:f=31;break;
case 9:f=30;break;
case 10:f=31;break;
case 11:f=30;break;
case 12:f=31;break;
default: f=0;break;
}
return f;
}
//******************闹钟************************
//*********************大哥大*******************
void main()
{
DU=0;
WE=0;
init();
while(1)
{
keyscan();
if(time==50)
{
time=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
}
jishi(11,miao);
if(fen>=60)
{
fen=0;
shi++;
}
jishi(8,fen);
if(shi>=24)
{
shi=0;
week++;
ri++;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
项目训练.zip
(66.74 KB, 下载次数: 22)
2019-3-16 13:51 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1