单片机DS1302读写不明白

void DS1302ByteWrite(unsigned char dat) //发送一个字节到 DS1302 通信总线上
{
unsigned char mask;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位移出
{
if ((mask&dat) != 0) //首先输出该位数据
{
DS1302_IO = 1;
}
else
{
DS1302_IO = 0;
}
DS1302_CK = 1; //然后拉高时钟
DS1302_CK = 0; //再拉低时钟,完成一个位的操作
}
DS1302_IO = 1; //最后确保释放 IO 引脚 不懂的是这句,DS1302_IO置1了,从写到读没有任何操作,再去读DS1302_IO不是一定是1了。
}
unsigned char DS1302ByteRead(void) //由 DS1302 通信总线上读取一个字节
{
unsigned char mask;
unsigned char dat = 0;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位读取
{
if (DS1302_IO != 0) //首先读取此时的 IO引脚,并设置 dat中的对应位
{
dat |= mask;
}
DS1302_CK = 1; //然后拉高时钟
DS1302_CK = 0; //再拉低时钟,完成一个位的操作
}
return dat; //最后返回读到的字节数据
}
unsigned char DS1302SingleRead(unsigned char reg) //用单次模式从 DS1302 的某一寄存器读
取一字节数据,寄存器地址 reg,返回值为读取到的字节数据
{
unsigned char dat;
DS1302_CE = 1; //使能片选信号
DS1302ByteWrite((reg<<1) | 0x81); //发送读寄存器指令
dat = DS1302ByteRead(); //读取字节数据
DS1302_CE = 0; //除能片选信号
return dat;
}

“不懂的是这句,DS1302_IO置1了,从写到读没有任何操作,再去读DS1302_IO不是一定是1了。”
对于51单片机,将IO口写1,是将其置为读状态。此时外部将管脚拉低的话是可以通过读管脚指令读到外部电平状态的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-14
51是准双向口,读数据之前先写1,再读状态。
第2个回答  2014-03-14
其实看DS1302的PDF就可以,里面写的很详细!!
就是一些时序问题!追问

求大神解释下,为什么写操作最后一句DS1302_IO = 1; //最后确保释放 IO 引脚
不懂的是这句,DS1302_IO置1了,从写到读没有任何操作去改变DS1302_IO,循环的第一次直接去读DS1302_IO不是一定是1了。

追答

其实就是低电平能把高电平拉低,所以先把它置1,当输出是1的时候不变,当输出是0的时候,高电平就被拉成低电平了!!最后输出低电平!

追问

是不是这个意思:当第八位写入的时候 DS1302_CK = 1; 就已经读入了,然而记着DS1302_CK = 0; DS1302就开始输出了(时序是说下跳沿输出),我 DS1302_IO = 1; 只是对单片机这边来说,而DS1302输出的0,它还是为0的。

追答

就是输出完以为数据的时候要一个脉冲才能输出下一位,DS1302_CK=1后DS1302_CK=0这个是一个脉冲,DS1302_IO这个是读取某位的电平值!!
不明白可以继续问!!

本回答被提问者采纳
相似回答