DS1302时钟C语言编程完整实例_第1页
DS1302时钟C语言编程完整实例_第2页
DS1302时钟C语言编程完整实例_第3页
DS1302时钟C语言编程完整实例_第4页
DS1302时钟C语言编程完整实例_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、1DS1302简介:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源)可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,

2、因此广泛应用于测量系统中。图1DS1302的外部引脚分配图2DS1302的内部结构各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。当Vcc2Vcc1+02V时,由Vcc2向DS1302供电,当Vcc2vVccl时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。DS1302有下列几组寄存器:DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h8Dh,写

3、时80h8Ch;存放的数据格式为BCD码形式,如图3所示。3士jgjg与奇住諳BIT7BIT6BIT5B!T481h80hCH10砂83h82h1Q分85h84h12/24010时87h86h00ioa3CDS1302用于定义DS13有关日历、时间02是运行于12啲寄存器小小时模式还、时寄存器(是24小时模85h、84h)的式当为高时选立10择月位5是引当为表示时M。在12小时丄模式时,土口47心曰旨一虫n畀、口十0位5是当力80h1亠mJHJSaxilj7|丄4/回一1且uj10年秒寄存器81h80h)的立7定义为时钟暂停标志该HCtC置为1时;时钟振汤器1停止,DS1302处于低功耗状态;

4、当该位置为0时,时钟开始运行。控制寄存器(8Fh、8Eh)的位7是写保护位(WP)其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。DS1302有关RAM的地址DS1302中附加31字节静态RAM的地址如图4所示。读地址写地址数据范围C1hCOtiOQ-FFtiC3h0211OO-FFtiC5hC4hOa-FFhFDhFChOtKFFh图4DS1302的工作模式寄存器所谓突发模式是指一次传送多个字节的时钟信号和RAM数据。突发模式寄存器如图5所示。工作模式寄存器读寄存器写寄存器吋钟突发樓式寄存器CLOCKBURSTBFhBE

5、h突发模式寄存器RAMBURSTFFhFEh图5此外,DS1302还有充电寄存器等。2读写时序说明DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与DS1302通信首先要先了解DS1302的控制字QS1302的控制字如图6。765432101RAMA4.A2AiA0RDCKWR图6控制字(即地址及命令字节)控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4A0)指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示

6、进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位i0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图7。单字节读SCLKrrrrm林丽AOA1A2A3A4R/C图7数据读写时序单字节写电路原理图如图8DS1302与单片机的连接也仅需要3条线CE引脚、SCLK串行时钟32.760kHz、电路原理图如图8DS1302与单片机的连接也仅需要3条线CE引脚、SCLK串行时钟32.760kHz、行数据引脚,V为芯片提供计时脉冲。C

7、c2为备用电源,外接图8以上部分是我拷贝别人的,在此我要感谢他,后面的部分全部是我自己写的,经过调试,系统运彳丁稳定。本来是不准备拷贝的,但考虑读者可能会读不懂程序,所以我才将核心器件的通信协议拿来给大家看看,当初老师叫我随便用C语言编写个单片机程序,于是我就找了个DS1302时钟的程序,写的有点长,可能是我第一次经验不够吧。#includevreg51.h#includevstdio.h#defineucharunsignedchar#defineuintunsignedintucharcodetable=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0

8、 xf8,0 x80,0 x90,0 x7f;/0123456789.sbitsclk=P3人6;sbitdata_io=P3A7;sbitrst=P3A5;sbitkl=PlA4;/mod功能选择键sbitk2=P1A5;/-(待机时按此键显示当前日期)sbitk3=PlA6;/+(待机时,按此键显示闹钟时间及状态,进入闹钟设定时此键是闹铃开关键)sbitk4=P1A7;退出设定sbitdidi=P3A0;/闹钟铃音ucharmod;ucharkaiguan;bitkeys(void);/函数申明voidshow(x,y,z);函数申明voidalarmshow(a_shi,a_fen);函

9、数申明voiddelay(uintms)/1ms延时子程序uinti,j;for(i=ms;i0;i-)for(j=244;j0;j-);voidalarmdisplay(ucharshu,ucharwei)闹钟显示子程序P2=0 x00;P0=tableshu;P2=(1wei);delay(1);P2=0 x00;if(kaiguan%2)显示ON12-23,闹钟时间显示格式P0=0 xc0;P2=0 x01;delay(1);P2=0 x00;P0=0 xc8;P2=0 x02;delay(1);P2=0 x00;P0=0 xf7;P0=0 x08;delay(1);P2=0 x00;e

