久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

利人利己,做關(guān)于ds1302全面深入探討,歡迎踴躍參與

比較多的人在研究ds1302這款時(shí)鐘芯片,平時(shí)也會(huì)用到這個(gè),并且過(guò)程當(dāng)中也遇到些問(wèn)題,所以萌生開(kāi)貼大家來(lái)討論的想法,集思廣益,這樣討論出來(lái)的內(nèi)容利人利己,自己學(xué)到知識(shí)的同時(shí)也幫助了別人,把問(wèn)題集中起來(lái)

也希望高手們過(guò)來(lái)一起補(bǔ)充,一起討論遇到的問(wèn)題...更希望曾經(jīng)研究過(guò)這款芯片的同學(xué)來(lái)分享學(xué)習(xí)ds1302遇到的問(wèn)題和解決方法

我先說(shuō)一些

DS1302編程注意事項(xiàng):

通信:

1、單片機(jī)通過(guò)三線與ds1302芯片進(jìn)行數(shù)據(jù)通信:reset, data, sclk,但并非I2C通信方式。

2、reset其實(shí)質(zhì)相當(dāng)于片選CE,兩個(gè)作用:

a、選中芯片,開(kāi)啟ds1302移位寄存器,以進(jìn)行數(shù)據(jù)傳輸,且整個(gè)數(shù)據(jù)傳輸過(guò)程中,需要保持為 高電平;

b、突發(fā)訪問(wèn)(多字節(jié)傳輸)模式下,通過(guò)拉低reset來(lái)結(jié)束本次突發(fā)訪問(wèn)模式。

需要注意必須保證在sclk拉低的前提前才能拉高reset(換言之,每次開(kāi)始數(shù)據(jù)通信之前,必須sclk必須為低電平,那么sclk第一個(gè)邊緣則一定為上升沿)。

3、data引腳應(yīng)配置成可以雙向通信的模式(例如:開(kāi)漏輸出,外接上拉電阻),在程序中應(yīng)注意在單片機(jī)從接收ds1302數(shù)據(jù)之前,應(yīng)拉高data,避免影響ds1302輸出數(shù)據(jù);

4、sclk 與 reset引腳,配置為普通輸出模式即可。

5、ds1302時(shí)序:ds1302在sclk上升沿讀取data數(shù)據(jù),下降沿發(fā)布數(shù)據(jù)到data上。應(yīng)注意在ds1302有數(shù)據(jù)輸出時(shí),輸出數(shù)據(jù)開(kāi)始位是緊接著命令發(fā)送字節(jié)的末尾的下降沿輸出的。

全部回復(fù)(30)
正序查看
倒序查看
pirate
LV.4
2
2014-02-08 15:44

確實(shí)弄一個(gè)集中討論帖比較好,問(wèn)題比較集中也比較全面

DS1302操作上的問(wèn)題我寫(xiě)了一些大家可以看看,指導(dǎo)一下啊

1、任何寫(xiě)操作之前應(yīng)先清除寫(xiě)保護(hù)bit(特別重要)。

2、ds1302應(yīng)外接32768Hz晶振,但并非直接就能起振的 ,需要軟件清除 秒寄存器的bit7 即CH Bit,晶振才能正常工作,從而驅(qū)動(dòng)ds1302內(nèi)部計(jì)數(shù)器,達(dá)到準(zhǔn)確計(jì)時(shí) 的目的,若正常起振,則此時(shí)可以用示波器在晶振引腳處測(cè)出波形。

3、對(duì)于突發(fā)訪問(wèn)模式:即是在sclk的驅(qū)動(dòng)下,可以一次對(duì)多個(gè)寄存器進(jìn)行讀寫(xiě),但是均是從(ram或者時(shí)間/日歷寄存器)地址0開(kāi)始訪問(wèn)的。應(yīng)注意若是突發(fā)模式下寫(xiě) 時(shí)鐘/日歷寄存器 ,則必須要求傳輸8字節(jié)數(shù)據(jù),若是突發(fā)訪問(wèn)ram數(shù)據(jù),則不需要限定字節(jié)數(shù),可以通過(guò)拉低reset來(lái)結(jié)束本次突發(fā)訪問(wèn)。

4、ds1302的ram區(qū)域,掉電丟失,可以利用這種特性來(lái)檢測(cè)ds1302是否為第一次上電,從而確定是否需要配置ds1302。

0
回復(fù)
daylight
LV.4
3
2014-02-22 16:35

以下是我編寫(xiě)的DS1302芯片驅(qū)動(dòng)代碼,已測(cè)試,可以正常操作芯片,但是我用到的是stm32單片機(jī),估計(jì)會(huì)有同學(xué)不習(xí)慣使用庫(kù)的風(fēng)格,但是不重要,感興趣的同學(xué)可以參考程序的步驟就可以了,比如要看時(shí)序,就只看那一個(gè) 函數(shù)就可以了。。。。。更希望用51單片機(jī)開(kāi)發(fā)的同學(xué)要是方便的話,能上傳你寶貴的代碼,讓更多的人簡(jiǎn)單清楚的明白驅(qū)動(dòng)步驟,更好的幫助他們

 

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "ds1302.h"

