实时日历时钟_第1页
实时日历时钟_第2页
实时日历时钟_第3页
实时日历时钟_第4页
实时日历时钟_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、实时日历时钟硬件设计图源程序/*功能介绍: 有时间功能键,增加键,减少键,日期功能键; 可根据不同键调节百年,年,月,日,时,分,秒; 具有闰年调节,日期错误调整等校正功能; 具有按键自校正功能,防止误按键; 有断电保存功能;*/#include<reg52.h>/包含52单片机头文件#define uchar unsigned char #define uint unsigned intbit write=0; /写24C02的标志;sbit sda=P31; sbit scl=P30;void delay0() ; void start() /开始信号sda=1;delay0(

2、);scl=1;delay0();sda=0;delay0();void stop() /停止sda=0;delay0();scl=1;delay0();sda=1;delay0();void respons() /应答uchar i;scl=1;delay0();while(sda=1)&&(i<250)i+;scl=0;delay0();void init_24c02()/IIC初始化函数sda=1;delay0();scl=1;delay0();void write_byte(uchar date)/写一个字节函数uchar i,temp;temp=date;for

3、(i=0;i<8;i+)temp=temp<<1;scl=0; delay0();sda=CY;delay0();scl=1;delay0();scl=0;delay0();sda=1;delay0();uchar read_byte()/读一个字节函数uchar i,k;scl=0;delay0();sda=1;delay0();for(i=0;i<8;i+)scl=1;delay0();k=(k<<1)|sda;scl=0;delay0();return k;void write_add(uchar address,uchar date)/指定地址写一个

4、字节start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();char read_add(uchar address)/指定地址读一个字节uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;/sbit dula=P26

5、; /定义锁存器锁存端/sbit wela=P27;sbit rs=P20; /定义1602液晶RS端sbit lcden=P22;/定义1602液晶LCDEN端sbit rw=P21;sbit s1=P14; /定义按键-功能键sbit s2=P15;/定义按键-增加键sbit s3=P16;/定义按键-减小键sbit s4=P17; /定义按键-riqi功能键sbit rd=P37;sbit beep=P23; /定义蜂鸣器端uchar count,s1num;uint count1;char miao,shi,fen;uchar n,moon,d,t,s4num,m;uchar code

6、 table1=" WELCOME TO USE"uchar code table2=" THE SYSTEM"void delay(uint z) /延时函数uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void di()/蜂鸣器发声函数beep=0;delay(100);beep=1;void write_com(uchar com)/液晶写命令函数rs=0; rw=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(u

7、char date)/液晶写数据函数rs=1;rw=0;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;void write_sfm(uchar add,uchar date)/写时分秒函数uchar shi,ge;shi=date/10;/分解一个2位数的十位和个位ge=date%10;write_com(0x80+0x40+add);/设置显示位置write_date(0x30+shi);/送去液晶显示十位write_date(0x30+ge); /送去液晶显示个位void write_nyr(uchar add,uchar date)/

8、写年月日函数uchar shi,ge;shi=date/10;/分解一个2位数的十位和个位ge=date%10;write_com(0x80+add);/设置显示位置write_date(0x30+shi);/送去液晶显示十位write_date(0x30+ge); /送去液晶显示个位void lcdinit1() uchar a; write_com(0x38); /显示模式设置:16×2显示,5×7点阵,8位数据接口write_com(0x0c); /显示模式设置write_com(0x06); /显示模式设置:光标右移,字符不移write_com(0x01); /清屏

9、幕指令,将以前的显示内容清除write_com(0x80); /设置所要显示字符的位置为第一行第一列 TMOD=0x10; TH1=(65536-50000)/256;/定时器装初值TL1=(65536-50000)%256; EA=1; ET1=1; TR1=1; do a=0; write_com(0x80); /设置所要显示字符的位置为第一行第一列 while(table1a!='0')/只要没有写到结束标志,就继续写 /这是写字符的第一种方法,用while循环。 write_date(table1a); a+; a=0; write_com(0x80+0x40); wh

