基于51单片机的电子日历.docx
- 文档编号:9641228
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:17.62KB
基于51单片机的电子日历.docx
《基于51单片机的电子日历.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子日历.docx(20页珍藏版)》请在冰豆网上搜索。
基于51单片机的电子日历
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLCD_RS=P2^6;
sbitLCD_RW=P2^5;
sbitLCD_EP=P2^7;
sbitSDA=P2^1;
sbitSCL=P2^0;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitbeep=P1^5;
ucharcount=0,s1num=0,week=5;
intsecond,minute,hour,year1=20,year2=10,mouth=12,day=25;
unsignedcharcodemouth_0[]={31,28,31,30,31,30,31,31,30,31,30,31};//设置闰年和非闰年每个月的天数
unsignedcharcodemouth_1[]={31,29,31,30,31,30,31,31,30,31,30,31};
voiddelay0()
{;;}
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddi()
{
beep=0;
delay(100);//扬声器
beep=1;
}
voidstart()//24c02开始信号
{
SDA=1;
delay0();
SCL=1;
delay0();
SDA=0;
delay0();
}
voidstop()//24c02停止信号
{
SDA=0;
delay0();
SCL=1;
delay0();
SDA=1;
delay0();
}
voidrespons()//应答
{
uchari;
SCL=1;
delay0();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay0();
}
voidinit()//I2c初始化
{
SDA=1;
delay0();
SCL=1;
delay0();
}
voidwrite_byte(uchardate)//写一个字节
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay0();
SDA=CY;
delay0();
SCL=1;
delay0();
}
SCL=0;
delay0();
SDA=1;
delay0();
}
ucharread_byte()//读一个字节
{
uchari,k;
SCL=0;
delay0();
SDA=1;
delay0();
for(i=0;i<8;i++)
{
SCL=1;
delay0();
k=(k<<1)|SDA;
SCL=0;
delay0();
}
returnk;
}
voidwrite_add(ucharaddress,uchardate)//指定地址写一个字节
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
ucharread_add(ucharaddress)//指定地址读一个字节
{
uchardate;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
returndate;
}
voidwrite_com(ucharcom)//液晶写命令函数
{
LCD_RS=0;
LCD_RW=0;
LCD_EP=0;
P0=com;
delay0();
LCD_EP=1;
delay(5);
LCD_EP=0;
}
voidwrite_date(uchardate)//液晶写数据函数
{
LCD_RS=1;
LCD_RW=0;
LCD_EP=0;
P0=date;
delay(5);
LCD_EP=1;
delay(5);
LCD_EP=0;
}
voidwrite_sfm(ucharadd,uchardate)//写时分秒函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_nyr(ucharadd,uchardate)//写年、月、日函数
{
charshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_week(charwe)//写星期函数
{
write_com(0x80+12);
switch(we)
{
case1:
write_date('M');
delay0();
write_date('O');
delay0();
write_date('N');
break;
case2:
write_date('T');
delay0();
write_date('U');
delay0();
write_date('E');
break;
case3:
write_date('W');
delay0();
write_date('E');
delay0();
write_date('D');
break;
case4:
write_date('T');
delay0();
write_date('H');
delay0();
write_date('U');
break;
case5:
write_date('F');
delay0();
write_date('R');
delay0();
write_date('I');
break;
case6:
write_date('S');
delay0();
write_date('A');
delay0();
write_date('T');
break;
case7:
write_date('S');
delay0();
write_date('U');
delay0();
write_date('N');
break;
}
}
voidinit1()//初始化函数
{
second=0;
minute=0;
hour=0;
init();
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置显示初始坐标
write_com(0x80+0x40+2);//写出时间显示部分的两个冒号
write_date(':
');
write_com(0x80+0x40+5);
write_date(':
');
write_com(0x80+4);//写出日期显示部分的两个-号
write_date('-');
write_com(0x80+7);
write_date('-');
second=read_add
(1);//首次上电从24C02读取出存储的数据
minute=read_add
(2);
hour=read_add(3);
day=read_add(5);
week=read_add(4);
mouth=read_add(6);
year2=read_add(7);
write_sfm(6,second);//分别送去液晶显示
write_sfm(3,minute);
write_sfm(0,hour);
write_nyr(0,year1);
write_nyr(2,year2);
write_nyr(8,day);
write_nyr(5,mouth);
write_week(week);
}
voidkeyscan()
{intyear=year1*100+year2;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!
s1);
di();
switch(s1num)
{//光标显示位置
case1:
TR0=0;
write_com(0x80+0x40+6);
write_com(0x0f);
break;
case2:
write_com(0x80+0x40+3);
break;
case3:
write_com(0x80+0x40+0);
break;
case4:
write_com(0x80+12);
break;
case5:
write_com(0x80+8);
break;
case6:
write_com(0x80+5);
break;
case7:
write_com(0x80+2);
break;
case8:
s1num=0;
TR0=1;
write_com(0x0c);
break;
}
}
}
if(s1num!
=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
di();
switch(s1num)
{
case1:
second++;
if(second==60)
second=0;
write_sfm(6,second);
write_com(0x80+0x40+6);
write_add(1,second);
break;
case2:
minute++;
if(minute==60)
minute=0;
write_sfm(3,minute);
write_com(0x80+0x40+3);
write_add(2,minute);
break;
case3:
hour++;
if(hour==24)
hour=0;
write_sfm(0,hour);
write_com(0x80+0x40+0);
write_add(3,hour);
break;
case4:
week++;
if(week>7)
week=1;
write_week(week);
write_add(4,week);
break;
case5:
day++;
if(year%4==0||(year%100==0&&year%400==0))//判断是否为闰年
{
if(day>mouth_1[mouth-1])//判断是否大于当前月的天数,是则将天数置1
day=1;
}
elseif(day>mouth_0[mouth-1])//不是闰年,判断是否大于当前月的天数,是则置1
day=1;
write_nyr(8,day);
write_add(5,day);
break;
case6:
mouth++;
if(mouth>12)
mouth=1;
write_nyr(5,mouth);
write_add(6,mouth);
break;
case7:
year2++;
if(year2>99)
{
year2=0;
year1++;
write_nyr(0,year1);
write_add(8,year1);
}
write_nyr(2,year2);
write_add(7,year2);
break;
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
di();
switch(s1num)
{
case1:
second--;
if(second<0)
second=59;
write_sfm(6,second);
write_com(0x80+0x40+6);
write_add(1,second);
break;
case2:
minute--;
if(minute<0)
minute=59;
write_sfm(3,minute);
write_com(0x80+0x40+3);
write_add(2,minute);
break;
case3:
hour--;
if(hour<0)
hour=23;
write_sfm(0,hour);
write_com(0x80+0x40+0);
write_add(3,hour);
break;
case4:
week--;
if(week==0)
week=7;
write_week(week);
write_add(4,week);
break;
case5:
day--;
if(year%4==0||(year%100==0&&year%400==0))//判断是否为闰年
{
if(day==0)
day=mouth_1[mouth-1];
}
elseif(day==0)
day=mouth_0[mouth-1];
write_nyr(8,day);
write_add(5,day);
break;
case6:
mouth--;
if(mouth==0)
mouth=12;
write_nyr(5,mouth);
write_add(6,mouth);
break;
case7:
year2--;
if(year2<0)
{
year2=99;
year1--;
write_nyr(0,year1);
write_add(8,year1);
}
write_nyr(2,year2);
write_add(7,year1);
break;
}
}
}
}
}
voidmain()
{
init1();
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
IE=0x82;
TR0=1;
while
(1)
keyscan();
}
voidtime0()interrupt1
{
intyear=year1*100+year2;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week>7)
week=1;
write_week(week);
write_add(4,week);
if(year%4==0||(year%100==0&&year%400==0))//判断是否为闰年
{
if(day>mouth_1[mouth-1])//判断天数是否大于当前这个月的天数,是则将天数置1
{
day=1;
mouth++;
if(mouth>12)
{
mouth=1;
year2++;
if(year2>100)
{
year1++;
write_nyr(0,year1);
}
write_nyr(2,year2);
}
write_nyr(5,mouth);
}
write_nyr(8,day);
}
elseif(day>mouth_0[mouth-1])
{
day=1;
mouth++;
if(mouth>12)
{mouth=1;
year2++;
if(year2==100)
{
year2=0;
year1++;
write_nyr(0,year1);
}
}
write_nyr(2,year2);
write_add(7,year2);
write_nyr(5,mouth);
write_add(6,mouth);
}
write_nyr(8,day);
write_add(5,day);
}
write_sfm(0,hour);
write_add(3,hour);
}
write_sfm(3,minute);
write_add(2,minute);
}
write_sfm(6,second);
write_add(1,second);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 电子 日历