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