DS1302在STM32F0中的应用

/**
*作者:魏波
*时间:2017.6.6
*
**///DS1302在STM32F0中的应用/**********************第一:首先对端口进行配置****************/
//DS1302时钟端口定义
void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;//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);}uint8_t read_1302(uint8_t add);
void ds1302_data(uint8_t *read);
void write_1302byte(uint8_t dat) ;
void write_1302(uint8_t add,uint8_t dat);
void ds1302_init(uint8_t *write,uint8_t *time);uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址
uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址void main(char src[])
{/**********************第二:把一个十进制时间戳转换成常规格式的时间****************/char myTime[11] = "1516766898";//存放十进制时间戳time_t t;  struct tm *p;t=atoi(myTime);//time(&t);p=gmtime(&t);   uint8_t Second=0,Min=0,Hour=0,Day=0,Month=0,Weekday=0,Year=0,Year_end=0;Second = (uint8_t)(p->tm_sec);Min = (uint8_t)(p->tm_min);Hour = (uint8_t)(p->tm_hour+8);Day = (uint8_t)(p->tm_mday);Month = (uint8_t)(1+p->tm_mon);Weekday = (uint8_t)(p->tm_wday);//Year = (uint8_t)(1900+p->tm_year);int unitPlace,tenPlace;unitPlace = (1900+p->tm_year)/1%10;   //获取年的个位tenPlace  = (1900+p->tm_year)/10%10;  //获取年的十位Year_end = (uint8_t)(tenPlace*10 + unitPlace);uint8_t start_time[] = {Second,Min,Hour,Day,Month,Weekday,Year_end};ACCLOG("Second = %d\nMin = %d\nHour = %d\nDay = %d\nMonth = %d\nWeekday = %d\nYear_end = %d\n",Second,Min,Hour,Day,Month,Weekday,Year_end);/**********************第三:ds1302_init()函数:用常规格式的时间初始化DS1302***/ds1302_init(write,start_time);/**********************第四:ds1302_data()函数*******************************(1)把时间写入DS1302(2)读出DS1302里的时间(3)把读出的时间转换成十进制时间戳(4)把这个十进制时间戳转换成字符串存入一个字符数组里******************************************************************/                             ds1302_data(read);  }/**********************************DS1302时钟子函数如下*****************************************///写一个字节的数据sck上升沿写数据
void write_1302byte(uint8_t dat)
{  uint8_t i = 0;  GPIO_ResetBits(GPIOB,GPIO_Pin_12); //ds1302clk=0  delay_us(2);//延时大约2us  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);  GPIO_SetBits(GPIOB,GPIO_Pin_12);    //发送一位数据,clk上升沿,//ds1302clk=1  dat >>= 1;  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);                     //略微延时  GPIO_SetBits(GPIOA,GPIO_Pin_0);   //clk = 0之后,这里将rst拉高,准备传送数据  //ds1302rst=1;  delay_us(2);                     //时间大约2us  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);  } //从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  GPIO_SetBits(GPIOA,GPIO_Pin_0);             //ds1302rst=1;  delay_us(3);                                //时间要大约3us  write_1302byte(add);                       //先写寄存器的地址  for(i=0;i<8;i++)  {  GPIO_SetBits(GPIOB,GPIO_Pin_12);       //ds1302clk=1; delay_us(5);Return_dat >>= 1;  delay_us(5);GPIO_ResetBits(GPIOB,GPIO_Pin_12);     //ds1302clk=0;//拉低时钟线,以便于数据的读入  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==1)    //数据线此时为高电平  {Return_dat = Return_dat|0x80;}  }  delay_us(1);  GPIO_ResetBits(GPIOA,GPIO_Pin_0);        //ds1302rst=0;释放总线  return Return_dat;
}//标准时间转换成时间戳
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;  return mktime(&stm);
}//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);
}  //处理数据
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;                                   //秒十位数据  }    ACCLOG("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]);  char str_time[14];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("ConfigureCodeTime is:%ld\n",ConfigureCodeTime); //itoa(ConfigureCodeTime, myTime, 10); //所用stdlib.h库中没有itoa函数,只能自己写my_itoa(ConfigureCodeTime,myTime);     //再把ConfigureCodeTime保存的时间戳赋给myTime数组         }//初始化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);                 //打开写保护
} 
//整数转字符串
char N2Char(long n)
{  int i;   //char flag = 'a'; char c;  if ((i=n/10)!=0)  N2Char(i);  c = n%10 + '0';  printf("%c", c);  //return flag;return c;}

DS1302时钟芯片在STM32F0中的完整应用代码相关推荐

  1. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  2. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...

  3. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》... 1

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  4. 51单片机进阶案例(1)——基于MATLAB GUI的单片机串口与PC的通信实现实时时钟和双向可调时钟功能(利用DS1302时钟芯片和LCD1602液晶屏)

    目录 一.案例描述 二.实现功能 三.51单片机部分实现 3.1 实时时钟的实现 3.2 串口通信的实现 3.2.1 接收数据 3.2.2 发送数据 四.MATLAB部分实现 4.1 GUI界面 4. ...

  5. 【C51单片机学习笔记--DS1302时钟芯片蜂鸣器I2C总线AT24C02存储器】

    C51单片机学习笔记–DS1302时钟芯片&&蜂鸣器&&I2C总线&&AT24C02存储器 文章目录 一.DS1302时钟芯片介绍 二.DS1302时钟 ...

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

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

  7. ds1302模块 树莓派_Arduino控制DS1302时钟芯片(ds1302引脚图及功能和应用电路)

    DS1302应用电路 应用电路一: DS1302的电路一个重点就是时钟电路,它所使用的晶振是一个32.768k的晶振,晶振外部也不需要额外添加其他的电容或者电阻电路了.时钟的精度,首先取决于晶振的精度 ...

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

    目录 DS1302的性能指标 DS1302的寄存器及片内RAM 标准库实现 HAL库实现 源码链接 单片机型号:STM32F103C8T6 在日常生活中,很多情况下会需要使用时间,单片机中虽然也是有定 ...

  9. 51单片机使用DS1302时钟芯片实现可调时钟

    文章目录 1.实现方法 2.所需函数模块 3.时钟写入(读取)函数(`DS1302.c`) 4.定时器初始化函数(`Timer0Init.c`) 5.按键扫描函数(`Key.c`) 6.时钟调整函数( ...

最新文章

  1. 最落寞的C9高校:从未没落
  2. 性能测试初学_windows 计数器
  3. 使用AspectJ和Spring简化了AOP
  4. javascript函数节流、防抖及使用场景
  5. 设计模式学习笔记——命令(Command)模式
  6. python中if语句最多支持的分支是_Python多分支if语句的使用
  7. 在电脑上安装python-如何在自己的电脑上安装python的idle版 - 卡饭网
  8. TJA1050 引脚
  9. Web登录小案例(含验证码登录)
  10. 华为机试---小东分苹果
  11. 可以显示九天天气情况的天气预报哦-LINUX下JAVA自制服务器端,申请公网IP,处理数据。。第二个项目
  12. PowerDesigner一键导入数据库所有表并画数据模型图
  13. Linux下tomcat重启
  14. 印度软件和中国软件工程师_如何成为印度的软件工程师?
  15. 程序猿终级课颈椎腰椎锻炼
  16. 数学建模的常用模型和方法
  17. 【报错记录】Un-Routed Net Constraint
  18. iFIX 6.1新功能之 - OPC UA Client Driver
  19. SAP中使用MM01创建物料如何选定行业领域和物料类型
  20. 更彻底清理微信存储空间让小存储手机继续生存

热门文章

  1. 用markdown写博客园
  2. codeblock 恢复默认字体设置
  3. ORACLE数据库,数据量大,转移数据到备份表语句
  4. Window CMD快捷键
  5. Android LayoutInflater详解(转)
  6. 关于CSS中的字体尺寸设置 em rem等
  7. 第 5 章 第二个 activity
  8. linux内核之accept实现
  9. Hibernate关联查询
  10. this.parentNode.nextSibling 对div里的换行敏感