ds1302引腳及功能
DS1302是由美國(guó)DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘芯片。它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),且具有閏年補(bǔ)償?shù)榷喾N功能。
圖1示出DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過(guò)把RST輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。RST輸入有兩種功能RFBLN2012090A1T:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器SMBJ70A-TR;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過(guò)程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說(shuō)明。SCLK始終是輸入端。
DS1302的控制字節(jié)
DS1302的控制字如圖2所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫(xiě)入DS1302中,位6如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù)GRM1886T1H1R0CD01C;位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫(xiě)操作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開(kāi)始輸出。
DS1302電路圖

SCL,SDA,RST_D連接單片機(jī),VCC電壓不清楚,只是有個(gè)接口。VCC是連接的ATMEGA64.
VCC=3.3V
DS1302與CPU的連接需要三條線,即SCLK(7)、I/O(6)、RST(5)。圖3示出DS1302與89C2051的連接圖,其中,時(shí)鐘的顯示用LCD。
51單片機(jī)DS1302實(shí)時(shí)時(shí)鐘驅(qū)動(dòng)程序
#include《reg51.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit IO=P3^4; //數(shù)據(jù)輸入輸出線
sbit RST=P3^5; //復(fù)位信號(hào)線
sbit SCLK=P3^6; //時(shí)鐘信號(hào)線
uchar code write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //寫(xiě)的地址
uchar code read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //讀的地址 //---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼---//
uchar time[7]={0,0,0x12,0x12,0x12,0x20,0x15}; //初始化的時(shí)間為2015年12月12日12:00
1、初始化
void ds1302_init()
{
uchar k;
write(0x8e,0x00); //禁止寫(xiě)保護(hù),即允許數(shù)據(jù)寫(xiě)入
for(k=0;k《7;k++) //寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
{
write(write_addr[k],time[k]);
}
write(0x8e,0x80); //打開(kāi)寫(xiě)保護(hù)
}
2、寫(xiě)字節(jié)
void write(uchar addr,uchar dat)
{
uchar i,j;
SCLK=0;
_nop_();
RST=0;
_nop_();
RST=1; //拉高,準(zhǔn)備寫(xiě)地址寫(xiě)數(shù)據(jù)
_nop_();
_nop_();
for(i=0;i《8;i++) //傳送8位地址,往哪里寫(xiě)
{
SCLK=0; //再置為低,以便實(shí)現(xiàn)上升沿
_nop_();
IO=addr&0x01; //先傳送最低位
addr》》=1; //向右移位,把8位數(shù)據(jù)依次寫(xiě)入
SCLK=1; //數(shù)據(jù)在上升沿時(shí),寫(xiě)入數(shù)據(jù)
_nop_();
}
for(j=0;j《8;j++) //寫(xiě)入8位數(shù)據(jù)
{
SCLK=0; //置為低,以便實(shí)現(xiàn)上升沿
_nop_(); IO=dat&0x01; //先傳送最低位
dat》》=1; //向右移位,把8位數(shù)據(jù)依次寫(xiě)入
SCLK=1; //數(shù)據(jù)在上升沿時(shí),寫(xiě)入數(shù)據(jù)
_nop_();
}
RST=0; //釋放
_nop_();
}
3、讀字節(jié)
uchar read(uchar addr)
{
uchar i,dat=0;
SCLK=0;
_nop_();
RST=0;
_nop_();
RST=1; //拉高,準(zhǔn)備寫(xiě)地址讀數(shù)據(jù)
_nop_();
_nop_();
for(i=0;i《8;i++) //傳送8位地址,從哪里讀
{
SCLK=0; //置為低,以便實(shí)現(xiàn)上升沿
_nop_();
IO=addr&0x01; //先傳送最低位
addr》》=1; //向右移位,把8位數(shù)據(jù)依次寫(xiě)入
SCLK=1; //數(shù)據(jù)在上升沿時(shí),寫(xiě)入數(shù)據(jù)
_nop_();
}
_nop_();
for(i=0;i《8;i++) //讀出8位數(shù)據(jù)
{
SCLK=1; //置為低,以便實(shí)現(xiàn)下降沿
_nop_();
dat》》=1; //向右移位,把8位數(shù)據(jù)依次讀出
if(IO==1)
dat=dat|0x80;
SCLK=0; //讀數(shù)據(jù)時(shí),下降沿有效
_nop_();
}
RST=0; //復(fù)位
_nop_();
SCLK = 1;
_nop_();
IO = 0;
_nop_();
IO = 1;
_nop_();
return dat; //返回讀到的數(shù)據(jù) }
4、讀時(shí)間
void read_time()
{
uchar n;
for(n=0;n《7;n++)
time[n]=read(read_addr[n]); //讀取分秒時(shí)日月周年
}
評(píng)論