登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

为什么我的ds1302读出来的都是FF呢?搞了N天了,

作者:northerns 栏目:单片机
为什么我的DS1302读出来的都是FF呢?搞了N天了,
我都快疯了,求各位救命啊
程序如下:
sbit ds_clk=P4^0;
sbit ds_io =P4^1;
sbit ds_rst=P4^2;

sbit ACC_0=ACC^0;
sbit ACC_7=ACC^7;

uchar i,j,c;
//uchar data txdata[12]={"HELLO MOTO\n"};
//uchar txdata;
uchar data txdata[7];

uchar data second,mintue,hour,dat,month,week,year;
uchar data ucbuffer;

void DISPLAY();

void delay()
{
uchar j;
for(j=250;j>0;j--)
//continue
;

}


void write_data(uchar ucsenddata)
{
uchar i;
ACC=ucsenddata;
for(i=8;i>0;i--)
  {
   ds_io=ACC_0;
   ds_clk=1;
   _nop_();
   _nop_();
   ds_clk=0;
   //ACC=_cror_(ACC,1);
   ACC=ACC>>1;
  }

}

uchar read_data()
{
uchar i;
for(i=8;i>0;i--)
{
  //ACC=_cror_(ACC,1);
  ACC=ACC>>1;
  ACC_7=ds_io;
  ds_clk=1;
   _nop_();
   _nop_();
   ds_clk=0;
}
return ACC;


}


void write_DS1302(uchar ucaddress,uchar ucdata)
{
ds_rst=0;
delay();
ds_clk=0;
delay();
ds_rst=1;
delay();
write_data(ucaddress);
delay();
delay();
write_data(ucdata);
delay();
ds_clk=0;
delay();
ds_rst=0;
delay();

}


uchar read_DS1302(uchar ucaddress)
{
ds_rst=0;
delay();
ds_clk=0;
delay();
ds_rst=1;
delay();
write_data(ucaddress);
delay();
ucbuffer=read_data();
delay();
ds_clk=0;
delay();
ds_rst=0;
delay();
return ucbuffer;

}

a()
{
write_DS1302(0x8e,0x00);
delay();
delay();
write_DS1302(0x90,0xa5);
delay();
delay();
write_DS1302(0x80,0x00);
delay();
delay();
write_DS1302(0x82,0x00);
delay();
delay();
write_DS1302(0x84,0x08);
delay();
delay();
write_DS1302(0x86,0x31);
delay();
delay();
write_DS1302(0x88,0x12);
delay();
delay();
write_DS1302(0x8a,0x06);
delay();
delay();
write_DS1302(0x8c,0x00);
delay();
delay();

}

/*
clockstart()
{
uchar val;
val=read_DS1302(0x81);
val&=0x7f;
write_DS1302(0x8e,0x00);
write_DS1302(0x80,val);
write_DS1302(0x90,0xa5);
write_DS1302(0x8e,0x80);
}
*/

b()
{
second=read_DS1302(0x81);
delay();
delay();
mintue=read_DS1302(0x83);
delay();
delay();
hour=read_DS1302(0x85);
delay();
delay();
dat=read_DS1302(0x87);
delay();
delay();
month=read_DS1302(0x89);
delay();
delay();
week=read_DS1302(0x8b);
delay();
delay();
year=read_DS1302(0x8d);
delay();
delay();
}





set()
{
PCON=0x00;
TMOD=0x20;
TH1=0xfa;
TL1=0xfa;
SCON=0x50;
TR1=1;
EA=1;
}















main()
{
set();
a();
//write_DS1302(0xC0,0x02);

// clockstart();


while(1)
{
  b();  
//month=read_DS1302(0xC1);
//ds_rst=1;

  i=0;
  txdata[i]=second;
  txdata[++i]=mintue;
  txdata[++i]=hour;
  txdata[++i]=dat;
  txdata[++i]=month;
  txdata[++i]=week;
  txdata[++i]=year;

// while(txdata[i]!=0x00)
  for (i=0;i<7;i++)
{
  SBUF=txdata[i];
  while(TI==0);
  TI=0;
  //i++;
}
  for(j=0;j<50000;j++);  


}






}








serial() interrupt 4
{TR1=0;
TH1=0xfa;
TL1=0xfa;
TR1=1;


}






