十二、51单片机之DS1302
创始人
2025-05-29 06:39:41

1、DS1302简介

(1)详情查看数据手册。

(2)管角描述

管教名称功能
1Vcc2双供电配置中的主电源供电引脚
2X1与标准的32.768kHz晶振相连。用于ds1302记时。
3X2
4GND电源地
5CE输入信号,CE信号在读写时必须保持高电平
6I/O输入/推挽输出I/O,是三线接口的双向数据管脚
7SCLKds1302与单片机通信的时钟信号
8Vcc1电源引脚

(3)ds1302采用SPI数字接口。

(4)ds1302内部存储着一个时间点信息(年月日时分秒周几),可读可写,上电时间自动走。

2、RTC相关知识

(1)RTC指real time clock,实时时钟的意思。

(2)时间点和时间段,时间点是xx年xx月xx日xx时xx分xx秒,时间段是一定长度的时间。

(3)RTC用于提供时间点,定时器用于提供时间段。

(4)RTC存在形式:单片机内部集成或单片机外部扩展。

3、SPI接口

(1)分为三线或者四线。

(2)三线:CE、SCLK、I/O。

(3)四线:CE、SCLK、输入、输出。

4、DS1302的时间格式

4.1、8421BCD码

(1)ds1302读出的时间是按照8421BCD码表示的。

(2)8421BCD码是一种数字编码,很像10进制和16进制的结合。

(3)8421BCD码看起来很像10进制(29往下是30而不是2A)。

(3)BCD码本质上又是16进制(BCD码的21在计算机中就是0x21)。

(4)BCD码用4位二进制数来表示十进制数中的0~9这10个数码。

4.2、BCD码的意义

(1)计算机喜欢16进制,而人喜欢10进制,BCD码综合了两者的考量。

4.3、ds1302年份

(1)ds1302直接读出的年(BCD编码)+2000就是当前的年份。

(2)譬如读出的BCD码16,对应0x16所以就是2016年。

4.4、十进制转换为8421BCD码

(1)十进制84转为8421BCD码为0x84。

(2)计算方式(84/10)*16+84%10

5、代码出现的问题及解决

问题: 串口打印时间时会出现一些FF。

解决方法:

(1)硬件上在IO线上设置10K的电阻做弱上拉处理。

(2)如果没有做弱上拉,也有办法解决。在代码的读取寄存器时序之后,加一个将IO置为低电平的代码进去,就可以了。(见如下代码ds1302.c中Ds1302ReadByte函数)。

6、代码

(1)ds1302代码

ds1302.c文件

#include "ds1302.h"
#include 
#include sbit DS_IO	 = P3^4;
sbit DS_CE   = P3^5;
sbit DS_SCLK = P3^6;
/*DS1302写入和读取时分秒的地址命令*/
uchar code  Read_RTC_Addr[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8B, 0x8D};
uchar code Write_RTC_Addr[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C};
/*存储顺序是秒分时日月周年,存储格式是用BCD码*/
uchar TIME[7] = {0, 50, 0x21, 0x16, 0x03, 0x04, 0x23};/**功能:向ds1302写命令(地址+数据)*参数:addr :地址value:数据*返回值:无*/
void DS1302_WriteByte(unsigned char addr, unsigned char value)
{unsigned char i = 0;DS_CE = 0;_nop_();DS_SCLK = 0;_nop_();DS_CE = 1;_nop_();for(i = 0; i < 8; i++){DS_IO = (addr >> i) & 0x01;		/*SPI由低位开始传输*/DS_SCLK=1;_nop_();DS_SCLK=0;_nop_();}for(i = 0; i < 8; i++){DS_IO = (value >> i) & 0x01;DS_SCLK = 1;_nop_();DS_SCLK = 0;_nop_();}DS_CE = 0;_nop_();
}/**功能  : 读取一个地址的数据*参数  : addr*返回值: Data*/
unsigned char Ds1302ReadByte(unsigned char addr)
{unsigned char i    = 0;unsigned char Data = 0;DS_CE = 0;_nop_();DS_SCLK = 0;_nop_();DS_CE = 1;_nop_();for(i = 0; i < 8; i++){DS_IO = (addr >> i) & 0x01;    /*数据从低位开始传送*/DS_SCLK = 1;                   /*数据在上升沿时,DS1302读取数据*/_nop_();                       /*延时*/DS_SCLK = 0;                   /*DS1302下降沿时,放置数据*/_nop_();}for(i = 0; i < 8; i ++)          /*读取8位数据*/{if(DS_IO == 1){Data |= (0x01 << i);         /*从最低位开始接收*/}DS_SCLK = 1;_nop_();DS_SCLK = 0;                   /*DS1302下降沿时,放置数据*/_nop_();}DS_CE = 0;_nop_();	DS_IO = 0;   /*为了解决FF出现的问题*/return Data;	
}/**功能:读取时钟信息*参数:无*返回值:无*/
void Ds1302ReadTime()
{unsigned char i = 0;for(i = 0; i < 7; i++)	/*读取7个字节的时钟信号:分秒时日月周年*/{TIME[i] = Ds1302ReadByte(Read_RTC_Addr[i]);}
}	/**功能:设置初始时间*参数:无*返回值:无*/
void DS1392SetTime(void)
{unsigned char i = 0;DS1302_WriteByte(0x8E,0x00);  /*关闭写保护*/for(i = 0; i < 7; i++){DS1302_WriteByte(Write_RTC_Addr[i],TIME[i]);  /*TIME为8421BCD码]*/}DS1302_WriteByte(0x8E,0x80);  /*打开写保护*/
}

