关于时钟模块DS1302的使用心得
最近在做万年历,用到实时时钟DS1302模块,花了两天时间看资料和写驱动,想记录一下我的学习经过,顺便做一下总结。
首先就是在图书馆查各种资料,于是查到的大多是这些,主要时硬件方面的资料:
其实能查到很多资料,但是能为我们所用的不是很多。在使用一个芯片时,我一般时按照一下步骤去学习:
1、芯片介绍;
2、查看引脚定义;
3、外围电路
4、分析时序图;
5、模仿着编写驱动程序,然后自己动手写驱动。
6、实现功能。
下面我就按照这个顺序去学习这款芯片;
一、芯片介绍
DS1302是DALLAS(达拉斯)公司出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收购,因此我们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志;
DS1302实时时钟芯片广泛应用于电话、传真、便携式仪器等产品领域,他的主要性能指标如下:
1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软年自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。
2、拥有31字节数据存储RAM。
3、串行I/O通信方式,相对并行来说比较节省IO口的使用。
4、DS1302的工作电压比较宽,大概是2.0V~5.5V都可以正常工作。采用双电源供电,当主电源比备用电源高0.2V时,由主电源供电,否则采用备用电源,一般是一个纽扣电池。
5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。
6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。
二、引脚定义
三、外围电路
一般与单片机IO口相连时要加上拉电阻,提高 IO 口的驱动能力,这样信号比较稳定,计时也比较准确。
四、分析时序图
这是单字节写入的时序图,可见,先拉高使能端,进行使能选择,然后在时钟上升沿写入一个字节。
DS1302在进行读写操作时最少读写两个字节,第一个是控制字节,就是一个命令,说明是读还是写操作,第二个时需要读写的数据。
对于单字节写,只有在SCLK为低电平时才能将 CE 置高电平,所以刚开始将SCLK 置低,CE置高,然后把需要写入的字节送入 IO口,然后跳变SCLK,在SCLK下降沿时,写入数据
五、编写驱动程序
有了 上面的分析,我们就可以学着编写驱动程序了,可以把驱动程序分为几个模块来写,由底层慢慢往上累加,比如,我们先编写单个字节的读写操作,在编写整个数据的读写,
#include "DS1302.h" //*******************
void ds1302_writebyte(uchar byte){
uint i;
uint t = 0x01;
for(i=;i<;i++){
SCIO = byte & t;
t<<=;
DOWN(); //下降沿完成一个位的操作
}
SCIO = ;//确保释放io引脚
}
//********************
void ds1302_writedata(uchar addr,uchar data_){ CE = ; nop();
SCLK = ; nop();
CE = ; nop(); //使能片选信号
ds1302_writebyte((addr<<)|0x80); //方便后面写入
ds1302_writebyte(data_);
CE = ; nop();//传送数据结束 }
//*************************
uchar ds1302_readbyte(){
uint i;
uchar data_ = ;
uint t = 0x01;
for(i=;i<;i++){ //c51好像不支持直接在for循环里面直接定义变量 if(SCIO){ data_ = data_ | t; //低位在前,逐位读取,刚开始不对,估计是这个的问题
}
t<<=;
DOWN();
}
return data_;
} //************************
uchar ds1302_readdata(uchar addr){ uchar data_ = ; CE = ; nop();
SCLK = ; nop();
CE = ; nop();
ds1302_writebyte((addr<<)|0x81);
data_ = ds1302_readbyte();
CE = ; nop();
SCLK = ; nop();
SCIO = ; nop();
SCIO = ; nop(); return data_;
} //*********************
void init_ds1302(){ uchar i;
CE = ; //初始化引脚
SCLK = ;
i = ds1302_readdata(0x00); //读取秒寄存器,秒在最低位
if((i & 0x80 != )){ ds1302_writedata(,0x00); //撤销写保护,允许写入数据
for(i = ;i<;i++){ ds1302_writedata(i,init_time[i]);
}
}
} //**************
void ds1302_readtime(){ //读取时间
uint i;
for(i = ;i<;i++){ init_time[i] = ds1302_readdata(i);
}
}
其中头文件为:
#ifndef __DS1302_H
#define __DS1302_H #include "reg52.h"
#include "intrins.h" #define uint unsigned int
#define uchar unsigned char
#define nop() _nop_() #define UP() {SCLK = 0;nop();SCLK = 1;nop();} //上升沿 ,使用宏定义函数时最后一定家分号
#define DOWN() {SCLK = 1;nop();SCLK = 0;nop();} //下降沿 //这个模块内没有集成上拉电阻,使用时最好接上2
sbit CE = P2^;//RET,使能输入引脚,当读写时,置高位
sbit SCIO = P2^;//IO ,双向通信引脚,读写数据都是通过这个完成
sbit SCLK = P2^;//SCLK,时钟信号 //为什么有时候好好的,也会出错显示少了分号呢?还气人啊!!!! void ds1302_writebyte(uchar byte);//写一个字节;
void ds1302_writedata(uchar addr,uchar data_);//给某地址写数据,data是c51内部的关键字,表示将变量定义在数据存储区,故此处用data_;
uchar ds1302_readbyte();//读一个字节
uchar ds1302_readdata(uchar addr);//读取某寄存器数据 ;
void init_ds1302();
void ds1302_readtime(); extern uchar init_time[]; #endif
六、功能实现
功能实现就简单了,就是加上主函数嘛,然后加上我们可以亲眼看见并感知的模块,比如用数码管显示时间:
#include "DS1302.h" #define DIG P0
sbit LSA = P2^;
sbit LSB = P2^;
sbit LSC = P2^; uchar init_time[] = {0x50,0x15,0x14,0x22,0x10,0x06,0x17};//初始化的时间 //秒 分 时 日 月 周 年
uchar code DIG_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字表
uint disp[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//把要显示的数字传给他
uchar Num=;
uint count_flag = ; //中断溢出次数 void time0_init();//定时器0初始化
void display();//数码管显示时间 void main(void){ init_ds1302(); //初始化时写入起始时间
time0_init(); while(){
display();
}
} //***************
void display(){ ds1302_readtime(); //读取时间
disp[] = DIG_CODE[init_time[]&0x0f];
disp[] = DIG_CODE[init_time[]>>];
disp[] = 0X40; //显示一个横线
disp[] = DIG_CODE[init_time[]&0x0f];
disp[] = DIG_CODE[init_time[]>>];
disp[] = 0X40;
disp[] = DIG_CODE[init_time[]&0x0f];
disp[] = DIG_CODE[init_time[]>>];
}
//******************
void time0_init(){ TMOD=0X02;//选择为定时器模式,工作方式2,8位自动重装模式,仅用TRX打开启动。
TH0=0X9C; //给定时器赋初值,定时100us,0x9c就是156,就是还需计数100次产生溢出,就是0.1ms
TL0=0X9C;
ET0=;//打开定时器0中断允许
EA=;//打开总中断
TR0=;//打开定时器
} void DigDisplay() interrupt //中断入口函数,扫描以实现动态显示
{
//定时器在工作方式二会自动重装初,所以不用在赋值。
// TH0=0X9c;//给定时器赋初值,定时0.1ms
// TL0=0X00; count_flag++;
if(count_flag==)
{
count_flag = ;
DIG=;
switch(Num) //位选,选择点亮的数码管,
{
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
case():
LSA=;LSB=;LSC=; break;
} DIG=disp[Num]; //段选,选择显示的数字。
Num++;
if(Num>)
Num=;
}
}
总结一下:
这个芯片基本上不是很难,但是想要用的灵活,用的上手,还是得多练的,最好是先把上面的驱动程序对着时序图自己分析一遍,然后自己亲手编写一下。
还有就是看数据手册,一个芯片所能用到的数据,在数据手册上基本都能查到。资料谁都能查到,就看怎么用了。
关于时钟模块DS1302的使用心得的更多相关文章
- 「雕爷学编程」Arduino动手做(29)——DS1302时钟模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- 玩转 RTC时钟库 DS1302
1.前言 最近博主在弄8266编程的时候,偶然发现两个全新时钟模块压仓货: DS1302 DS3231 为了避免资源浪费以及重复编写代码,博主还是抱着尝试的心态去寻找能够同时兼容 DS ...
- LPC2478时钟模块详解
时钟框图如上图,系统时钟来源分别是内部4M的RC振荡器和外置晶振,RTC模块在某些情况下也可以作为主时钟,经过系统时钟选择s\de时钟需要经过PLL倍频(或者不倍频),处理过的PLL输出USB时钟分频 ...
- 基于STM32F1的时钟芯片DS1302驱动
目录 DS1302.h源代码 DS1302.c源代码 DS1302.h源代码 /** ********************************************************* ...
- SynergyS7G2RTC时钟模块的使用
RTC功能描述 RTC时钟模块是Synergy芯片的一个时间外设,主要用于日期时间的存储和控制,有别于一般MCU中的Timer,RTC时钟有两种计时模式,日期模式和二进制计时模式,其中日期模式的时间可 ...
- 基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述 由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用. 本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具 ...
- 轻松吃透实时时钟芯片DS1302软硬件设计,看完秒懂
今天我们来讨论一款老掉牙的实时时钟芯片DS1302.什么是实时时钟(RealTime Clock, RTC)呢?为什么我们需要它呢?假设你使用单片机实现万年历应用,一般的做法是这样的:设置中断后判断1 ...
- React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...
- MSP430 G2553 基本时钟模块+ (Basic Clock Module+)
一.时钟源 MSP430的Basic Clock Module+支持的时钟源有: DCOCLK:内部数字控制振荡器,Internal digitally contrlled oscillator.所有 ...
随机推荐
- 201521123007《Java程序设计》第1周学习总结
1. 本周学习总结 了解了JAVA语言的发展历史及特点,还有JDK.JRE.JVM三者之间的关系,安装并设置JAVA开发平台,使用Notepad++和Eclipse编辑器编写JAVA程序并运行,学会使 ...
- 201521123006 《Java程序设计》第1周学习总结
1. 本章学习总结 (1)java在使用的过程中可以发现其本身有着许多为了节约资源而作的设计,而java根据其应用领域分为了三大平台:Java SE.Java ME与Java EE.在本周的学习中我们 ...
- Java实现基本排序算法
稳定排序算法性能比较 冒泡排序代码: /** * 冒泡排序 * * @param arr * @return */ public int[] bubbleSort(int[] arr) { int t ...
- jz2440重新分区
在购买开发板的时候,板子上已经烧写好了bootloader.内核和文件系统.但是在具体使用时,发现板子上划分的内核分区只有2M,但是我编译出来的内核大于2M,于是将内核烧写到nandflash上面时会 ...
- Angular2响应式表单
本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...
- 《Node.js在CLI下的工程化体系实践》成都OSC源创汇分享总结
背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...
- pdf去水印
问: 我用Adobe acrobat professional 7.0 版想去掉添加的水印,不知道如何删除,请各位大 侠指点! 答:1.(功能表)工具→高级编辑工具→TouchUp对象工具 2.用滑鼠 ...
- stdafx.h 的作用
stdafx.h VC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错. stdafx的英文全称为:Standard Application Framewo ...
- SiganlR 系列之概述
简介 SignalR 是微软的 http 长连接(以下简称长连接)框架,它的出现为我们提供了一套行之有效的实时通信的解决方案. 背景 在http 1.0 时代,preRequest 都会建立新的tcp ...
- hdu1760博弈SG
A New Tetris Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...