基于51单片机的电子日历.docx

上传人:b****7 文档编号:15862103 上传时间:2023-07-08 格式:DOCX 页数:20 大小:17.14KB
下载 相关 举报
基于51单片机的电子日历.docx_第1页
第1页 / 共20页
基于51单片机的电子日历.docx_第2页
第2页 / 共20页
基于51单片机的电子日历.docx_第3页
第3页 / 共20页
基于51单片机的电子日历.docx_第4页
第4页 / 共20页
基于51单片机的电子日历.docx_第5页
第5页 / 共20页
基于51单片机的电子日历.docx_第6页
第6页 / 共20页
基于51单片机的电子日历.docx_第7页
第7页 / 共20页
基于51单片机的电子日历.docx_第8页
第8页 / 共20页
基于51单片机的电子日历.docx_第9页
第9页 / 共20页
基于51单片机的电子日历.docx_第10页
第10页 / 共20页
基于51单片机的电子日历.docx_第11页
第11页 / 共20页
基于51单片机的电子日历.docx_第12页
第12页 / 共20页
基于51单片机的电子日历.docx_第13页
第13页 / 共20页
基于51单片机的电子日历.docx_第14页
第14页 / 共20页
基于51单片机的电子日历.docx_第15页
第15页 / 共20页
基于51单片机的电子日历.docx_第16页
第16页 / 共20页
基于51单片机的电子日历.docx_第17页
第17页 / 共20页
基于51单片机的电子日历.docx_第18页
第18页 / 共20页
基于51单片机的电子日历.docx_第19页
第19页 / 共20页
基于51单片机的电子日历.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机的电子日历.docx

《基于51单片机的电子日历.docx》由会员分享,可在线阅读,更多相关《基于51单片机的电子日历.docx(20页珍藏版)》请在冰点文库上搜索。

基于51单片机的电子日历.docx

基于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);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2