#define DS1302_RESET_PORT GPIOC

#define DS1302_RESET_BIT GPIO_Pin_10

#define DS1302_SCLK_PORT GPIOC

#define DS1302_SCLK_BIT GPIO_Pin_11

#define DS1302_DATA_PORT GPIOC

#define DS1302_DATA_BIT GPIO_Pin_12

void DS1302Init(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//打開(kāi)時(shí)鐘模塊

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = DS1302_RESET_BIT;//reset

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(DS1302_RESET_PORT, &GPIO_InitStructure);//復(fù)位引腳

GPIO_InitStructure.GPIO_Pin = DS1302_SCLK_BIT;

GPIO_Init(DS1302_SCLK_PORT, &GPIO_InitStructure);//SCLK

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);

GPIO_InitStructure.GPIO_Pin = DS1302_DATA_BIT;//data

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//開(kāi)漏輸出,通過(guò)外接上拉電阻,達(dá)到雙向通信

GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);

DS1302TimeConfig();

}

unsigned char CommunicationByte(unsigned char value)

{

unsigned char i, temp;

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

temp = 0;

i = 0;

for(i = 0; i < 8; i++)

{

//接收數(shù)據(jù),數(shù)據(jù)是緊接著控制字最后一位輸出的

asm("NOP");asm("NOP");asm("NOP");asm("NOP");

temp >>= 1;//低位在前

if (GPIO_ReadInputDataBit(DS1302_DATA_PORT, DS1302_DATA_BIT) == 1)

{

temp |= 0x80;

}

//發(fā)送數(shù)據(jù)

if ((value & 0x01) != 0)

{

GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_SET);

}

else

{

GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_RESET);

}

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 1, 上升沿

value >>= 1;//低位在前

asm("NOP");asm("NOP");asm("NOP");asm("NOP");

GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_SET);//拉高DATA IO,避免影響芯片輸出

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0,下降沿

}

return temp;

}

void DS1302WriteRegister(unsigned char reg, unsigned char value)

{

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平

CommunicationByte(reg);

CommunicationByte(value);

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;

}

unsigned char DS1302ReadRegister(unsigned char reg)

{

unsigned char temp;

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平

CommunicationByte(reg);

temp = CommunicationByte(0xff);

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;

return temp;

}

void DS1302WriteTime(unsigned char *data)

{

unsigned char i;

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//reset = 1;

CommunicationByte(0xbe);//連續(xù)寫(xiě) 日歷/時(shí)鐘寄存器

for (i = 0; i < 8; i++)

{

CommunicationByte(data[i]);

}

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;

}

void DS1302ReadTime(unsigned char *buffer)

{

unsigned char i;

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//reset = 1;

CommunicationByte(0xbf);//連續(xù)讀 日歷/時(shí)鐘寄存器

for (i = 0; i < 8; i++)

{

buffer[i] = CommunicationByte(0xff);

}

GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 0;

GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;

}

void DS1302TimeConfig(void)

{

unsigned char temp;

unsigned char data[8] = {0x01,0x10,0x11,0x30,0x11,0x05,0x12};//for test

temp = DS1302ReadRegister(0xc1);//讀取ds1302ram 數(shù)據(jù)

if (temp != 0xaa)//第一次上電

{

DS1302WriteRegister(0x8e, 0x00);//允許寫(xiě)操作

DS1302WriteRegister(0xc0, 0xaa);//置標(biāo)志位

DS1302WriteTime(data);

DS1302WriteRegister(0x8e, 0x80);//禁止寫(xiě)操作

/*

DS1302WriteRegister(0x80,0x01);//設(shè)置秒

DS1302WriteRegister(0x82,0x18);//設(shè)置分

DS1302WriteRegister(0x84,0x17);//設(shè)置時(shí)

DS1302WriteRegister(0x86,0x29);//設(shè)置日

DS1302WriteRegister(0x88,0x11);//設(shè)置月

DS1302WriteRegister(0x8a,0x04);//設(shè)置星期

DS1302WriteRegister(0x8c,0x12);//設(shè)置年

*/

}

}

void DS1302TimeUpdate(unsigned char *data)

{

//data 數(shù)據(jù)應(yīng)為壓縮bcd碼

DS1302WriteRegister(0x8e, 0x00);//允許寫(xiě)操作

DS1302WriteRegister(0xc0, 0xaa);//置標(biāo)志位

DS1302WriteTime(data);//連續(xù)寫(xiě)入 時(shí)鐘/日歷 寄存器數(shù)據(jù)

DS1302WriteRegister(0x8e, 0x80);//禁止寫(xiě)操作

}

 

