ds1302引腳及功能
DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償?shù)榷喾N功能。
圖1示出DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能RFBLN2012090A1T:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器SMBJ70A-TR;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當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始終是輸入端。
DS1302的控制字節(jié)
DS1302的控制字如圖2所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù)GRM1886T1H1R0CD01C;位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始輸出。
DS1302電路圖
SCL,SDA,RST_D連接單片機,VCC電壓不清楚,只是有個接口。VCC是連接的ATMEGA64.
VCC=3.3V
DS1302與CPU的連接需要三條線,即SCLK(7)、I/O(6)、RST(5)。圖3示出DS1302與89C2051的連接圖,其中,時鐘的顯示用LCD。
51單片機DS1302實時時鐘驅(qū)動程序
#include《reg51.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit IO=P3^4; //數(shù)據(jù)輸入輸出線
sbit RST=P3^5; //復位信號線
sbit SCLK=P3^6; //時鐘信號線
uchar code write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //寫的地址
uchar code read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //讀的地址 //---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
uchar time[7]={0,0,0x12,0x12,0x12,0x20,0x15}; //初始化的時間為2015年12月12日12:00
1、初始化
void ds1302_init()
{
uchar k;
write(0x8e,0x00); //禁止寫保護,即允許數(shù)據(jù)寫入
for(k=0;k《7;k++) //寫入7個字節(jié)的時鐘信號:分秒時日月周年
{
write(write_addr[k],time[k]);
}
write(0x8e,0x80); //打開寫保護
}
2、寫字節(jié)
void write(uchar addr,uchar dat)
{
uchar i,j;
SCLK=0;
_nop_();
RST=0;
_nop_();
RST=1; //拉高,準備寫地址寫數(shù)據(jù)
_nop_();
_nop_();
for(i=0;i《8;i++) //傳送8位地址,往哪里寫
{
SCLK=0; //再置為低,以便實現(xiàn)上升沿
_nop_();
IO=addr&0x01; //先傳送最低位
addr》》=1; //向右移位,把8位數(shù)據(jù)依次寫入
SCLK=1; //數(shù)據(jù)在上升沿時,寫入數(shù)據(jù)
_nop_();
}
for(j=0;j《8;j++) //寫入8位數(shù)據(jù)
{
SCLK=0; //置為低,以便實現(xiàn)上升沿
_nop_(); IO=dat&0x01; //先傳送最低位
dat》》=1; //向右移位,把8位數(shù)據(jù)依次寫入
SCLK=1; //數(shù)據(jù)在上升沿時,寫入數(shù)據(jù)
_nop_();
}
RST=0; //釋放
_nop_();
}
3、讀字節(jié)
uchar read(uchar addr)
{
uchar i,dat=0;
SCLK=0;
_nop_();
RST=0;
_nop_();
RST=1; //拉高,準備寫地址讀數(shù)據(jù)
_nop_();
_nop_();
for(i=0;i《8;i++) //傳送8位地址,從哪里讀
{
SCLK=0; //置為低,以便實現(xiàn)上升沿
_nop_();
IO=addr&0x01; //先傳送最低位
addr》》=1; //向右移位,把8位數(shù)據(jù)依次寫入
SCLK=1; //數(shù)據(jù)在上升沿時,寫入數(shù)據(jù)
_nop_();
}
_nop_();
for(i=0;i《8;i++) //讀出8位數(shù)據(jù)
{
SCLK=1; //置為低,以便實現(xiàn)下降沿
_nop_();
dat》》=1; //向右移位,把8位數(shù)據(jù)依次讀出
if(IO==1)
dat=dat|0x80;
SCLK=0; //讀數(shù)據(jù)時,下降沿有效
_nop_();
}
RST=0; //復位
_nop_();
SCLK = 1;
_nop_();
IO = 0;
_nop_();
IO = 1;
_nop_();
return dat; //返回讀到的數(shù)據(jù) }
4、讀時間
void read_time()
{
uchar n;
for(n=0;n《7;n++)
time[n]=read(read_addr[n]); //讀取分秒時日月周年
}
評論
查看更多