10、ile(table2a!='0')/只要没有写到结束标志,就继续写 /这是写字符的第一种方法,用while循环。 write_date(table2a); a+; while(count1<=140&s2=1&s3=1); count1=0; TR1=0; void init()/初始化函数/uchar num;rd=0; /软件将矩阵按键第4列一端置低用以分解出独立按键/dula=0;/关闭两锁存器锁存端,防止操作液晶时数码管会出乱码/wela=0;lcden=0;fen=0; /初始化种变量值miao=0;shi=9;m=20;moon=2;d=14;

11、n=14;s4num=0;count=0; count1=0;s1num=0;init_24c02();write_com(0x38);/初始化1602液晶/功能设置write_com(0x0c);/显示开关write_com(0x06);/设置输入方式write_com(0x01);/清屏write_com(0x80);/设置显示初始坐标write_com(0x80+6);/写出时间显示部分的两个冒号write_date('-');delay(5);write_com(0x80+9);write_date('-');delay(5);write_com(0x8

12、0+0x40+6);/写出时间显示部分的两个冒号write_date(':');delay(5);write_com(0x80+0x40+9);write_date(':');delay(5);miao=read_add(1);/首次上电从AT24C02中读取出存储的数据fen=read_add(2);shi=read_add(3);d=read_add(4);moon=read_add(5);n=read_add(6);m=read_add(7);write_nyr(10,d);/分别送去液晶显示write_nyr(7,moon);write_nyr(4,n)

13、;write_nyr(2,m);write_sfm(10,miao);/分别送去液晶显示write_sfm(7,fen);write_sfm(4,shi);TMOD=0x11;/设置定时器0,1工作模式1TH0=(65536-50000)/256;/定时器装初值TL0=(65536-50000)%256; TH1=(65536-50000)/256;/定时器装初值TL1=(65536-50000)%256;EA=1;/开总中断ET0=1;/开定时器0中断 ET1=1;TR0=1;/启动定时器0 TR1=0;void keyscan()/按键扫描函数if(s1=0)delay(5);if(s1=

14、0)/确认功能键被按下s1num+;/功能键按下次数记录while(!s1);/释放确认di();/每当有按键释放蜂鸣器发出滴声s4num=0;/终止日期调节count1=0;if(s1num=1)/第一次被按下时TR0=0; /关闭定时器 TR1=1;write_com(0x80+0x40+11);/光标定位到秒位置 write_com(0x0f);if(s1num=2)/第二次按下光标闪烁定位到分钟位置write_com(0x80+0x40+8);if(s1num=3)/第三次按下光标闪烁定位到小时位置write_com(0x80+0x40+5);if(s1num=4)/第四次按下s1nu

15、m=0;/记录按键数清零write_com(0x0c);/取消光标闪烁TR0=1;/启动定时器使时钟开始走 TR1=0; count1=0; if(s1num!=0)/只有功能键被按下后,增加和减小键才有效if(s2=0)delay(5);if(s2=0)/增加键确认被按下while(!s2);/按键释放di();/每当有按键释放蜂鸣器发出滴声 count1=0;if(s1num=1)/若功能键第一次按下miao+; /则调整秒加1if(miao>=60)/若满60后将清零miao=0;write_sfm(10,miao);/每调节一次送液晶显示一下write_com(0x80+0x40

16、+11);/显示位置重新回到调节处write_add(1,miao);/数据改变立即存入24C02if(s1num=2)/若功能键第二次按下fen+;/则调整分钟加1if(fen>=60)/若满60后将清零fen=0;write_sfm(7,fen);/每调节一次送液晶显示一下write_com(0x80+0x40+8);/显示位置重新回到调节处write_add(2,fen);/数据改变立即存入24C02if(s1num=3)/若功能键第三次按下shi+;/则调整小时加1if(shi>=24)/若满24后将清零shi=0;write_sfm(4,shi);/每调节一次送液晶显示一