0
回復(fù)
daylight
LV.4
4
2014-02-22 16:39
@daylight
以下是我編寫(xiě)的DS1302芯片驅(qū)動(dòng)代碼,已測(cè)試,可以正常操作芯片,但是我用到的是stm32單片機(jī),估計(jì)會(huì)有同學(xué)不習(xí)慣使用庫(kù)的風(fēng)格,但是不重要,感興趣的同學(xué)可以參考程序的步驟就可以了,比如要看時(shí)序,就只看那一個(gè)函數(shù)就可以了。。。。。更希望用51單片機(jī)開(kāi)發(fā)的同學(xué)要是方便的話,能上傳你寶貴的代碼,讓更多的人簡(jiǎn)單清楚的明白驅(qū)動(dòng)步驟,更好的幫助他們 #include"stm32f10x_gpio.h"#include"stm32f10x_rcc.h"#include"ds1302.h"#defineDS1302_RESET_PORTGPIOC#defineDS1302_RESET_BITGPIO_Pin_10#defineDS1302_SCLK_PORTGPIOC#defineDS1302_SCLK_BITGPIO_Pin_11#defineDS1302_DATA_PORTGPIOC#defineDS1302_DATA_BITGPIO_Pin_12voidDS1302Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打開(kāi)時(shí)鐘模塊GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=DS1302_RESET_BIT;//resetGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(DS1302_RESET_PORT,&GPIO_InitStructure);//復(fù)位引腳GPIO_InitStructure.GPIO_Pin=DS1302_SCLK_BIT;GPIO_Init(DS1302_SCLK_PORT,&GPIO_InitStructure);//SCLKGPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);GPIO_InitStructure.GPIO_Pin=DS1302_DATA_BIT;//dataGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//開(kāi)漏輸出,通過(guò)外接上拉電阻,達(dá)到雙向通信GPIO_Init(DS1302_DATA_PORT,&GPIO_InitStructure);DS1302TimeConfig();}unsignedcharCommunicationByte(unsignedcharvalue){unsignedchari,temp;GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;temp=0;i=0;for(i=0;i<8;i++){//接收數(shù)據(jù),數(shù)據(jù)是緊接著控制字最后一位輸出的asm("NOP");asm("NOP");asm("NOP");asm("NOP");temp>>=1;//低位在前if(GPIO_ReadInputDataBit(DS1302_DATA_PORT,DS1302_DATA_BIT)==1){temp|=0x80;}//發(fā)送數(shù)據(jù)if((value&0x01)!=0){GPIO_WriteBit(DS1302_DATA_PORT,DS1302_DATA_BIT,Bit_SET);}else{GPIO_WriteBit(DS1302_DATA_PORT,DS1302_DATA_BIT,Bit_RESET);}GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_SET);//sclk=1,上升沿value>>=1;//低位在前asm("NOP");asm("NOP");asm("NOP");asm("NOP");GPIO_WriteBit(DS1302_DATA_PORT,DS1302_DATA_BIT,Bit_SET);//拉高DATAIO,避免影響芯片輸出GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0,下降沿}returntemp;}voidDS1302WriteRegister(unsignedcharreg,unsignedcharvalue){GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平CommunicationByte(reg);CommunicationByte(value);GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_RESET);//reset=0;}unsignedcharDS1302ReadRegister(unsignedcharreg){unsignedchartemp;GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平CommunicationByte(reg);temp=CommunicationByte(0xff);GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_SET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_RESET);//reset=0;returntemp;}voidDS1302WriteTime(unsignedchar*data){unsignedchari;GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_SET);//reset=1;CommunicationByte(0xbe);//連續(xù)寫(xiě)日歷/時(shí)鐘寄存器for(i=0;i<8;i++){CommunicationByte(data[i]);}GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_RESET);//reset=0;}voidDS1302ReadTime(unsignedchar*buffer){unsignedchari;GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_RESET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_SET);//reset=1;CommunicationByte(0xbf);//連續(xù)讀日歷/時(shí)鐘寄存器for(i=0;i<8;i++){buffer[i]=CommunicationByte(0xff);}GPIO_WriteBit(DS1302_SCLK_PORT,DS1302_SCLK_BIT,Bit_SET);//sclk=0;GPIO_WriteBit(DS1302_RESET_PORT,DS1302_RESET_BIT,Bit_RESET);//reset=0;}voidDS1302TimeConfig(void){unsignedchartemp;unsignedchardata[8]={0x01,0x10,0x11,0x30,0x11,0x05,0x12};//fortesttemp=DS1302ReadRegister(0xc1);//讀取ds1302ram數(shù)據(jù)if(temp!=0xaa)//第一次上電{DS1302WriteRegister(0x8e,0x00);//允許寫(xiě)操作DS1302WriteRegister(0xc0,0xaa);//置標(biāo)志位DS1302WriteTime(data);DS1302WriteRegister(0x8e,0x80);//禁止寫(xiě)操作/*DS1302WriteRegister(0x80,0x01);//設(shè)置秒DS1302WriteRegister(0x82,0x18);//設(shè)置分DS1302WriteRegister(0x84,0x17);//設(shè)置時(shí)DS1302WriteRegister(0x86,0x29);//設(shè)置日DS1302WriteRegister(0x88,0x11);//設(shè)置月DS1302WriteRegister(0x8a,0x04);//設(shè)置星期DS1302WriteRegister(0x8c,0x12);//設(shè)置年*/}}voidDS1302TimeUpdate(unsignedchar*data){//data數(shù)據(jù)應(yīng)為壓縮bcd碼DS1302WriteRegister(0x8e,0x00);//允許寫(xiě)操作DS1302WriteRegister(0xc0,0xaa);//置標(biāo)志位DS1302WriteTime(data);//連續(xù)寫(xiě)入時(shí)鐘/日歷寄存器數(shù)據(jù)DS1302WriteRegister(0x8e,0x80);//禁止寫(xiě)操作} 

