⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302程序.c

📁 DS1302时钟程序
💻 C
字号:
/*********定义DS1302访问使用的端口******************/
#define Wait1us _NOP();
#define T_CLK_1 PORTD |= (1 << PD2) //CLK 1
#define T_CLK_0 PORTD &= ~(1 << PD2) //CLK 0

#define T_IO_1 PORTD |= (1 << PD3) //I/O OUT 1
#define T_IO_0 PORTD &= ~(1 << PD3) //I/O OUT 0

#define R_IO (PIND & (1 << PIND3)) //读取IO值

#define T_RST_1 PORTD |= (1 << PD4) //RST 1
#define T_RST_0 PORTD &= ~(1 << PD4) //RST 0

#define IO_OUT DDRD |= (1 << PD3) //设置I/O为输出
#define IO_IN {DDRD &= ~(1 << PD3); PORTD &= ~(1 << PD3);} //设置I/O为输入,不需要上拉电阻

void SetByte(unsigned char DSAdree); 
unsigned char GetByte(void); 
void WriteDataToDS1302(unsigned char DSAdree, unsigned char DSData);
unsigned char ReadDataDS1302(unsigned char DSAdree);

/***************初始化************/

void InitDS1302(void)
{
 DDRD |= ((1 << PD2) | (1 << PD4)); //设置PD2,PD4为输出
 T_CLK_0;
 T_RST_0;
 WriteDataToDS1302(0x8E, 0x0);  //写保护关闭
 Sec = ReadDataDS1302(0x81);
 WriteDataToDS1302(0x80, (Sec & 0x7F));  //设置运行位
 WriteDataToDS1302(0x90, 0xAB);  //启用电池充电,双二极管,8K电阻。
 WriteDataToDS1302(0x8E, 0x80);  //写保护开启
}

/******************************************************************** 

函 数 名:SetByte()
功    能:向DS1302写入1Byte数据
输入参数:DSAdree 写入的数据 
返 回 值:无  

***********************************************************************/
void SetByte(unsigned char DSAdree) 
{ 
    unsigned char i;
    DS = DSAdree;
 IO_OUT; //设置端口为输出
    for(i = 8; i > 0; i --)
    {
        if (DS & 0x1)
  {
   T_IO_1;
  }
  else
  {
   T_IO_0;
  }
  T_CLK_1;
  Wait1us;
        T_CLK_0;
        DS = DS >> 1; 
    }
 IO_IN; //修改端口为输入,注意此项关键,否则可能烧毁DS1302
}
/******************************************************************** 

函 数 名:GetByte()
功    能:从DS1302读取一字节
输入参数:无  
返 回 值:一个字节

***********************************************************************/
unsigned char GetByte(void) 
{ 
    unsigned char i;
 IO_IN; //设置端口为输入
 DS = 0;
    for(i = 8; i > 0; i --)
    {
        DS = (DS >> 1);
  if (R_IO)
  {
   DS |= 0x80;
  }
        T_CLK_1;
  Wait1us;
        T_CLK_0;
    }
    return (DS); 
}
/******************************************************************** 

函 数 名:WriteDataToDS1302()
功    能:向DS1302写入数据
调    用:InputByte() , GetByte()
入口参数:DSAdree: DS1302地址, DSData: 要写的数据
返 回 值:无

***********************************************************************/
void WriteDataToDS1302(unsigned char DSAdree, unsigned char DSData)
{
    T_RST_0;
    T_CLK_0;
    T_RST_1;
    SetByte(DSAdree); // 地址,命令
    SetByte(DSData); // 写1Byte数据
    T_CLK_1;
    T_RST_0;
} 
/******************************************************************** 

函 数 名:ReadDataDS1302()
功    能:读取DS1302某地址的数据
调    用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据

***********************************************************************/
unsigned char ReadDataDS1302(unsigned char DSAdree)
{
    unsigned char DSData;
    T_RST_0;
    T_CLK_0;
    T_RST_1;
    SetByte(DSAdree);             // 地址,命令
    DSData = GetByte();         // 读1Byte数据
    T_CLK_1;
    T_RST_0;
    return(DSData);
}

 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -