基于stm32f103zet6的DS1302学习

发布者:shmilyde最新更新时间:2017-09-07 来源: eefocus关键字:stm32f103zet6  DS1302 手机看文章 扫描二维码
随时随地手机看文章

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

1、所谓的DS1302


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

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

1、主函数main


  1. #include "stm32f10x.h"      

  2. #include "SysTick.h"  

  3. #include "Delay.h"  

  4. #include "Usart.h"  

  5. #include "stdio.h"  

  6. #include "DS1302.h"  

  7. /*******由于没有做外设测试的程序是:按键PA0仅一个LED灯                                  ******/  

  8. /*******由于没有做外设测试的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/  

  9. /*******由于没有做外设测试的程序是:ds1302clk <-> PA4  

  10.                                                                         ds1302dat <-> PA5  

  11.                                                                         ds1302rst <-> PA6                                      *****/  

  12.                                                                           

  13. extern uint8_t write[];  

  14. extern uint8_t read[];  

  15.   

  16. int main(void)  

  17. {  

  18.     //uint8_t time[] = {0,0,12,11,11,1,13};  

  19.     //初始化系统定时器  

  20.     SysTick_Init();  

  21.     USART1_Config();  

  22.     ds1302_GPIO_Configuration();                                                    //一定别忘记了配置GPIO  

  23.     printf("\r\n ("__DATE__ " - " __TIME__ ") \r\n");  

  24.     //ds1302_init(write,time);                                                      //设置1302的初始时间  

  25.     ds1302_data(read);  

  26.     while(1);                                                                                           //这个得加,不然的话会有尾巴是乱码!!!  

  27. }  



  1. /*******************************************************************************  

  2. ** 文件名称 : ds1302.c  

  3. ** 编译环境 : RealView MDK-ARM 4.53  

  4. ** 文件作者 :     

  5. ** 功能说明 : ds1302相关函数定义  

  6. ** 软件协议 :模拟SPI协议  

  7. ** 简介           :clk上升沿发送数据,clk下降沿接收数据  

  8.                         :typedef unsigned          char uint8_t;  

  9. **                        

  10. **                               

  11. **  

  12. *******************************************************************************/  

  13. /* 包含头文件 *****************************************************************/  

  14. #include "ds1302.h"  

  15. #include "stdio.h"  

  16. #include "Delay.h"  

  17.   

  18. uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址  

  19. uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址  

  20. /*PA4、PA6为输出*/  

  21. /*PA5配置为开漏模式,此模式下能够实现真正的双向IO口*/  

  22. void ds1302_GPIO_Configuration(void)  

  23. {  

  24.     GPIO_InitTypeDef GPIO_InitStruct;  

  25.   

  26.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  

  27.     GPIO_InitStruct.GPIO_Pin = ds1302clk|ds1302rst;         //clk、rst配置为输出  

  28.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  

  29.     GPIO_Init(GPIOA, &GPIO_InitStruct);  

  30.   

  31.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;               //IO配置为双向  

  32.     GPIO_InitStruct.GPIO_Pin = ds1302dat;  

  33.     GPIO_Init(GPIOA, &GPIO_InitStruct);  

  34.   

  35. }  

  36.   

  37. void write_1302byte(uint8_t dat)                                            //写一个字节的数据sck上升沿写数据  

  38. {  

  39.     uint8_t i = 0;  

  40.     GPIO_ResetBits(GPIOA,ds1302clk);                                        //ds1302clk=0  

  41.       

  42.   Delay_us(2);//延时大约2us  

  43.       

  44.     for(i = 0;i < 8;i ++)  

  45.         {  

  46.             GPIO_ResetBits(GPIOA,ds1302clk);                            //ds1302clk=0;  

  47.             if(dat&0x01)  

  48.                 GPIO_SetBits(GPIOA,ds1302dat);  

  49.             else                                                                                        //ds1302dat=(dat&0x01)  

  50.                 GPIO_ResetBits(GPIOA,ds1302dat);                  

  51.             Delay_us(2);  

  52.             GPIO_SetBits(GPIOA,ds1302clk);                                  //发送一位数据,clk上升沿,//ds1302clk=1  

  53.             dat >>= 1;  

  54.             Delay_us(1);  

  55.         }     

  56.     }  

  57.       

  58. uint8_t read_1302(uint8_t add)                                              //读数据  

  59. {  

  60.     uint8_t i=0;  

  61.     uint8_t Return_dat=0x00;  

  62.     GPIO_ResetBits(GPIOA,ds1302rst);                                    //ds1302rst=0;  

  63.     GPIO_ResetBits(GPIOA,ds1302clk);                                        //ds1302clk=0;  

  64.     Delay_us(3);                                                                                //略微延时2us  

  65.     GPIO_SetBits(GPIOA,ds1302rst);                                      //ds1302rst=1;  

  66.     Delay_us(3);                                                                                //时间要大约3us  

  67.     write_1302byte(add);                                                                //先写寄存器的地址  

  68.     for(i=0;i<8;i++)  

  69.     {  

  70.         GPIO_SetBits(GPIOA,ds1302clk);                                      //ds1302clk=1;  

  71.         Return_dat >>= 1;  

  72.         GPIO_ResetBits(GPIOA,ds1302clk);                                    //ds1302clk=0;//拉低时钟线,以便于数据的读入  

  73.         if(GPIO_ReadInputDataBit(GPIOA,ds1302dat)==1)           //数据线此时为高电平  

  74.         {Return_dat = Return_dat|0x80;}  

  75.     }  

  76.       Delay_us(1);  

  77.       GPIO_ResetBits(GPIOA,ds1302rst);                                //ds1302rst=0;释放总线  

  78.       return Return_dat;  

  79.     }  

  80. void write_1302(uint8_t add,uint8_t dat)                            //向指定寄存器写入一个字节的数据  

  81. {  

  82.     GPIO_ResetBits(GPIOA,ds1302rst);                                        //只有在rst为高电平的时候才能进行数据传输  

  83.     GPIO_ResetBits(GPIOA,ds1302clk);                                        //只有clk为低电平的时候,rst才能被置为高电平  

  84.     //ds1302rst=0;  

  85.     //ds1302clk=0;  

  86.     Delay_us(1);                                                                                //略微延时  

  87.     GPIO_SetBits(GPIOA,ds1302rst);                                          //clk = 0之后,这里将rst拉高,准备传送数据  

  88.     //ds1302rst=1;  

  89.     Delay_us(2);                                                                                //时间大约2us  

  90.     write_1302byte(add);                                                                //先发地址  

  91.     write_1302byte(dat);                                                                //然后发数据  

  92.     GPIO_ResetBits(GPIOA,ds1302rst);                                        //这里释放总线  

  93.     GPIO_ResetBits(GPIOA,ds1302clk);                                        //拉低clk,以备下一次数据发送  

  94.     //ds1302clk=0;  

  95.     //ds1302rst=0;  

  96.     Delay_us(1);  

  97.   

  98. }  

  99. void ds1302_init(uint8_t *write,uint8_t *time)              //初始化1302  

  100. {  

  101.     uint8_t i=0,j=0;  

  102.     write_1302(0x8e,0x00);                                                          //关闭写保护  

  103.     for(i=0;i<7;i++)                                                                     //十进制转BCD码  

  104.     {  

  105.         j=time[i]%10;                                                                           //个位数部分  

  106.         time[i]=(time[i]/10)*16+j;    

  107.     }  

  108.     for(i=0;i<7;i++)                                                                     //进行对时  

  109.     {  

  110.         write_1302(write[i],time[i]);                                           //在对应寄存器上写入对应的十六进制数据  

  111.           

  112.     }  

  113.     write_1302(0x8e,0x80);                                                      //打开写保护  

  114. }  

  115. void ds1302_data(uint8_t *read)                                             //处理数据并通过串口打印  

  116. {  

  117.     uint8_t i=0,g[7],time[7];  

  118. //  static uint8_t s = 1;  

  119.     for(i=0;i<7;i++)  

  120.     {  

  121.         time[i]=read_1302(read[i]);                                             //读数据已经完成  

  122.     }  

  123.     for(i=0;i<7;i++)  

  124.     {  

  125.         g[i]=time[i]%16;                                                                    //秒个位数据:BCD转十进制  

  126.         time[i]=time[i]/16;                                                             //秒十位数据  

  127.     }  

  128.     //此时已转换成10进制数,g[i]里面存放的是秒分时日月周年的各个位数据  

  129.     //而此时的time[i]存放的是十位数据  

  130.                       

  131.         //if(s != (time[0]+g[0]))  

  132.     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]);  

  133.       //s = time[0]+g[0];     

  134. }  

