如何让DS1302启动起来,让它开始计时?
时间:10-02
整理:3721RD
点击:
如何让DS1302启动起来,让它开始计时?我的程序如下:
void write_byte(uchar add)
{uchar i;
for(i=0;i<8;i++)
{SCLK=0;
SDA=(bit)add&0x01;
add>>=1;
SCLK=1;
}
}
uchar read_byte()
{uchar i;
uchar value;
for(i=0;i<8;i++)
{value>>=1;
SDA=1;
if(SDA)
{value=value|0x80;}
SCLK=1;
_nop_();
}
SCLK=0;
RST=0;
_nop_();
return value;
}
void write_1302(uchar DS_add,uchar DS_dat) //DS1302写数据
{RST=0; //拉低RST,芯片禁止读写
_nop_();
SCLK=0;//SCLK为低电平时,才能把RST为高电平,时钟下降沿读取
_nop_();
RST=1; //芯片开启读写
_nop_();
write_byte(DS_add);
write_byte(DS_dat);
RST=0;
_nop_();
SDA=1;
SCLK=1;
}
uchar read_1302(uchar DS_add)
{uchar timedata;
RST=0;
SCLK=0;
RST=1;
write_byte(DS_add);
timedata=read_byte();
RST=0 ;
_nop_();
SCLK=1;
_nop_();
SDA=1;
return timedata;
}
void set_time()
{uchar i,j,k;
for(i=0;i<7;i++)
{j=TIME/10;
k=TIME%10;
TIME=k+j*16; //将数组转化成BCD码
}
write_1302(0x8e,0x00);
for(i=0;i<7;i++)
{write_1302(write_add,TIME); //将转化后的值写入芯片
}
write_1302(0x8e,0x80);
}
void read_time()
{
miao=read_1302(0x81); //秒寄存器
fen=read_1302(0x83); //读分
shi=read_1302(0x85); //读时
week=read_1302(0x8B); //读星期
ri=read_1302(0x87); //日
yue=read_1302(0x89); //月
nian=read_1302(0x8d); //年
}
void write_byte(uchar add)
{uchar i;
for(i=0;i<8;i++)
{SCLK=0;
SDA=(bit)add&0x01;
add>>=1;
SCLK=1;
}
}
uchar read_byte()
{uchar i;
uchar value;
for(i=0;i<8;i++)
{value>>=1;
SDA=1;
if(SDA)
{value=value|0x80;}
SCLK=1;
_nop_();
}
SCLK=0;
RST=0;
_nop_();
return value;
}
void write_1302(uchar DS_add,uchar DS_dat) //DS1302写数据
{RST=0; //拉低RST,芯片禁止读写
_nop_();
SCLK=0;//SCLK为低电平时,才能把RST为高电平,时钟下降沿读取
_nop_();
RST=1; //芯片开启读写
_nop_();
write_byte(DS_add);
write_byte(DS_dat);
RST=0;
_nop_();
SDA=1;
SCLK=1;
}
uchar read_1302(uchar DS_add)
{uchar timedata;
RST=0;
SCLK=0;
RST=1;
write_byte(DS_add);
timedata=read_byte();
RST=0 ;
_nop_();
SCLK=1;
_nop_();
SDA=1;
return timedata;
}
void set_time()
{uchar i,j,k;
for(i=0;i<7;i++)
{j=TIME/10;
k=TIME%10;
TIME=k+j*16; //将数组转化成BCD码
}
write_1302(0x8e,0x00);
for(i=0;i<7;i++)
{write_1302(write_add,TIME); //将转化后的值写入芯片
}
write_1302(0x8e,0x80);
}
void read_time()
{
miao=read_1302(0x81); //秒寄存器
fen=read_1302(0x83); //读分
shi=read_1302(0x85); //读时
week=read_1302(0x8B); //读星期
ri=read_1302(0x87); //日
yue=read_1302(0x89); //月
nian=read_1302(0x8d); //年
}
没玩过
没看见主函数吗?
大概看了一下程序,没发现什么问题.把1302的操作流程简单介绍下,希望对您有帮助:
//操作步骤:
//1.通过设置芯片0x8E地址处的值,将芯片的写保护关掉,以便可以设置日期的初始值;
//2.依次对芯片的0x80\0x82\0x84\0x86\0x88\0x8A\0x8C地址进行初值的写入;
//3.设置芯片开始计时;
//4.在芯片的0x8E地址处打开写保护,防止误操作;
//5.不断读取芯片0x80-0x8C地址的值,得到计时的数据,做你想要的事情.
好好读读数据手册 有寄存器地址
学习中,,,,