10、lse显示OFF12-23,闹钟时间显示格式P2=0 x00;P0=0 xc0;P2=0 x01;delay(1);P2=0 x00;P0=0 x8e;P2=0 x02;delay(1);P2=0 x00;P0=0 x8e;P2=0 x04;delay(1);P2=0 x00;voiddisplay(ucharshu,ucharwei)显示函数P2=0 x00;P0=tableshu;P2=(1wei);delay(1);P2=0 x00;显示该位数字P0=0 xbf;P2=0 x04;delay(1);显示横杠P2=0 x00;P0=0 xbf;P2=0 x20;delay(1);显示横杠P

11、2=0 x00;voidweidisplay(void)/调时间时显示调整哪一个位ucharwei;P2=0 x00;P0=0 x7f;if(mod=1|mod=4|mod=7)wei=3;if(mod=2|mod=5)wei=0;if(mod=3|mod=6)wei=6;P2=(30;i-)didi=1;delay(1);didi=0;delay(1);if(k1=0)delay(5);if(k1=0)while(k1);break;voidwrite(ucharaddr,ucharshu)/写两个字节uchartemp,t;rst=0;sclk=0;rst=1;temp=addr;for(

12、t=0;t=1;temp=shu;for(t=0;t=1;rst=0;ucharread(ucharaddr)/读一个字节uchartemp,t;rst=0;sclk=0;rst=1;temp=addr;for(t=0;t=1;temp=0;for(t=0;t=1;returntemp;voidmain()/主函数bitflag;ucharshi,fen,miao,nian,yue,ri,a_shi,a_fen;当前时间10:06:5310-12-20write(0 x80,0 x53);write(0 x82,0 x06);秒寄存器(初始化年月日,时分秒,闹铃)write(0 x84,0 x

13、10);时寄存器write(0 x86,0 x20);日寄存器write(0 x88,0 x12);月寄存器write(0 x8c,0 x10);年寄存器a_shi=0 x07;初始化闹钟时间7:30a_fen=0 x30;while(1)shi=read(0 x85);读小时fen=read(0 x83);读分钟miao=read(0 x81);读秒钟if(kaiguan%2)判断闹钟if(a_shi=shi&a_fen=fen)alarm();if(k3=0&mod=0)待机情况下按k3显示闹铃时间delay(5);if(k3=0&mod=0)while(k3)alarmshow(a_sh

14、i,a_fen);if(k2=0&mod=0)待机情况下按k2显示日期delay(5);if(k2=0&mod=0)while(k2)show(nian,yue,ri);flag=keys();按键标识位,有按键按下时flag=1;if(l)程序出现个小错误,原本这里是写flag,但没有办法,只能写1了,感兴趣的话自己分析if(mod=1)if(k4=0)如果k4=0,则退出设定delay(5);if(k4=0)while(k4);mod=0;if(k2=0)delay(5);if(k2=0)while(k2);fen=(fen4)*10+(fen&0 x0f);fen+;if(fen=60)

15、fen=0;fen=(fen/10)4)*10+(shi&0 x0f);shi+;if(shi=24)shi=0;shi=(shi/10)4)*10+(ri&0 x0f);ri+;if(ri=32)ri=0;ri=(ri/10)4)*10+(yue&0 x0f);yue+;if(yue=13)yue=0;yue=(yue/10)4)*10+(nian&0 x0f);nian+;if(nian=100)nian=0;nian=(nian/10)4)*10+(ri&0 x0f);if(ri=0)ri=32;ri-;ri=(ri/10)4)*10+(yue&0 x0f);if(yue=0)yue=3

16、2;yue-;yueA(yue、l0K4)+(yue%10)k4H9遑圧辛Mdelay(5)八if(k4N0)whileTk4)八modHO;if(k3N0)delay(5)八if(k3N0)whileTk3)八nianAnianv4)*1o+(nian&oxof八if(nianHHO)nianHloo;nianJ.nianA(nian、l0K4)+(nian%10)k4Hp遑圧辛Mdelay(5)八if(k4N0)whileTk4)八eoxo丈(01&0)+(寸乂01/11启0)酋启0oHUQe(09NUO4e)七+uo4edoxo文Uu4e)+oI*(寸4)*10+(a_shi&0 x0f);a_shi+;if(a_shi=24)a_shi=0;a_shi=(a_shi/10)=1&mod=2)show(shi,fen,miao);weidisplay();elseif(mod4,0);display(x&0 x0f,1);display(y4,3);display(y&0 x0f,4);display(z4,6);display(z&0 x0f,7);voidalarmshow(uchara_shi,ucha

温馨提示

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

评论

0/150

提交评论