这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 51单片机DS1302时钟

共20条 1/2 1 2 跳转至

51单片机DS1302时钟

菜鸟
2013-11-24 19:59:30     打赏
最近在学51,关于DS1302的时序问题,一般读一字节数据是这种unsigned char output(void)
{
unsigned char i,dat=0;
for(i=8;i>0;i--)
{
dat>>=1;
if(DS1302_IO)dat|=0x80;
CLK=1;
CLK=0;
}
return (dat);
}
但是我有一直疑问:这一个字节数据到底是怎么样的过程被读出??if(DS1302_IO)dat|=0x80;这句话不是把所有的位都置1了吗??求大神能仔细帮我剖析这段代码,谢谢了

专家
2013-11-24 20:29:34     打赏
2楼

1、if(DS1302_IO)dat|=0x80;这句话不是把所有的位都置1了吗?

    楼主只考虑了DS1302_IO为高电平的情况,当DS1302_IO为低电平的时候,当前这位不是为0么~?!

2、这一个字节数据到底是怎么样的过程被读出??

    楼主可以用示波器抓下dat的波形,很直观明了的看到这一字节是怎么样的


高工
2013-11-24 22:53:55     打赏
3楼

首先了解,DS1302的通信方式,在时钟的下降沿读数据

/************************************************
函数名称:Ds1302ReadByte(uint8 Dat)
函数功能:读一个字节
输入参数:无
输出参数:读出的数据
备    注:下降沿读,从低位开始
***************************************************/
uint8 Ds1302ReadByte()
{
 uint8 i,Temp;                   //做循环用,数据返回
 for(i = 0;i < 8;i++)
 {
  Temp >>= 1;              //先把相应的位清0
  SetDs1302Sclk();
  ClrDs1302Sclk();          //产生下降沿
  if(DS_DATA)             //如果为高电平即这一位为1
   Temp |= 0x80;       //将相应位置1,,这里是或运算
 }
 return Temp; 
}

 


高工
2013-11-25 09:12:08     打赏
4楼

if(DS1302_IO)dat|=0x80;应该是if(DS1302_IO)   dat|=0x80;

拜托发帖时候编辑好代码,连在一起很难看


院士
2013-11-25 22:53:30     打赏
5楼

此楼为正解。

楼主尽可参考一下吧~


院士
2013-11-25 22:59:21     打赏
6楼
旁听一下。

院士
2013-11-25 23:01:02     打赏
7楼
咱们论坛对于源代码的样式也有待提高。

高工
2013-11-25 23:06:39     打赏
8楼

这个貌似是按位读取一个字节的函数吧。


专家
2013-11-25 23:19:03     打赏
9楼
的确~    都不想在帖子里上传代码了,有需要直接截图来的清晰

院士
2013-11-25 23:22:08     打赏
10楼
嘿嘿,去一个网站下载优秀的参考示例是多么多么的重要啊~~

共20条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]