PIC单片机之DS1302时钟

畅学单片机 2019-06-28 10:33

大家好,通过前一期的学习,我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232串口、步进电机、温度传感器、I2C 总线、SPI 总线等资源,体会到了学习板的易用性与易学性,这一期我们将介绍市面上常见的时钟芯片DS1302 的应用。

一、DS1302时钟芯片简介

DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/ 日历和31 字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/ 日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 标志位决定采用24 或12 小时时间格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O 线:复位(RST)、I/O 数据线、串行时钟(SCLK)。时钟/RAM 的读/写数据以一字节或多达31 字节的字符组方式通信。

DS1302 工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。

1. DS1302 的内部结构

DS1302 的外部引脚功能说明如图1 所示。

图1 DS1302封装图

DS1302 的内部结构如图2 所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。

图2 DS1302的内部结构图

DS1302 含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。

2. DS1302 的工作原理

DS1302 工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8 位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8 位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8 位地址+8 位数据),在多字节方式下为8 加最多可达248 的数据。

3. DS1302 的寄存器和控制命令

对DS1302 的操作就是对其内部寄存器的操作,DS1302 内部共有12 个寄存器,其中有7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如表1 所示。

表1 日历、时钟寄存器与控制字对照表

最后一位RD/W 为“0”时表示进行写操作,为“1”时表示读操作。

DS1302 内部寄存器列表如表2 所示。

DS1302 内部的RAM 分为两类,一类是单个RAM 单元,共31 个,每个单元为一个8 位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM 的31 个字节,命令控制字为FEH(写)、FFH(读)。

表2 DS14302内部主要寄存器分布表

我们现在已经知道了控制寄存器和RAM 的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302 写入一个命令帧,最高位BIT7 固定为1,BIT6 决定操作是针对RAM 还是时钟寄存器,接着的5 个BIT 是RAM或时钟寄存器在DS1302 的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。

物理上,DS1302 的通讯接口由3 个口线组成,即RST,SCLK,I/O。其中RST 从低电平变成高电平启动一次数据传输过程,SCLK 是时钟线,I/O 是数据线。具体的读写时序参考图3,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302 正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK 保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK 保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。

图3 DS1302的命令字结构

通过前文的原理介绍,我们已经对DS1302 时钟芯片的特性以及工作原理有了大致地了解,但当我们拿到一个时钟器件时要正确地应用它还是一时不知如何下手,比如我们要做一个简单的时间显示,需要怎么办呢?首先,时钟芯片与单片机的连接非常简单,一般来说,我们只需要将IIC 器件的复位“RST”、数据“I/O”、时钟“SCLK”端与单片机的I/O 口相连,就可以进行时间、日期数据的写入或读取了。现在,我们来一起看一个使用DS1302 做时间显示的例子,通过一个实例,相信会给大家带来一个感性的认识。

首先, 我们来看一下增强型PIC 实验板上DS1302 器件的接口电路,因为我们需要将软件和硬件相结合进行考虑如何来编程,完成该实验的硬件原理图如图4 所示,U2 为实验板上DS1302 芯片,“I/O”

与单片机的RB5 口相连,“SCLK”与单片机RB6 相连,“RST”与单片机RB7 相连,七段数码管D5、D7、D8 组成了显示单元,字形码的数据通过RC 口送入,各数码管的显示片选信号分别不同的RA 口进行控制。

图4 硬件原理图

对于单机软件的编程,我们使用MPLab IDE 软件来进行C 语言编程,它是我们的编程环境,同时我们可以通过使用ICD2 仿真烧写器和增强型PIC 实验板连接进行程序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的说明和介绍,在此就不再重复说明,读者朋友可以参阅以前的文章或直接登陆我们的网站查看资料。现在我们可以输入程序代码进行调试了,我们在MPLab IDE 软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。编写的程序代码如下,其中程序流程图如图5 所示,实际运行效果如图6 所示。

图5 软件流程

图6 DS1302 实验演示图

二、软件代码

/*************************************************/

/*DS1302 读写演示程序 */

/* 目标器件:PIC16F877A */

/* 晶振:4.0MHZ */

/* 编译环境:MPLAB V7.51 */

/**************************************************/

#include<pic.h>

#define i_o RB5

#define sclk RB6

#define rst RB7

unsigned char time_rx @ 0x30;

// 定义接收寄存器

static volatile bit time_rx7 @ (unsigned)&time_rx*8+7;

// 接收寄存器的最高位

/***************************************************

子函数定义

**************************************************/

void port_init(); // 申明引脚初始化函数

void ds1302_init(); // 申明DS1302 初始化函数

void set_time(); // 申明设置时间函数

void get_time(); // 申明读取时间函数

void display(); // 申明显示函数

void time_write_1(unsigned char time_tx);

// 申明写一个字节函数

unsigned char time_read_1();

// 申明读一个字节函数

void delay(); // 申明延时函数

/***************************************************

时间和日期存放表

**************************************************/

const char table[]={0x00,0x30,0x12,0x8,0x3,0x06,0x06,0x00};

char table1[7];

/**************************************************

共阴LED 段码表

**************************************************/

