基于stm32f103zet6的DS1302学习

2023-05-16

由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧!

1、所谓的DS1302


这里面也指明了简单的SPI协议

然后就直接上代码了,注释很详细的!基本实现单行注释

1、主函数main

#include "stm32f10x.h"    
#include "SysTick.h"
#include "Delay.h"
#include "Usart.h"
#include "stdio.h"
#include "DS1302.h"
/*******由于没有做外设测试的程序是:按键PA0仅一个LED灯									******/
/*******由于没有做外设测试的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/
/*******由于没有做外设测试的程序是:ds1302clk <-> PA4
																		ds1302dat <-> PA5
																		ds1302rst <-> PA6  									 *****/
																		
extern uint8_t write[];
extern uint8_t read[];

int main(void)
{
	//uint8_t time[] = {0,0,12,11,11,1,13};
	//初始化系统定时器
	SysTick_Init();
	USART1_Config();
	ds1302_GPIO_Configuration();													//一定别忘记了配置GPIO
	printf("\r\n ("__DATE__ " - " __TIME__ ") \r\n");
	//ds1302_init(write,time);														//设置1302的初始时间
	ds1302_data(read);
	while(1);																							//这个得加,不然的话会有尾巴是乱码!!!
}

/*******************************************************************************
** 文件名称 : ds1302.c
** 编译环境 : RealView MDK-ARM 4.53
** 文件作者 : 	
** 功能说明 : ds1302相关函数定义
** 软件协议 :模拟SPI协议
** 简介			:clk上升沿发送数据,clk下降沿接收数据
						:typedef unsigned          char uint8_t;
**                      
**                             
**
*******************************************************************************/
/* 包含头文件 *****************************************************************/
#include "ds1302.h"
#include "stdio.h"
#include "Delay.h"

uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址
uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址
/*PA4、PA6为输出*/
/*PA5配置为开漏模式,此模式下能够实现真正的双向IO口*/
void ds1302_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst; 		//clk、rst配置为输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;				//IO配置为双向
	GPIO_InitStruct.GPIO_Pin = ds1302dat;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void write_1302byte(uint8_t dat)											//写一个字节的数据sck上升沿写数据
{
 	uint8_t i = 0;
	GPIO_ResetBits(GPIOA,ds1302clk);										//ds1302clk=0
	
  Delay_us(2);//延时大约2us
	
 	for(i = 0;i < 8;i ++)
 	    {
			GPIO_ResetBits(GPIOA,ds1302clk);	 	    				//ds1302clk=0;
			if(dat&0x01)
				GPIO_SetBits(GPIOA,ds1302dat);
			else																						//ds1302dat=(dat&0x01)
				GPIO_ResetBits(GPIOA,ds1302dat);				
	 		Delay_us(2);
			GPIO_SetBits(GPIOA,ds1302clk);									//发送一位数据,clk上升沿,//ds1302clk=1
	 		dat >>= 1;
	 		Delay_us(1);
 		}	
	}
	
uint8_t read_1302(uint8_t add)												//读数据
{
	uint8_t i=0;
	uint8_t Return_dat=0x00;
	GPIO_ResetBits(GPIOA,ds1302rst);		  							//ds1302rst=0;
	GPIO_ResetBits(GPIOA,ds1302clk);										//ds1302clk=0;
	Delay_us(3);																				//略微延时2us
	GPIO_SetBits(GPIOA,ds1302rst);	  									//ds1302rst=1;
	Delay_us(3);																				//时间要大约3us
	write_1302byte(add);																//先写寄存器的地址
	for(i=0;i<8;i++)
	{
		GPIO_SetBits(GPIOA,ds1302clk);		 								//ds1302clk=1;
		Return_dat >>= 1;
		GPIO_ResetBits(GPIOA,ds1302clk);									//ds1302clk=0;//拉低时钟线,以便于数据的读入
		if(GPIO_ReadInputDataBit(GPIOA,ds1302dat)==1)			//数据线此时为高电平
		{Return_dat = Return_dat|0x80;}
	}
	  Delay_us(1);
	  GPIO_ResetBits(GPIOA,ds1302rst);	 							  //ds1302rst=0;释放总线
	  return Return_dat;
	}