ds1302.h文件

#ifndef _DS1302_H_
#define _DS1302_H_#define uchar unsigned charextern uchar TIME[7];void DS1302_WriteByte(unsigned char addr, unsigned char value);  /*向ds1302写命令(地址+数据)*/  
unsigned char Ds1302ReadByte(unsigned char addr);                /*读取一个地址的数据*/
void Ds1302ReadTime();                                           /*读取时钟信息*/
void DS1392SetTime(void);                                        /*设置初始时间*/#endif

(2)串口代码

drv_uart.c文件

#include "drv_uart.h"
#include 
#include /**功能:串口初始化函数,8数据位,1停止位,无校验位,波特率4800*参数:无*返回值:无*/
void UartInit(void)
{SCON = 0x50;  //串口工作在模式1,8位数据位,允许串行接收PCON = 0x80;  //波特率加倍TMOD = 0x20;  //设置T1为模式2 TH1 = 243;    //波特率4800	,TH1 = 晶振频率/12/32/波特率TL1 = 243;    //8位自动重装,意识是TH1用完了之后下一个周期TL1会自动重装到TH1去。TR1 = 1;      //开启定时器1ES = 1;       //打开串口中断EA = 1;       //打开总中断
}/**功能:通过串口发送一个字节数据*参数:需要发送的内容*返回值:无*/
void UartSendByte(unsigned char Dat)
{SBUF = Dat;      //准备好需要发送的一个字节while(TI == 0);  //确认串口发送没有再忙,while循环需要加超时判断TI = 0;					 //软件复位TI标志位
}void Delay500ms()		//@12.000MHz
{unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);
}

drv_uart.h文件

#ifndef __DRV_UART_H__
#define __DRV_UART_H__/*函数声明*/
void UartInit(void);                  /*串口初始化函数,8数据位,1停止位,无校验位,波特率4800*/
void UartSendByte(unsigned char Dat); /*通过串口发送一个字节数据*/
void Delay500ms();	#endif

(3)main.c代码

#include 
#include "ds1302.h"
#include "drv_uart.h"/*函数声明*/
void Uart_PrintTime(void);void main()
{UartInit();      // 串口初始化DS1392SetTime(); // 设置初始时间while(1){Ds1302ReadTime();     /*读取时钟信息*/Uart_PrintTime();     /*通过串口打印时间*///UartSendByte('D');Delay500ms();}
}/**功能:通过串口打印时间*参数:无*返回值:无*/
void Uart_PrintTime(void)
{unsigned char i = 0;	/*用于for循环*/for(i = 0; i < 7; i++){UartSendByte(TIME[i]);}
}

七、实验现象

通过串口打印时间,如下图:

 

 

相关内容

热门资讯

