dsl302时钟程序详解经典
dsl302时钟程序详解
DS1302的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始
2.3数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0
位到高位7o
2.4 DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位
为BCD码形式,其日历、
时间寄存器及其控制字见表1。
» I日历•別间襦存祁及凡担制孑
fir* 野擅"itwtr 収他总cn -
T
»fsy网
移
e S』3
2 1 0
林斶
son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、
MH K4H851101 \2A12 24« 10 IIH HK
MhH M7II01 -2S.2V,
W-Jl »o imiAre
8SH WII03 - !2(11) 0 IUM MOYI1I
AAII8HH ni(i II » 0 0h\V
8LH Mill OQ • 9910YLAH
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器
及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
dsl302程序流程图
S 4 ISI30J 实廿时M ]人川
3.2 DS1302实时时间流程
图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下 面结合流程图对DS1302的基
本操作进行编程
:
#inrluilr **lnttins, h"
站ylk=P3・3
whit tj<> = PJ-4
•hii t j>i = PV5
>Ut BO7 = AC(77
“i【nrro=ACCD
void oipulbytr {uri(sgi>e<l ch nr yrda) / 丿8 位数IK'j 入函数
(iiiwigm-d rluir i:
AC<* = IH ch: 48UPJ人的数故人\<X
for(»=8: i> 0: i-);循环8次,写入8位数擁 ;从低位到高位
{ijo二BIT0;将ACCD的值賦给时钟数据线t_rlk = 0
U-lk二I:他时钟线的上升沿写人I位数据ACC = ACCAL:将応1位数站移至
ACC0
unsignrd char outputl^te(void)//8 位数据址出函数
| uiisipKMj rliJir i;
二I:启动数据传送
f«r(i = 8: i> 0: i・J:渎出&位数据.从低位到禺位(ACC = ACC>1;将前一下降沿读出的数据右莎
I位,从而该次谀出的数放人ACC-7
tio^hPI 口输人之前置I tjrlk = 1
Ulk =0:时钟线下降沿读出I位数据
IMT7 = f Jo: ran not usr PI "7 =tja for PI"7 not
:d varietu
return (ACC)
//^elay 15( I)
input byte ( ucda)
= 0
U<> = I
i
unsigned char rej302(unsigned chnr mid)//读出对应寄存器内容(unsigned chnr ncda
Ijst = 0
l』lk =0
I J»t = I
mpulby(e(«dd)
//4rlayl5(l)
ucdn = uni卩u【byle()
iju=0
return (ucdn)
I
void SH I l3O2(unMignrd char * pda ) /殳It 时伺
lunMgncd dmr i unsigned char add = 0x80 MT J 302( O«8r. 0x(X1);将控制奇ff器值没为零.
;圮高位0允许写
ror(i = 7; i> 0; i牌七个时间初徂写人对
:应斷存器
|wrj302(iid(i. * |xkd:写对应时仲需存器的值
A<l(i + =2:
I
rrj 302<Ox8e. 0x80):写保护,防比干就影响时
:间值
I
"21 g*!j302 (kittened char rlirtilttel ])"读収
绅时阿値
lurMigiicd <4iar i< j
unsigned char add =0*81
Ixlaia unsigiinl fhar 5cc
for(i = 0; i <7: i + ♦)
kurtimr(i) = re J 302( add}; i 粪对应时钟寄
存器的值
see 二ciirtinirUl
j = see Al:桁HCI)码辕化成对应十进制数
j* =10
we = $r<'&(h0f
sec+ xj
curtimef i | = sw
add 4=2
■
,1
根据本人在调试中遇到的问题,特作如下说明:DS1302与微处理器进行数据交换时,首先山微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6二0,指定时钟数据,D6=l,指定
RAM数据;D5, D1指定输入或输出的特定寄存器;最低位LSB(DO)为逻辑0,指定写操作(输入),DO二1,指定读操作(输出)。
在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。
若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输岀数据字节。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次
性读、写所有的RAM的31个字节。
要特别说明的是备用电源B1,可以用电池或者超级电容器(0. 1F以上)。
虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。
可以用老式电脑主板上的 3. 6V充电电池。
如果断电时间较短(儿小时或儿天)时,就可以用漏电较小的普通电解电容器代替。
100 UF就可以保证1小时的正常走时。
DS1302在第一次加电后,必须进行初始
化操作。
初始化后就可以按正常方法调整时间。