DS1302时钟---时序---读取时间发送接收

这篇博客介绍了如何使用单片机与DS1302时钟进行通信,包括写入地址/命令字节和数据的步骤。详细阐述了时序过程,强调了在高速单片机与DS1302同步时钟信号匹配的重要性,以及解决位移运算错误的方法。同时,提供了串口调试代码,以便于检查单片机的串口发送功能,并给出了完整的读取时间代码,包括可能遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

他们读取和写入的桥梁是连接在一起的IO引脚,在通过定义一个字节的缓存空间把数据放入缓存空间中

从第0位(最低位)开始读取

注意:SCLK的低位一般是放置数据的

一、先大致写出一个框架

#include <reg51.h>

sbit SCLK=P0^0;
sbit CE  =P0^1;
sbit IO  =P0^2;

//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
 //第一部分:时序起始

 //第二部分:写入第一字节,先给前八位地址

 //第三部分:写入第二字节,再给后八位数据

 //第四部分:时序结束
}

为啥要写两次字节?

因为在DS1302中写入数据,需要先写入地址/命令,然后才能写数据

对于1302的操作分两部分,一部分是控制字,也就是地址及命令字节,另一部分是数据。

例:

二、添加单片机写入和DS1302读取的内容

  1. 开始的时候SCLK(时钟信号)和CE(RST(复位功能))都为低电平0

  1. CE设置高电平开始写入数据

  1. 写入第一个字节,单片机把addr的最低bit位发出(写入)去给IO引脚,在DS1302的SCLK(同步时钟)产生一个上升沿时,读取IO引脚的bit位

  1. 把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备

  1. 循环8次,单片机向DS1302发出8个位(1字节)结束循环

  1. 写入第二个字节的时候同理

  1. 时序结束

#include <reg51.h>

sbit SCLK=P0^0;
sbit CE  =P0^1;
sbit IO  =P0^2;



//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
 unsigned char i=0;
 unsigned char dat=0;
 //第一部分:时序起始
  SCLK= 0;
  CE  = 0;     //RST为低电平读写操作无效
  CE  = 1;     //RST为高电平开始读写
               //SCLK为低时,RST由低变高,意味着一个大周期的开始

 //第二部分:写入第1字节,addr,先给前八位地址
  for(i=0;i<8;i++)
 {
  dat  = addr & 0x01;  //SPI从最低bit位开始传输
  IO   = dat;          //把要发送的数据丢到IO引脚上准备好
  SCLK = 1;            //制造一个上升沿,让DS1302把IO上的数值读走
                       //读走之后一个小周期就完啦
  SCLK = 0;            //把SCLK拉低为下一个小周期做准备
  addr>>=1;            //把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
 }

 //第三部分:写入第2字节,value,再给后八位数据
  for(i=0;i<8;i++)
 {
  dat  = value & 0x01;   //SPI从最低bit位开始传输
  IO   = dat;            //把要发送的数据丢到IO引脚上准备好
  SCLK = 1;              //制造一个上升沿,让DS1302把IO上的数值读走
                         //读走之后一个小周期就完啦
  SCLK = 0;              //把SCLK拉低为下一个小周期做准备
  value= value >> 1;    //把value右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
 }

 //第四部分:时序结束
 SCLK= 0;
 CE  = 0;              //结束一个大周期     
 
}

二、因为单片机的时钟频率比DS1302快很多,所以要在在每个时钟信号后加delay这种延时代码,拉慢单片机的时钟频率,让单片机和DS1302尽量同频率,不加延时的话DS1302很难捕捉到单片机的时钟信号,所以,以下代码添加了一个延时函数

#include <reg51.h>

sbit SCLK=P0^0;
sbit CE  =P0^1;
sbit IO  =P0^2;

//函数声明
void delay(void);//延时三个时钟周期

//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
 unsigned char i=0;
 unsigned char dat=0;
 //第一部分:时序起始
  SCLK= 0;
  delay();
  CE  = 0;     //RST为低电平读写操作无效
  delay();
  CE  = 1;   //RST为高电平开始读写
  delay();     //SCLK为低时,RST由低变高,意味着一个大周期的开始

 //第二部分:写入第1字节,addr,先给前八位地址
  for(i=0;i<8;i++)
 {
  dat  = addr & 0x01;  //SPI从最低bit位开始传输
  IO   = dat;           //把要发送的数据丢到IO引脚上准备好
  SCLK = 1;               //制造一个上升沿,让DS1302把IO上的数值读走
                         //读走之后一个小周期就完啦
  delay();
  SCLK = 0;               //把SCLK拉低为下一个小周期做准备
  delay();
  addr>>=1;               //把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
 }

 //第三部分:写入第2字节,value&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长中的单片小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值