學(xué)習(xí)過(guò)程中用到的關(guān)于ds1302的兩份參考資料

ds1302中文資料.pdf

DS1302中文資料_帶源代碼.pdf

0
回復(fù)
2014-02-22 16:42
下一步打算搞搞個(gè)這個(gè)片子。謝謝資料。
0
回復(fù)
2014-02-22 16:45
1302好芯片,不過(guò),殘次品太多,我就遇見(jiàn)個(gè),必須在IO口加上拉電阻才能工作的片子,不加就亂碼
0
回復(fù)
daylight
LV.4
7
2014-02-22 16:46
@soap泡泡
1302好芯片,不過(guò),殘次品太多,我就遇見(jiàn)個(gè),必須在IO口加上拉電阻才能工作的片子,不加就亂碼
這個(gè)情況可能和單片機(jī) io端口配置有關(guān), 要達(dá)到雙向通信的話,單片機(jī)io端口必須可以輸出和輸入,且單片機(jī)的輸出不能影響到DS1302的輸出(說(shuō)的有點(diǎn)繞口,要表達(dá)的意思就是,同一時(shí)刻IO data只能分配給cpu或者 DS1302有效使用,而另一個(gè)則要配置為不影響IO data狀態(tài)),有的模式下就必須要外接上拉電阻才能正常通信。就stm32F10x單片機(jī)而言,要達(dá)到雙向通信的功能,io端口必須要配置成開(kāi)漏輸出,那么則必須要外接上拉電阻才能實(shí)現(xiàn)  輸出高電平.。。。。。。。。具體的話,你可以詳細(xì)了解下 開(kāi)漏輸出, 我說(shuō)的肯定也不是多么 準(zhǔn)確哈
0
回復(fù)
backin
LV.4
8
2014-02-22 16:47
@daylight
這個(gè)情況可能和單片機(jī)io端口配置有關(guān),要達(dá)到雙向通信的話,單片機(jī)io端口必須可以輸出和輸入,且單片機(jī)的輸出不能影響到DS1302的輸出(說(shuō)的有點(diǎn)繞口,要表達(dá)的意思就是,同一時(shí)刻IOdata只能分配給cpu或者DS1302有效使用,而另一個(gè)則要配置為不影響IOdata狀態(tài)),有的模式下就必須要外接上拉電阻才能正常通信。就stm32F10x單片機(jī)而言,要達(dá)到雙向通信的功能,io端口必須要配置成開(kāi)漏輸出,那么則必須要外接上拉電阻才能實(shí)現(xiàn)  輸出高電平.。。。。。。。。具體的話,你可以詳細(xì)了解下開(kāi)漏輸出,我說(shuō)的肯定也不是多么準(zhǔn)確哈
什么叫開(kāi)漏輸出???
0
回復(fù)
backin
LV.4
9
2014-02-22 16:49

ds1302有兩個(gè)vcc分別是1和8引腳,在應(yīng)用是1號(hào)引腳為備用電源端,但不知對(duì)電源電壓大小有無(wú)要求啊?又是多少呢?

這是我在制作時(shí)鐘時(shí)使用DS1302的操作代碼和對(duì)應(yīng)時(shí)序圖:

void WriteDs1302Byte(uchar temp)

{

uchar i;

for(i=8;i>0;i--)

{

DS1302_IO=temp&0x01;

DS1302_CLK=0;

DS1302_CLK=1;

temp>>=1;

}

}

void WriteDs1302( uchar address,uchar dat )

{

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

delay(1);

WriteDs1302Byte(address);

WriteDs1302Byte(dat);

DS1302_RST=0;

}

uchar read_byte()

{

uchar i;

for(i=8;i>0;i--)

{

if(DS1302_IO)

temp0=temp0|0x80;

DS1302_CLK=1;

DS1302_CLK=0;

temp0=temp0>>1;

}

return temp0;

}

uchar ReadDs1302(uchar address)

{

uchar temp;

DS1302_RST=0;

DS1302_CLK=0;

DS1302_RST=1;

WriteDs1302Byte(address);

temp=read_byte();

DS1302_RST=0;

DS1302_CLK=1;

return temp;

}

 

