51单片机实现万年历程序_第1页
51单片机实现万年历程序_第2页
51单片机实现万年历程序_第3页
51单片机实现万年历程序_第4页
51单片机实现万年历程序_第5页
免费预览已结束,剩余13页可下载查看

付费下载

下载本文档

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

文档简介

1、51单片机实现万年历利用AT89S52单片机的P0 口来和另外几个口来限制1602液晶的显示和P1 口还有其它口来限制 ds12887时钟芯片.设置四个按键,1个定义为时间设置功能键,一个定义为闹钟设置功能键, 另外两个用来调节时间的增减.原理图:pcb 图:源程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit beep=P2A0;/Z蜂鸣器限制 口sbit timeadd=P2A1;/Z调节时间加sbit timesub=P2A2;/Z调节时间减sbit timeclk=P2A3

2、;/Z闹钟设定键sbit timefun=P2A4;/Z时间设定键sbit lcdrs=P2A5;/Z液晶的命令和数据限制口sbit ledrw=P2A6;/Z液晶的写数据口sbit lcden=P2A7;/Z液晶显示模块的使能端sbit timeds=P3A3;/Z时钟芯片地址闸sbit timerw=P3A4;/Z时钟芯片读写sbit timeas=P3A5;/Z时钟芯片地址闸sbit timeen=P3A6;/Z时钟芯片片选uchar code table="20- week "uchar code table1=":"/ 要显示的字符申char

3、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;i>0;i-)for(j=110;j>0;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)

4、 (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(

5、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;ti

6、merw=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)(

7、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)

8、; 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

9、+;if(fen=60)fen=O;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)ri=1

10、 ;break;ri=1 ;break;ri=1 ;break;ri=1 ;break;ri=1 ;break;ri=1 ;break;ri=1 ;break;case 1:ri+;if(ri=32)case 2:ri+;if(ri=30)case 3:ri+;if(ri=32)case 4:ri+;if(ri=31)case 5:ri+;if(ri=32)case 6:ri+;if(ri=31)case 7:ri+;if(ri=32)case 8:ri+;if(ri=32) case 9:ri+;if(ri=31)ri=1 ;break;ri=1;break;case 10:ri+;if(r

11、i=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;elseswitch(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+

12、;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;case10:ri+;if(ri=32)ri=1;break;case11:ri+;if(ri=31)ri=1;break;case12:ri+;if(ri=32)ri=1;break;write_nyr(8,ri);write_com(0x80+0x08);write_ds(7,ri);if(nu

13、mfun=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);

14、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+0x

15、0f); 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

16、) 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;elseswitch(yue)(case 1:ri-;if(ri=0) ri=31;break;case 3:ri-;i

17、f(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;case10:ri-;if(ri=0)ri=31;break;case11:ri-;if(ri=0)ri=30;break;case12:ri-;if(ri=0)ri=31;b

18、reak;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

19、,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)fl

20、ag=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+;

21、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(0x

22、80+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;/开外部中断0IT0=1;/设定触发方式为负跳变沿有效lcden=0;/ 选通液晶显示屏ledrw=0;/设定液晶显示屏的读写方式为读write_com(0x38);/设置液晶显示模式为16*2显示,5*7点阵,8位数据接口write_com(0x0c);/ 翻开显示,并使光标不显示也不闪烁write_com(0x06);/ 光标指针每次自动加 1write_co

温馨提示

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

评论

0/150

提交评论