📄 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 + -