您的位置 首页 开关

SPI时钟芯片DS1302的使用

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功用,作业电压为2.5V~5.5V。选用三线接口与CPU进行同步通讯,并可选用突发方法一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性寄存数据的RAM寄存器。选用一般32.768kHz晶振!RST是复位/片选线,通过把RST输入驱动置高电平来发动一切的数据传送。RST输入有两种功用:首要,RST接通操控逻辑,答应地址/指令序列送入移位寄存器;其次,RST供给停止单字节或多字节数据的传送手法。当RST为高电平时,一切的数据传送被初始化,答应对DS1302进行操作。如果在传送过程中RST置为低电平,则会停止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST有必要坚持低电平。只要在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),在操控指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开端。相同,在紧跟8位的操控指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。SCLK始终是输入端。

//======================================驱动
sbit SDA_1302=P1^0;//数据输入输出脚
sbit SCL_1302=P1^1;//串行时钟输入
sbit RST =P1^2;//复位脚
void send_data(unsigned char ch)
{
unsigned char i;
SCL_1302=0;
_nop_();
RST=1;
for(i=0;i<8;i++)
{
SCL_1302=0;
SDA_1302=(bit)(ch&0x01);
SCL_1302=1;
ch=ch>>1;
}
SCL_1302=0;
RST=0;
}
unsigned char receive_data()
{
unsigned char i,data;
SCL_1302=0;
_nop_();
RST=1;
for(i=0;i<8;i++)
{
data>>=1;
SCL_1302=0;
if(SDA_1302) data|=0x80;
elsedata&=0x7f;
SCL_1302=1;
}
SCL_1302=0;
RST=0;
return data;
}
================================================//
//=======================================使用
sbit SDA_1302=P1^0;
sbit SCL_1302=P1^1;
sbit RST=P1^2;
#define WSEC0x80
#define RSEC0x81
#define WMIN0x82
#define RMIN0x83
#define WHOU0x84
#define RHOU0x85
#define WDAY0x86
#define RDAY0x87
#define WMON0x88
#define RMON0x89
#define WWEEK 0X8a
#define RWEEK 0X8b
#define WYEAR 0x8c
#define RYEAR 0x8d
#define EWOK0X8e //
#define EW0X8F //
#define CDOK0X90 // 涓流充电写
#define CD0X91 // 读

void delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void write_ds1302(unsigned char addr,unsigned char tempdata)
{
unsigned char i=0;
SCL_1302=0;
delay();
RST=1;
delay();
for(i=0;i<8;i++)
{
SCL_1302=0;
SDA_1302=(bit)(addr&0x01);
SCL_1302=1;
addr>>=1;
}
for(i=0;i<8;i++)
{
SCL_1302=0;
SDA_1302=(bit)(tempdata&0x01);
SCL_1302=1;
addr>>=1;
}
RST=0;
delay();
SCL_1302=0;
}
unsigned char read_ds1302(unsigned char addr)
{
unsigned char i=0;
unsigned char temp=0;
SCL_1302=0;
delay();
RST=1;
delay();
for(i=0;i<8;i++)
{
SCL_1302=0;
SDA_1302=(bit)(addr&0x01);
SCL_1302=1;
addr>>=1;
}
SDA_1302=1;
for(i=0;i<8;i++)
{
temp>>=1;
SCL_1302=1;
if(SDA_1302)
temp|=0x80;
else
temp&=0x7f;
SCL_1302=0;
}
RST=0;
delay();
SCL_1302=0;
return (temp);
}
void write_initial(void) //写入初始时刻 2009年 1月1日1时0分0秒
{
SCL_1302=0;
RST=0;
write_ds1302(EWOK,0x00);
write_ds1302(WSEC,0X00);
write_ds1302(WMIN,0X00);
write_ds1302(WHOU,0X81);
write_ds1302(WDAY,0X01);
write_ds1302(WMON,0X01);
write_ds1302(WWEEK,0X04);
write_ds1302(WYEAR,0X09);
}
void read(void)
{
DAY=read_ds1302(RDAY);
MONTH=read_ds1302(RMON);
YEAR=read_ds1302(RYEAR);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/263130.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部