0
回復(fù)
daylight
LV.4
10
2014-02-22 16:53
@backin
ds1302有兩個(gè)vcc分別是1和8引腳,在應(yīng)用是1號(hào)引腳為備用電源端,但不知對(duì)電源電壓大小有無(wú)要求啊?又是多少呢?這是我在制作時(shí)鐘時(shí)使用DS1302的操作代碼和對(duì)應(yīng)時(shí)序圖:voidWriteDs1302Byte(uchartemp){uchari;for(i=8;i>0;i--){DS1302_IO=temp&0x01;DS1302_CLK=0;DS1302_CLK=1;temp>>=1;}}voidWriteDs1302(ucharaddress,uchardat){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;delay(1);WriteDs1302Byte(address);WriteDs1302Byte(dat);DS1302_RST=0;}ucharread_byte(){uchari;for(i=8;i>0;i--){if(DS1302_IO)temp0=temp0|0x80;DS1302_CLK=1;DS1302_CLK=0;temp0=temp0>>1;}returntemp0;}ucharReadDs1302(ucharaddress){uchartemp;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;WriteDs1302Byte(address);temp=read_byte();DS1302_RST=0;DS1302_CLK=1;returntemp;}[圖片] 

我也是最近才發(fā)現(xiàn) 這個(gè)問(wèn)題:還沒(méi)有說(shuō) 兩個(gè)電源的關(guān)系......主要是還沒(méi)有吃透透這個(gè)地方..。。。用過(guò)ds1302備用電源的同學(xué)一起來(lái)討論下...........首先,vcc1電壓范圍 2.0-5.5v, 那么vcc2 也應(yīng)該是這個(gè)范圍....兩個(gè)電源切換條件如下:

可以這么理解, vcc1 和vcc2 哪個(gè)電壓高些,就由那個(gè)電源向芯片供電。。。。。。。。然后,ds1302手冊(cè)里面 涓流充電有如下圖:

 ds1302內(nèi)部具有充電電路,只要配置相應(yīng)的寄存器即可啟用..............根據(jù)圖中二極管方向,則可以發(fā)現(xiàn),電流只能有1腳vcc 流向 8腳vcc, 所以,只能由1腳的電源給8腳的電源充電,那么,8腳應(yīng)該接超級(jí)電容或者可充電電池,但是 用戶手冊(cè)上則說(shuō),1腳為備用電源,8腳為主電壓...有點(diǎn)不理解這個(gè)地方.................現(xiàn)在懷疑是不是用戶手冊(cè)翻譯的時(shí)候出錯(cuò)了

 

 

