版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上按键可调ds1302时钟显示 (亲测可用)* 实验说明:本例程为四键控制时钟,k1键按下后进入时钟的调整状态,k2按下时钟上 * k3按下时钟下调,调好设定的时钟后按下k4时钟进入走时状态 * */#include #include sbit SCK=P36;/时钟sbit SDA=P34;/数据sbit RST = P35;/ DS1302复位sbit k1=P10; /sbit k2=P11;sbit k3=P12;sbit k4=P13;sbit LS138A=P22; /sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_
2、Flag;/定义读DS1302标志bit mie;unsigned char x,t1,xuan,shan;unsigned char l_tmpdate7;unsigned char l_tmpdisplay8;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code unsigned char table=0x3f,0
3、x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00; /共阴数码管 0-9 - 熄灭表/*/* 函数声明 */*/void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC
4、 void InitTIMER0(void);/inital timer0void tiao_time(); /时间调整unsigned char key(); /按键函数void shanshuo(); / 闪烁函数/*/* 主函数 */*/void main(void) InitTIMER0(); /初始化定时器0 /Set_RTC(); /写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1) if(ReadRTC_Flag) ReadRTC_Flag=0; tiao_time(); if(x=0) Read_RTC(); /l_tmpdisplay0=l
5、_tmpdate2/16;/数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate2&0x0f;l_tmpdisplay2=10; /加入-l_tmpdisplay3=l_tmpdate1/16;l_tmpdisplay4=l_tmpdate1&0x0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdisplay7=l_tmpdate0&0x0f; if(shan=1) /进入调整状态后闪烁 shanshuo(); /调用闪烁函数 if(mie=1) /闪烁就是亮灭相间 switch(xuan)
6、/判断哪位闪烁case 1:l_tmpdisplay7=11,l_tmpdisplay6=11;break; case 2:l_tmpdisplay4=11,l_tmpdisplay3=11;break;case 3:l_tmpdisplay1=11,l_tmpdisplay0=11;break; /*/* 时间调整函数 */*/void tiao_time() unsigned char miao,fen,shi,y; switch(key()/判断哪个键按下 case 1: x=1;y+;xuan+;/k1按下后进入调整状态并且计数应该调整哪位 if(y2) y=2; if(y=1) Re
7、ad_RTC(); if(xuan3) xuan=1; miao=l_tmpdate0; shan=1; break; /调整时该位闪烁case 2: /k2按下为时钟上调 switch(xuan) /判断调整哪位 case 1: /按k1一次调秒 miao+; if(miao%16)=10) miao=miao+6;/由于显示处理时是以十六进制处理而miao+是十进制需要出来才能正常显示 if(miao=96) miao=0;/加到59后重为0 l_tmpdate0=miao; break;case 2: /按k1两次调分 fen+; if(fen%16)=10) fen=fen+6; if
8、(fen=96) fen=0; l_tmpdate1=fen; break;case 3: /按k1三次调时 shi+; if(shi%16)=10) shi=shi+6; if(shi=36) shi=0; /加到23重为0 l_tmpdate2=shi; break; break; case 3: /按下k3时钟下调 switch(xuan) case 1: /调秒 miao-; if(miao%16)=10) miao=miao-6; if(miao=0) miao=89; /减到0后重为59 l_tmpdate0=miao; break; case 2:/调分 fen-; if(fen
9、%16)=10) fen=fen-6; if(fen=0) fen=89; l_tmpdate1=fen; break; case 3:/调时 shi-; if(shi%16)=10) shi=shi-6; if(shi=0) shi=30; /减到0重为23 l_tmpdate2=shi; break; break; case 4: /k4键按下时钟进入走时状态 miao=miao-miao/16*6; /由于时钟在显示的时候时间经过十六进制处理而时钟的设定是十进制处理所以需要数据转换 l_tmpdate0=miao; fen=fen-fen/16*6; l_tmpdate1=fen; sh
10、i=shi-shi/16*6; l_tmpdate2=shi; Set_RTC(); /把设置的数据压到ds1302中 x=0;y=0;shan=0;xuan=0; break; /*/* 闪烁函数 */*/void shanshuo()for(t1=0;t1=200;t1+);mie=mie;/*/* 按键函数 */*/unsigned char key() unsigned char keyzhi; P1=0xff; if(P1!=0xff) /有键按下 if(k1=0) keyzhi=1; /判断哪个键按下 if(k2=0) keyzhi=2; if(k3=0) keyzhi=3; if
11、(k4=0) keyzhi=4; else keyzhi=0; /没键按下返回为0 while(P1!=0xff); /判断按键是否释放 return keyzhi; /返回keyzhi的值/*/* 定时器0初始化 */*/void InitTIMER0(void) TMOD|=0x01;/定时器设置 16位 TH0=0xef;TL0=0xf0; ET0=1; TR0=1; EA=1;/*/* 写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /*/*
12、 写入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(); /启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address ) unsigned char i,temp=0x00; RST=
13、0;_nop_();_nop_(); SCK=0;_nop_();_nop_(); RST=1;_nop_();_nop_(); Write_Ds1302_Byte(address); for (i=0;i=1;/右移一位_nop_(); _nop_(); _nop_(); SCK=1; RST=0;_nop_(); /以下为DS1302复位的稳定时间 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();retu
14、rn (temp);/返回/*/* 读时钟数据 */*/void Read_RTC(void) /读取 日历 unsigned char i,*p; p=read_rtc_address; /地址传递 for(i=0;i7;i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定 日历unsigned char i,*p,tmp;for(i=0;i7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdate
15、i=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00); p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); p+; Write_Ds1302(0x8E,0x80);/*/* 定时器中断函数 */*/void tim(void) interrupt 1 using 1 /中断,用于数码管扫描 static unsigned char i,num; TH0=0xf5; TL0=0xe0; P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段 switch(i) case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年下半年陕西省省属事业单位公开招聘工作人员笔试和安排笔试历年典型考题及考点剖析附带答案详解
- 2025云南地矿工程勘察集团有限公司招聘10人笔试历年参考题库附带答案详解
- 2026年中建三局招聘模拟题及解析
- 2026年思考类知识与运动类知识
- 工业污水处理厂建设项目安全管理方案
- 蜂窝纸板生产项目车间环境管控方案
- 二氧化硅生产项目技术方案
- 2026年省考保险系统招聘笔试模拟题
- 2026年孕期健康教育知识问答
- 2026广东中山市教体系统招聘事业编制教职员163人备考题库(第二期)含答案详解
- 2026年大豆花生提质固氮绿色增产ARC生物耦合技术应用指南
- 2026湖北水利发展集团有限公司财务专业人员招聘13人考试参考题库及答案解析
- 【单元卷】教科版(2024)小学一年级科学下册第二单元 常见的动物(含答案与解析)
- 首都机场航空器活动区机动车驾驶证考试试题与答案
- 2026年高考乙卷理综化学真题解析含答案
- 2025-2026学年小学数学(人教版)六年级上学期期末模拟试题及答案(共5套)
- 2026年高考全国二卷语文真题试卷含答案
- 视网膜脱落课件
- 2025年春国家开放大学《园艺植物栽培学总论》形考任务1-3+实验实习参考答案
- 营销部地推岗位职责及考核标准范本
- 高频词根词缀词族对照表知识清单-2026届高考英语一轮复习
评论
0/150
提交评论