当前位置:   article > 正文

STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)_ds1302 hal

ds1302 hal

目录

DS1302的性能指标

DS1302的寄存器及片内RAM

标准库实现

HAL库实现

源码链接


单片机型号:STM32F103C8T6  

        在日常生活中,很多情况下会需要使用时间,单片机中虽然也是有定时器但并不能较为准备的实现计时功能,而且定时计时纯属浪费资源,因此,为了解决此问题,就引入了时钟芯片,时钟芯片能够实现较为精确计时,可实现电子钟/闹钟等功能。

        市面上时钟芯片种类很多,本文选用使用较为广泛的DS1302芯片。        

        DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小时格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线: (1) RST复位(2) I/O数据线(3)SCLK串行时钟。

        时钟/RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。DS1302工作时功耗很低保持数据和时钟信息时功率小于1mW。

下面是其电路图,通过自己设计也是可以实现的,电路图如下:

如果自己不想设计电路,也可以在网上购买时钟模块,其实就是按照上述电路图设计制成,效果图如下:

接下来简单介绍一下DS1302,网上关于其知识点很多,大家也可以自行学习:

  •  DS1302的性能指标

1)可以计算2100年之前的秒、分、时、日、星期、月、年,并且可以调整闰年。
2)内部有31个字节静态RAM,供用户访问
3)串行数据传送方式(SPI3线接口)
4)工作电压:2.0~5.5v
5) 工作电流:2v时,小于300nA(功耗低)
6)时钟或RAM数据的读写,有两种传送方式:单字节传送、多字节传送
7)主电源和负电源双电源供电(备份电源可以用电池或大电容实现)

DS1302内部包括1个控制寄存器,12个寄存器(7个与日历、时钟相关,存放的数据是BCD码形式)和31个RAM
1)控制寄存器
用于存放ds1302的控制命令字,DS1302的复位引脚回到高电平后写入的第一个字就是控制命令,控制着ds1302的读写过程

D7D6D5D4D3D2D1D0
1RAM/CKA4A3A2A1A0RD/W
  • 其中:
  • D7:固定为1
  • D6:RAM/CK位,=1片内RAM,=0日历、时钟寄存器选择位。
  • D5-D1:地址位,用于选择进行读写的日历、时钟寄存器或片内RAM。对日历、时钟寄存器或片内RAM的选择。
  • D0:读写选择,=0写,=1读

 寄存器0:最高位 CH 是一个时钟停止标志位。如果时钟电路有备用电源,上电后,我们要先检测一下这一位,如果这一位是0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果 Vcc1 悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是1,我们可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的7位高3位是秒的十位,低4位是秒的个位,这里再提请注意一次,DS1302 内部是 BCD 码,而秒的十位最大是5,所以3个二进制位就够了。

寄存器1:最高位未使用,剩下的7位中高3位是分钟的十位,低4位是分钟的个位。

寄存器2:bit7 是1的话代表是12小时制,0代表是24小时制;bit6 固定是0,bit5 在12小时制下 0代表的是上午,1代表的是下午,在24小时制下和 bit4 一起代表了小时的十位,低4位代表的是小时的个位。

寄存器3:高2位固定是0,bit5 和 bit4 是日期的十位,低4位是日期的个位。

寄存器4:高3位固定是0,bit4 是月的十位,低4位是月的个位。

寄存器5:高5位固定是0,低3位代表了星期。

寄存器6:高4位代表了年的十位,低4位代表了年的个位。请特别注意,这里的00~99指的是2000年~2099年。

寄存器7:最高位一个写保护位,如果这一位是1,那么是禁止给任何其它寄存器或者那31个字节的 RAM 写数据的。因此在写数据之前,这一位必须先写成0。
 

接下来是代码实现:

接线表设计:

时钟模块STM32F103
VCC5V/3.3V
GNDGND
CLKPA0
DATAPA1
RSTPA2
-PA9(串口1)
-PA10(串口1)

