一个完整的DS1302时钟在STM32上的应用(代码位置有点乱).

整理后的完整代码https://blog.csdn.net/weibo1230123/article/details/80372790

/**
*作者:魏波
*时间:2018.6.6
*
**///一个完整的DS1302时钟在STM32上的应用/*DS1302时钟芯片*/
uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址
uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址
uint8_t start_time2[8]={0,0,10,5,5,6,18};//初始化时间:2018年5月5号10:00:00星期六//I/O定义
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;//DS1302时钟定义//SCLKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB, GPIO_Pin_12);//RSTGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA, GPIO_Pin_0);/*IO:PB2配置为开漏模式,此模式下能够实现真正的双向IO口*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB, GPIO_Pin_2);
}//my_itoa:整数转换成相应的字符串
void my_itoa(long i, char *string)
{  int power = 0, j = 0;  j = i;  for (power = 1; j>10; j /= 10)  power *= 10;  for (; power>0; power /= 10)  {  *string++ = '0' + i / power;  i %= power;  }  *string = '\0';  //printf("%s\n", string);
}  //标准时间转换成时间戳
long GetTick(char *str_time)
{  struct tm stm;  int iY, iM, iD, iH, iMin, iS;  memset(&stm,0,sizeof(stm)); iY = atoi(str_time);  iM = atoi(str_time+5);  iD = atoi(str_time+8);  iH = atoi(str_time+11);  iMin = atoi(str_time+14);  iS = atoi(str_time+17);stm.tm_year=iY-1900;  stm.tm_mon=iM-1;  stm.tm_mday=iD;  stm.tm_hour=iH-8;//注意时区转换  stm.tm_min=iMin;  stm.tm_sec=iS;  /*printf("%d-%0d-%0d %0d:%0d:%0d\n", iY, iM, iD, iH, iMin, iS);*/ return mktime(&stm);
}//写一个字节的数据sck上升沿写数据
void write_1302byte(uint8_t dat)
{  uint8_t i = 0;  GPIO_ResetBits(GPIOB,GPIO_Pin_12); //ds1302clk=0  delay_us(2);//延时大约2us  //my_delay_us(1);for(i = 0;i < 8;i ++)  {  GPIO_ResetBits(GPIOB,GPIO_Pin_12);   //ds1302clk=0;  if(dat&0x01)  GPIO_SetBits(GPIOB,GPIO_Pin_2);  else                            //ds1302dat=(dat&0x01)  GPIO_ResetBits(GPIOB,GPIO_Pin_2);                  delay_us(2); //my_delay_us(1);GPIO_SetBits(GPIOB,GPIO_Pin_12);    //发送一位数据,clk上升沿,//ds1302clk=1  dat >>= 1;  delay_us(1);//my_delay_us(1);}
}//向DS1302指定寄存器写入一个字节的数据
void write_1302(uint8_t add,uint8_t dat)
{  GPIO_ResetBits(GPIOA,GPIO_Pin_0); //只有在rst为高电平的时候才能进行数据传输  GPIO_ResetBits(GPIOB,GPIO_Pin_12); //只有clk为低电平的时候,rst才能被置为高电平  //ds1302rst=0;  //ds1302clk=0;  delay_us(1);                     //略微延时  //my_delay_us(1);GPIO_SetBits(GPIOA,GPIO_Pin_0);   //clk = 0之后,这里将rst拉高,准备传送数据  //ds1302rst=1;  delay_us(2);                     //时间大约2us //my_delay_us(1);write_1302byte(add);             //先发地址  write_1302byte(dat);             //然后发数据  GPIO_ResetBits(GPIOA,GPIO_Pin_0); //这里释放总线  GPIO_ResetBits(GPIOB,GPIO_Pin_12); //拉低clk,以备下一次数据发送  //ds1302clk=0;  //ds1302rst=0;  delay_us(5);  //my_delay_us(1);} //从DS1302指定寄存器读数据
uint8_t read_1302(uint8_t add)
{  uint8_t i=0;  uint8_t Return_dat = 0x00;  GPIO_ResetBits(GPIOA,GPIO_Pin_0);            //ds1302rst=0;  GPIO_ResetBits(GPIOB,GPIO_Pin_12);           //ds1302clk=0;  delay_us(3);                                 //略微延时2us  //my_delay_us(1);GPIO_SetBits(GPIOA,GPIO_Pin_0);             //ds1302rst=1;  delay_us(3);                                //时间要大约3us  // my_delay_us(1);write_1302byte(add);                       //先写寄存器的地址  for(i=0;i<8;i++)  {  GPIO_SetBits(GPIOB,GPIO_Pin_12);       //ds1302clk=1; delay_us(5);//my_delay_us(1);Return_dat >>= 1;  delay_us(5);//my_delay_us(1);GPIO_ResetBits(GPIOB,GPIO_Pin_12);     //ds1302clk=0;//拉低时钟线,以便于数据的读入  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==1)    //数据线此时为高电平  {Return_dat = Return_dat|0x80;}  }  delay_us(1);//my_delay_us(1);GPIO_ResetBits(GPIOA,GPIO_Pin_0);        //ds1302rst=0;释放总线  return Return_dat;
}//初始化1302
void ds1302_init(uint8_t *write,uint8_t *time)
{  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);                 //打开写保护
} //从DS1302中读取出时间赋给myTime(硬件系统时间)
void ds1302_data(uint8_t *read)
{  write_1302(0x8e,0x00);            //关闭写保护write_1302(0x8e,0x80);            //打开写保护 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]))ACCLOG("DS1302 time is 20%d%d %d%d %d%d %d%d:%d%d:%d%d %d\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];  char str_time[20];str_time[0] = '2';str_time[1] = '0';//N2Char():整数转字符串str_time[2] = N2Char((int)(time[6]));str_time[3] = N2Char((int)g[6]);str_time[4] = 32;                    str_time[5] = N2Char((int)time[4]);                        str_time[6] = N2Char((int)g[4]);                    str_time[7] = 32;                         str_time[8] = N2Char((int)time[3]);                     str_time[9] = N2Char((int)g[3]);                       str_time[10] = 32;                   str_time[11] = N2Char((int)time[2]);                       str_time[12] = N2Char((int)g[2]);                    str_time[13] = 32;                         str_time[14] = N2Char((int)time[1]);str_time[15] = N2Char((int)g[1]);str_time[16] = 32; str_time[17] = N2Char((int)time[0]);str_time[18] = N2Char((int)g[0]);long ConfigureCodeTime = GetTick(str_time);  //ConfigureCodeTime中放的是时间戳ACCLOG("\nDS1302 turn to Timestamp is:%ld\n",ConfigureCodeTime); // myTime[11] = ConfigureCodeTime;//memset((char *) &myTime, 0, sizeof(myTime));my_itoa(ConfigureCodeTime,myTime); //再把ConfigureCodeTime保存的时间戳赋给myTime数组ACCLOG("myTime is:%ld\n",ConfigureCodeTime); //itoa(ConfigureCodeTime, myTime, 10);
}