0
回復(fù)
daylight
LV.4
11
2014-02-22 16:54
@backin
什么叫開(kāi)漏輸出???
我也是 在stm32單片機(jī)時(shí)候,才曉得這個(gè)概念的!!百度一下吧,貌似51的p0端口就是 開(kāi)漏輸出
0
回復(fù)
elio
LV.2
12
2014-02-22 16:56
開(kāi)漏輸出應(yīng)該就是內(nèi)部沒(méi)有上拉電阻或者管子的,意思是只能靠外部接上拉電阻來(lái)灌電流的引腳。
0
回復(fù)
vidas
LV.2
13
2014-02-22 17:03
我用的是DS1302N,如果第8腳接電池的話,芯片發(fā)熱很厲害,所以,第8腳不能接電池,只有想別的辦法讓他不斷電了.
0
回復(fù)
daylight
LV.4
14
2014-02-22 17:04
@vidas
我用的是DS1302N,如果第8腳接電池的話,芯片發(fā)熱很厲害,所以,第8腳不能接電池,只有想別的辦法讓他不斷電了.
芯片發(fā)燙,很有可能是電流過(guò)大,這個(gè)樣子的話,不能通過(guò)ds1302來(lái)給電池充電了么?
0
回復(fù)
一木01
LV.3
15
2014-02-22 17:05
@daylight
我也是最近才發(fā)現(xiàn)這個(gè)問(wèn)題:還沒(méi)有說(shuō)兩個(gè)電源的關(guān)系......主要是還沒(méi)有吃透透這個(gè)地方..。。。用過(guò)ds1302備用電源的同學(xué)一起來(lái)討論下...........首先,vcc1電壓范圍2.0-5.5v,那么vcc2也應(yīng)該是這個(gè)范圍....兩個(gè)電源切換條件如下:[圖片]可以這么理解,vcc1和vcc2哪個(gè)電壓高些,就由那個(gè)電源向芯片供電。。。。。。。。然后,ds1302手冊(cè)里面涓流充電有如下圖:[圖片] ds1302內(nèi)部具有充電電路,只要配置相應(yīng)的寄存器即可啟用..............根據(jù)圖中二極管方向,則可以發(fā)現(xiàn),電流只能有1腳vcc流向8腳vcc,所以,只能由1腳的電源給8腳的電源充電,那么,8腳應(yīng)該接超級(jí)電容或者可充電電池,但是用戶手冊(cè)上則說(shuō),1腳為備用電源,8腳為主電壓...有點(diǎn)不理解這個(gè)地方.................現(xiàn)在懷疑是不是用戶手冊(cè)翻譯的時(shí)候出錯(cuò)了  
英文手冊(cè)上說(shuō)1腳VCC2是主電源接口,8腳VCC1是備用電源接口。
0
回復(fù)
matou
LV.3
16
2014-02-22 17:06
我做的實(shí)時(shí)時(shí)鐘DS18B20,電源斷電為什么不能保持呢
0
回復(fù)
cloud7890
LV.2
17
2014-02-22 17:08
@matou
我做的實(shí)時(shí)時(shí)鐘DS18B20,電源斷電為什么不能保持呢
沒(méi)有備用電池?
0
回復(fù)
stony_s
LV.3
18
2014-02-22 17:09
DS1302使用比較方便,不用I2C。同樣地時(shí)鐘芯片DS1307就很麻煩,I2C搞來(lái)搞去的。
0
回復(fù)
close3
LV.5
19
2014-02-22 17:10
我有一個(gè)問(wèn)題,想請(qǐng)教一下大家,我用ds1302,在設(shè)置時(shí)間時(shí),讓芯片暫停,可是開(kāi)始后為什么芯片就不運(yùn)行了?
0
回復(fù)
for_real
LV.3
20
2014-02-22 17:13
@backin
ds1302有兩個(gè)vcc分別是1和8引腳,在應(yīng)用是1號(hào)引腳為備用電源端,但不知對(duì)電源電壓大小有無(wú)要求啊?又是多少呢?這是我在制作時(shí)鐘時(shí)使用DS1302的操作代碼和對(duì)應(yīng)時(shí)序圖:voidWriteDs1302Byte(uchartemp){uchari;for(i=8;i>0;i--){DS1302_IO=temp&0x01;DS1302_CLK=0;DS1302_CLK=1;temp>>=1;}}voidWriteDs1302(ucharaddress,uchardat){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;delay(1);WriteDs1302Byte(address);WriteDs1302Byte(dat);DS1302_RST=0;}ucharread_byte(){uchari;for(i=8;i>0;i--){if(DS1302_IO)temp0=temp0|0x80;DS1302_CLK=1;DS1302_CLK=0;temp0=temp0>>1;}returntemp0;}ucharReadDs1302(ucharaddress){uchartemp;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;WriteDs1302Byte(address);temp=read_byte();DS1302_RST=0;DS1302_CLK=1;returntemp;}[圖片] 
相差0.2V以上,腳可以隨便接,默認(rèn)低電壓端為備用,另里面可選充電電阻二極管
0
回復(fù)
god_father
LV.3
21
2014-02-22 17:14
自己用ds1302和1602做了一個(gè)時(shí)鐘,但51不能從ds1302中讀取數(shù)據(jù),1602一直在那閃。
0
回復(fù)
一木01
LV.3
22
2014-02-22 17:31
@daylight
我也是最近才發(fā)現(xiàn)這個(gè)問(wèn)題:還沒(méi)有說(shuō)兩個(gè)電源的關(guān)系......主要是還沒(méi)有吃透透這個(gè)地方..。。。用過(guò)ds1302備用電源的同學(xué)一起來(lái)討論下...........首先,vcc1電壓范圍2.0-5.5v,那么vcc2也應(yīng)該是這個(gè)范圍....兩個(gè)電源切換條件如下:[圖片]可以這么理解,vcc1和vcc2哪個(gè)電壓高些,就由那個(gè)電源向芯片供電。。。。。。。。然后,ds1302手冊(cè)里面涓流充電有如下圖:[圖片] ds1302內(nèi)部具有充電電路,只要配置相應(yīng)的寄存器即可啟用..............根據(jù)圖中二極管方向,則可以發(fā)現(xiàn),電流只能有1腳vcc流向8腳vcc,所以,只能由1腳的電源給8腳的電源充電,那么,8腳應(yīng)該接超級(jí)電容或者可充電電池,但是用戶手冊(cè)上則說(shuō),1腳為備用電源,8腳為主電壓...有點(diǎn)不理解這個(gè)地方.................現(xiàn)在懷疑是不是用戶手冊(cè)翻譯的時(shí)候出錯(cuò)了  

vcc2才是主電壓,上面的是datasheet上的引腳說(shuō)明

0
回復(fù)
cloud7890
LV.2
23
2014-02-22 17:32

搞了一晚上的ds1302,連開(kāi)發(fā)板的程序都覺(jué)得怪怪的。

開(kāi)發(fā)板的程序這樣的:

sbit SCK=P2^7; //時(shí)鐘

sbit SDA=P2^6; //數(shù)據(jù)

sbit RST = P2^5;// DS1302復(fù)位

好的,上面給出了開(kāi)發(fā)板的硬件連接。我隨后在另一個(gè)最小系統(tǒng)上寫(xiě)入這樣的代碼:

sbit SCK=P2^6; //時(shí)鐘

sbit SDA=P2^5; //數(shù)據(jù)

