ds1302时钟电路原理图_ds1302时钟芯片代码

ds1302时钟电路原理图_ds1302时钟芯片代码STM32F1驱动DS1302实时时钟芯片代码分享首先祝大家元旦快乐,希望大家2020事事顺心,财源滚滚,同时新的一年,新的起点,也希望大家带着新的目标迈向新的征程。最近项目用到了DS1302这个实时时钟芯片,现把我调试好的代码分享一下,希望对用到此芯片的朋友有所帮助,由于无法上传附件只

STM32F1驱动DS1302实时时钟芯片代码分享
  首先祝大家元旦快乐,希望大家2020事事顺心,财源滚滚,同时新的一年,新的起点,也希望大家带着新的目标迈向新的征程。

  最近项目用到了DS1302这个实时时钟芯片,现把我调试好的代码分享一下,希望对用到此芯片的朋友有所帮助,由于无法上传附件只能将代码贴出,如需要源代码文件可留言,如有帮助可一下,我会不定期与大家分享使用过的各类芯片经验,如有不足请指正,不喜勿喷,谢谢!

  原理图:ds1302时钟电路原理图_ds1302时钟芯片代码ds1302时钟电路原理图_ds1302时钟芯片代码

  调试代码:

  DS1302.C

  #include "ds1302.h"

  //16进制转换为10进制函数

  static unsigned char bcd_decimal(unsigned char bcd)

  {

  return bcd-(bcd >> 4)*6;

  }

  /***********************引脚初始化******************

  /**************还需要初始化时钟和复位两个引脚********

  /**************因为我在使用时其余两个引脚没在这里进行初始化设置,所以使用时需要注意

  //数据引脚设置

  void Ds1302_IN_time(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  }

  //数据引脚设置

  void Ds1302_OUT_time(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOE, &GPIO_InitStructure);

  }

  //DS1302写入单字节数据

  void v_RTInputByte(unsigned char ucDa)

  {

  unsigned char i,m;

  m=ucDa;

  OUT_time;

  delay_us(1);

  for(i=8; i>0; i–)

  {

  T_CLK_0;

  delay_us(1);

  if(m&0x01)

  TDATA_1;

  else

  TDATA_0;

  delay_us(1);

  T_CLK_1;

  m=m>>1;

  delay_us(1);

  }

  }

  //DS1302读出单字节数据

  unsigned char uc_RTOutputByte(void)

  {

  unsigned char i,timec=0;

  IN_time;

  //delay_us(1);

  for(i=8; i>0; i–)

  {

  T_CLK_0;

  delay_us(2);

  timec=timec>>1;

  //delay_us(1);

  if(TDATA)

  {

  timec=(timec|0x80);

  }

  else

  {

  timec=(timec&0x7f);

  }

  T_CLK_1;

  delay_us(1);

  //T_CLK_1;

  //delay_us(1);

  //T_CLK_0;

  //delay_us(1);

  }

  return(timec);

  }

  //向某地址(ucAddr)写入某数据(ucDa)

  void v_W1302(unsigned char ucAddr, unsigned char ucDa)

  {

  ucAddr&=0xfe;

  TRST_0;

  T_CLK_0;

  TRST_1;

  v_RTInputByte(ucAddr);

  v_RTInputByte(ucDa);

  TRST_0;

  }

  //从某地址(ucAddr)读某数据(ucDa)

  //写入地址,返回读到的数据

  unsigned char uc_R1302(unsigned char ucAddr)

  {

  unsigned char ucDa;

  TRST_0;

  T_CLK_0;

  TRST_1;

  v_RTInputByte(ucAddr); // µØÖ·£¬ÃüÁî

  ucDa = uc_RTOutputByte(); // ¶Á1ByteÊý¾Ý

  TRST_0;

  return(ucDa);

  }

  //初始化DS1302

  void Ds1302Init(void)

  {

  v_W1302(CONTROL,0x00);

  }

  //DS1302设置时间,因为程序需要我在此处用的是包含时间值得6字节数组指针

  //可更换成实际时间数组

  //例如换成int set_timer(u8 year,u8 month,u8 data,u8 hour,u8 min,u8 sec)

  //将相应数据写入相应位置即可,以下函数道理雷同

  int set_timer(char *ATimeData)

  {

  v_W1302(SECOND, ATimeData[0]); //m_second

  v_W1302(MINUTE, ATimeData[1]); //m_minute

  v_W1302(HOUR, ATimeData[2]); //m_hour

  v_W1302(DATE, ATimeData[3]); //m_day

  v_W1302(WEEK, 0x01); //WEEK

  v_W1302(MONTH, ATimeData[4]); //m_month

  v_W1302(YEAR, ATimeData[5]); //m_year

  return 1;

  }

  //DS1302时间读取函数

  void read_timer(void)

  {

  unsigned char ucYear,ucMonth,ucDay,ucHour,ucMinute,ucSecond;

  ucYear = uc_R1302(YEAR); //读年

  ucMonth = uc_R1302(MONTH); //读月

  ucDay = uc_R1302(DATE); //日

  ucHour = uc_R1302(HOUR); //时

  ucMinute = uc_R1302(MINUTE); //分

  ucSecond = uc_R1302(SECOND); //秒

  }

  //上面读出来的时时间戳的形式需要转换称实际时间方法很多

  //例如:

  ATimeData[0] = 0x32;

  ATimeData[1] = 0x30;

  ATimeData[2] = (((ucYear&0xf0)>>4) + 0x30);

  ATimeData[3] = (ucYear&0x0f) + 0x30;

  ATimeData[4] = (((ucMonth&0xf0)>>4) + 0x30);

  ATimeData[5] = (ucMonth&0x0f) + 0x30;

  ATimeData[6] = (((ucDay&0xf0)>>4) + 0x30);

  ATimeData[7] = (ucDay&0x0f) + 0x30;

  ATimeData[8] = (((ucHour&0xf0)>>4) + 0x30);

  ATimeData[9] = (ucHour&0x0f) + 0x30;

  ATimeData[10] = (((ucMinute&0x70)>>4) + 0x30);

  ATimeData[11] = (ucMinute&0x0f) + 0x30;

  ATimeData[12] = (((ucSecond&0x70)>>4) + 0x30);

  ATimeData[13] = (ucSecond&0x0f) + 0x30;

  //这里读出来的是20200101010101这种形式即2020年01月01日01时01分01秒

  DS1302.H

  #ifndef Ds1302_H

  #define Ds1302_H

  #include <stm32f10x.h>

  #include "includes.h"

  /**********************DS1302对应指令**********************/

  #define SECOND 0x81 //SECOND

  #define MINUTE 0x83 //MINUTE

  #define HOUR 0x85 //HOUR

  #define DATE 0x87 //DAY

  #define MONTH 0x89 //MONTH

  #define YEAR 0x8d //YEAR

  #define WEEK 0X8b //WEEK

  #define CONTROL 0x8f //CONTROL

  #define TRICKLE 0x91 //TRICKLE

  #define CLK_BURST 0xbf //CLK_BURST

  #define RAM_BURST 0xff //RAM_BURST

  #define RAM0 0xc1 //时间存储

  #define RAM1 0xD5 /结束地址

  /*******************ds1302对应的单片机控制引脚****************************/

  #define TDATA_1 GPIO_SetBits(GPIOE,GPIO_Pin_4) //da = 0

  #define TDATA_0 GPIO_ResetBits(GPIOE,GPIO_Pin_4) //da = 1

  #define T_CLK_1 GPIO_SetBits(GPIOE,GPIO_Pin_3) //CLK = 0

  #define T_CLK_0 GPIO_ResetBits(GPIOE,GPIO_Pin_3) //CLK = 1

  #define TRST_1 GPIO_SetBits(GPIOE,GPIO_Pin_5) //RST = 0

  #define TRST_0 GPIO_ResetBits(GPIOE,GPIO_Pin_5) //RST = 1#define TDATA GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) #define OUT_time Ds1302_OUT_time()#define IN_time Ds1302_IN_time()

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/96157.html

(0)
上一篇 2024年 5月 23日 下午3:21
下一篇 2024年 5月 23日

相关推荐

关注微信