第一部分——简单句——第一章—... 谓语动词的物种变化 (二)情态   情态不变动词 can be/must...
网商银行40亿永续债获批!银行... 本文来源:时代周报 作者:黄宇昆时隔5年,浙江网商银行再次获批发债“补血”。近日,浙江金融监管局发布...
甜粽子和咸粽子都没人吃了? 在端午节的传统美食中,甜粽子和咸粽子曾是人们餐桌上的常客。然而,如今却出现了一种令人惊讶的现象,那就...
超4100只个股下跌 超410... 2025.05.30本文字数:424,阅读时长大约1分钟作者 |一财资讯截至午间收盘,沪指跌0.31...
「午盘」A股早盘弱势震荡收跌,... A股三大股指5月30日集体低开。早盘两市探底回升,三大股指跌势明显,个股呈现普跌态势。从盘面上看,可...
English Learnin... English Learning - L2 语音作业打卡 复习对比 [ɔ:] [ɒ] Day22 2...
Java设计模式 02-工厂模... 工厂模式 一、简单(静态)工厂模式 1、看一个具体的需求 看一个披萨的项目:要便于披萨...
嘉应制药信披违规突遭立案,养天... 5月28日晚,广东嘉应制药股份有限公司(以下简称“嘉应制药”)发布公告,公司收到中国证券监督管理委员...
河北保定蠡县县委书记陈伟已跨市... 澎湃新闻记者从相关方面独家获悉,原任河北保定蠡县县委书记的陈伟近日已跨市调任廊坊三河市委书记。 陈...
4月,全国发行新增债券2534... 2025年4月地方政府债券发行和债务余额情况 一、全国地方政府债券发行情况 (一)当月发行情况。 2...
JFX-A型精子质量分析仪空气... JFX-A型精子质量分析仪空气减震器:为精准医疗保驾护航行 在现代医疗技术中,精子质量分析仪是评估男...
“王健林卖万达广场”话题连续4... "先定个小目标"的王健林,如今却像清仓特卖般疯狂甩卖手里近1/5的万达广场,背后暗藏什么玄机? 短...
AI概念股早盘走弱,人工智能相... AI概念股早盘走弱,中科星图跌超8%,芯原股份、寒武纪-U、光环新网跌超3%。 受盘面影响,人工智能...
原创 稀... 近期,据美国《纽约时报》援引匿名知情人士的话报道称,美国商务部已暂停部分允许美国公司向中国商用飞机有...
一线城市豪宅市场火爆:500亿... “日光盘”接连上演,上海楼市持续高温。 5月27日,上海共有7个楼盘集中入市,其中3个项目实现“日光...
信泰人寿合规之殇:国资入局能否... 信泰人寿从民企转为国企,过程布满荆棘。自2007年成立以来,经历了股东内斗、偿付能力危机、高管贪腐、...
傲农生物“脱险”后,何时恢复盈... 得益于2024年财报的向好表现,福建傲农生物科技集团股份有限公司(简称“傲农生物”)近日被撤销退市风...
Java:分布式RPC框架Ap... 目录一、软件架构的演进过程【了解】二、Dubbo概述【了解】1、Dubbo简介2、Dubb架构三、服...
长肥网络与TCP的长肥管道 本文目录1、简化的理解网络模型2、时延带宽积的定义3、长肥网络与TCP长肥管道的定义4、TCP长肥管...
从NLP视角看电视剧《狂飙》,... 文章目录1、背景2、数据获取3、文本分析与可视化3.1 短评数据预处理3.2 词云图可视化3.3 t...
下一个万亿级蓝海市场,数字能源... 随着全球碳中和共识的形成、能源转型的推进,数字能源作为新一代能源技术的重要组成部分,成为各国政府和企...
【CSS】P9 选择器优先级 选择器优先级抛出一个问题选择器优先级权重!important外部样式与内部样式冲突 抛出一个问题 ...
孙悟空为何成了完美男友? 孙悟空成为完美男友,实乃其独特特质所致。他神通广大,能在女友遇到危险时瞬间现身,如那盖世英雄,给予最...
深市同标的规模最大的证券ETF... 5月30日,A股早盘震荡走低,券商板块回调。相关ETF中,证券ETF(159841)截至发稿跌0.7...
中建投信托地产风险化解仍需时日... 中建投信托仍然被“地产旧伤"拖累。文/每日财报 汇水在信托行业深度转型的2024年,年报数据清晰反...
RTP载荷H265(实战细节) H264与H265协议详解RTP载荷H264(实战细节) RTP载荷H2...
【2023.3.8】数据结构复... 【2023.3.8】数据结构复习笔记 文章目录【2023.3.8】数据结构复习笔记序言一、绪论二、线...
赛力斯应邀出席东盟重要经济论坛... 近年来,伴随着中国汽车产业的全面国际化,中国车企的全球影响力日益提升,就在最近赛力斯被应邀出席东盟-...
聚集更有国际化潜力研发管线 君... 5月29日,上海君实生物医药科技股份有限公司(简称“君实生物”)发布关于部分募投项目子项目变更及金额...
面经-2023-哲库Zeku-... 专栏推荐:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 专栏首页:2023 数字IC...