STM32F1驱动DS1302实时时钟芯片代码分享
首先祝大家元旦快乐,希望大家2020事事顺心,财源滚滚,同时新的一年,新的起点,也希望大家带着新的目标迈向新的征程。
最近项目用到了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