单片机/MCUwilliam hill官网
直播中

李文磊

9年用户 9经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 制造/封装 模拟技术 连接器 EMC/EMI设计 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[文章]

ds1302的写、读数据问题

大神们求助啊!
1、为什么在写入数据时,地址要先把地位最地位置零呢?,即 addr = addr & 0xFE;     //最低位置零
2、为什么在读数据时,地址为什么又要先把最低位置高呢?,即 addr = addr | 0x01;    //最低位置高   
   具体代码如下:
/*------------------------------------------------
           向DS1302写入一字节数据
------------------------------------------------*/
void Ds1302_Write_Byte(unsigned char addr, unsigned char d)
{

        unsigned char i;
        RST_SET;        
        
        //写入目标地址:addr
        addr = addr & 0xFE;     //最低位置零
        for (i = 0; i < 8; i ++)
            {
                if (addr & 0x01)
                    {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
        
        //写入数据:d
        for (i = 0; i < 8; i ++)
           {
                if (d & 0x01)
                    {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                d = d >> 1;
                }
        RST_CLR;                                        //停止DS1302总线
}
/*------------------------------------------------
           从DS1302读出一字节数据
------------------------------------------------*/

unsigned char Ds1302_Read_Byte(unsigned char addr)
{

        unsigned char i;
        unsigned char temp;
        RST_SET;        

        //写入目标地址:addr
        addr = addr | 0x01;//最低位置高
        for (i = 0; i < 8; i ++)
            {
            
                if (addr & 0x01)
                   {
                        IO_SET;
                        }
                else
                    {
                        IO_CLR;
                        }
                SCK_SET;
                SCK_CLR;
                addr = addr >> 1;
                }
        
        //输出数据:temp
        for (i = 0; i < 8; i ++)
            {
                temp = temp >> 1;
                if (IO_R)
                   {
                        temp |= 0x80;
                        }
                else
                   {
                        temp &= 0x7F;
                        }
                SCK_SET;
                SCK_CLR;
                }
        
        RST_CLR;        //停止DS1302总线
        return temp;
}

已退回1积分

回帖(3)

figa@qq.com

2015-10-14 11:35:40
你好, 请详细看看  DS1302 器件规格书,有介绍 。
举报

李文磊

2015-10-14 12:44:01
引用: figa@qq.com 发表于 2015-10-14 11:35
你好, 请详细看看  DS1302 器件规格书,有介绍 。

嗯嗯,谢谢!我刚刚看了一下ds1302的控制字,瞬间明白了,地址最低位相当于开关,控制读写。地址最低位置零,表示写数据。地址最低位置高,表示读数据。
举报

figa@qq.com

2015-10-20 20:23:43
                                
举报

更多回帖

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