void write_1302(uint8_t add,uint8_t dat)							//向指定寄存器写入一个字节的数据
{
	GPIO_ResetBits(GPIOA,ds1302rst);										//只有在rst为高电平的时候才能进行数据传输
	GPIO_ResetBits(GPIOA,ds1302clk);										//只有clk为低电平的时候,rst才能被置为高电平
	//ds1302rst=0;
	//ds1302clk=0;
	Delay_us(1);																				//略微延时
	GPIO_SetBits(GPIOA,ds1302rst);											//clk = 0之后,这里将rst拉高,准备传送数据
	//ds1302rst=1;
	Delay_us(2);																				//时间大约2us
	write_1302byte(add);																//先发地址
	write_1302byte(dat);																//然后发数据
	GPIO_ResetBits(GPIOA,ds1302rst);										//这里释放总线
	GPIO_ResetBits(GPIOA,ds1302clk);										//拉低clk,以备下一次数据发送
	//ds1302clk=0;
	//ds1302rst=0;
	Delay_us(1);

}
void ds1302_init(uint8_t *write,uint8_t *time)				//初始化1302
{
	uint8_t i=0,j=0;
	write_1302(0x8e,0x00);															//关闭写保护
	for(i=0;i<7;i++)																		//十进制转BCD码
	{
		j=time[i]%10;																			//个位数部分
		time[i]=(time[i]/10)*16+j;	
	}
	for(i=0;i<7;i++)																		//进行对时
	{
		write_1302(write[i],time[i]);											//在对应寄存器上写入对应的十六进制数据
		
	}
    write_1302(0x8e,0x80);														//打开写保护
}
void ds1302_data(uint8_t *read)												//处理数据并通过串口打印
{
	uint8_t i=0,g[7],time[7];
//	static uint8_t s = 1;
	for(i=0;i<7;i++)
	{
		time[i]=read_1302(read[i]);												//读数据已经完成
	}
	for(i=0;i<7;i++)
	{
		g[i]=time[i]%16;																	//秒个位数据:BCD转十进制
		time[i]=time[i]/16;																//秒十位数据
	}
	//此时已转换成10进制数,g[i]里面存放的是秒分时日月周年的各个位数据
	//而此时的time[i]存放的是十位数据
					
		//if(s != (time[0]+g[0]))
	printf("20%d%d年%d%d月%d%d日%d%d:%d%d:%d%d 星期%d\r\n",time[6],g[6],time[4],g[4],time[3],g[3],time[2],g[2],time[1],g[1],time[0],g[0],g[5]);
	  //s = time[0]+g[0];	
}
就是这样的简单,然后给出一张效果图


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于stm32f103zet6的DS1302学习 的相关文章

  • STM32F103ZET6串口调试与语音播报

    一 串口调试 1 串口是什么 xff1f 串行接口简称串口 xff0c 也称串行通信接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 2 通信 xff1a 串行通信 xff0c 并行通信 数字信号是8
  • 时钟芯片DS1302时序分析、读写代码解析

    1 DS1302芯片原理图分析 引脚名称功能X1 X2外接32 768kHz 晶振 xff0c 用于内部计时SCLK和主控通信的时钟线I O数据输入输出引脚CE使能引脚VCC1接电池供电 xff0c 保证主板掉电时间能继续走VCC2主板的电
  • DS1302时钟芯片(SPI协议)

    DS1302时钟芯片 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 它可以对年 月 日 周 时 分 秒进行计时 xff0c 且具有闰年补偿等多种功能 可以把该芯片看成一个小型的单片机 xff0c 其内部
  • 【mcuclub】时钟模块DS1302

    一 实物图 二 原理图 编号名称功能1VCC2双供电配置中的主电源供应引脚 DS1302工作于 VCC1和VCC2中较大者 当VCC2比VCC1高0 2V 时 xff0c VCC2 给 DS1302供电 当VCC1比VCC2高时 VCC1给
  • 1.0 DS1302-外部RTC

    一 综述 DS1302是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 xff0c 因为应用非常广泛 xff0c 结果就导致了大量的国产仿制品 xff0c GC1302是一款国产DS1302仿制芯片 xff0c 使用方法
  • STM32F103ZET6和STM32F103C8T6芯片的区别

    是这样的 xff0c 一个具体的STM32F103系列芯片的内存有多大 xff0c 你看一下芯片上的型号就行了 STM32F103XY 注意 xff0c XY是个代号 xff0c X是表示封装有多少个引脚 xff0c 比如 xff0c 如果
  • ds1302时钟芯片工作原理引脚电路图及功能

    资源获取码 xff1a aaaa DS1302时钟实用仿真图 上面仿真图功能描述 xff1a 1 能读取DS1302数据 xff0c 并显示在数码管上面 2 带按键设置功能 xff0c 可以设置DS1302时分秒数据 3 带倒计时功能 xf
  • STM32F103ZET6驱动57闭环步进电机(连线+代码)

    一 设备 xff1a 1 STM32F103开发板 xff08 普中F103的板子 xff09 2 57闭环电机带驱动 3 24V 3A的直流电源 xff0c 用于给电机驱动供电 简单说明 xff1a 使用Keil5编程 xff0c 主要使
  • 时钟芯片DS1302异常

    异常现象 xff1a DS1302时间不走时 xff0c 秒位是一个大于60的错误数字 分析原因 xff1a DS1302受到干扰 xff0c 软件仿真发现DS1302的秒寄存器最高位被置为1 xff08 为时钟停止位 xff09 解决方法
  • STM32与DS1302设计时钟芯片,超详细

    DS1302 是DALLAS 公司推出的涓流充电时钟芯片 xff0c 内含有一个实时时钟 日历和31 字节静态RAM xff0c 通过简单的串行接口与单片机进行通信 实时时钟 日历电路提供秒 分 时 日 周 月 年的信息 xff0c 每月的
  • STM32F103ZET6的中断管理

    1 STM32的中断 STM32的中断管理是属于内核部分的 xff0c 所以中断管理的寄存器也是属于内核组 xff0c 不属于芯片外设 xff0c 在查看相关资料的时候 xff0c 需要查看相对应的内核手册 STM32F103ZET6是Co
  • 蓝桥杯单片机-DS1302时钟模块

    一 简介 1 采用SPI三线接口通信 xff08 SCK SDA RST xff09 上升沿数据被写入DS1302 xff0c 下降沿被读出 二 应用 1 在ds1302 c文件中定义三个数组 unsigned char code READ
  • ds1302——斌哥51

    以下内容分别借鉴了 清翔 51 xff0c 斌哥51 xff0c 以及CSDN 普通的不普通少年 内部结构 xff1a DS1302 包括时钟 日历寄存器和 31 字节 xff08 8 位 xff09 的数据暂存寄存器 xff0c 数据通信
  • 基于stm32f103zet6的DS1302学习

    由于硬件出了问题 xff0c 也就是外部低速晶振没用 xff0c 震不起来 xff0c 然后查看了网上的帖子 xff0c STM32的RTC果然口碑不怎么样 xff0c 所以果断换DS1302 xff0c 在移植的过程中还算顺利 xff0c
  • 基于stm32f103zet6之使用FSMC驱动TFT的学习

    在完成IO驱动彩屏的试验后 xff0c 就准备着手使用FSMC来驱动彩屏 xff0c 先了解一下预备知识 一 所谓的FSMC机制 简单介绍FSMC在这篇博文里面很清楚 xff0c 推荐一下 http blog csdn net king b
  • Arduino驱动DS1302显示时钟

    Arduino驱动DS1302显示时钟 前言电气参数经典应用电路接线程序实验结果 前言 目前有许多流行的串行时钟电路 xff0c 例如 DS1302 xff0c DS3231 xff0c DS1307 xff0c PCF8485 等 它们由
  • STM32F103ZET6驱动TOF250激光测距传感器

    STM32驱动TOF250激光测距传感器 TOF250介绍I2C通讯协议I2C寄存器地址 TOF250引脚说明和STM32的接线和STM32的接线 程序实验结果总结 TOF250介绍 TOF250是一款基于TOF原理的单点测距雷达 xff0
  • 时钟芯片DS1302的原理及使用

    一 描述 DS1302时钟芯片是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 它可以对年 月 日 周 时 分 秒进行计时 且具有闰年补偿等多种功能 DS1302芯片包含一个用于存储实时时钟 日历的 31 字节的静态
  • STM32F103操作DS1302时钟芯片串口显示(标准库和HAL库)

    目录 DS1302的性能指标 DS1302的寄存器及片内RAM 标准库实现 HAL库实现 源码链接 单片机型号 STM32F103C8T6 在日常生活中 很多情况下会需要使用时间 单片机中虽然也是有定时器但并不能较为准备的实现计时功能 而且
  • 基于STM32F103ZET6的RX8025SA时钟电路设计

    1 现在网上大多例程都是关于RX8025T的 带温度补偿的时钟芯片手册 RX8025SA与RX8025T的区别 RX8025T内置高稳定性32 768kHz的DTCXO 数字温度补偿晶体振荡器 可保证在全温度范围内的精度保持在 5ppm R