17、下write_com(0x80+0x40+5);/显示位置重新回到调节处write_add(3,shi);/数据改变立即存入24C02if(s3=0)delay(5);if(s3=0)/确认减小键被按下while(!s3);/按键释放di();/每当有按键释放蜂鸣器发出滴声 count1=0;if(s1num=1)/若功能键第一次按下miao-;/则调整秒减1if(miao=-1)/若减到负数则将其重新设置为59miao=59;write_sfm(10,miao);/每调节一次送液晶显示一下write_com(0x80+0x40+11);/显示位置重新回到调节处write_add(1,miao

18、);/数据改变立即存入24C02if(s1num=2)/若功能键第二次按下fen-;/则调整分钟减1if(fen=-1)/若减到负数则将其重新设置为59fen=59;write_sfm(7,fen);/每调节一次送液晶显示一下write_com(0x80+0x40+8);/显示位置重新回到调节处write_add(2,fen);/数据改变立即存入24C02if(s1num=3)/若功能键第二次按下shi-;/则调整小时减1if(shi=-1)/若减到负数则将其重新设置为23shi=23;write_sfm(4,shi);/每调节一次送液晶显示一下write_com(0x80+0x40+5);/

19、显示位置重新回到调节处write_add(3,shi);/数据改变立即存入24C02/*时间调整*/闰年判断uchar nian(uchar n)uchar y;if(n%400=0)y=1;else if(n%100=0)y=0;else if(n%4=0)y=1;else y=0;return y;/月天数判断uchar m_tian(uchar moon)uchar y,tian,nm;nm=n+m*100;y=nian(nm);if(moon=2)if(y=0)tian=28;else tian=29;else if(moon=4|moon=6|moon=9|moon=11)tian=

20、30;else tian=31;return tian;/键盘扫描1void keyscan1()if(s4=0)/日期功能键实现delay(5);if(s4=0)s4num+;/s4按下的次数while(!s4);di();s1num=0;/终止时间调节 count1=0;switch(s4num)case 1:TR0=0; TR1=1;write_com(0x80+11);write_com(0x0f);/光标显示并闪烁break;case 2:write_com(0x80+8);break;case 3:write_com(0x80+5);break;case 4:write_com(0

21、x80+3);break;case 5:s4num=0;write_com(0x0c);/光标不再闪烁TR0=1; TR1=0; count=0;break;/日期调整if(s4num!=0)if(s2=0)delay(5);if(s2=0)/时间增加调整while(!s2);di(); count1=0;if(s4num=1)d+;t=m_tian(moon);if(d>t)d=1;write_nyr(10,d);write_com(0x80+11);write_add(4,d);if(s4num=2)moon+;if(moon>=13)moon=1;write_nyr(7,mo

22、on);write_com(0x80+8);write_add(5,moon);if(s4num=3)n+;if(n>=100)n=0;write_nyr(4,n);write_com(0x80+5);write_add(6,n);if(s4num=4)m+;if(m>=100)m=0;write_nyr(2,m);write_com(0x80+3);write_add(7,m);if(s3=0)/时间减少调整delay(5);if(s3=0)while(!s3);di(); count1=0;if(s4num=1)t=m_tian(moon); if(d>t) d=t+1;

23、if(d=1)d=t+1; d-; write_nyr(10,d);write_com(0x80+11);write_add(4,d);if(s4num=2)if(moon>13) moon=13; if(moon=1)moon=13;moon-;write_nyr(7,moon);write_com(0x80+8);write_add(5,moon);if(s4num=3) if(n>100) n=100;if(n=0)n=100;n-;write_nyr(4,n);write_com(0x80+5);write_add(6,n);if(s4num=4)if(m>100)

24、m=100;if(m=0)m=100;m-;write_nyr(2,m);write_com(0x80+3);write_add(7,m);void main()/主函数 lcdinit1();init();/首先初始化各数据 while(1)/进入主程序大循环keyscan();/不停的检测按键是否被按下keyscan1();void timer0() interrupt 1/定时器0中断服务程序TH0=(65536-50000)/256;/再次装定时器初值TL0=(65536-50000)%256;count+;/中断次数累加if(count=18) /20次50毫秒为1秒count=0;miao+;if(miao>=60)/秒加到60则进位分钟miao=0;/同时秒数清零fen+;if(fen&g

温馨提示

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

评论

0/150

提交评论