芯片介紹
DS1302 是 DALLAS 公司推出的串行接口實時時鐘芯片。芯片使用簡單,外部連線少,在智能化儀表及自動控制領域具有廣泛用途。其主要特點為簡單的三線串行 I/O 接口; 2.5~5.5V 的電壓工作范圍(在 2.5V工作時耗電小于 300nA); 與 TTL 兼容(Vcc=5V)時; 實時時鐘包括秒、分、小時、日、月、星期和年(閏年)等信息; 31*8 靜態(tài) RAM 可供用戶使用; 可選的涓流充電方式; 工作電源和備份電源雙引腳輸入; 備份電源可由大容量電容來替代。
2腳和3腳接32768Khz晶振,1腳接主電源,8腳接備用電池(亦可用大電容代替)。5、6、7腳與單片機連接。
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_()
sbit RST = P1^5;
sbit CK = P1^6;
sbit IO = P1^7;
uchar Z10BCD( uchar date) //十進制轉BCD碼
{
uchar i,j;
i=date/10;
j=date-(i*10);
i=(i<<4)|j;
return (i);
}
uchar BCDTO10( uchar date ) //BCD碼轉10進制
{
uchar i,j;
i=(date & 0xf0)>>4 ;
j=date & 0x0f ;
i=i*10+j;
return i;
}
void MCs() //上升沿
{
CK=0;
nop();
CK=1;
}
void MCx() //下降沿
{
CK=1;
nop();
CK=0;
}
void WRdate( uchar date ) //寫一個字節(jié),由低到高
{
uchar i;
for(i=0;i<8;i++)
{
IO = date & 0x01 ; //數(shù)據在上升沿以前準備好
MCs(); //上升沿時刻寫入
date>>=1;
}
}
uchar REdate()
{
uchar i,date=0;
for(i=0;i<8;i++)
{
if(IO)
{
date|=0x80;
}
MCx(); //下降沿讀出數(shù)據
date>>=1;
}
return date;
}
uchar RE1302( uchar addr )
{
uchar Date;
RST=0;
CK=0;
RST=1; //CK為0時,RST才能為1,然后才能讀寫
WRdate(addr); //寫地址
Date=REdate(); //讀數(shù)據
CK=1;
RST=0;
return (Date);
}
void WR1302( uchar addr,uchar Date ) //給某地址寫數(shù)據
{
RST=0;
CK=0;
RST=1; //CK為0時,RST才能為1,然后才能讀寫
WRdate(addr); //寫地址
WRdate(Date); //寫數(shù)據
CK=1;
RST=0;
}
void Initime(uchar sec,uchar min,uchar hor,uchar day,uchar yue,uchar week,uchar year)
{
WR1302(0x8E,0X00); // 0X8E是WP寫保護地址,最高位賦0表示可以寫
WR1302( 0x80, Z10BCD( sec ) ); //向秒單元賦初值
WR1302( 0x82, Z10BCD( min ) ); //向分單元賦初值
WR1302( 0x84, Z10BCD( hor ) ); //向時單元賦初值
WR1302( 0x86, Z10BCD( day ) ); //向日單元賦初值
WR1302( 0x88, Z10BCD( yue ) ); //向月單元賦初值
WR1302( 0x8a, Z10BCD( week) ); //向周單元賦初值
WR1302( 0x8c, Z10BCD( year) ); //向年單元賦初值
}
main()
{
uchar Sec,Min,Hor,Day;
uchar Yue,Week,Year;
WR1302(0x8E,0X00); // 0X8E是WP寫保護地址,最高位賦0表示可以寫操作
Initime(5,20,14,18,6,3,10); //設置初始值
//順序:秒、分、時、日、月、星期、年(只寫00~99) 2010-6-18 14:20:05 周三
WR1302(0x8E,0X80); // 0X8E是WP寫保護地址,最高位賦1表示寫保護,只能讀
WR1302(0x90,0XA7); //0x90是充電設置地址,0XA7表示一個二極管串聯(lián)一個8K電阻
// WR1302(0x90,0XA6); //一個二極管加一個4K電阻
// WR1302(0x90,0XA5); //一個二極管加一個2K電阻
// WR1302(0x90,0XA4); //一個二極管不加電阻
// WR1302(0x90,0XA8); //兩個二極管不加電阻
// WR1302(0x90,0XA9); //兩個二極管加一個2K電阻
// WR1302(0x90,0XAA); //兩個二極管加一個4K電阻
// WR1302(0x90,0XAB); //兩個二極管加一個8K電阻
while(1)
{
Sec = BCDTO10( RE1302(0x81) ); //0x81讀秒數(shù)據,讀出來的是BCD碼,還要轉換成十進制數(shù)
Min = BCDTO10( RE1302(0x83) ); //0x83讀分數(shù)據
Hor = BCDTO10( RE1302(0x85) ); //0x85讀時數(shù)據
Day = BCDTO10( RE1302(0x87) ); //0x87讀日數(shù)據
Yue = BCDTO10( RE1302(0x89) ); //0x89讀月數(shù)據
Week = BCDTO10( RE1302(0x8B) ); //0x8b讀星期數(shù)據
Year = BCDTO10( RE1302(0x8D) ); //0x8d讀年數(shù)據
nop();
P2=Sec; //仿真時方便查看
}
}