声明:代码确实写的不好,用的都是最笨的方法实现功能,不喜勿喷
DS1302时钟芯片有困难的地方就在读写的时序上面,说到底还是时序图怎样读懂的问题。
这个芯片还有一点要注意的就是数据的格式问题:
数据分高四位和低四位,地址分为写地址和读地址
因为数据分高四位和低四位所以我们在写数据的时候要将高位移位进入高四位地址,数据的读取时要将高四位的数在转化为数据的高位。如果不明白的话,看一下代码就明白了。
下面看一下代码:
#include "ds1302.h"
uchar shijian[7];
uchar code ds[]={50,59,23,10,10,1,16};
//DS1302初始化
void DS13Init()
{
uchar i;
uchar add=0x80;
write_DS(0x8e,0x00);//关闭写保护
for(i=0;i<7;i++)
{
write_DS(add,ds[i]);
add=add+2;
}
write_DS(0x8e,0x80);//开启写保护
}
//向DS1302写地址和数据
void write_DS(uchar add,uchar dat)
{
uchar num;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
num=(dat/10<<4)|(dat%10);//将数据的高位移入寄存器的高四位,低位移入寄存器的低四位(数据的格式转换)
writebyte(num);
CE=0;
}
//将数据存储到指定数组中
void Read_Time()
{
uchar i;
uchar add=0x81;
write_DS(0x8e,0x00);//关闭写保护
for(i=0;i<7;i++)
{
shijian[i]=read(add);
add=add+2;
}
write_DS(0x8e,0x80);//开启写保护
}
//读取DS1302指定地址中的数据
uchar read(uchar add)
{
uchar i,temp;
uchar dat_low,dat_high;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
for(i=0;i<8;i++)
{
SCLK=0;
temp>>=1;
if(IO)
{
temp|=0x80;
}
SCLK=1;
}
IO=0;//数据位要从零开始
dat_high=temp/16;//将读取的数据进行数据的转换,将寄存器的高四位转化为十进制的十位
dat_low=temp%16;//将读取的数据进行数据的转换,将寄存器的低四位转化为十进制的个位
temp=dat_high*10+dat_low;
return temp;
}
//向DS1302写数据
void writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
IO=dat&0x01;
SCLK=1;
dat>>=1;
}
}