单片机1302编程问题 读取数据求大神解释

for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1;
if(DS1302_IO)ucdat|=0x80;
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
}
if语句中io始终是1吧,前面定义的1,那返回的ucdat就是11111111了吧 程序是不是错误的啊 怎么都理解不了

for(i=8;i>0;i--)
{
DS1302_IO=1; // 数据线SDA挂高,准备接受数据
ucdat=ucdat>>1; //准备放数的空间左移准备,D7现在移入一个0
if(DS1302_IO) ucdat=ucdat|0x80;
//如果SDA上现在是1,因为总线被DS1302改变了,D7就是1。如果是0,刚才左移进入的0就是。
DS1302_CLK=1; //这下面三行就是SCK的操作了。
_nop_();
DS1302_CLK=0;
}

楼主要明白,但单片机挂高是把总线释放了。现在从机是可以改变总线数值的。不要老把单片机当主角,I2C上的从机有时是要说话的,SDA挂高就是给DS1302说话的机会。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-21
if语句中DS1302_IO不一定始终是1,该项脚作为输入脚必须先置1,所以前面有一句DS1302_IO=1,

置1只是为了正确输入,如果此时DS1302输出为0,则将DS1302_IO拉低,就变成0了,注意看看51单片机书上关于引脚特性的描述。追问

那置一后的io输出是1302控制得么?

第2个回答  2013-11-21
DS1302_IO是DS1302的一个输入输出端口,它与单片机的一个IO口相接,如果读1302的话,必须先把此IO口置高,也就是 DS1302_IO=1;当1302输出低时,此端口的电位会被拉成低,那ucdat就不会是你说的始终是11111111了。
相似回答