标准库实现:

DS1302.c

  1. #include "ds1302.h"
  2. #include "delay.h"
  3. u8 read_time[7];
  4. struct TIMEData TimeData;
  5. char DS1302_data_1[10];
  6. char DS1302_data_2[8];
  7. /*
  8. * SCLK 和 CE初始化
  9. */
  10. void ds1302_gpio_init()
  11. {
  12. GPIO_InitTypeDef GPIO_InitStructure;
  13. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  17. GPIO_Init(GPIOA, &GPIO_InitStructure); //
  18. GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  19. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  20. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  22. GPIO_Init(GPIOA, &GPIO_InitStructure); //
  23. GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  24. }
  25. /*
  26. * 数据端口输出配置
  27. */
  28. void ds1302_DATAOUT_init()//配置双向I/O端口为输出态
  29. {
  30. GPIO_InitTypeDef GPIO_InitStructure;
  31. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  32. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // DATA
  33. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  35. GPIO_Init(GPIOA,&GPIO_InitStructure); // 初始化
  36. GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  37. }
  38. /*
  39. * 数据端口输入配置
  40. */
  41. void ds1302_DATAINPUT_init()//配置双向I/O端口为输入态
  42. {
  43. GPIO_InitTypeDef GPIO_InitStructure;
  44. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  45. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA.1 DATA
  46. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  47. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.1
  48. }
  49. /*
  50. * /向DS1302发送一字节数据
  51. */
  52. void ds1302_write_onebyte(uint8_t data)//向DS1302发送一字节数据
  53. {
  54. uint8_t count=0;
  55. ds1302_DATAOUT_init(); // I/O配置为输出
  56. SCLK_L; // 拉低时钟
  57. for(count=0;count<8;count++)
  58. {
  59. SCLK_L; // 拉低时钟
  60. if(data&0x01)
  61. {
  62. DATA_H;
  63. }
  64. else
  65. {
  66. DATA_L;
  67. }//先准备好数据再发送
  68. SCLK_H; //拉高时钟线,发送数据
  69. data>>=1;
  70. }
  71. }
  72. /*
  73. * 向DS1302发送指定数据
  74. */
  75. void ds1302_wirte_rig(uint8_t address,uint8_t data)//向指定寄存器地址发送数据
  76. {
  77. uint8_t temp1=address;
  78. uint8_t temp2=data;
  79. CE_L; // 拉低CE
  80. SCLK_L; // 拉低SCLK
  81. delay_us(1);
  82. CE_H; // 拉高CE
  83. delay_us(2);
  84. ds1302_write_onebyte(temp1); // 写命令
  85. ds1302_write_onebyte(temp2); // 写数据
  86. CE_L; // 拉低CE
  87. SCLK_L; // 拉低时钟
  88. delay_us(2);
  89. }
  90. /*
  91. * 从DS1302读取数据
  92. */
  93. uint8_t ds1302_read_rig(uint8_t address)//从指定地址读取一字节数据
  94. {
  95. uint8_t temp3=address;
  96. uint8_t count=0;
  97. uint8_t return_data=0x00;
  98. CE_L; // 拉低CE
  99. SCLK_L; // 拉低SCLK
  100. delay_us(3);
  101. CE_H; // 拉高CE
  102. delay_us(3);
  103. ds1302_write_onebyte(temp3); // 写地址
  104. ds1302_DATAINPUT_init();//配置I/O口为输入
  105. for(count=0;count<8;count++)
  106. {
  107. delay_us(2);//使电平持续一段时间
  108. return_data>>=1;
  109. SCLK_H;
  110. delay_us(4);//使高电平持续一段时间
  111. SCLK_L;
  112. delay_us(14);//延时14us后再去读取电压,更加准确
  113. if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1))
  114. {return_data=return_data|0x80;}
  115. }
  116. delay_us(2);
  117. CE_L; // 拉低CE
  118. DATA_L; // 拉低SCLK
  119. return return_data; // 返回数据
  120. }
  121. /*
  122. * 初始化DS1302
  123. */
  124. void ds1302_init()
  125. {
  126. ds1302_wirte_rig(0x8e,0x00);//关闭写保护
  127. ds1302_wirte_rig(0x80,0x37);//seconds37
  128. ds1302_wirte_rig(0x82,0x58);//minutes58
  129. ds1302_wirte_rig(0x84,0x23);//hours23
  130. ds1302_wirte_rig(0x86,0x30);//date30
  131. ds1302_wirte_rig(0x88,0x09);//months9
  132. ds1302_wirte_rig(0x8a,0x07);//days星期日
  133. ds1302_wirte_rig(0x8c,0x20);//year2020
  134. //ds1302_wirte_rig(0x80,0x19);
  135. ds1302_wirte_rig(0x8e,0x80);//关闭写保护
  136. }
  137. /*
  138. * 读取DS1302数据
  139. */
  140. void ds1302_read_time(void)
  141. {
  142. read_time[0]=ds1302_read_rig(0x81);//读秒
  143. read_time[1]=ds1302_read_rig(0x83);//读分
  144. read_time[2]=ds1302_read_rig(0x85);//读时
  145. read_time[3]=ds1302_read_rig(0x87);//读日
  146. read_time[4]=ds1302_read_rig(0x89);//读月
  147. read_time[5]=ds1302_read_rig(0x8B);//读星期
  148. read_time[6]=ds1302_read_rig(0x8D);//读年
  149. }
  150. void ds1302_read_realTime(void)
  151. {
  152. ds1302_read_time(); //BCD码转换为10进制
  153. TimeData.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);
  154. TimeData.minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);
  155. TimeData.hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);
  156. TimeData.day=(read_time[3]>>4)*10+(read_time[3]&0x0f);
  157. TimeData.month=(read_time[4]>>4)*10+(read_time[4]&0x0f);
  158. TimeData.week=read_time[5];
  159. TimeData.year=(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;
  160. DS1302_data_1[0]='2';
  161. DS1302_data_1[1]='0';
  162. DS1302_data_1[2]='0'+(TimeData.year-2000)/10;
  163. DS1302_data_1[3]='0'+(TimeData.year-2000)%10;
  164. DS1302_data_1[4]='-';
  165. DS1302_data_1[5]='0'+TimeData.month/10;
  166. DS1302_data_1[6]='0'+TimeData.month%10;
  167. DS1302_data_1[7]='-';
  168. DS1302_data_1[8]='0'+TimeData.day/10;
  169. DS1302_data_1[9]='0'+TimeData.day%10;
  170. DS1302_data_2[0]='0'+TimeData.hour/10;
  171. DS1302_data_2[1]='0'+TimeData.hour%10;
  172. DS1302_data_2[2]=':';
  173. DS1302_data_2[3]='0'+TimeData.minute/10;
  174. DS1302_data_2[4]='0'+TimeData.minute%10;
  175. DS1302_data_2[5]=':';
  176. DS1302_data_2[6]='0'+TimeData.second/10;
  177. DS1302_data_2[7]='0'+TimeData.second%10;
  178. }

