打印

ds1302好像读写数据都有问题,请大侠帮我看看怎么回事呀?

[复制链接]
4383|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
martial|  楼主 | 2011-4-26 11:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用的是stc的1T的单片机,程序如下:

/**********************
标题:WriteByte
功能:实现写命令和数据
格式:void WriteByte(uchar,uchar)
输入:往ds1302上写入命令参数及数据
输出:无
返回值:无
**********************/
void WriteByte(uchar cmd_ds,uchar dat_ds)//
{
uchar i_ds=0;//       ,j_ds=0
nRST_T=0;//复位引脚为低电平,所有数据传送终止
// _nop_();
_nop_();
_nop_();
SCLK_T=0; //清除时钟总线
// _nop_();
_nop_();
_nop_();
nRST_T=1;//复位引脚为高电平逻辑控制有效
// _nop_();
_nop_();
_nop_();
for(i_ds=0;i_ds<8;i_ds++)
{
  SDA_T=cmd_ds&0x01;//将数据传送到发送位
//  _nop_();//_nop_()全部为短暂延时
  _nop_();
  _nop_();
  SCLK_T=1; //时钟上升沿发送数据有效
//  _nop_();
  _nop_();
  _nop_();
  SCLK_T=0;
//  _nop_();
  _nop_();
  _nop_();
  cmd_ds=cmd_ds>>1;
}
for(i_ds=0;i_ds<8;i_ds++)
{
  SDA_T=dat_ds&0x01;//将数据传送到发送位
//  _nop_();//_nop_()全部为短暂延时
  _nop_();
  _nop_();
  SCLK_T=1; //时钟上升沿发送数据有效
//  _nop_();
  _nop_();
  _nop_();
  SCLK_T=0;
//  _nop_();
  _nop_();
  _nop_();
  dat_ds=dat_ds>>1;
}
//}
nRST_T=0;//复位引脚为低电平,所有数据传送终止

}
/**********************
标题:ReadByte
功能:实现读数据
格式:uchar ReadByte(uchar)
输入:往lcm上写入数据
输出:无
返回值:uchar
**********************/
uchar ReadByte(uchar cmd_ds)
{
uchar i_ds=0,dat_ds=0;
nRST_T=0;//复位引脚为低电平,所有数据传送终止
// _nop_();
_nop_();
_nop_();
SCLK_T=0; //清除时钟总线
// _nop_();
_nop_();
_nop_();
nRST_T=1;//复位引脚为高电平逻辑控制有效
// _nop_();
_nop_();
_nop_();
for(i_ds=0;i_ds<8;i_ds++)
{
  SDA_T=cmd_ds&0x01;//将命令数据传送到发送位
//  _nop_();//_nop_()全部为短暂延时
  _nop_();
  _nop_();
  SCLK_T=1; //时钟上升沿发送数据有效
//  _nop_();
  _nop_();
  _nop_();
  SCLK_T=0;
//  _nop_();
  _nop_();
  _nop_();
  cmd_ds=cmd_ds>>1;
}

for(i_ds=0;i_ds<8;i_ds++)
{
  dat_ds=dat_ds<<1;
  if(SDA_T)
   dat_ds=dat_ds|0x01;//将数据传送到接收位
//  _nop_();//_nop_()全部为短暂延时
  _nop_();
  _nop_();
  SCLK_T=1; //时钟置高
//  _nop_();
  _nop_();
  _nop_();
  SCLK_T=0;//时钟下降沿接收数据有效
//  _nop_();
  _nop_();
  _nop_();
}

nRST_T=0;//复位引脚为低电平,所有数据传送终止   
return(dat_ds);
}

相关帖子

沙发
playjian| | 2011-4-26 12:54 | 只看该作者
ds1302注意里面时分秒之类的那些寄存器是用BCD码表示的~~要注意转换~~

使用特权

评论回复
板凳
zhuyl456| | 2011-4-26 13:41 | 只看该作者
补充发下硬件图呢!
最好在几个和单片机的IO口加上上拉电阻,这样会好一点

使用特权

评论回复
地板
martial|  楼主 | 2011-4-26 17:18 | 只看该作者
上图,不是bcd码的问题

使用特权

评论回复
5
zhuyl456| | 2011-4-26 21:49 | 只看该作者
4# martial
图是没问题的,可以的
不过你的程序到底遇到了什么问题呢?
一个像2楼说的bcd码的问题,还有一个就是延时(时序)的问题,好像就这些了吧

使用特权

评论回复
6
martial|  楼主 | 2011-4-28 08:43 | 只看该作者
写数据:
WriteByte(0x8e,0x00);//wp=0:去掉写保护
WriteByte(0x90,0x06);//0x06禁止充电
WriteByte(0x8c,0x01);//年
WriteByte(0x8a,0x01);//星期
WriteByte(0x88,0x01);//月
WriteByte(0x86,0x01);//日
WriteByte(0x84,0x01);//小时
WriteByte(0x82,0x01);//分钟
WriteByte(0x80,0x00);//秒,并启动时钟
读数据:
ADCReadData[7]=ReadByte(0x8d);//年
ADCReadData[6]=ReadByte(0x8b);//星期
ADCReadData[5]=ReadByte(0x89);//月
ADCReadData[4]=ReadByte(0x87);//日
ADCReadData[3]=ReadByte(0x85);//小时
ADCReadData[2]=ReadByte(0x83);//分钟
ADCReadData[1]=ReadByte(0x81);//秒

通过液晶显示发现读出来的数从秒到年依次为:
0,80,80,80,80,80

使用特权

评论回复
7
martial|  楼主 | 2011-4-28 08:58 | 只看该作者
通过液晶显示发现读出来的数从秒到年依次为:
0,80,80,80,80,80,80

使用特权

评论回复
8
zhujing03| | 2011-4-28 12:48 | 只看该作者
正确的时钟数据是全0,自秒开始增加数值。

使用特权

评论回复
9
martial|  楼主 | 2011-4-28 13:54 | 只看该作者
秒的读数总是0,其它的数据反而不是0,这就有点不对了

使用特权

评论回复
10
martial|  楼主 | 2011-5-10 08:07 | 只看该作者
已经解决了,不知道什么原因,for循环中,从小到大显示,可以,反过来不行。另外显示0x80是读数时移位反了,现在已经解决。顺便问一下,读写RAM跟读写时间寄存器应该一样的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

296

帖子

0

粉丝