sbit RST = P2^4;// DS1302復(fù)位

然后分別把開(kāi)發(fā)板的p27接另一個(gè)板的P26,P26-P25,P25-P24.

這樣的目的是為了讓另一塊板子上的單片機(jī)讀出開(kāi)發(fā)板上DS1302的數(shù)據(jù),并將時(shí)分秒的十進(jìn)制通過(guò)串口送出去這樣我就會(huì)看見(jiàn)數(shù)據(jù)了。然后,上電,出錯(cuò)。

無(wú)論IO口怎么改就是讀不出,只有一種設(shè)定可以正常:另一個(gè)板子的P27,P26,P25和開(kāi)發(fā)板的程序?qū)?yīng),硬件連接一模一樣就可以。

0
回復(fù)
cloud7890
LV.2
24
2014-02-22 17:35
@cloud7890
搞了一晚上的ds1302,連開(kāi)發(fā)板的程序都覺(jué)得怪怪的。開(kāi)發(fā)板的程序這樣的:sbitSCK=P2^7;//時(shí)鐘sbitSDA=P2^6;//數(shù)據(jù)sbitRST=P2^5;//DS1302復(fù)位好的,上面給出了開(kāi)發(fā)板的硬件連接。我隨后在另一個(gè)最小系統(tǒng)上寫(xiě)入這樣的代碼:sbitSCK=P2^6;//時(shí)鐘sbitSDA=P2^5;//數(shù)據(jù)sbitRST=P2^4;//DS1302復(fù)位然后分別把開(kāi)發(fā)板的p27接另一個(gè)板的P26,P26-P25,P25-P24.這樣的目的是為了讓另一塊板子上的單片機(jī)讀出開(kāi)發(fā)板上DS1302的數(shù)據(jù),并將時(shí)分秒的十進(jìn)制通過(guò)串口送出去這樣我就會(huì)看見(jiàn)數(shù)據(jù)了。然后,上電,出錯(cuò)。無(wú)論IO口怎么改就是讀不出,只有一種設(shè)定可以正常:另一個(gè)板子的P27,P26,P25和開(kāi)發(fā)板的程序?qū)?yīng),硬件連接一模一樣就可以。
我發(fā)現(xiàn)我的DS1302三根線只能和單片機(jī)P2口連著才能工作,任何一根線和上拉電阻的P0口連接就會(huì)出錯(cuò)。為什么會(huì)這么奇怪呢
0
回復(fù)
pirate
LV.4
25
2014-02-22 17:37
前段時(shí)間終于搞定了,我買(mǎi)的是淘寶上的模塊(店家說(shuō)接不接電阻沒(méi)關(guān)系,事實(shí)上一定得接10k上拉),我用的是AT51
0
回復(fù)
001a
LV.3
26
2014-02-22 17:42
好帖子呀。能這么細(xì)心回復(fù)的還是少見(jiàn)。我在做一個(gè)18B20+1302的板子,溫度正常,就是時(shí)間怎么都不走,也調(diào)不了。一直都是顯示2000-01-01好是頭疼
0
回復(fù)
001a
LV.3
27
2014-02-22 17:45
@001a
好帖子呀。能這么細(xì)心回復(fù)的還是少見(jiàn)。我在做一個(gè)18B20+1302的板子,溫度正常,就是時(shí)間怎么都不走,也調(diào)不了。一直都是顯示2000-01-01好是頭疼
我的1302接在了i/oP1.1口,SCLK--P1.0,RST---P1.2。就是無(wú)法正常工作.其他資料說(shuō)是1接VCC,8接電容。DS1302_IO = ACC0;                       是不是應(yīng)該把這句寫(xiě)到前面去呀?(   DS1302_CLK = 1;)
0
回復(fù)
2014-02-22 17:48
剛好用到這個(gè)芯片,搞得我頭都大了
0
回復(fù)
pirate
LV.4
29
2014-02-22 17:52
前一段時(shí)間也用這個(gè)做了一個(gè)顯示屏
0
回復(fù)
heal
LV.3
30
2014-02-22 17:54

樓主你好 請(qǐng)教個(gè)問(wèn)題 我做的12864萬(wàn)年歷 液晶顯示了 就是時(shí)鐘不走 不知道是什么原因 附上原理圖和驅(qū)動(dòng)程序 知道的大神幫幫看看 感激不盡 ,,,,//DS1302時(shí)鐘芯片驅(qū)動(dòng)程序

/*****************************************************************************/

//常用時(shí)鐘數(shù)據(jù)讀取

void Read1302S(void){

ss = Read1302(0x81);//讀取秒數(shù)據(jù)

mm = Read1302(0x83);//讀取分鐘數(shù)據(jù)

hh = Read1302(0x85);//小時(shí)

dd = Read1302(0x87);//日

mo = Read1302(0x89);//月

xq = Read1302(0x8b);//星期

yy = Read1302(0x8d);//年

}

/*****************************************************************************/

//調(diào)時(shí)用加1程序

void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫(xiě)入DS1302