main.c

  1. /**
  2. ******************************************************************************
  3. * @file Project/STM32F10x_StdPeriph_Template/main.c
  4. * @author MCD Application Team
  5. * @version V3.5.0
  6. * @date 08-April-2011
  7. * @brief Main program body
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13. * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  14. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17. *
  18. * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  19. ******************************************************************************
  20. */
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "stm32f10x.h"
  23. #include "delay.h"
  24. #include "usart.h"
  25. #include "stdio.h"
  26. #include "string.h"
  27. #include "ds1302.h"
  28. /**
  29. * @brief Main program.
  30. * @param None
  31. * @retval None
  32. */
  33. int main(void)
  34. {
  35. int i = 0; // 循环变量
  36. char str[10] =""; // 字符数组
  37. char str2[100] =""; // 字符数组
  38. char str3[10] =""; // 字符数组
  39. char str4[100] =""; // 字符数组
  40. delay_init(); // 延时函数初始化
  41. uart_init(9600); // 串口1函数初始化
  42. ds1302_gpio_init();//CE,SCLK端口初始化
  43. ds1302_init();
  44. /* Infinite loop */
  45. while (1)
  46. {
  47. ds1302_read_realTime();
  48. delay_ms(10);
  49. for(i = 0;i < 10;i++)
  50. {
  51. sprintf(str3,"%c",DS1302_data_1[i]);
  52. strcat(str4,str3);
  53. }
  54. strcat(str4,"\r\n");
  55. for(i=0;i<strlen(str4);i++)
  56. {
  57. USART_SendData(USART1,str4[i]);
  58. delay_ms(20);
  59. }
  60. ds1302_read_realTime();
  61. delay_ms(10);
  62. for(i = 0;i < 8;i++)
  63. {
  64. sprintf(str,"%c",DS1302_data_2[i]);
  65. strcat(str2,str);
  66. }
  67. strcat(str2,"\r\n");
  68. for(i=0;i<strlen(str2);i++)
  69. {
  70. USART_SendData(USART1,str2[i]);
  71. delay_ms(20);
  72. }
  73. delay_ms(200);
  74. memset(str2,0,sizeof(str2));
  75. memset(str4,0,sizeof(str4));
  76. }
  77. }
  78. /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