const char table2[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

void main()

{

port_init(); // 调用引脚初始化函数

TRISC =0x00;

ds1302_init(); // 调用DS1302 初始化函数

set_time(); // 调用设置时间函数

while(1)

{

get_time(); // 调用取时间函数

display(); // 调用显示函数

}

}

void ds1302_init() // DS1302 初始化函数子程序

{

sclk=0; // 拉低时钟信号

rst =0; // 复位DS1302

rst=1; // 使能DS1302

time_write_1(0x8e); // 发控制命令

time_write_1(0); // 允许写DS1302

rst=0; // 复位

}

void set_time() // 设置时间函数子程序

{

int i; // 定义循环变量

rst=1; // 使能DS1302

time_write_1(0xbe); // 时钟多字节写命令

for(i=0;i<8;i++) // 连续写8 个字节数据

{

time_write_1(table[i]); // 调用写一个字节函数

delay();

}

rst=0; // 复位

}

void get_time() // 读取时间函数子程序

{

int i; // 设置循环变量

rst=1; // 使能DS1302

time_write_1(0xbf); // 发送多字节读取命令

for(i=0;i<7;i++) // 连续读取7 个字节数据

{

table1[i]=time_read_1();

// 调用读取1 个字节数据的函数

delay();

}

rst=0; // 复位DS1302

}

void time_write_1(unsigned char time_tx)

{

int j; // 设置循环变量

for(j=0;j<8;j++) // 连续写8bit

{

i_o=0; // 先设置数据为0

sclk=0; // 时钟信号拉低

if(time_tx&0x01) // 判断待发送的数据位是0 或1

{

i_o=1; // 待发送数据位是1

}

time_tx=time_tx》1; // 待发送的数据右移1 位

sclk=1; // 拉高时钟信号

}

sclk=0; // 写完一个字节,拉低时钟信号

}

unsigned char time_read_1()

{

int j; // 设置循环变量

TRISB5=1; // 设置数据口方向为输入

for(j=0;j<8;j++) // 连续读取8bit

{

sclk=0; // 拉低时钟信号

time_rx=time_rx》1; // 接收寄存器右移1 位

time_rx7=i_o;

// 把接收到的数据放到接收寄存器的最高位sclk=1; // 拉高时钟信号

}

TRISB5=0; // 恢复数据口方向为输出

sclk=0; // 拉低时钟信号

return(time_rx); // 返回读取到的数据

}

void port_init()

{

TRISA=0x00; // 设置A 口全输出

TRISC=0X00; // 设置C 口全输出

TRISB=0x00;

}

void display() // 显示子程序

{

int i; // 定义查表变量

i=table1[0]&0x0f; // 求秒的个位

PORTC=table2[i]; // 送C 口显示

PORTA=0xFD; // 点亮秒的个位

delay(); // 延长一段时间,保证亮度

i=table1[0]&0xf0; // 求秒的十位

i=i》4; // 右移4 位

PORTC=table2[i]; // 送C 口显示

PORTA=0xFE; // 点亮秒的十位

delay(); // 延长一段时间,保证亮度

i=table1[1]&0x0f; // 求分的个位

PORTC=table2[i]&0x7f;

// 送C 口显示,并显示小数点

PORTA=0xF7; // 点亮分的个位

delay(); // 延时一定时间,保证亮度

i=table1[1]&0xf0; // 求分的十位

i=i》4;

PORTC=table2[i]; // 送C 口显示

PORTA=0xFB; // 点亮分的十位

delay(); // 延长一段时间,保证亮度

i=table1[2]&0x0f; // 求时的个位

PORTC=table2[i]&0x7f;

// 送C 口显示,并加上小数点

PORTA=0xDF; // 点亮时的个位

delay(); // 延时一定时间,保证亮度

i=table1[2]&0xf0; // 求时的十位

i=i》4;

PORTC=table2[i]; // 送C 口显示

PORTA=0xEF; // 点亮时的十位

delay(); // 延长一段时间,保证亮度

}

void delay() // 延时程序

{

int i; // 定义整形变量

for(i=100;i--;); // 延时

}

看到这里,相信你现在已经可以完成一些简单的电子钟实验,DS1302 的原理与使用我们讲到这里。

增强型PIC 实验板系统资源丰富,可做实验有:6 位LED 数码管、8 路LED、直控键盘、蜂鸣器喇叭、继电器试验、I2C 总线接口、SPI 总线接口、160X 液晶、128X64 液晶、红外接收头接口、步进电机驱动接口、AD 模/ 数转换接口、串行时钟芯片DS1302、温度传感器DS18B20 接口、RS232 串口通讯、外扩展接口以便外接更多的实验资源。

为了方便大家更好的学习,您还可以关注畅学电子和EDA的公众号,每天推送相关知识,希望能对你的学习有所帮助!


畅学单片机 以单片机为核心,带你全面了解和单片机相关的知识技巧,经验心得。关注我们,一起来学习吧!
评论
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 91浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 91浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 51浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 18浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 53浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 28浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 146浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 90浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 32浏览
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 71浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 110浏览
  • 概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些之前系列器件还未遇到的问题,这些问题将在本文中进行详细描述介绍。 在五代Cyclone器件内部系统时钟受限的情况下,意味着大量逻辑资源将被浪费在于实现较大长度的TDL上面。是否可以找到方法可以对此前TDL的长度进行优化呢?本文还将探讨这个问题。TDC前段BIN颗粒堵塞问题分析 将延时链在逻辑中实现后
    coyoo 2024-12-10 13:28 102浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 74浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 28浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 90浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