signed char address,item;

signed char max,mini;

LCM_WriteDatOrCom(0,0x9a);

LCM_WriteString("調(diào)整");

//if(sel==6) {LCM_WriteString("秒鐘");address=0x80; max=0;mini=0;} //秒7

if(sel==5) {LCM_WriteString("分鐘");address=0x82; max=59;mini=0;} //分鐘6

if(sel==4) {LCM_WriteString("小時(shí)");address=0x84; max=23;mini=0;} //小時(shí)5

if(sel==3) {LCM_WriteString("星期");address=0x8a; max=7;mini=1;} //星期4

if(sel==2) {LCM_WriteString("日期");address=0x86; max=31;mini=1;} //日3

if(sel==1) {LCM_WriteString("月份");address=0x88; max=12;mini=1;} //月2

if(sel==0) {LCM_WriteString("年份");address=0x8c; max=99; mini=0;} //年1

//讀取1302某地址上的數(shù)值轉(zhuǎn)換成10進(jìn)制賦給item

item=((Read1302(address+1))/16)*10 + (Read1302(address+1))%16;

if(KEY_2 == 0){

item++;//數(shù)加 1

}

if(KEY_4 == 0){

item--;//數(shù)減 1

}

if(item>max) item=mini;//查看數(shù)值有效范圍

if(item

Write1302(0x8e,0x00);//允許寫(xiě)操作

Write1302(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫(xiě)入1302

Write1302(0x8e,0x80);//寫(xiě)保護(hù),禁止寫(xiě)操作

updata (); //刷新數(shù)據(jù)

lcm_w_mm();//刷新 分

}

/*****************************************************************************/

//設(shè)置1302的初始時(shí)間(自動(dòng)初始化)

void Init_1302(void){//-設(shè)置1302的初始時(shí)間(2007年1月1日00時(shí)00分00秒星期一)

unsigned char f;

if(Read1302(0xc1) != 0xaa){

Write1302(0x8e,0x00);//允許寫(xiě)操作

Write1302(0x8c,0x10);//年

Write1302(0x8a,0x01);//星期

Write1302(0x88,0x01);//月

Write1302(0x86,0x01);//日

Write1302(0x84,0x00);//小時(shí)

Write1302(0x82,0x00);//分鐘

Write1302(0x80,0x00);//秒

Write1302(0x90,0xa5);//充電

Write1302(0xc0,0xaa);//寫(xiě)入初始化標(biāo)志RAM(第00個(gè)RAM位置)

for(f=0;f<60;f=f+2){//清除鬧鐘RAM位為0

Write1302(0xc2+f,0x00);

}

Write1302(0x8e,0x80);//禁止寫(xiě)操作

}

}

/*****************************************************************************/

//DS1302寫(xiě)數(shù)據(jù)(底層協(xié)議)

void Write1302(unsigned char ord, unsigned char dd){

clock_clk=0;

clock_Rst=0;

clock_Rst=1;

DS1302OutputByte(ord);

DS1302OutputByte(dd);

clock_Rst=0;

clock_clk=1;

}

/*****************************************************************************/

//1302驅(qū)動(dòng)程序(底層協(xié)議)

void DS1302OutputByte(unsigned char dd){

ACC=dd;

clock_dat=a0; clock_clk=1; clock_clk=0;

clock_dat=a1; clock_clk=1; clock_clk=0;

clock_dat=a2; clock_clk=1; clock_clk=0;

clock_dat=a3; clock_clk=1; clock_clk=0;

clock_dat=a4; clock_clk=1; clock_clk=0;

clock_dat=a5; clock_clk=1; clock_clk=0;

clock_dat=a6; clock_clk=1; clock_clk=0;

clock_dat=a7; clock_clk=1; clock_clk=0;

}

/*****************************************************************************/

//DS1302寫(xiě)入字節(jié)(底層協(xié)議)

unsigned char DS1302InputByte(void){

clock_dat=1;

a0=clock_dat;

clock_clk=1; clock_clk=0; a1=clock_dat;

clock_clk=1; clock_clk=0; a2=clock_dat;

clock_clk=1; clock_clk=0; a3=clock_dat;

clock_clk=1; clock_clk=0; a4=clock_dat;

clock_clk=1; clock_clk=0; a5=clock_dat;

clock_clk=1; clock_clk=0; a6=clock_dat;

clock_clk=1; clock_clk=0; a7=clock_dat;

return(ACC);

}

/*****************************************************************************/

//DS1302讀數(shù)據(jù)(底層協(xié)議)

unsigned char Read1302(unsigned char ord){

unsigned char dd=0;

clock_clk=0;

clock_Rst=0;

clock_Rst=1;

DS1302OutputByte(ord);

dd=DS1302InputByte();

clock_Rst=0;

clock_clk=1;

return(dd);

}

 

 

0
回復(fù)
2014-02-22 17:55
我的DS1302無(wú)論怎樣 用1602顯示的時(shí)候都是亂碼
0
回復(fù)
發(fā)