实现效果:

HAL库实现:

ds1302.c

  1. #include "main.h"
  2. #include "ds1302.h"
  3. uint8_t read_time[7];
  4. struct TIMEData TimeData;
  5. char DS1302_data_1[10];
  6. char DS1302_data_2[8];
  7. void ds1302_DATAOUT_init(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStruct = {0};
  10. /* GPIO Ports Clock Enable */
  11. __HAL_RCC_GPIOA_CLK_ENABLE();
  12. /*Configure GPIO pin Output Level */
  13. HAL_GPIO_WritePin(GPIOA,DATA_Pin, GPIO_PIN_RESET);
  14. /*Configure GPIO pin : DATA_Pin */
  15. GPIO_InitStruct.Pin = DATA_Pin;
  16. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  17. GPIO_InitStruct.Pull = GPIO_NOPULL;
  18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  19. HAL_GPIO_Init(DATA_GPIO_Port, &GPIO_InitStruct);
  20. }
  21. void ds1302_DATAINPUT_init(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStruct = {0};
  24. /* GPIO Ports Clock Enable */
  25. __HAL_RCC_GPIOA_CLK_ENABLE();
  26. /*Configure GPIO pin : PA2 */
  27. GPIO_InitStruct.Pin = DATA_Pin;
  28. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  29. GPIO_InitStruct.Pull = GPIO_NOPULL;
  30. HAL_GPIO_Init(DATA_GPIO_Port, &GPIO_InitStruct);
  31. }
  32. /*
  33. * /向DS1302发送一字节数据
  34. */
  35. void ds1302_write_onebyte(uint8_t data)//向DS1302发送一字节数据
  36. {
  37. uint8_t count=0;
  38. ds1302_DATAOUT_init(); // I/O配置为输出
  39. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  40. for(count=0;count<8;count++)
  41. {
  42. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  43. if(data&0x01)
  44. {
  45. HAL_GPIO_WritePin(GPIOA,DATA_Pin, GPIO_PIN_SET);
  46. }
  47. else
  48. {
  49. HAL_GPIO_WritePin(GPIOA,DATA_Pin, GPIO_PIN_RESET);
  50. }//先准备好数据再发送
  51. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_SET); //拉高时钟线,发送数据
  52. data>>=1;
  53. }
  54. }
  55. /*
  56. * 向DS1302发送指定数据
  57. */
  58. void ds1302_wirte_rig(uint8_t address,uint8_t data)//向指定寄存器地址发送数据
  59. {
  60. uint8_t temp1=address;
  61. uint8_t temp2=data;
  62. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_RESET); // 拉低RST
  63. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  64. delay_us(1);
  65. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_SET); // 拉高RST
  66. delay_us(2);
  67. ds1302_write_onebyte(temp1); // 写命令
  68. ds1302_write_onebyte(temp2); // 写数据
  69. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_RESET); // 拉低RST
  70. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  71. delay_us(2);
  72. }
  73. /*
  74. * 从DS1302读取数据
  75. */
  76. uint8_t ds1302_read_rig(uint8_t address)//从指定地址读取一字节数据
  77. {
  78. uint8_t temp3=address;
  79. uint8_t count=0;
  80. uint8_t return_data=0x00;
  81. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_RESET); // 拉低RST
  82. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  83. delay_us(3);
  84. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_SET); // 拉高RST
  85. delay_us(3);
  86. ds1302_write_onebyte(temp3); // 写地址
  87. ds1302_DATAINPUT_init();//配置I/O口为输入
  88. for(count=0;count<8;count++)
  89. {
  90. delay_us(2);//使电平持续一段时间
  91. return_data>>=1;
  92. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_SET);// 拉高时钟
  93. delay_us(4);//使高电平持续一段时间
  94. HAL_GPIO_WritePin(GPIOA,CLK_Pin, GPIO_PIN_RESET);// 拉低时钟
  95. delay_us(14);//延时14us后再去读取电压,更加准确
  96. if(HAL_GPIO_ReadPin(GPIOA,DATA_Pin))
  97. {return_data=return_data|0x80;}
  98. }
  99. delay_us(2);
  100. HAL_GPIO_WritePin(GPIOA,RST_Pin, GPIO_PIN_RESET); // 拉低RST
  101. HAL_GPIO_WritePin(GPIOA,DATA_Pin, GPIO_PIN_RESET); // DATA拉低
  102. return return_data; // 返回数据
  103. }
  104. /*
  105. * 初始化DS1302
  106. 注意,写的时候D0配置为0
  107. 写入时
  108. 秒:1000 00000x80
  109. 分:1000 00100x82
  110. 时:1000 01000x84
  111. 日:1000 01100x86
  112. 月:1000 10000x88
  113. 周:1000 10100x8a
  114. 年:1000 11000x8c
  115. */
  116. void ds1302_init()
  117. {
  118. ds1302_wirte_rig(0x8e,0x00);//关闭写保护
  119. ds1302_wirte_rig(0x80,0x37);//seconds37
  120. ds1302_wirte_rig(0x82,0x58);//minutes58
  121. ds1302_wirte_rig(0x84,0x23);//hours23
  122. ds1302_wirte_rig(0x86,0x30);//date30
  123. ds1302_wirte_rig(0x88,0x09);//months9
  124. ds1302_wirte_rig(0x8a,0x07);//days星期日
  125. ds1302_wirte_rig(0x8c,0x20);//year2020
  126. //ds1302_wirte_rig(0x80,0x19);
  127. ds1302_wirte_rig(0x8e,0x80);//关闭写保护
  128. }
  129. /*
  130. * 读取DS1302数据
  131. 注意,读的时候D0配置为1
  132. 读取时
  133. 秒:1000 00010x81
  134. 分:1000 00110x83
  135. 时:1000 01010x85
  136. 日:1000 01110x87
  137. 月:1000 10010x89
  138. 周:1000 10110x8b
  139. 年:1000 11010x8d
  140. */
  141. void ds1302_read_time(void)
  142. {
  143. read_time[0]=ds1302_read_rig(0x81);//读秒
  144. read_time[1]=ds1302_read_rig(0x83);//读分
  145. read_time[2]=ds1302_read_rig(0x85);//读时
  146. read_time[3]=ds1302_read_rig(0x87);//读日
  147. read_time[4]=ds1302_read_rig(0x89);//读月
  148. read_time[5]=ds1302_read_rig(0x8B);//读星期
  149. read_time[6]=ds1302_read_rig(0x8D);//读年
  150. }
  151. void ds1302_read_realTime(void)
  152. {
  153. ds1302_read_time(); //BCD码转换为10进制
  154. TimeData.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);
  155. TimeData.minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);
  156. TimeData.hour=(read_time[2]>>4)*10+(read_time[2]&0x0f);
  157. TimeData.day=(read_time[3]>>4)*10+(read_time[3]&0x0f);
  158. TimeData.month=(read_time[4]>>4)*10+(read_time[4]&0x0f);
  159. TimeData.week=read_time[5];
  160. TimeData.year=(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;
  161. DS1302_data_1[0]='2';
  162. DS1302_data_1[1]='0';
  163. DS1302_data_1[2]='0'+(TimeData.year-2000)/10;
  164. DS1302_data_1[3]='0'+(TimeData.year-2000)%10;
  165. DS1302_data_1[4]='-';
  166. DS1302_data_1[5]='0'+TimeData.month/10;
  167. DS1302_data_1[6]='0'+TimeData.month%10;
  168. DS1302_data_1[7]='-';
  169. DS1302_data_1[8]='0'+TimeData.day/10;
  170. DS1302_data_1[9]='0'+TimeData.day%10;
  171. DS1302_data_2[0]='0'+TimeData.hour/10;
  172. DS1302_data_2[1]='0'+TimeData.hour%10;
  173. DS1302_data_2[2]=':';
  174. DS1302_data_2[3]='0'+TimeData.minute/10;
  175. DS1302_data_2[4]='0'+TimeData.minute%10;
  176. DS1302_data_2[5]=':';
  177. DS1302_data_2[6]='0'+TimeData.second/10;
  178. DS1302_data_2[7]='0'+TimeData.second%10;
  179. }

