unsigned char time[3]={0x50,0x59,0x00}; //00:59:50
void ds1302_init()
{
unsigned char k;
Write_Ds1302(0x8e,0x00);
for(k=0;k<3;k++)
{
Write_Ds1302(write_addr[k],time[k]); //寫入秒,分,時
}
Write_Ds1302(0x8e,0x80);
}
秒和分都能寫進去,小時寫不進去,哪位大佬路過指導一下。
uj5u.com熱心網友回復:
秒和分都能寫進去,寫時序應該沒有問題。樓主檢查一下讀時序吧。uj5u.com熱心網友回復:
unsigned char write_addr[]={0x80,0x82,0x84};unsigned char read_addr[]={0x81,0x83,0x85};
void read_time()
{
unsigned char n;
for(n=0;n<3;n++)
{
time[n]=Read_Ds1302(read_addr[n]);
}
}
讀也只能讀出分和秒,小時不會進位,會不會初始化需要秒、分、時需要延時啊
uj5u.com熱心網友回復:
樓主,帖一下子函式Read_Ds1302(unsigned char) 和 Write_Ds1302(unsigned char, unsigned char)。uj5u.com熱心網友回復:
void Write_Ds1302_Byte(unsigned char temp){
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp);
}
uj5u.com熱心網友回復:
樓主,讀操作在SCK=0;之后加入延時試試。另外,秒、分、時讀出來的資料分別是什么?unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
_nop_();_nop_();
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
......
}
uj5u.com熱心網友回復:
沒有用,我把0x84,0x85,改成0x86和0x87,讀日期和寫日期都是正常的,感覺是芯片有問題,但又沒法確認。uj5u.com熱心網友回復:
而且我設定時間為01日23:59:50的初始時間日期進位是正常的,不知道什么情況uj5u.com熱心網友回復:
這樣的話,讀寫時序沒有問題。硬體電路SDA管腳最好加一個10K的上拉。樓主可以打亂日期、時、分、秒等的讀寫順序,看看是不是只有時無法正常讀寫。如果只有時無法正常讀寫,芯片存在問題的概率就極大了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/156718.html
標籤:單片機/工控
