单片机/MCU论坛
直播中

daybreak9

12年用户 61经验值
私信 关注
[问答]

关于DS1302中for循环的疑问。。

      从我学习C语言以来,我就一直以为for(i = 0; i < 8; i++)语句与for(i = 8; i > 0; i--)是等价的,两个语句的作用都是循环八次,当然,到现在我还是这样子以为。在这两个语句中,无论在什么时候我都会用前面那个,这只是我个人的一个编程习惯,可是,在今天写单片机与DS1302的通讯协议时,却遇到了一些麻烦。。。。
    在写单片机与DS1302的协议时,有两个向DS1302写出写入字节的函数,其中有一个写入字节的函数我是这样子写的:
void DS1302_InputByte(uchar dat)
{     uchar i;
      ACC = dat;
      DS1302_RST = 1;
   for(i = 0; i < 8; i++)
   {    DS1302_IO = ACC0;
        DS1302_SCLK = 1;
     DS1302_SCLK = 0;
     ACC = ACC >> 1;
   }
}
    在把其他函数都写好后,我就把程序下载到开发板上调试,可一调试就出问题了,数码管上显示几个不动的乱码,而不是一秒一秒跳动的时钟。出问题了,就要去找问题的所在,因此,我就回头去查我写的代码,我先把无头紧要的函数都去掉,然后下载、调试,但问题还在,于是又删又改的,搞了很久,到最后只剩下几个很关键的函数,但还是老样子。。。。于是,我就去找配套资料的源代码,然后和我自己写的一条一条的作对比,最后发现配套上写入写出字节的函数是类似于这样子写的:
void DS1302_InputByte(uchar dat)
{     uchar i;
      ACC = dat;
      DS1302_RST = 1;
   for(i = 8; i > 0; i--)
   {    DS1302_IO = ACC0;
        DS1302_SCLK = 1;
     DS1302_SCLK = 0;
     ACC = ACC >> 1;
   }
}
     两个函数的不同就只在于for循环,于是我就把我写代码中的for(i = 0; i < 8; i++)改成了for(i = 8; i > 0; i--),然后把程序下载到开发板上调试运行,没想到居然成功了,我看着数码管上跳动的数字,心情有点郁闷。。。。。就这个我就调了两三个小时啊!!!
     虽然也经常用看DS1302的芯片资料,但对于DS1302的通讯还不能做到全都懂。可是让我特别疑惑的是这个for循环啊,为什么用for(i = 0; i < 8; i++)不行??而用for(i = 8; i > 0; i--)就可以了呢???这两个在我看来可是完全等价的啊!最后虽然还是调出来了,但我还是很疑惑,我情愿我还没有调出来,因为我还没有弄懂为什么是这样子。。。。
       我只是一个在学单片机的菜鸟,还请各位高手帮忙解解我的困惑。。。。。。
   

回帖(2)

157119

2012-3-30 19:23:47
没碰到过,帮不了你!
举报

玉婷

2021-2-5 19:06:12
两个循环的次数是一样的,但i的大小变化不同,(i=0; i<8; i++)是i逐步增加,而(i=8; i>0, i--)i是逐步减小的,而ds1302写时必须是从低位向高位来写。和  ACC = ACC >> 1;进行配合,假若i是增加的,地址也是增加的,那应该没有问题,但若i是增加的而地址是减小的,那就会产生矛盾。估计问题出在这。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分