就是这样的简单,然后给出一张效果图



关键字:stm32f103zet6  DS1302 引用地址:基于stm32f103zet6的DS1302学习

上一篇:基于stm32f103zet6的IIC学习
下一篇:基于stm32f103zet6的RTC学习

推荐阅读最新更新时间:2024-03-16 15:36

基于DS1302+AT89C2051制作的红外遥控LED电子钟
自制LED电子钟在很多电子报刊杂志上都可以见到,但大多数在断电后都要重新设置时间等 参数,给使用带来很多不便。也有用后备电池作为备用电源的,但往往体积较大。本文介绍 的LED电子钟克服了以往的弊端,而且采用了家电通用的红外遥控器进行控制,方便使用。 有一路闹铃输出,可以通过遥控器设置闹铃时间及允许与否。 电子钟的正面 电子钟的背面 一.工作原理 DS1302为达拉斯公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电 源提供可编程的充电功能,并且可以关闭充电功能。采用普通32768Hz晶振。 AT89C2051作为主控芯片,一是对接收到的红外遥控编码进行判断识别,并执行相应的处 理;第二就是定期的读取时
[单片机]
stm32+DS1302+TM1638驱动程序
1、TM1638与STM32连接 1.1 硬件连接 Vcc--电源+ GND--电源地 STB--PA0 CLK--PA1 DIO--PA2 1.2 驱动程序 TM1638.c文件: /********************************************************************************************** **Program Assignment: Driver for TM1638 digital tube **Author : **Date : **Description : This is
[单片机]
时钟芯片DS1302及其在数据记录中的应用
    摘 要: 介绍了美国DALLAS公司推出的低功耗时钟芯片DS1302的结构和工作原理及其在测量系统中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析以及对异常数据出现的原因的查找有重要意义。     关键词: 数据记录 时钟芯片DS1302 硬件电路 软件设计     在测量控制系统中,特别是长时间无人职守的测控系统中,经常需要记录某些具有特殊意义的数据及其出现的时间。记录及分析这些特殊意义的数据,对测控系统的性能分析及正常
[半导体设计/制造]
基于AT89S52的家庭智能浇花器的设计
随着人们生活水平的提高,花卉逐渐收到人们的青睐,陶冶情操,净化空气。利用单片机设计了一款家庭智能浇花器实现自动浇花,节省人力,方便人们出差的时候,不至于影响花卉的生长,如果在家也可以关断浇花器,手动浇花。浇花器设置为两种方式,一种是定时定量浇花,一种是根据湿度浇花。采用哪种方式是通过按键控制或者红外遥控的,在采用定时定量浇花时,数码管显示时间和流水时间,在选用根据湿度浇花时,数码管显示是目前的湿度。 1 总体设计 利用AT89S52单片机设计了自动浇花器,针对不同的花卉,此智能浇花器设置为两种方式:一是定时定量浇花,二是利用湿度传感器检测花卉(也可以用于蔬菜等)的湿度,采集的湿度传送到单片机芯片,单片机根据湿度控制是否浇水,
[单片机]
基于AT89S52的家庭智能浇花器的设计
STM32F103ZET6 启动模式
STM32三种启动模式: STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动
[单片机]
DS3231模块配合stc89c52程序与原理图
这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用 卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了 1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉 可以放心食用 实物图 单片机源程序如下: #include reg52.h #include intrins.h typedef unsig
[单片机]
DS3231模块配合stc89c52程序与原理图
基于stm32f103zet6的定时器的学习3(定时器产生4路PWM)
定时器TIM3产生四路PWM波输出。 首先介绍一下PWM吧,算是给自己充电,脉冲宽度调制(PWM),是英文“Pulse Width Modulation ”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。 一、这个程序的主函数相当简单: span style= font-size:10px; /*******由于没有做外设测试的程序是:按键PA0仅一个LED灯******/ /*******由于没有做外设测试的程序是:串口采用的是PA9- (T - T),PA9- (R - R)*****/ #include stm32f10x.h
[单片机]
基于<font color='red'>stm32f103zet6</font>的定时器的学习3(定时器产生4路PWM)
基于51单片机电子万年历设计 lcd12864+24c02+ds1302
作品名称:基于51单片机电子万年历设计 作评功能:1:实现ds1302的读写 2:lcd12864的显示 3:24c02的读写 4:更改日期,时间 5:整点报时,闹钟的功能 6:阴阳历的转换 硬件部分:普中开发板(程序内明确标明接线方式) 软件部分:原创 1:代码规范:易于更改 2:封装良好,可以直接移植。 单片机源程序如下: #include reg51.h //此文件中定义了单片机的一些特殊功能寄存器 #include lcd12864.h #include ds1302.h #include 24c
[单片机]
基于51单片机电子万年历设计 lcd12864+24c02+<font color='red'>ds1302</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved