单片机实现万年历程序.doc_第1页
单片机实现万年历程序.doc_第2页
单片机实现万年历程序.doc_第3页
单片机实现万年历程序.doc_第4页
单片机实现万年历程序.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机实现万年历 利用AT89S52单片机的P0口来和另外几个口来控制1602液晶的显示和P1口还有其它口来控制ds12887时钟芯片。设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键,另外两个用来调节时间的增减。 原理图: pcb图: 源程序: #include #define uint unsigned int #define uchar unsigned char sbit beep=P20;/蜂鸣器控制口 sbit timeadd=P21;/调节时间加 sbit timesub=P22;/调节时间减 sbit timeclk=P23;/闹钟设定键 sbit timefun=P24;/时间设定键 sbit lcdrs=P25;/液晶的命令和数据控制口 sbit ledrw=P26;/液晶的写数据口 sbit lcden=P27;/液晶显示模块的使能端 sbit timeds=P33;/时钟芯片地址闸 sbit timerw=P34;/时钟芯片读写 sbit timeas=P35;/时钟芯片地址闸 sbit timeen=P36;/时钟芯片片选 uchar code table=20- week ; uchar code table1= :;/要显示的字符串 char num,shi,fen,miao,nian=2000,yue,ri,week,numfun,anumfun,flag,flag1; uchar leap; void delay(uint x) uchar i,j; for(i=x;i0;i-) for(j=110;j0;j-); void didi() beep=0; delay(1000); beep=1; delay(1000); void write_com(uchar com) lcdrs=0; P0=com; delay(5); lcden=1; delay(20); lcden=0; void write_date(uchar date) lcdrs=1; P0=date; delay(5); lcden=1; delay(20); lcden=0; void write_sfm(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); void write_nyr(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge); void write_zhou(uchar add,uchar date) write_com(0x80+add); write_date(0x30+date); void write_ds(uchar add,uchar date) timeen=0; timeas=1; timeds=1; timerw=1; P1=add; timeas=0; timerw=0; P1=date; timerw=1; timeas=1; timeen=1; uchar read_ds(uchar add) uchar ds_date; timeas=1; timeds=1; timerw=1; timeen=0; P1=add; timeas=0; timeds=0; P1=0xff; ds_date=P1; timeds=1; timeas=1; timeen=1; return ds_date; void keyscan() if(flag1=1)/用来关闭闹钟铃声 if(timeadd=0) delay(5); if(timeadd=0) while(!timeadd=0); flag1=0; if(timesub=0) delay(5); if(timesub=0) while(!timesub=0); flag1=0; if(timefun=0) delay(5); if(timefun=0) while(!timefun); flag=1; numfun+; if(numfun=1) write_com(0x80+0x40+0x0a); write_com(0x0f); if(numfun=2) write_com(0x80+0x40+0x07); write_com(0x0f); if(numfun=3) write_com(0x80+0x40+0x04); write_com(0x0f); if(numfun=4) write_com(0x80+0x0f); write_com(0x0f); if(numfun=5) write_com(0x80+0x09); write_com(0x0f); if(numfun=6) write_com(0x80+0x06); write_com(0x0f); if(numfun=7) write_com(0x80+0x03); write_com(0x0f); if(numfun=8) numfun=0; flag=0; if(numfun!=0) if(timeadd=0) delay(5); while(!timeadd); if(numfun=1) miao+; if(miao=60) miao=0; write_sfm(9,miao); write_com(0x80+0x40+9); write_ds(0,miao); if(numfun=2) fen+; if(fen=60) fen=0; write_sfm(6,fen); write_com(0x80+0x40+6); write_ds(2,fen); if(numfun=3) shi+; if(shi=24) shi=0; write_sfm(3,shi); write_com(0x80+0x40+3); write_ds(4,shi); if(numfun=4) week+; if(week=8) week=1; write_zhou(0x0f,week); write_com(0x80+0x0f); write_ds(6,week); if(numfun=5) if(nian=0) switch(yue) case 1:ri+;if(ri=32) ri=1;break; case 2:ri+;if(ri=30) ri=1;break; case 3:ri+;if(ri=32) ri=1;break; case 4:ri+;if(ri=31) ri=1;break; case 5:ri+;if(ri=32) ri=1;break; case 6:ri+;if(ri=31) ri=1;break; case 7:ri+;if(ri=32) ri=1;break; case 8:ri+;if(ri=32) ri=1;break; case 9:ri+;if(ri=31) ri=1;break; case 10:ri+;if(ri=32) ri=1;break; case 11:ri+;if(ri=31) ri=1;break; case 12:ri+;if(ri=32) ri=1;break; else if(leap&yue=2) ri+; if(ri=30) ri=1; else if(yue=2&leap=0) ri+; if(ri=29) ri=1; else switch(yue) case 1:ri+;if(ri=32) ri=1;break; case 3:ri+;if(ri=32) ri=1;break; case 4:ri+;if(ri=31) ri=1;break; case 5:ri+;if(ri=32) ri=1;break; case 6:ri+;if(ri=31) ri=1;break; case 7:ri+;if(ri=32) ri=1;break; case 8:ri+;if(ri=32) ri=1;break; case 9:ri+;if(ri=31) ri=1;break; case 10:ri+;if(ri=32) ri=1;break; case 11:ri+;if(ri=31) ri=1;break; case 12:ri+;if(ri=32) ri=1;break; write_nyr(8,ri); write_com(0x80+0x08); write_ds(7,ri); if(numfun=6) yue+; if(yue=13) yue=0; write_nyr(5,yue); write_com(0x80+0x05); write_ds(8,yue); if(numfun=7) nian+; if(nian=100) nian=0; leap=nian%4=0&nian%100!=0; write_nyr(2,nian); write_com(0x80+2); write_ds(9,nian); if(timesub=0) delay(5); while(!timesub); if(numfun=1) miao-; if(miao=-1) miao=59; write_sfm(9,miao); write_com(0x80+0x40+9); write_ds(0,miao); if(numfun=2) fen-; if(fen=-1) fen=59; write_sfm(6,fen); write_com(0x80+0x40+6); write_ds(2,fen); if(numfun=3) shi-; if(shi=-1) shi=23; write_sfm(3,shi); write_com(0x80+0x40+3); write_ds(4,shi); if(numfun=4) week-; if(week=0) week=7; write_zhou(0x0f,week); write_com(0x80+0x0f); write_ds(6,week); if(numfun=5) if(nian=0) switch(yue) case 1:ri-;if(ri=0) ri=31;break; case 2:ri-;if(ri=0) ri=29;break; case 3:ri-;if(ri=0) ri=31;break; case 4:ri-;if(ri=0) ri=30;break; case 5:ri-;if(ri=0) ri=31;break; case 6:ri-;if(ri=0) ri=30;break; case 7:ri-;if(ri=0) ri=31;break; case 8:ri-;if(ri=0) ri=31;break; case 9:ri-;if(ri=0) ri=30;break; case 10:ri-;if(ri=0) ri=31;break; case 11:ri-;if(ri=0) ri=30;break; case 12:ri-;if(ri=0) ri=31;break; else if(leap&yue=2) ri-; if(ri=0) ri=29; else if(yue=2&leap=0) ri-; if(ri=0) ri=28; else switch(yue) case 1:ri-;if(ri=0) ri=31;break; case 3:ri-;if(ri=0) ri=31;break; case 4:ri-;if(ri=0) ri=30;break; case 5:ri-;if(ri=0) ri=31;break; case 6:ri-;if(ri=0) ri=30;break; case 7:ri-;if(ri=0) ri=31;break; case 8:ri-;if(ri=0) ri=31;break; case 9:ri-;if(ri=0) ri=30;break; case 10:ri-;if(ri=0) ri=31;break; case 11:ri-;if(ri=0) ri=30;break; case 12:ri-;if(ri=0) ri=31;break; write_nyr(8,ri); write_com(0x80+0x08); write_ds(7,ri); if(numfun=6) yue-; if(yue=-1) yue=12; write_nyr(5,yue); write_com(0x80+0x05); write_ds(8,yue); if(numfun=7) nian-; if(nian=-1) nian=99; leap=nian%4=0&nian%100!=0; write_nyr(2,nian); write_com(0x80+2); write_ds(9,nian); void set_alarm() uchar ashi,afen,amiao; if(timeclk=0)/判断是否按下闹钟设定键 delay(5);/延时消抖 if(timeclk=0) while(!timeclk); anumfun+;/按键次数加1 if(anumfun=1) flag=1; write_com(0x80+0x40+0x0a); write_com(0x0f); if(anumfun=2) flag=1; write_com(0x80+0x40+0x07); write_com(0x0f); if(anumfun=3) flag=1; write_com(0x80+0x40+0x04); write_com(0x0f); if(anumfun=4) flag=0; anumfun=0; if(anumfun!=0) if(timeadd=0)/如果加功能键按下 delay(5); while(!timeadd); if(anumfun=1) /设定秒 amiao+; if(amiao=60) amiao=0; write_sfm(9,amiao); write_com(0x80+0x40+9); write_ds(1,amiao); if(anumfun=2) afen+; if(afen=60) afen=0; write_sfm(6,afen); write_com(0x80+0x40+6); write_ds(3,afen); if(anumfun=3) ashi+; if(ashi=24) ashi=0; write_sfm(3,ashi); write_com(0x80+0x40+3); write_ds(5,ashi); if(anumfun!=0) if(timesub=0) delay(5); while(!timesub); if(anumfun=1) amiao-; if(amiao=-1) amiao=59; write_sfm(9,amiao); write_com(0x80+0x40+9); write_ds(1,amiao); if(anumfun=2) afen-; if(afen=-1) afen=59; write_sfm(6,afen); write_com(0x80+0x40+6); write_ds(3,afen); if(anumfun=3) ashi-; if(ashi=-1) ashi=23; write_sfm(3,ashi); write_com(0x80+0x40+3); write_ds(5,ashi); void init() EA=1;/开总中断 EX0=1;/开外部中断0 IT0=1;/设定触发方式为负跳变沿有效 lcden=0;/选通液晶显示屏 ledrw=0;/设定液晶显示屏的读写方式为读 write_com(0x38);/设置液晶显示模式为16*2显示,5*7点阵,8位数据接口 write_com

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论