main.c中mian函数

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. char str[100] =""; // 字符数组
  5. char str2[100] =""; // 字符数组
  6. /* USER CODE END 1 */
  7. /* MCU Configuration--------------------------------------------------------*/
  8. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9. HAL_Init();
  10. /* USER CODE BEGIN Init */
  11. /* USER CODE END Init */
  12. /* Configure the system clock */
  13. SystemClock_Config();
  14. /* USER CODE BEGIN SysInit */
  15. /* USER CODE END SysInit */
  16. /* Initialize all configured peripherals */
  17. MX_GPIO_Init();
  18. MX_USART1_UART_Init();
  19. /* USER CODE BEGIN 2 */
  20. ds1302_init(); //
  21. /* USER CODE END 2 */
  22. /* Infinite loop */
  23. /* USER CODE BEGIN WHILE */
  24. while (1)
  25. {
  26. /* USER CODE END WHILE */
  27. /* USER CODE BEGIN 3 */
  28. ds1302_read_realTime();
  29. HAL_Delay(10);
  30. strcat(str,DS1302_data_2);
  31. strcat(str,"\r\n");
  32. strcat(str2,DS1302_data_1);
  33. strcat(str2,"\r\n");
  34. while(HAL_OK != HAL_UART_Transmit(&huart1,(unsigned char *)str2,strlen(str2), 500));
  35. while(HAL_OK != HAL_UART_Transmit(&huart1,(unsigned char *)str,strlen(str), 500));
  36. HAL_Delay(500);
  37. memset(str,0,sizeof(str));
  38. memset(str2,0,sizeof(str2));
  39. }
  40. /* USER CODE END 3 */
  41. }

 效果如下:

以上是将数据读取出来,然后通过串口发送出来,这样便于大家移植,祝大家学习愉快,还要沟通交流!!!

源码链接:

STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)-C文档类资源-CSDN文库

吾芯电子工作室

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/460807
推荐阅读
相关标签
  

闽ICP备14008679号