一个完整的DS1302时钟在STM32上的应用实例相关推荐

  1. 用PaddleDetection做一个完整的目标检测项目(上)

    文章转载自:微信公众号:飞桨PaddlePaddle的微信文章 原文章中由于排版问题,导致文字遮挡,不便阅读,因此对文章格式稍作更改,增加了一些关键词加粗,便于后续阅读. PaddleDetectio ...

  2. WebMagic爬虫入门教程(二)一个完整的爬取动漫之家的实例

    (一)前言 我的上一篇博客已经说明如何爬取某一个网页的动漫数据,这里重点说一下一个完整的爬虫实例. 和上一篇文章相比,多了的就是动画种类,日文名什么的. 推荐这个爬取博客的:http://blog.c ...

  3. 云计算搭建全部内容总结,保证可以搭建一个完整的云计算服务器,包括节点安装、实例的分配和网络的配置等内容

  4. 基于STM32的DS1302时钟芯片驱动

    基于STM32的DS1302时钟芯片驱动 /****************************************************************************** ...

  5. DS1302时钟芯片在STM32F0中的完整应用代码

                                     DS1302在STM32F0中的应用 /** *作者:魏波 *时间:2017.6.6 * **///DS1302在STM32F0中的应 ...

  6. 使用51单片机和DS1302时钟芯片做一个简易的电子时钟

    简易的电子时钟实验 一.前言 二.DS1302模块介绍 三.驱动DS1302的代码 3.1 初始化DS1302时钟芯片 3.2 读取DS1302时钟芯片的时间 3.3 设置DS1302时钟芯片的时间 ...

  7. 一个较完整的关键字过滤解决方案(上)

    如果您希望看到关键字过滤算法的话那么可能就要失望了.博客园中已经有不少关于此类算法的文章(例如这里和这里),虽然可能无法直接满足特定需求,但是已经足够作为参考使用.而本文的目的,是给出一个较为完整的关 ...

  8. 用C#在STM32上写第一个Hello world

    随着微软放弃.Net MF ,通过C#编写STM32 平台上的程序变得渺茫, 但是, 别着急, 目前至少有两个社区在做这件事情, 传承了微软的.Net MF , 一家是 nanoframework,另 ...

  9. 线上redis一般安在linux_Redis企业级应用-Linux安装搭建一个完整的linxu线上服务(上)...

    我们在做项目的时候经常会遇到很多性能的问题,也成为整个系统优化最疼痛的问题,主要还是因为在用户量大的时候或者就是说高并发访问的时候,我们系统的数据库会有一个限制.当然也可以通过对数据库的优化对系统进行 ...

最新文章

  1. 数字经济时代下老年群体手机APP软件网络推广适老化需求日益明显
  2. nacos集群的ap cp切换_配置中心Nacos
  3. 阿里笔试-二叉树由前序遍历和中序遍历推导后序遍历
  4. linux cmake装在自己目录下,如何在Linux下安装cmake
  5. 数字化转型知识方法系列之五:数字化转型战略
  6. 互联网的大厂就那么几家,所以很多员工跳槽后都是互相流动的
  7. oppo怎么广告接入_OPPO游戏创游无境 构建强大的游戏生态
  8. 如何在秋招中拿到offer?
  9. Modbus通用数据读取工具设计及使用
  10. scala访问MySQL数据库
  11. 第六课 大数据技术之Hadoop3.x的源码解析
  12. 解决Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout
  13. VScode 控制台/终端乱码
  14. 使用certbot-auto脚本安装Certbot 生成https证书
  15. 在本机搭建FTP服务器
  16. 零基础入门学习Python--永久存储:腌制一缸美味的泡菜
  17. module_init源码分析
  18. 求2!+4!+6!+ …… +2n!的和
  19. 设计模式笔记--备忘录模式
  20. 家乐福推出供应商网站

热门文章

  1. 【Kotlin】Kotlin 抽象类与接口 ( 接口声明 | 接口实现 | 抽象类声明与实现 )
  2. 【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )
  3. window下tomcat的内存溢出问题
  4. 【Redis】Redis学习(三) Redis 主从模式详解
  5. unix环境高级编程——文件i/o
  6. 链表是否带环、环入口、环长度、链表相交问题分析与总结
  7. [转]Win下必备神器之Cmder
  8. 如何用ASP.NET加密Cookie数据过程分析
  9. IT技术文章示例(附源码)
  10. OpenCV-Python 彩色图像均衡化与规定化