随机推荐

  • Android JNI基础篇(一)

    Android JNI 基础篇 前言 JNI学习其实并不难 xff0c 在这里 xff0c 我将引导大家学习JNI的基础知识 xff0c 认真学完本教程 xff0c 你将更加坚信我说的话 来吧 xff0c 我们一起学习 xff01 JNI
  • ROS学习(三):消息通信过程

    主节点管理节点信息 xff0c 每个节点根据需要与其他节点进行连接和消息通信 在这里 xff0c 我们来看看最重要的主节点 节点 话题 服务和动作信息的过程 一 运行主节点 节点之间的消息通信当中 xff0c 管理连接信息的主节点是为使用R
  • HTTP Digest authentication(摘要认证)和HTTP basic Authorization(普通认证)用户登出注销的方法

    最近项目中需要对普通认证HTTP basic Authorization和摘要认证HTTP Digest authenticatio登录进行注销 搜索到有几篇文章号称ie xff0c Firefox chrome都可以可以注销 xff0c
  • POCO C++库学习和分析 -- 序

    POCO C 43 43 库学习和分析 序 1 POCO库概述 xff1a POCO是一个C 43 43 的开源库集 同一般的C 43 43 库相比 xff0c POCO的特点是提供了整一个应用框架 如果要做C 43 43 程序应用框架的快
  • 【ubuntu18+QT12+OpenCV4环境配置】

    ubuntu18 43 QT12 43 OpenCV4环境配置 前些天编译了最新版本opencv4 xff0c 但是电脑内还有个opencv3 2 xff0c 有时候二者共享链接库文件即libopencv so XX xff0c 之类的路径
  • Ubuntu无法使用浏览器上网

    1 可以更新一下浏览器 xff0c 打开终端 xff0c 输入 xff1a sudo apt get install firefox 如果你用的是其他浏览器可以吧后面的 firefox 改为其他浏览器 xff0c 如谷歌浏览器 xff1a
  • 浅析C++中struct和class的区别

    文章目录 C和C 43 43 中struct的区别C 43 43 中struct和class的区别 C和C 43 43 中struct的区别 struct最早是在C语言中出现的 xff0c 但在C语言中struct只是一种 用户自定义数据类
  • C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题 在一个头文件 h中定义一个结构体 在另一个 h文件中使用这个结构体引发错误C2143 语法错误 缺少 在 的前面 编译源文件 等莫名的报错头文件的交叉包含 即头文件a包含了头文件b 头文件b又包含了头文件a多个不同的头文件
  • 使用python进行http请求自动登录处理302跳转的问题

    一 问题背景 最近在做一个自动化业务处理的程序时 xff0c 需要完成对系统的自动登录 经过抓包测试只需要使用简单的post请求后收到的回包中包含cookie信息 xff0c 因此可以据此完成登录 程序设计思路为发送求到登录验证页面 xff
  • C# TCP/UDP网络通讯调试助手(含源码)

    C TCP UDP网络通讯调试助手 1 客户端界面 1 客户端界面 源码下载地址 xff1a https download csdn net download kingleitao 11927885
  • socketcan

    参考 lt lt Linux Can编程详解 gt gt CAN原理介绍 https www cnblogs com spoorer p 6649303 html 一 初始化工作 SocketCAN 中大部分的数据结构和函数在头文件 lin
  • vscode+cmake 实现C++项目的完整编译

    1 项目目录 span class token builtin class name span bin build CMakeLists txt include array 2d h common h swap h lib src arra
  • 航模常用硅胶线、热缩管规格

    一般穿越机中信号线等用26或28awg xff0c 外径1 3 1 5mm xff0c 配套热缩管选用2mm的比较合适 供电电源线一般用10awg或12awg xff0c 外径4 5 5 4mm xff0c 配套热缩管为7mm比较合适 14
  • POCO C++库学习和分析 -- 线程 (一)

    POCO C 43 43 库学习和分析 线程 xff08 一 xff09 线程是程序设计中用的非常多的技术 xff0c 在UI设计 xff0c 网络通讯设计中广泛使用 在POCO库中 xff0c 线程模块可以分成6个部分去理解 锁 xff0
  • 100条经典C语言笔试题目

    100 条经典C语言笔试题目 题目来源 xff1a 1 中兴 华为 慧通 英华达 微软亚洲技术中心等中 外企业面试题目 xff1b 2 C 语言面试宝典 林锐 高质量编程第三版 说明 xff1a 1 部分C 语言面试题中可能会参杂部分和C
  • hadoop2.7完全分布式集群搭建以及任务测试

    要想深入的学习hadoop数据分析技术 xff0c 首要的任务是必须要将hadoop集群环境搭建起来 xff0c 本文主要讲述如何搭建一套hadoop完全分布式集群环境 环境配置 xff1a 2台64位的redhat6 5 43 1台64位
  • /etc/passwd, /etc/shadow

    使用者帐号 xff1a etc passwd etc shadow 由上面的说明您大概已经知道 xff0c 嘿嘿 xff01 帐号管理最重要的两个档案就是 etc passwd 与 etc shadow 了 xff01 这两个档案可以说是
  • 密集负载下的网卡中断负载均衡smp affinity及单队列RPS

    简单的说就是 xff0c 每个硬件设备 xff08 如 xff1a 硬盘 网卡等 xff09 都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情 xff0c 这样 CPU 可能就会放下手中的事情去处理应急事件 xff0c
  • 基于stm32f103zet6之最小系统的制作

    因为嵌入式老师一直鼓励我们去学习stm32 xff0c 他说这是一款很不错的片子 xff0c 所以就萌生了学习stm32的念头 xff0c 之前一直在学习基于arm11的OK6410 xff0c 裸机跑到触摸屏就没有再继续了 xff0c 感
  • 基于stm32f103zet6的DS1302学习

    由于硬件出了问题 xff0c 也就是外部低速晶振没用 xff0c 震不起来 xff0c 然后查看了网上的帖子 xff0c STM32的RTC果然口碑不怎么样 xff0c 所以果断换DS1302 xff0c 在移植的过程中还算顺利 xff0c