由串口中读出的数据:FF FF FF FF FF FF FF 

2楼: >>参与讨论
northerns
电池暂时还没接
 

3楼: >>参与讨论
coldra
一看别人的程序就头疼
要下班了,回家给你看看,建议你去找一下别人的成熟一点的程序,网上很多的,C语言移置很多方便,我找过一个,稍修改一下竟然一下子就成功了,呵呵

4楼: >>参与讨论
扬欣电子
我用过很容易的呀。
1、晶振为何没有匹配电容?
2、DS1302的启动位设置了吗?

5楼: >>参与讨论
northerns
to
我这个程序也是在网上找的,可是不知道是不是有问题,我编程水平低,各位帮一下啦。
to coldra和扬欣电子 :谢谢两位了,两位要是有自己运行过的DS1302的程序,能给我发一份吗?
我的邮箱:northernstart@hotmail.com
          northernstart@yahoo.com.cn
晶振没有电容据说也没问题的。
启动位怎么设置啊?有人说把秒寄存器的高位设置为0,怎么设置呢?

6楼: >>参与讨论
扬欣电子
我是51汇编的,你有用嘛?
你的CPU是什么?

7楼: >>参与讨论
扬欣电子
看看这个帖子,里面有DS1302的读写程序
http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=1941533&tp=DS1302%u5728Protes%u4E0B%u7684%u4EFF%u771F

8楼: >>参与讨论
zzz正
你可以去这里看看
http://www.21icbbs.com/club/bbs/bbsview.asp?boardid=9&t=1925171&tp=%CE%D2%B5%C4%A3%B1%A3%B8%A3%E2%A3%B2%A3%B0%B2%E2%CE%C2%B3%CC%D0%F2%B6%C1%B2%BB%B3%F6%CE%C2%B6%C8%D6%B5

9楼: >>参与讨论
blliao
给你一个成功的C
sbit  DS13CS   =P3^5;  /*DS1302的RST脚片选*/
sbit  DS13IO   =P3^4;  /*DS1302的IO脚数据*/
sbit  DS13CLK  =P3^3;  /*DS1302的SCLK脚脉冲*/
/*向DS1302写一个字节*/
void _wds13byte(uchar _code)
{
uchar i;
DS13CLK =0;
DS13CLK =0;
for(i=0;i<8;i++)
{
  if(_code&0x01) DS13IO =1;
  else DS13IO =0;
  DS13CLK =1;
  DS13CLK =1;
  DS13CLK =0;
  DS13CLK =0;
  _code =_code >> 1;
}
}
/*从DS1302读一个字节*/
uchar _rds13byte(void)
{
uchar i,_code;
_code=0;
DS13CLK =0;
DS13CLK =0;
DS13IO  =1;
for(i=0;i<8;i++)
{
  _code =_code >>1;
  if(DS13IO) _code =_code|0x80;
  DS13CLK =1;
  DS13CLK =1;
  DS13CLK =0;
  DS13CLK =0;
}
return _code;
}
/*读功能 _code读功能命令   */
uchar readds1302(uchar _code)
{
DS13CS  =0;         /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS  =1;          /*使能DS1302*/
_wds13byte(_code);   /*读代码*/
_code=_rds13byte();  /*返回读取数字*/
DS13CLK =1;
DS13CS  =0;         /*关闭DS1302*/
return _code;
}
/*写功能 fp写的地址,_code写的内容*/
void writeds1302(uchar fp,uchar _code)
{
DS13CS  =0;         /*关闭DS1302*/
DS13CLK =0;
DS13CLK =0;
DS13CS  =1;          /*使能DS1302*/
_wds13byte(fp);     /*写控制命令*/
_wds13byte(_code);  /*写入数据*/
DS13CLK=1;
DS13CS =0;          /*关闭DS1302*/
}
/*******DS1302设置快速充电***************/
void ds13_charg(void)
{
  writeds1302(0x8e,0x00);  /*解除写保护*/
  writeds1302(0x90,0xa5);  /*单二极管2K电阻充电*/
  writeds1302(0x8e,0x10);  /*置位写保护*/
}

10楼: >>参与讨论
northerns
谢谢各位,我试一下先,
 
