STM32F103ZET6对DS12C887+时间模块的驱动

对于项目的一个小模块部分,如果因为驱动程序的问题而半天不能正常操作,这样的事还是挺令人抓狂的,在此整理出DS12C887+时间模块的驱动程序,属于大家的参考,也属于自己的积累。
DS12C887+的基本功能大家应该都了解,不太了解的可以百度下,这里就根据手册附上一些特别有用的内容哈!

在EDIP封装的引脚图上有6个悬空引脚,在实际的芯片上这些引脚也都是没有的。

首先是头文件:

#ifndef __DS12C887_H
#define __DS12C887_H
#include "sys.h"
/************************************
AD0-AD7——>PF0-PF7
IRQ——>PE0 中断中断请求输出,低电平有效
CS——>PE1
AS——>PE2
RW——>PE3
DS——>PE4SQW  方波输出MOT  总线时序选择,接地,1:Motorola模式,0:Intel模式。
RST  复位脚,接VCC
************************************/
#define DS12C887_CS PEout(1)  //片选
#define DS12C887_AS PEout(2)  //上升沿锁存,下降沿清除
#define DS12C887_RW PEout(3)  //1读,0写
#define DS12C887_DS PEout(4)  //读允许位//PF0~7作为数据线
#define DS12C887_DATAOUT(x) GPIO_Write(GPIOF,x);//数据输出
#define DS12C887_DATAIN GPIO_ReadInputData(GPIOF)&0x00ff;//数据输入//IO方向设置
#define DS12C887_DATE_IN()  {GPIOF->CRL&=0xf00000000;GPIOF->CRL|=0x88888888;GPIOF->ODR|=0xff;} //上拉输入
#define DS12C887_DATE_OUT() {GPIOF->CRL&=0xf00000000;GPIOF->CRL|=0x33333333;} //推挽输出void Write_DS12C887(u8 add,u8 date);//写数据
u8 Read_DS12C887(u8 add);           //读数据
void Read_DS12C887Date(u8 *temp0);  //读时间
void DS12C887_Init(void);           //初始化#endif

除了VCC和GND接到电源外,通常MOT接地选用Motorola操作模式,RST复位脚接VCC。
接下来是源代码:

#include "ds12c887.h"
#include "delay.h"
void Write_DS12C887(u8 add,u8 date)
{DS12C887_CS=0;DS12C887_AS=1;DS12C887_DS=1;DS12C887_RW=1;DS12C887_DATE_OUT();DS12C887_DATAOUT(add);delay_us(100);DS12C887_AS=0;DS12C887_RW=0;DS12C887_DATAOUT(date);delay_us(100);DS12C887_RW=1;DS12C887_AS=1;DS12C887_CS=1;}
u8 Read_DS12C887(u8 add)
{u8 DS12C887_DATE;DS12C887_AS=1;DS12C887_DS=1;DS12C887_RW=1;DS12C887_CS=0;DS12C887_DATE_OUT();DS12C887_DATAOUT(add);delay_us(100);DS12C887_AS=0;DS12C887_DS=0;DS12C887_DATAOUT(0xff);DS12C887_DATE_IN();DS12C887_DATE=DS12C887_DATAIN;DS12C887_DS=1;DS12C887_AS=1;DS12C887_CS=1;return DS12C887_DATE;
}
//写入一个7字节数组,年/月/日/星期/时/分/秒
void Read_DS12C887Date(u8 *temp0)
{*temp0=Read_DS12C887(9); //年*(temp0+1)=Read_DS12C887(8); //月*(temp0+2)=Read_DS12C887(7); //日*(temp0+3)=Read_DS12C887(6); //星期*(temp0+4)=Read_DS12C887(4); //时*(temp0+5)=Read_DS12C887(2); //分*(temp0+6)=Read_DS12C887(0); //秒
}void DS12C887_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF, ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_SetBits(GPIOE,0x78|GPIO_ReadOutputData(GPIOE));//控制脚初始化,置1GPIO_InitStruct.GPIO_Pin=0xff;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOF,&GPIO_InitStruct);GPIO_SetBits(GPIOF,0xff);Write_DS12C887(0x0a,0x20);//打开振荡器Write_DS12C887(0x0b,0x26);//设置24小时模式,数据为二进制,开启闹铃//  Write_DS12C887(0,xxx);  //秒
//  Write_DS12C887(2,xxx);  //分
//  Write_DS12C887(4,xxx);  //小时
//  Write_DS12C887(6,xxx);  //星期
//  Write_DS12C887(7,xxx);  //日
//  Write_DS12C887(8,xxx);  //月
//  Write_DS12C887(9,xxx);  //年
//  Write_DS12C887(1,xxx);  //秒闹钟
//  Write_DS12C887(3,xxx);  //分闹钟
//  Write_DS12C887(5,xxx);  //小时闹钟
}

源代码中的“xxx”为自己设定的值,可根据自己的情况来修改。当数据设置为二进制模式时,寄存器表如下:

