PIC单片机驱动时钟芯片DS1302(附代码)

在工业控制、家电等产品中经常会用到实时时钟,DS1302是比较常用的一款时钟芯片。今天,就以PIC16F877为例,阐述一下DS1302的驱动方法。

一、 DS1302 简介

DS1302工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,支持双电源供电,具有低至300nA的待机功耗。正常工作时由系统电源供电,掉电后自动切换到备份电池,确保时钟持续运行。这个特性在工业现场极为重要,能有效避免更换电池时时间重置的尴尬。

二、硬件连接: PIC 单片机与 DS1302

PIC单片机与DS1302的典型电路:

设计中的三个关键细节:

  1. 晶振选择 :须使用6pF 负载电容的 32.768kHz 晶振 ,普通12.5pF的晶振会导致走时不准。
  2. 备用电池 :VCC1端串联1N5819 二极管 (图中未画出)可以防止系统电源对电池充电。对于CR2032这类不可充电电池,这是必须的保护措施。
  3. 上拉电阻 :三线接口建议在靠近MCU侧加5.1kΩ 上拉电阻 ,提高抗干扰能力,特别是当连接线较长时。

三、软件实现:

以下代码基于PIC16F877,可以通过串口来设置DS1302的初值

例程如下:

#include <pic16f87x.h>

#define i_o RC3 //定义DS1302的数据口

#define sclk RC4 //定义DS1302的时钟口

#define rst RC2 //定义DS1302的复位口

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

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

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

void time_write (unsigned char time_tx); //申明写一个字节函数

unsigned char time_read (); //申明读一个字节函数

//定义待设置的时间: 秒、 分、 时、 日、月、星期、年、控制字

unsigned char table8;

//定义读取时间和日期存放表格

unsigned char table17;

void ds1302_init()

{

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

rst =0; //复位DS1302

rst=1; //使能DS1302

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

time_write_2(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(tablei); //调用写一个字节函数

}

rst=0; //复位

}

//---------------------------------------------

//读取时间函数

void get_time()

{

int i; //设置循环变量

rst=1; //使能DS1302

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

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

{

table1i=time_read_1(); //调用读取1个字节数据的函数

}

rst=0; //复位DS1302

}

//写一个字节数据函数

void time_write(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()

{

int j; //设置循环变量

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

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

{

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

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

time_rx7=i_o; //把接收到的数据放到接收寄存器的最高位

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

}

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

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

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

}

四、 BCD 码转换

DS1302内部所有时间数据均以BCD 格式存储。

例如:

  • 十进制 23 → BCD码 = 0x23 (二进制 0010 0011)
  • 十进制 59 → BCD码 = 0x59 (二进制 0101 1001)

如果不做转换,直接用二进制读写,会出现时间错乱的情况。

下面是转换函数

复制代码
// 二进制转BCD码(0-99)
复制代码
unsigned char bin2bcd(unsigned char bin)
复制代码
{
复制代码
    return ((bin / 10) << 4) | (bin % 10);
复制代码
}
复制代码
复制代码
// BCD码转二进制
复制代码
unsigned char bcd2bin(unsigned char bcd)
复制代码
{
复制代码
    return (bcd >> 4) * 10 + (bcd & 0x0F);
复制代码
}

附:《 PIC 单片机入门实战》共 8 篇文章与《 PIC 单片机进阶实战》共 6 篇文章内容来源于我自己画的电路原理图及程序,有对 PIC 单片机感兴趣想学习的朋友可以关注我,免费赠送资料(包括原理图、数据手册、各种例程等)。

有需要这两款控制板的朋友也可以关注联系我。

后续干货不断,咱们一起在单片机的世界里,共同进步。

相关推荐
小岐AI观9 小时前
智赋岐黄适合养生馆吗?
大数据·人工智能·物联网
wuyk55510 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
恒锐丰-罗生11 小时前
国产 H 桥驱动 SS6289|18V/4A 有刷电机驱动芯片性与应用分析 内置采样 + 多保护,门锁 / 机器人优选器件
驱动开发·嵌入式硬件·硬件工程
数字新视界13 小时前
动环监控信创适配助力机房管理智能化转型
物联网·数据中心·动环监控·微模块机房·模块化机房
zcmodeltech15 小时前
工程机械与矿山机械沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的露天开采-井下掘进-智慧矿山全场景联动方案
数据库·stm32·单片机·嵌入式硬件·制造·多分类
云泽80816 小时前
深入浅出 STM32(十五):多通道GPIO驱动的软件抽象与实现
stm32·单片机·嵌入式硬件
嵌入式阿蔡16 小时前
OTA 实战五(收官):量产落地 Checklist —— 版本号 / 防回滚 / 灰度 / 断点续传
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
乐橙开放平台17 小时前
物业 SaaS 笔记:子账号 Policy 按通道隔离,At_ 管控面 / St_ 数据面治理 accessToken
后端·物联网·音视频
碧海银沙音频科技研究院17 小时前
基于杰理AC7016C的GTCRN门控卷积神经网络语音增强方法
人工智能·嵌入式硬件·语音识别
DoLovya18 小时前
从零实现 ESP8266 + MQTT 智能门禁:公网一键开门、舵机控制、在线监控完整方案
python·物联网·mqtt·嵌入式·esp8266·门禁系统