11楼: >>参与讨论
northerns
终于能读出数了
原来是管脚定义错误了
sbit ds_clk=P4^0;
sbit ds_io =P4^1;
sbit ds_rst=P4^2;
应该是

sbit ds_clk=P4^1;
sbit ds_io =P4^0;
sbit ds_rst=P4^2;

又有新问题了,时钟不走,该怎么做呢,可以的话顺便据个例子,最好是运行过的,先谢谢各位了,急盼啊

12楼: >>参与讨论
coldra
时钟不走是没有启动1302
 
13楼: >>参与讨论
coldra
billo的程序应该可以
你的1302不走应该是没有启动,另外你看一下你的晶振是否确实振起来了
我给你发了例程,你查收看一下吧

14楼: >>参与讨论
陈双君
就这样也能行了
就这样也能行了.

我要先去用一下才知道, 好像我认为总是少了一点什么似的.

15楼: >>参与讨论
hotpower
晕到...
 
16楼: >>参与讨论
northerns
我把80H写了00了
a()
{
write_ds1302(0x8e,0x00);
delay();
delay();
write_ds1302(0x90,0xa5);
delay();
delay();
write_ds1302(0x80,0x00);
delay();
delay();
write_ds1302(0x82,0x00);
delay();
delay();
write_ds1302(0x84,0x08);
delay();
delay();
write_ds1302(0x86,0x31);
delay();
delay();
write_ds1302(0x88,0x12);
delay();
delay();
write_ds1302(0x8a,0x06);
delay();
delay();
write_ds1302(0x8c,0x00);
delay();
delay();

}

我把0x80单元写了00了,这样行吗

17楼: >>参与讨论
northerns
先谢谢各位大侠了
 
18楼: >>参与讨论
northerns
时钟开始走了,可是还是有点不明白
我把上面的我列出来的程序写了N遍都不行,今天我把主程序main()中的函数a()给屏蔽了(就是//a()这样了),时钟就可以走了,终于感动老天了。可是为什么那。函数a()是往DS1302的秒寄存器0x80、分寄存器0x82、小时寄存器0x84……里写初始值的,为什么我往CPU里写了N次程序以后,把它屏蔽掉后DS1302时钟就能运行了,百思不得其解。
跪求各位大侠们指点迷津,因为以后的还有好多程序要编,时钟终于能走了,我好怕再出什么问题啊,呜呜,这可是关系到我的这份工作的命运了,要是再干不好,就要被炒了,我好不容易找到这份工作的呀,恳请知道原因的大哥大姐们帮帮我呀!!!!

19楼: >>参与讨论
夏虫
经验是时间积累的结果,不要怕出问题
经验是时间积累的结果,不要怕出问题,只有出问题了,才知道错在哪里,今后就可以避免类似的错误了,哪个工程师都是这么走出来的,今后也不能保证不出错啊~~

20楼: >>参与讨论
soho
总结一下
是芯片/电路有问题?不是
是程序有问题?也不是. 编译通过了,说明程序可以跑起来(什么,没你要的结果,那不怪程序,它是按你的指示在执行).
那么问题在那?
1. 程序与硬件不相附,比如你把管脚搞错了;
2. 芯片不熟悉, 不知道怎样才是正确的.
所以,出现问题时,仔细检查,对不熟的芯片,反复看它的资料.

21楼: >>参与讨论
northerns
谢谢各位的忠告
我先把程序写到CPU里,这时,读出来的是写进去的,但是不计时,然后我再把主程序main()中的函数a()给屏蔽了(就是//a()这样了),再写一次程序时钟就可以走了,很怪啊,哪位高人遇到过或知道为什么的,能不能耽误点您的宝贵时间,告诉我一下啊,在这先谢谢啦

22楼: >>参与讨论
northerns
问题解决了
问题解决了。加了一条语句以判断是否已经初始化。多谢各位大侠朋友的帮忙,谢谢!!!

参与讨论
昵称:
讨论内容:
 
 
相关帖子
有个红外解码的问题想请各位大侠帮忙,谢谢!(急)
各位高手看过来!!!8279的问题!!!
求单片机,带SPI,其他均可不要,价格越便宜越好!
汇编中可以嵌入c吗?
现在哪些语音录放芯片音质教好,高手推荐一二,谢谢!
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号