1、dsl302时钟程序详解-dsl302程序流程图(c程序)dsl302时钟程序详解,dsl302程序流程图(c程序)dsl302时钟程序详解ds1302的控制字如图2所示.控制字节的最高市效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作总元的地址;最低有效位(位0)如为0表示要进行写操作,为i表示进行读操作,控制字节总是从最低位开始输出.2.3 数据输入输出(do)在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1m2,数据输入从低位即位0开 始。同样,在紧跟8位的控制指令字后

2、的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位九2.4 ds1302的寄存器ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式,其日历、时间寄存器及其控制字见表u会1日历时间寄存器及x控制字自作命令字丁;性作武界“以价枪0?t一件内容6 s 4 j2 1 08011s1ii00-59ch1usec”:c犍85 hu 49siomisvin明f修制84 h- ”312/24u 10 hrhr86h 72% w.j1(10 iodatel5tk月有“舞mkh03 4!20u 0 i0m

3、uoxi1isahshh01 -07ii o q 0in8(: h8dh00-09ioyearyeak此外,ds1302还有年份寄存器、控制寄存器、充电寄存照、时钟突发寄存器及与ram相关的寄存器 等。时钟突发寄存器可一次性顺序读写除充电寄存甥外的所有寄存器内容。ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为cohfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的rav寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写ffh(读)。m 3a cpt1ds1302程序流程图3.2 ds13

4、02实时时间流程图4示出ds1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对ds1302的基本操作进行编程:frinrludr “liiirinsji”乩 iy ik = p3*3sbit i jo = p3nmbit 51 -13*5sbit bit7 = ac(77sbic brro = accrovoid inpulbyh*(unsigne 0: i-):循环8次,写入8位数据.;从低位到高位(ijo = bito:将acu0的值赋给时钟数据线i j;lk = 0ik二i:在时钟线在上升沿写上1位数据acc二acca1;将商1位数据移至acu0 unsigned

5、 ehar(julpubyte(void)/8 位数据读出函数(unsigned char i;二1;启动数据传送for(i = 8: i 0: i-):读出8位数据.从低位到高位acc = acca1;将前一下降沿读出的数据右移i位,从而该次读出的数放入acc-7lio = l;pi 口输入之前i1tj?lk = 1ulk =0:时钟线下降沿读出1位数据rit7 = tjo: can nol use pl*7 =ljo for p7 not;a varierilretum(acc)/delay 15( i) input by te(ucda)= 0tj9 = j1unsigned char

6、re j 302(unsigned char add)/读出 对应寄存器内容unsigned char ucda5t = 0ijdk =0ij?i = iij)putl)yte(adutputl)yle()ijsl =0rrtum( ucda) void $etl302(unsigned char * pdu )/设置时间ivqhgned clmr iunsigned cliur add =0x80h7jj02(0x8e.0x00);将控制寄存器值设为零,;ffl:高位wp = 0允许写for(i = 7; i 0:i-将七个时间初一写入对 ;应寄存器|wrj302(add, * pda);写

7、对应时钟寄存器的值 曲+ add = 2: iwrj 302 (ox 84 0x80):写保护,防止干扰影响时 :间值ivoid 302(unsigned char :urtitne )/读取 当前时间值unsigned rhar i. junsigned char add - 0x81 hlata unsigned char see for( i = 0; i 7: i + + ) curtimri i j = rej302(ad(h;谈对应时钟寄 存器的值 se(* = eurtime ij = seea4:将bcd码转化成对应十进制数j* =10ec = &erstoxofsee+ =j

8、eurtimrf i | = se* add + = 2 i根据本人在调试中遇到的问题,特作如下说明: ds1302与微处理器进行数据交换时,首先由微处理 器向电路发送命令字节,命令字节最高位msb(d7)必须为逻辑1,如果d7=0,则禁止写ds1302,即写保 护;d6=0,指定时钟数据,d6=l,指定ram数据;d5d1指定输入或输出的特定寄存;最低位ls b(d0)为逻辑0,指定写操作(输入),d0=l指定读操作(输出)。 在ds1302的时钟日历或ram进行 数据传送时,ds1302必须首先发送命令字节.若进行单字节传送,8位命令字节传送结束之后,在下2个 sclk周期的上升沿输入数据字节,或在下8个sclk周期的下降沿输出数据字节。 ds1302与ram 相关的寄存甥分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制 字为c0hfdh,其中奇数为读操作,偶数为写操作;再一类为突发方式下的ram寄存器,在此方式下可一次性读、写所有的ram的31个字节.要特别说明的是备用电源be可以用电池或者超级电容器(0jf以上)。虽然ds1302在主电源掉电后的耗电很小,但是,如果要长时