DS1302读写操作

void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
delaynus(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delaynus(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}

}

void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止数据传递
SCLK=0; //确保写数据前SCLK被拉低
RST=1; //启动数据传输
delaynus(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}

unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续读8个二进制位数据
{
dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1) //如果读出的数据是1
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delaynus(2); //稍微等待
}
return dat; //将读出的数据返回
}

unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
Write1302(Cmd); //写入命令字
dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是ct107s开发板的ds1302读写函数的示例代码: ```c #include "ct107s.h" #include "ds1302.h" // DS1302 RST引脚 #define DS1302_RST_PIN P0_0 // DS1302 IO引脚 #define DS1302_IO_PIN P0_1 // DS1302 SCLK引脚 #define DS1302_SCLK_PIN P0_2 // DS1302读取一个字节 u8 DS1302_ReadByte(void) { u8 i, dat = 0; // 设置IO口为输入 GPIO_Init(DS1302_IO_PIN, GPIO_Mode_IPU); // 读取数据 for (i = 0; i < 8; i++) { dat >>= 1; GPIO_WriteBit(DS1302_SCLK_PIN, Bit_RESET); if (GPIO_ReadInputDataBit(DS1302_IO_PIN) == Bit_SET) { dat |= 0x80; } GPIO_WriteBit(DS1302_SCLK_PIN, Bit_SET); } return dat; } // DS1302写入一个字节 void DS1302_WriteByte(u8 dat) { u8 i; // 设置IO口为输出 GPIO_Init(DS1302_IO_PIN, GPIO_Mode_Out_PP); // 写入数据 for (i = 0; i < 8; i++) { GPIO_WriteBit(DS1302_IO_PIN, (dat & 0x01) ? Bit_SET : Bit_RESET); dat >>= 1; GPIO_WriteBit(DS1302_SCLK_PIN, Bit_RESET); GPIO_WriteBit(DS1302_SCLK_PIN, Bit_SET); } } // DS1302读取一个寄存器 u8 DS1302_ReadReg(u8 reg) { u8 dat; // 禁止写入 DS1302_WriteByte((reg << 1) | 0x81); dat = DS1302_ReadByte(); // 使能写入 DS1302_WriteByte((reg << 1) | 0x80); return dat; } // DS1302写入一个寄存器 void DS1302_WriteReg(u8 reg, u8 dat) { // 禁止写入 DS1302_WriteByte((reg << 1) | 0x80); DS1302_WriteByte(dat); // 使能写入 DS1302_WriteByte((reg << 1) | 0x81); } ``` 在使用时,需要先初始化IO口: ```c GPIO_Init(DS1302_RST_PIN, GPIO_Mode_Out_PP); GPIO_Init(DS1302_IO_PIN, GPIO_Mode_Out_PP); GPIO_Init(DS1302_SCLK_PIN, GPIO_Mode_Out_PP); ``` 然后就可以调用上述函数进行DS1302读写操作了。例如,读取DS1302的秒数: ```c u8 sec = DS1302_ReadReg(DS1302_SEC_REG); ``` 写入DS1302的小时数: ```c DS1302_WriteReg(DS1302_HOUR_REG, 0x12); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值