基于STM32F1的时钟芯片DS1302驱动
DS1302.h源代码
/**
******************************************************************************
* @file DS1302.h
* @author Velscode
* @email velscode@gmail.com
* @version 学习完全版 1.0
* @brief 基于STM32F1x的时钟芯片DS1302驱动
******************************************************************************
*/
#ifndef __DS1302_H
#define __DS1302_H
/* 头文件 ------------------------------------------------------------------ */
#include "stm32f10x.h"
#include "delay.h"
/* 引脚配置 ------------------------------------------------------------------ */
#define DS1302_IO_CLOCK RCC_APB2Periph_GPIOC //使用到的IO口时钟源,多个可用或|连接
#define DS1302_CLK_GPIO GPIOC //CLK线
#define DS1302_CLK_PIN GPIO_Pin_0
#define DS1302_CLK PCout(0)
#define DS1302_DIO_GPIO GPIOC //DIO线
#define DS1302_DIO_PIN GPIO_Pin_1
#define DS1302_DATIN PCin(1)
#define DS1302_DATOUT PCout(1)
#define DS1302_RST_GPIO GPIOC //RST线
#define DS1302_RST_PIN GPIO_Pin_2
#define DS1302_RST PCout(2)
/* 寄存器地址 -------------------------------------------------------------- */
#define DS1302_REG_SEC 0x80 //秒数据地址
#define DS1302_REG_MIN 0x82 //分数据地址
#define DS1302_REG_HR 0x84 //时数据地址
#define DS1302_REG_DATE 0x86 //日数据地址
#define DS1302_REG_MONTH 0x88 //月数据地址
#define DS1302_REG_DAY 0x8a //星期几数据地址
#define DS1302_REG_YEAR 0x8c //年数据地址
#define DS1302_REG_CONTROL 0x8e //写保护寄存器地址
#define DS1302_REG_CHARGER 0x90 //涓流充电寄存器
/* 全局变量 ------------------------------------------------------------------ */
/* 函数声明 ------------------------------------------------------------------ */
void DS1302_Init(void); //初始化DS1302
void Ds1302_WriteReg( unsigned char address, unsigned char dat );
unsigned char DS1302_ReadReg(unsigned char address);
unsigned char DS1302_Get_Sec ( void );
unsigned char DS1302_Get_Min ( void );
unsigned char DS1302_Get_Hour ( void );
unsigned char DS1302_Get_Date ( void );
unsigned char DS1302_Get_Mouth( void );
unsigned char DS1302_Get_Day ( void );
unsigned char DS1302_Get_Year ( void );
void DS1302_Set_Sec ( unsigned char val );
void DS1302_Set_Min ( unsigned char val );
void DS1302_Set_Hour ( unsigned char val );
void DS1302_Set_Date ( unsigned char val );
void DS1302_Set_Mouth( unsigned char val );
void DS1302_Set_Day ( unsigned char val );
void DS1302_Set_Year ( unsigned char val );
#endif /* __DS1302_H */
/* End of File ------------------------------------------------------------- */
DS1302.c源代码
/**
******************************************************************************
* @file DS1302.c
* @author Velscode (velscode@gmail.com)
* @version 学习完全版 1.0
* @brief 基于STM32F1x的时钟芯片DS1302驱动
******************************************************************************
*/
#include "DS1302.h"
/* 宏定义 ------------------------------------------------ */
/* 内部函数声明 ------------------------------------------ */
void DS1302_Config_DIO_Input(void);
void DS1302_Config_DIO_Output(void);
/**
**********************************************************
* 函数名称:DS1302_Init
* 功 能:初始化IO口
* 备 注:所有IO参数已使用宏定义替换,只需要更改头文件即可
**********************************************************
*/
void DS1302_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS1302_IO_CLOCK, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置IO速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置IO输出模式
//CLK
GPIO_InitStructure.GPIO_Pin =DS1302_CLK_PIN;
GPIO_Init(DS1302_CLK_GPIO, &GPIO_InitStructure);
//DIO
GPIO_InitStructure.GPIO_Pin =DS1302_DIO_PIN;
GPIO_Init(DS1302_DIO_GPIO, &GPIO_InitStructure);
//RST
GPIO_InitStructure.GPIO_Pin =DS1302_RST_PIN;
GPIO_Init(DS1302_RST_GPIO, &GPIO_InitStructure);
//设定为24小时工作制
}
/**
**********************************************************
* 函数名称:DS1302_Config_DIO_Input
* 功 能:将DIO口配置为输入模式,用于读取数据
**********************************************************
*/
void DS1302_Config_DIO_Input(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//IO
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/**
**********************************************************
* 函数名称:DS1302_Config_DIO_Output
* 功 能:将DIO口配置为输出模式,用于写入数据
**********************************************************
*/
void DS1302_Config_DIO_Output(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//IO
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/**
**********************************************************
* 函数名称:DS1302_SPI_ReadByte
* 功 能:模拟SPI通信读取一个字节
* 返 回:读取到的字节
**********************************************************
*/
unsigned char DS1302_SPI_ReadByte(void)
{
unsigned char i = 0, data = 0;
DS1302_Config_DIO_Input(); //DIO配置为输入模式
for(i = 0; i <8; i++)
{
data = data >> 1;
if(DS1302_DATIN == 1)
data = data | 0x80;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return data;
}
/**
**********************************************************
* 函数名称:DS1302_SPI_WriteByte
* 功 能:模拟SPI通信写入一个字节
* 参 数:dat 待写入的字节
**********************************************************
*/
void DS1302_SPI_WriteByte(u8 dat)
{
u8 i = 0, data = dat;
DS1302_Config_DIO_Output();
for(i = 0; i < 8; i++)
{
DS1302_DATOUT = data&0x01; //将数据送到IO口
DS1302_CLK = 1; //拉高时钟,保持诗句稳定,可以延时100us
DS1302_CLK = 0; //拉低时钟,准备传输下一位
data = data >> 1;
}
DS1302_DATOUT = 1; //
}
/**
**********************************************************
* 函数名称:DS1302_ReadReg
* 功 能:读取DS1302寄存器中的值
* 参 数:address 寄存器的地址(无须刻意加1,软件实现)
* 返 回:目标寄存器中的值
**********************************************************
*/
unsigned char DS1302_ReadReg(unsigned char address)
{
unsigned char data = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_SPI_WriteByte(address|0x01); //读取地址需要与0x01相或,最低为变成1
data = DS1302_SPI_ReadByte();
DS1302_CLK = 1;
DS1302_RST = 0;
return data;
}
/**
**********************************************************
* 函数名称:Ds1302_WriteReg
* 功 能:向DS1302寄存器中写入一个值
* 参 数:address 寄存器的地址
* 参 数:dat 待写入的值
**********************************************************
*/
void Ds1302_WriteReg( unsigned char address, unsigned char dat )
{
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_SPI_WriteByte(address);
DS1302_SPI_WriteByte(dat);
DS1302_CLK = 1;
DS1302_RST = 0;
}
/**
**********************************************************
* 函数名称:DS1302_Get_Sec
* 功 能:获取秒
* 返 回:一个整数,当前秒的值
*
* 80H Bit 7 | 6 5 4 | 3 2 1 0 | 范围
* CH | 10 Seconds | Seconds | 00-59
* 秒 - 十位 秒 - 个位
**********************************************************
*/
unsigned char DS1302_Get_Sec( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_SEC);
val = ((val >> 4) &0x07 ) * 10 + ( val & 0x0F ); //把BCD码转换为实际的数值
// 取高4位 中的 低3位的值 取低四位的值
return val;
}
/**
**********************************************************
* 函数名称:DS1302_Get_Min
* 功 能:获取分
* 返 回:一个整数,当前分的值
*
* 82H Bit 7 6 5 4 | 3 2 1 0 | 范围
* 10 Minutes | Minutes | 00-59
**********************************************************
*/
unsigned char DS1302_Get_Min( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_MIN);
val = (val >> 4) * 10 + (val & 0x0F);
return val;
}
/**
********************************************************************
* 函数名称:DS1302_Get_Hour
* 功 能:获取小时
* 返 回:一个整数,当前小时的值
*
* 84H Bit 7 | 6 | 5 | 4 | 3 2 1 0 | 范围
* 12/24 | 0 | 10/AP |10Hours | Hours | 1-12或0-24
* 备 注:当BIT7=1时为12小时制,此时,BIT=1代表PM
* 当BIT7=0时为24小时制,BIT5表示小时十位的数字
* 本程序未支持12小时制
*********************************************************************
*/
unsigned char DS1302_Get_Hour( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_HR);
val =((val >> 4) & 0x03) * 10 + (val & 0x0F);
return val;
}
/**
********************************************************************
* 函数名称:DS1302_Get_Date
* 功 能:获取日的值
* 返 回:一个整数,当前日的值
*
* 8+H Bit 7 6 | 5 4 | 3 2 1 0 | 范围
* 0 0 | 10DATE | DATE |01-28/29或01-30或01-31
*********************************************************************
*/
unsigned char DS1302_Get_Date( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_DATE);
val =(val >> 4) * 10 + (val & 0x0F);
return val;
}
/**
********************************************************************
* 函数名称:DS1302_Get_Mouth
* 功 能:获取月份
* 返 回:一个整数,当前月份的值
*
* 88H Bit 7 6 5 | 4 | 3 2 1 0 | 范围
* 0 0 0 | 10Mouths | Mouths | 01-12
*********************************************************************
*/
unsigned char DS1302_Get_Mouth( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_MONTH);
val =(val >> 4) * 10 + (val & 0x0F);
return val;
}
/**
********************************************************************
* 函数名称:DS1302_Get_Day
* 功 能:获取星期几
* 返 回:一个整数,当前星期几的值
*
* 88H Bit 7 6 5 4 3 | 2 1 0 | 范围
* 0 0 0 0 0 | DAY | 01-07
*********************************************************************
*/
unsigned char DS1302_Get_Day( void )
{
return DS1302_ReadReg(DS1302_REG_DAY); //BCD码等于真实值,无须转换
}
/**
********************************************************************
* 函数名称:DS1302_Get_Day
* 功 能:获取星期几
* 返 回:一个整数,当前星期几的值
*
* 88H Bit 7 6 5 4 | 3 2 1 0 | 范围
* 10YEAR | YEAR | 00-99
*********************************************************************
*/
unsigned char DS1302_Get_Year( void )
{
unsigned char val = DS1302_ReadReg(DS1302_REG_YEAR);
val =(val >> 4) * 10 + (val & 0x0F);
return val;
}
void DS1302_Set_Sec ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_SEC, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Min ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_MIN, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Hour ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_HR, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Date ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_DATE, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Mouth( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_MONTH, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Day ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_DAY, val );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
void DS1302_Set_Year ( unsigned char val )
{
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x00 );
Ds1302_WriteReg( DS1302_REG_YEAR, ((val/10)<<4)+val%10 );
Ds1302_WriteReg( DS1302_REG_CONTROL, 0x80 );
}
/* End of File ------------------------------------------------------------- */
基于STM32F1的时钟芯片DS1302驱动的更多相关文章
- 基于STM32F1的语音合成芯片SYN6288驱动
目录 说明 SYN6288.h SYN6288.c 说明 基于USART2制作,封装了各种通信协议 SYN6288.h #ifndef _SYN6288_H_ #define _SYN6288_H_ ...
- 轻松吃透实时时钟芯片DS1302软硬件设计,看完秒懂
今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...
- 基于STM32F1的局域网通信模块W5500驱动
目录 说明 W5500 W5500.c 使用方法 说明 需要调整的内容为W5500.h中关于IP地址.端口号.子网掩码.网关等参数 W5500 #ifndef _W5500_H_ #define _W ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- DS1302时钟芯片驱动程序
/***************************************************************************** FileName : DS1302.c F ...
- STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- spi接口的ds1302时钟芯片控制在lcd1602上显示
spi接口的ds1302时钟芯片控制在lcd1602上显示 ...
- uboot的GPIO驱动分析--基于全志的A10芯片【转】
本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...
随机推荐
- 距离放弃python又近了一大步,而然只是第四天
今天是周末后的第一天,周末四处浪浪浪,所以在周一的时候就要狠狠的复习之前的东西了,之后从第一天的计算机基础开始复习,具体内容请翻阅前三篇随笔,主要是要仔细看看,怕学了后面的忘了前面的,今天引进的第一个 ...
- cumprod、prod函数
1.prod函数 prod函数用于求矩阵元素的积,其调用格式如下. (1)B=prod(A):若A为向量,则返回所有元素的积:若A为矩阵,则返回各列所有元素的积. (2)B=prod(A,dim):返 ...
- 使用Kernel NetEm和tc模拟复杂网络环境
关键词:netem(Network Emulator).tc(Traffic Control). 大部分局域网环境良好,但是产品实际网络环境可能千差万别,为了对产品进行各种情况测试就需要模拟网络环境. ...
- Python之find命令中的位置的算法
find("s",a,b) #s表示的是一个子序列,a表示的是检索的起始位置,b表示的是检索的终止位置,ab可有可无 test = "abcdefgh" ...
- 计算机网络基础知识-OSI七层协议模型
一.物理层 物理层主要规定了物理设备的标准,如网线的类型.光纤的接口类型.各种传输介质的传输速率,物理层的数据以比特流(二进制)的形式存在,传输时将比特流转化为电流强弱,达到目的地之后再转化为比特流. ...
- Linux centos7.5操作系统的安装
安装centos7.5 1.1 新建虚拟机 1.2 选择客户机系统和版本 1.3 更改虚拟机名称和创建地址. 1.4 选择网络类型 1.5 自定义硬件,选择添加centos7.5镜像 1.6 开机 ...
- php函数 array_combine
(PHP 5, PHP 7) array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_combine ( array $keys , array $ ...
- 6-4 The present perfect
1 Summary The present perfect is an important verb tense in English. It is used to talk about things ...
- vue-electron脚手架安装及说明 打包基于Vue的 桌面应用程序
今天这篇文章是讲述一下 融合了vue-cli+electron的一种新的脚手架,省去许多繁琐配置,即vue-electron. 下面就说一下安装和使用,假设你的电脑已经安装node.js,并且已经全局 ...
- ABP mysql
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator ...