ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:16.88KB ,
资源ID:8761412      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8761412.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(万年历程序.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

万年历程序.docx

1、万年历程序/*功能 :DS1302+lcd1602 万年历时钟1,显示年、月、日、星期、时、分、秒2,DS1302掉电不丢失时间3,按键校准编写者: 温斌编写日期:2011-11-15*/#include#define uchar unsigned char#define uint unsigned intsbit SCLK=P20;sbit IO=P21;sbit RST=P22;sbit lcdrs=P24;sbit lcdrw=P25;sbit lcden=P26;sbit ACC7=ACC7;sbit s1=P10;sbit s2=P11;sbit s3=P12;uchar flag;

2、uchar shi,fen,miao,week,month,year,day;uchar code table=2011-11-14 01;uchar code table1=00:00:00;uchar code add=0x8c,0x88,0x86,0x8a,0x84,0x82,0x80;/* ms级延时子程序*/void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=120;y0;y-);/* DS1302驱动程序部分*/void write_ds1302(uchar add,uchar date) uchar i,temp; RST=0; S

3、CLK=0; RST=1; for(i=0;i=1; SCLK=1; for(i=0;i=1; SCLK=1; RST=0;uchar read_ds1302(uchar add) uchar i,temp,dat,dat1; RST=0; SCLK=0; RST=1; for(i=0;i=1; SCLK=1; for(i=0;i=1; SCLK=0; RST=0; dat=ACC;dat1=dat/16; dat=dat%16; dat=dat+dat1*10; return(dat);/* DS1302初始化*/void init_ds1302() write_ds1302(0x8e,0x

4、00); /禁止写保护 write_ds1302(0x8c,0x11); /年 write_ds1302(0x88,0x11); /月 write_ds1302(0x86,0x14); /日 write_ds1302(0x8A,0x01); /星期 write_ds1302(0x84,0x16); /时 write_ds1302(0x82,0x46); /分 write_ds1302(0x80,0x00); /秒 write_ds1302(0x8e,0x80); /允许写保护/* 读取DS1302各寄存器数据*/void read_time() miao=read_ds1302(0x81);

5、/秒寄存器 fen=read_ds1302(0x83); /分 shi=read_ds1302(0x85); /时 week=read_ds1302(0x8B); /星期 day=read_ds1302(0x87); /日 month=read_ds1302(0x89); /月 year=read_ds1302(0x8d); /年/* LCD1602液晶驱动显示部分*/void write_cmd(uchar cmd) lcdrs=0; /低电平选择指令寄存器 lcdrw=0; lcden=0; P0=cmd; delay(5); lcden=1; lcden=0;void write_dat

6、e(uchar date) lcdrs=1; /高电平选择数据寄存器 lcdrw=0; lcden=0; P0=date; delay(5); lcden=1; lcden=0;void init_lcd() uchar i; write_cmd(0x01);/清屏 write_cmd(0x38);/8位数据位,双行显示,5*7点阵 write_cmd(0x0c);/显示开,光标不显示,不闪烁 write_cmd(0x06);/输入方式从左至右 write_cmd(0x80); for(i=0;i13;i+)write_date(tablei); write_cmd(0xc0); for(i=

7、0;i8;i+)write_date(table1i);/* 数据转换使其正确显示在1602上*/void display_buff(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_cmd(0x80+add); write_date(0x30+shi); write_date(0x30+ge);/* 显示各种数据,年、月、 日、星期、时、分、秒*/void display_time() display_buff(2,year); display_buff(5,month); display_buff(8,da

8、y); display_buff(11,week); display_buff(0x40,shi); display_buff(0x40+3,fen); display_buff(0x40+6,miao);/* 写字符串函数*/void wstring(uchar *s) while(*s) write_date(*s); s+; /* 星期更新*/void week1() write_cmd(0xc0+11); switch(week) case 01:wstring(Mon);break; case 02:wstring(Tus);break; case 03:wstring(Wen);b

9、reak; case 04:wstring(Thu);break; case 05:wstring(Fri);break; case 06:wstring(Sta);break; case 07:wstring(Sun);break; default:break; /* 键盘扫描*/void keyscan() uchar i,temp; if(s1=0) delay(10); if(s1=0) while(!s1); flag+; write_ds1302(0x8e,0x00); /禁止写保护 if(flag=8) flag=0; write_ds1302(0x8e,0x80); /允许写保

10、护 switch(flag) case 1:write_cmd(0x80+3); write_cmd(0x0f);break; case 2:write_cmd(0x80+6); write_cmd(0x0f);break; case 3:write_cmd(0x80+9); write_cmd(0x0f);break; case 4:write_cmd(0x80+12); write_cmd(0x0f);break; case 5:write_cmd(0xc0+1); write_cmd(0x0f);break; case 6:write_cmd(0xc0+4); write_cmd(0x0

11、f);break; case 7:write_cmd(0xc0+7); write_cmd(0x0f);break; default:break; if(s2=0) delay(10); if(s2=0) while(!s2); switch(flag) case 7: miao+; /设置键按动1次,调秒 if(miao=60) miao=0; display_buff(0x40+6,miao); temp=(miao)/10*16+(miao)%10; write_ds1302(0x80,temp); write_cmd(0xc0+7); break; case 6: fen+; if(f

12、en=60) fen=0; display_buff(0x40+3,fen); temp=(fen)/10*16+(fen)%10; write_ds1302(0x82,temp); write_cmd(0xc0+4); break; case 5: shi+; if(shi=24) shi=0; display_buff(0x40,shi); temp=(shi)/10*16+(shi)%10; write_ds1302(0x84,temp); write_cmd(0xc0+1); break; case 4: week+; if(week=8) week=1; display_buff(1

13、1,week); temp=(week)/10*16+(week)%10; write_ds1302(0x8a,temp); week1(); write_cmd(0x80+12); break; case 3: day+; if(day=32) day=1; display_buff(8,day); temp=(day)/10*16+(day)%10; write_ds1302(0x86,temp); write_cmd(0x80+9); break; case 2: month+; if(month=13) month=1; display_buff(5,month); temp=(mon

14、th)/10*16+(month)%10; write_ds1302(0x88,temp); write_cmd(0x80+6); break; case 1: year+; if(year=100) year=0; display_buff(2,year); temp=(year)/10*16+(year)%10; write_ds1302(0x8c,temp); write_cmd(0x80+3); break; default:break; if(s3=0) delay(10); if(s3=0) while(!s3); switch(flag) case 7: miao-; /设置键按

15、动1次,调秒 if(miao=0) miao=59; display_buff(0x40+6,miao); temp=(miao)/10*16+(miao)%10; write_ds1302(0x80,temp); write_cmd(0xc0+7); break; case 6: fen-; if(fen=0) fen=59; display_buff(0x40+3,fen); temp=(fen)/10*16+(fen)%10; write_ds1302(0x82,temp); write_cmd(0xc0+4); break; case 5: shi-; if(shi=0) shi=59

16、; display_buff(0x40,shi); temp=(shi)/10*16+(shi)%10; write_ds1302(0x84,temp); write_cmd(0xc0+1); break; case 4: week-; if(week=0) week=7; display_buff(11,week); temp=(week)/10*16+(week)%10; write_ds1302(0x8a,temp); week1(); write_cmd(0x80+12); break; case 3: day-; if(day=0) day=31; display_buff(8,da

17、y); temp=(day)/10*16+(day)%10; write_ds1302(0x86,temp); write_cmd(0x80+9); break; case 2: month-; if(month=0) month=12; display_buff(5,month); temp=(month)/10*16+(month)%10; write_ds1302(0x88,temp); write_cmd(0x80+6); break; case 1: year-; if(year=0) year=20; display_buff(2,year); temp=(year)/10*16+(year)%10; write_ds1302(0x8c,temp); write_cmd(0x80+3); break; default:break; /* 主函数*/void main() init_lcd(); init_ds1302(); /第一次烧到单片机中不屏蔽,允许DS1302初始化 /第二次烧需要屏蔽,禁止DS1302初始化 while(1) keyscan(); if(flag=0) week1(); read_time(); display_time();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1