如想要设置脉冲输出,可对应下表来选择输出的频率:

如输出8192Hz的方波:
Write_DS12C887(0x0b,0x2e); //设置方波输出,SQWE位置高,
Write_DS12C887(0x0a,0x23); //频率8192Hz,设置频率。
当然,还可以设置两个DS12C887+同时进行方波输出,可以看下它们的输出时钟精度。

0s处:

0.5s处:

1s处:

约错开了四分之一个周期,则1秒约错开了0.03ms。

【2020-10-28】DS12C887+驱动相关推荐

  1. 记一次小米前端面试题(一面)2020.10.28

    性能优化 vue中key的作用 浏览器输入URL到页面的过程 DOM解析过程 css文件为什么在head中引入,而不放在body中 js文件为什么放在body底部,别的非阻塞加载js的方法,async ...

  2. 鸿蒙设备开发C语言,《鸿蒙开发板外设控制》直播图文版(2020.10.28)

    直播主题: 直播实验设备 Hi3861核心板 + 交通灯外设板 + 底板,如下图: 1. Hello World(如果不想迈出第一步时就踩坑,请严格遵守步骤) 解说: 1) 对于初学者来说,SYS_R ...

  3. NOIP模拟day1 2020.10.28

    不得不说,今天考的4道题感觉质量可以,就是T3数据有点水纯搜索86分可还行 Problem a 如果这道题每个棋子都能是第一个出去的话,那么这道题就简单了,ans便是!n 能骗30多分 ,但是显然受各 ...

  4. 2020.10月做题记录

    PS:本博客仅选择了一些作者认为有必要记录的题目进行记录. week -1 2020.09.28-2020.10.4 军训+国庆放假-就这样又废了一周- 2020.10.04 回来第一天完全没有状态- ...

  5. (十一:2020.08.28)CVPR 2017 追踪之论文纲要(译)

    CVPR 2017 追踪之论文纲要(修正于2020.08.28) 讲在前面 论文目录 讲在前面 论坛很多博客都对论文做了总结和分类,但就医学领域而言,对这些论文的筛选信息显然需要更加精细的把控,所以自 ...

  6. (十四:2020.08.28)CVPR 2014 追踪之论文纲要(译)

    CVPR 2020 追踪之论文纲要(修正于2020.08.28) 讲在前面 论文目录 讲在前面 论坛很多博客都对论文做了总结和分类,但就医学领域而言,对这些论文的筛选信息显然需要更加精细的把控,所以自 ...

  7. 2020.10.19-10.26 人工智能行业每周技术精华文章汇总

    前段时间,和一个朋友聊天. 聊最近在做的一些事情,比较有意思的是: 他说,很多事情,刚开始想法挺多,但平时时间太少,下班就想休息休息,不想动了. 这可能也是很多人面临的问题,很多事想尝试,但是觉得很麻 ...

  8. tiny4412 uboot 2020.10版本移植(四)——uboot修改支持sd卡、eMMC引导内核及其他一些杂项设置

    本文在<tiny4412 uboot 2020.10版本移植(三)--uboot初步启动> 的基础上继续向tiny4412 uboot 2020.10版添加功能. 主要有三块内容:1. D ...

  9. 微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...

  10. 宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...

最新文章

  1. 团队项目—每日记录2
  2. Android Gradle 批量修改生成的apk文件名
  3. Flash与.NET的通信(三):LoadVars对象的应用
  4. .so文件反编译_java加密防止反编译-VirboxProtector
  5. 《恋上数据结构第1季》红黑树(未完)
  6. 绝对干货:供个人开发者赚钱免费使用的一些好的API接口
  7. redis4数据类型.更新HyperLogLog类型
  8. Hadoop1.0.4伪分布式安装
  9. 2021最新调查报告来了!揭露中国程序员工作和生活真实现状
  10. !!!python 100行代码编写【Google 图片搜索爬取工具】多线程
  11. A Game of Thrones(97)
  12. MATLAB理论力学应用
  13. kali2019安装netspeed教程
  14. java对台湾同胞身份证号码验证
  15. 维度表和事实表的含义
  16. html手机输入框键盘弹起顶起背景图
  17. 同声传译系统matlab,知到网课答案英语基础口译课后作业答案
  18. python_speech_features文档翻译
  19. STM32之usart
  20. 官方yolov5s.pt ,yolo5x.pt下载地址

热门文章

  1. 卡在DSMOS has arrived的解决办法
  2. vue前端框架有哪些
  3. 考公 | 粉笔网课笔记——数量 刘凯
  4. eclipse中一些常见的报错处理
  5. 一个屌丝程序员的青春(二六五)
  6. Android存储子系统
  7. sybase 珍藏系列之一
  8. 潘金莲改变了历史吗 - PostgreSQL舆情事件分析应用
  9. Python wmi Cookbook 中文翻译
  10. 笑一笑-道高一尺魔高一丈