微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds1302的写、读数据问题

ds1302的写、读数据问题

时间:10-02 整理:3721RD 点击:
大神们求助啊!
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;
}

你好, 请详细看看  DS1302 器件规格书,有介绍 。

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

                                

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top