新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > SPI時鐘芯片DS1302的應(yīng)用

SPI時鐘芯片DS1302的應(yīng)用

作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。采用普通32.768kHz晶振!RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。SCLK始終是輸入端。

//======================================驅(qū)動
sbit SDA_1302=P1^0;//數(shù)據(jù)輸入輸出腳
sbit SCL_1302=P1^1;//串行時鐘輸入
sbit RST =P1^2;//復(fù)位腳
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;
}
================================================//
//=======================================應(yīng)用
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);
}


關(guān)鍵詞: SPI時鐘芯片DS130

評論


技術(shù)專區(qū)

關(guān)閉