www.openedv.com
您好,欢迎您!    会员注册 | 登入 
公告:欢迎访问www.openedv.com开源电子网,开源共享共同进步,祝您新年快乐,万事如意!
设为首页 | 加入收藏
论坛首页 » 51单片机 前往: 
DS1302读数据问题
发表人 内容
[Down] [Up]
[楼主位] llwwzz2007

等级:NO
注册时间:
2011/11/10 23:39
文章: 20
离线

以下读1302数据程序可正常运行,读出数据。请注意红色部分注解
uchar read_DS(uchar command)
   {
 uint i=0;
 uchar zhi=0;
 DS_RST=0;     //此三句也是必须要的。否则又存在初始化归0问题。
 DS_CLK=0;
 DS_RST=1;
 for(i=0;i<8;i++)      //先写地址
  {
  
   DS_IO=command&0x01;   //写数据时必须先将数据位置于IO口然后拉时钟。
                                        //此句与下面两句交换位置也会出错。
      DS_CLK=0;   
   DS_CLK=1;      //时钟上升沿写数据有效
   command>>=1;     //从低位写起
  }
 for(i=0;i<8;i++)      //再读数据
  {
    
   DS_CLK=1;     //时钟下降沿后读数据有效,先读低位。

   DS_CLK=0;     

  if(DS_IO) zhi|=0x01<<i;   //0x01<<i;zhi=zhi|0x01;<< 优先级
   else zhi|=0x00<<i;    //此句可以不要。

//   ACC0=DS_IO; 
//   zhi=zhi|(ACC<<i);     //很奇怪此三句不能正确读出数据。
//   ACC=0;
  }
 DS_RST=0;

 zhi=(zhi/16*10)+zhi%16;    //两位BCD码转换为十进制
 return zhi;
  }
-------------------------------
      但是奇怪的是,标记红色部分语句若换成紫色语句则不能正确读出数据。但是仔细推敲感觉二者的功能相同啊!!
     注:ACC0为宏定义,即ACC的第0位。
     望高手指点迷津!!!



[加为好友] 回复 引用回复
[Down] [Up]
[1楼] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8097
来自: 湖南
离线

51的,都忘记了...



我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[2楼] lrain

等级:NO
注册时间:
2012/02/11 02:31
文章: 3
来自: 深圳
离线

ACC移位前的内容是什么呢?如果不确定肯定不对。
由于ACC会经常使用,如中断、子程序调用后内容会变化,不建议用ACC,要用必须用独占方式,还是用一变量安全。


[加为好友] 回复 引用回复
[Down] [Up]
[3楼] llwwzz2007

等级:NO
注册时间:
2011/11/10 23:39
文章: 20
离线

嗯,但一般的变量可以进行位赋值吗?如ACC0=DS_IO这样。不确定ACC的值那上面的语句改为这样是否就可以了:

    ACC=0;
    ACC0=DS_IO; 
     zhi=zhi|(ACC<<i);    
     ACC=0;
>


[加为好友] 回复 引用回复
[Down] [Up]
[4楼] lrain

等级:NO
注册时间:
2012/02/11 02:31
文章: 3
来自: 深圳
离线

只要处理好我说的问题,ACC也是可以用的,只是如果遇到中断之类,还要进行堆栈处理,这样就没有什么优势了。
位运算在特定情况下有优势,但在通用性来说不是很好,Keil C中处理这种情况就是用“按位或”,即:
var = 0;
var |= 1<<n;

其中n为要赋值的bit。>


[加为好友] 回复 引用回复
[Down] [Up]
[5楼] llwwzz2007

等级:NO
注册时间:
2011/11/10 23:39
文章: 20
离线

嗯,多谢哈。


[加为好友] 回复 引用回复
 
前往: 

Powered by ALIENTEK工作室 © 粤ICP备12000418号-1