DS1302是由美國DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實(shí)時(shí)時(shí)鐘芯片。它可以對年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),并且具有閏年補(bǔ)償?shù)榷喾N功能。
1、參考電路
如下參考電路已經(jīng)過實(shí)踐驗(yàn)證,可正常工作。
其中,PU151到PU153對應(yīng)DS1302的SCLK,IO,RST引腳,需接到微處理器(如單片機(jī))的相關(guān)引腳。
第8腳加上3V的后備紐扣電池,時(shí)鐘在主電路掉電時(shí)也可以持續(xù)運(yùn)行。
2、參考程序
實(shí)踐驗(yàn)證,以下兩個(gè)程序任意一個(gè)都是可以運(yùn)行的。
2.1參考程序1
//DS1302設(shè)置子程序
#include "ds1302.h"
sbit sclk=P3^3;//DS1302設(shè)置
sbit rst=P3^5;
sbit io=P3^4; //DS1302三個(gè)管腳定義
unsigned char xdata time[7]={23,1,3,20,5,6,7};//0年 1周 2月 3日 4時(shí) 5分 6秒 有符號
unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302寫時(shí)間寄存器地址
unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀
void write_ds1302_byte(unsigned char dat) //DS1302寫字節(jié)函數(shù)
{
unsigned char i;
for(i=0;i<8;i++)
{
sclk=0; //下降沿?cái)?shù)據(jù)有效
io=dat&0x01;
dat=dat>>1;
sclk=1;
}
}
void write_ds1302(unsigned char add,unsigned char dat)
{
rst=0;
nop ();
sclk=0;
nop ();
rst=1;
nop ();
write_ds1302_byte(add);
write_ds1302_byte(dat);//發(fā)送地址后立即發(fā)送數(shù)據(jù),沒有停頓
rst=0;
nop ();
sclk=1;
io=1;
}
unsigned char read_ds1302(unsigned char add)
{
unsigned char i,dat=0;
rst=0;
nop ();
sclk=0;
nop ();
rst=1;
nop ();
write_ds1302_byte(add);//發(fā)送地址后DS1302立即送出數(shù)據(jù)
for(i=0;i<8;i++)
{
dat=dat>>1;
sclk=0;
if(io)
dat=dat|0x80;
sclk=1;
}
rst=0;
nop ();
sclk=0;
nop ();
sclk=1;
io=0; //223-3-20,1改為0后可保存數(shù)據(jù)
return dat;
}
void ds1302_init()
{
unsigned char i,j;
for(i=0;i<7;i++)
{
j=time[i]/10;
time[i]=time[i]%10;
time[i]=time[i]+j*16; //轉(zhuǎn)換為BCD碼
}
write_ds1302(0x8e,0x00);//去除寫保護(hù)
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time[i]);
}
write_ds1302(0x8e,0x80);//加寫保護(hù)
}
void read_time()//讀時(shí)間
{
unsigned char i;
for(i=0;i<8;i++)
{
time[i]=read_ds1302(read_add[i]);
time[i]=time[i]/16*10+time[i]%16;//轉(zhuǎn)換BCD碼為十進(jìn)制
}
if (time[4]>23) time[4]=23;
if (time[5]>59) time[5]=59;
if (time[6]>59) time[6]=59;
}
說明:
●如果要讀取時(shí)間,就調(diào)用read_time()子程序,讀取的時(shí)鐘數(shù)據(jù)存入time[]數(shù)組;
●如果要設(shè)置時(shí)間,就調(diào)用ds1302_init()子程序,要設(shè)置的時(shí)鐘數(shù)據(jù)預(yù)先存入time[]數(shù)組;
●ds1302_init()子程序不能每次開機(jī)運(yùn)行,只需在修改時(shí)間時(shí)運(yùn)行即可。
2.2參考程序2
#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int
//DS1302宏定義部分
#define WRITE_SECOND 0x80 //寫秒地址
#define WRITE_MINUTE 0x82 //寫分地址
#define WRITE_HOUR 0x84 //寫時(shí)地址
#define WRITE_DATE 0x86 //寫日地址
#define WRITE_MONTH 0x88 //寫月地址
#define WRITE_WEEK 0x8A //寫周地址
#define WRITE_YEAR 0x8C //寫年地址
#define WRITE_PROTECT 0x8E //寫保護(hù)
#define READ_SECOND 0x81 //讀秒地址
#define READ_MINUTE 0x83 //讀分地址
#define READ_HOUR 0x85 //讀時(shí)地址
#define READ_DATE 0x87 //讀日地址
#define READ_MONTH 0x89 //讀月地址
#define READ_WEEK 0x8B //讀周地址
#define READ_YEAR 0x8D //讀年地址
sbit ACC_7 = ACC^7; //位尋址寄存器定義
sbit SCLK = P3^3; // DS1302時(shí)鐘信號6腳
sbit DIO= P3^4; // DS1302數(shù)據(jù)信號5腳
sbit CE = P3^5; // DS1302片選7腳
uchar xdata time[7]={23,1,3,2,5,6,7}; //依次存放年月日周時(shí)分秒,十進(jìn)制表示,2023年1月3日周2 5:6:7
//地址、數(shù)據(jù)發(fā)送子程序
void Write1302 ( unsigned char addr,dat )
{
unsigned char i,temp;
CE=0; //CE 引腳為低,數(shù)據(jù)傳送中止
SCLK=0; //清零時(shí)鐘總線
CE = 1; //CE 引腳為高,邏輯控制有效
//發(fā)送地址
for ( i=8; i >0; i-- ) //循環(huán)8次移位
{
SCLK = 0;
temp = addr;
DIO = (bit)(temp&0x01); //每次傳輸?shù)妥止?jié)
addr > >= 1; //右移一位
SCLK = 1;
}
//發(fā)送數(shù)據(jù)
for ( i=8; i >0; i-- )
{
SCLK = 0;
temp = dat;
DIO = (bit)(temp&0x01); //每次傳輸?shù)妥止?jié)
dat > >= 1; //右移一位
SCLK = 1;
}
CE = 0;
}
//數(shù)據(jù)讀取子程序
unsigned char Read1302 ( unsigned char addr )
{
unsigned char i,temp,dat1,dat2;
CE=0;
SCLK=0;
CE = 1;
//發(fā)送地址
for ( i=8; i >0; i-- ) //循環(huán)8次移位
{
SCLK = 0;
temp = addr;
DIO = (bit)(temp&0x01); //每次傳輸?shù)妥止?jié)
addr > >= 1; //右移一位
SCLK = 1;
}
//讀取數(shù)據(jù)
for ( i=8; i >0; i-- )
{
ACC_7=DIO;
SCLK = 1;
ACC >>=1;
SCLK = 0;
}
CE=0;
dat1=ACC;
dat2=dat1/16; //數(shù)據(jù)進(jìn)制轉(zhuǎn)換
dat1=dat1%16; //十六進(jìn)制轉(zhuǎn)十進(jìn)制
dat1=dat1+dat2*10;
return (dat1);
}
//初始化 DS1302
void InitialDS1302(void)
{
//初始化為13年04月24日周3 23時(shí)27分56秒 注意,Write1302函數(shù)第二個(gè)參數(shù)是16進(jìn)制,需進(jìn)行十進(jìn)制到十六進(jìn)制轉(zhuǎn)碼,如參數(shù)里:秒0X56表示56秒,0X12表示12月,0x23表示23時(shí)等,以下已轉(zhuǎn)碼。
Write1302 (WRITE_PROTECT,0X00); //禁止寫保護(hù)
Write1302 (WRITE_SECOND,time[6]/10*16+time[6]%10); //秒位初始化
Write1302 (WRITE_MINUTE,time[5]/10*16+time[5]%10); //分鐘初始化
Write1302 (WRITE_HOUR,time[4]/10*16+time[4]%10); //時(shí)位初始化
Write1302 (WRITE_YEAR,time[0]/10*16+time[0]%10); //年位初始化
Write1302 (WRITE_MONTH,time[1]/10*16+time[1]%10); //月位初始化
Write1302 (WRITE_DATE,time[2]/10*16+time[2]%10); //日位初始化
Write1302 (WRITE_WEEK,time[3]/10*16+time[3]%10); //星期位初始化
Write1302 (WRITE_PROTECT,0x80); //允許寫保護(hù)
}
//讀取年月日周時(shí)分秒
void read_time(void)
{
time[0]=Read1302(READ_YEAR); //取年
time[1]=Read1302(READ_MONTH); //取月
time[2]=Read1302(READ_DATE); //取日
time[3]=Read1302(READ_WEEK); //取周
time[4]=Read1302(READ_HOUR); //取時(shí)
time[5]=Read1302(READ_MINUTE); //取分
time[6]=Read1302(READ_SECOND); //取
}
//// 運(yùn)行 read_nyrsfm()子函數(shù)讀取數(shù)組time[]顯示即可
說明:
●如果要讀取時(shí)間,就調(diào)用read_time()子程序,讀取的時(shí)鐘數(shù)據(jù)存入time[]數(shù)組;
●如果要設(shè)置時(shí)間,就調(diào)用InitialDS1302()子程序,要設(shè)置的時(shí)鐘數(shù)據(jù)預(yù)先存入time[]數(shù)組。
●InitialDS1302()子程序不能每次開機(jī)運(yùn)行,只需在修改時(shí)間時(shí)運(yùn)行即可。
以上電路和程序已經(jīng)過實(shí)踐驗(yàn)證,可正常運(yùn)行。
-
時(shí)鐘芯片
+關(guān)注
關(guān)注
2文章
253瀏覽量
39983 -
DS1302
+關(guān)注
關(guān)注
8文章
449瀏覽量
50836 -
ACC
+關(guān)注
關(guān)注
1文章
57瀏覽量
22826 -
紐扣電池
+關(guān)注
關(guān)注
2文章
112瀏覽量
7687
發(fā)布評論請先 登錄
相關(guān)推薦
實(shí)時(shí)時(shí)鐘模DS1302程序列子
實(shí)時(shí)時(shí)鐘電路DS1302的原理及應(yīng)用
![實(shí)時(shí)<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>電路</b><b class='flag-5'>DS1302</b>的原理及應(yīng)用](https://file1.elecfans.com//web2/M00/A4/B0/wKgZomUMNUeAfpr6AABsm1c2BPg235.jpg)
ds1302時(shí)鐘程序詳解,ds1302程序流程圖(C程序)
![<b class='flag-5'>ds1302</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>程序</b>詳解,<b class='flag-5'>ds1302</b><b class='flag-5'>程序</b>流程圖(C<b class='flag-5'>程序</b>)](https://file1.elecfans.com//web2/M00/A4/EA/wKgZomUMNjKANx2HAAVhZtXWA1g700.bmp)
ds1302芯片介紹,ds1302工作原理解析
DS1302時(shí)鐘芯片調(diào)試經(jīng)驗(yàn),奉上調(diào)試時(shí)鐘芯片DS1302的程序
ds1302時(shí)鐘芯片初始化,自動決定DS1302是否需要初始化程序
51單片機(jī)DS1302實(shí)時(shí)時(shí)鐘驅(qū)動程序
![51單片機(jī)<b class='flag-5'>DS1302</b>實(shí)時(shí)<b class='flag-5'>時(shí)鐘</b>驅(qū)動<b class='flag-5'>程序</b>](https://file.elecfans.com/web1/M00/50/B2/o4YBAFr6LmKAEuoIAAAhWUg4zlo494.jpg)
DS1302時(shí)鐘芯片與液晶1602的程序免費(fèi)下載
![<b class='flag-5'>DS1302</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>芯片</b>與液晶1602的<b class='flag-5'>程序</b>免費(fèi)下載](https://file.elecfans.com/web1/M00/AC/72/pIYBAF3BPjGAIpv1AAJVoNWZN78670.png)
DS1302時(shí)鐘芯片的詳細(xì)資料和使用詳細(xì)說明
![<b class='flag-5'>DS1302</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>芯片</b>的詳細(xì)資料和使用詳細(xì)說明](https://file.elecfans.com/web1/M00/B1/69/pIYBAF34LMCAW02-AADmSbtiCuc342.png)
評論