【51单片机快速入门指南】5.1:SPI与DS1302时钟芯片

目录

  • 硬知识
    • DS1302 简介
    • DS1302 使用
      • 控制寄存器
      • 日历/时钟寄存器
      • DS1302 的读写时序
    • 电路设计
  • 示例程序
    • DS1302.c
    • DS1302.h
    • 测试程序
      • main.c
      • 实验现象

普中51-单核-A2
STC89C52
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

       摘自《普中 51 单片机开发攻略》、《DS1302中文手册》。

DS1302 简介

       DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和 31 字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用 24 或 12 小时格式。DS1302 与 单片机之间能简单地采用同步串行的方式进行通信,仅需用到三根通信线:
       ①RES 复位
       ②I/O 数据线
       ③SCLK 串行时钟。
       时钟/RAM 的读/写数据以一个字节或多达 31 个字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和时钟信息时功率小于 1mW。 DS1302 由 DS1202 改进而来增加了以下的特性:双电源管脚用于主电源和 备份电源供应,Vcc1 为可编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。
       主要的性能指标:
★ 实时时钟具有能计算 2100 年之前的秒、分、时、日、星期、月、年的 能力,还有闰年调整的能力;
★ 31 个 8 位暂存数据存储 RAM;
★ 串行 I/O 口方式使得管脚数量最少;
★ 宽范围工作电压 2.0 ~ 5.5V;
★ 工作在 2.0V 时,电流小于 300nA;
★ 读/写时钟或 RAM 数据时有两种传送方式单字节传送和多字节传送字符组 方式;
★ 8 脚 DIP 封装或可选的 8 脚 SOIC 封装根据表面装配;
★ 简单 3 线接口;
★ 与 TTL 兼容 Vcc=5V;
★ 可选工业级温度范围-40~+85;
在这里插入图片描述

  1. VCC2:主电源引脚
  2. X1、X2:DS1302 外部晶振引脚,通常需外接 32.768K 晶振
  3. GND:电源地
  4. CE:使能引脚,也是复位引脚(新版本功能变)。
  5. I/O:串行数据引脚,数据输出或者输入都从这个引脚
  6. SCLK:串行时钟引脚
  7. VCC1:备用电源

DS1302 使用

       操作 DS1302 的大致过程,就是将各种数据写入 DS1302 的寄存器,以设置 它当前的时间的格式。然后使 DS1302 开始运作,DS1302 时钟会按照设置情况 运转,再用单片机将其寄存器内的数据读出。再用液晶显示,就是我们常说的简 易电子钟。所以总的来说 DS1302 的操作分 2 步(显示部分属于液晶显示的内容, 不属于 DS1302 本身的内容),但是在讲述操作时序之前,我们要先看看寄存器, DS1302 有一个控制寄存器、12 个日历、时钟寄存器和 31 个 RAM。
在这里插入图片描述
在这里插入图片描述

控制寄存器

       控制寄存器用于存放 DS1302 的控制命令字,DS1302 的 RST 引脚回到高电平后写入的第一个字节就为控制命令。它用于对 DS1302 读写过程进行控制,格式如下:
在这里插入图片描述
       上图是 DS1302 的寄存器样式,我们看到:

  1. 第 7 位永远都是 1;
  2. 第 6 位,1 表示 RAM,寻址内部存储器地址;0 表示 CK,寻址内部寄存器;
  3. 第 5 到第 1 位,为 RAM 或者寄存器的地址;
  4. 最低位,高电平表示 RD,即下一步操作将要“读”;低电平表示 W,即 下一步操作将要“写”。

在这里插入图片描述
在这里插入图片描述
       比如要读秒寄存器则命令为 1000 0001,反之写为 1000 0000。

日历/时钟寄存器

       DS1302 共有 12 个寄存器,其中有 7 个与日历、时钟相关,存放的数据为 BCD 码形式。格式如下:
在这里插入图片描述
在这里插入图片描述
       秒寄存器:低四位为秒的个位,高的次三位为秒的十位。最高位 CH 为 DS1302 的运行标志,当 CH=0 时,DS1302 内部时钟运行,反之 CH=1 时停止;
       小时寄存器:时寄存器。最高位为 12/24 小时的格式选择位,该位为 1 时表示 12 小时格式。当设置为 12 小时显示格式时,第 5 位的高电平表示下午 (PM);而当设置为 24 小时格式时,第 5 位位具体的时间数据。
       写保护寄存器:当该寄存器最高位 WP 为 1 时,DS1302 只读不写,所以要在往 DS1302 写数据之前确保 WP 为 0。
       慢充电寄存器(涓细电流充电)寄存器:我们知道,当 DS1302 掉电时,可以马上调用外部电源保护时间数据。该寄存器就是配置备用电源的充电选项的。 其中高四位(4 个 TCS)只有在 1010 的情况下才能使用充电选项;低四位的情 况与 DS1302 内部电路有关。

       在日历/时钟寄存器中都是以 BCD 码存放数据,BCD 码是通过 4 位二进制码来表示 1 位十进制中的 0~9 这 10 个数码。 如下所示:
在这里插入图片描述

DS1302 的读写时序

       在控制指令字输入后的下一个 SCLK 时钟的上升沿时,数据被写入 DS1302, 数据输入从低位(位 0)开始。同样,在紧跟 8 位的控制指令字后的下一个 SCLK 脉冲的下降沿读出 DS1302 的数据,读出数据时从低位 0 位到高位 7。其时序图如下所示:
在这里插入图片描述
       上图就是 DS1302 的三个时序:复位时序,单字节写时序,单字节读时序;
        CE(RST):复位时序,即在 RST 引脚产生一个正脉冲,在整个读写器件, RST 要保持高电平,一次字节读写完毕之后,要注意把 RST 返回低电平准备下次 读写周期;
       单字节读时序:注意读之前还是要先对寄存器写命令,从最低位开始写;可以看到,写数据是在 SCLK 的上升沿实现,而读数据在 SCLK 的下降沿实现。所以, 在单字节读时序中,写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了!这个就是 DS1302 操作中最特别的地方。 当然读出来的数据也是最低位开始。
       单字节写时序:两个字节的数据配合 16 个上升沿将数据写入即可。

        程序注意事项:
        ★要记得在操作 DS1302 之前关闭写保护;
        ★注意用延时来降低单片机的速度以配合器件时序;
        ★DS1302 读出来的数据是 BCD 码形式,要转换成我们习惯的 10 进制,转换方法在源程序里;
        ★读取字节之前,将 IO 设置为输入口,读取完之后,要将其改回输出口;
        ★在写程序的时候,建议实现开辟数组(内存空间)来集中放置 DS1302 的 一系列数据,方便以后扩展键盘输入。

电路设计

在这里插入图片描述

示例程序

       stdint.h见【51单片机快速入门指南】1:基础知识和工程创建
       软件SPI程序见【51单片机快速入门指南】5:软件SPI
       串口部分见【51单片机快速入门指南】3.3:USART 串口通信
       根据时序图,写入时都是模式1,读取时先是模式1,之后是模式0。

DS1302.c

#include "./Soft_SPI/Soft_SPI.h"
#include <STC89C5xRC.H>
#include "DS1302.h"sbit DS1302_CS = P3^5;//DS1302_CS拉高 移植时需修改
void DS1302_CS_H()
{DS1302_CS = 1;
}//DS1302_CS拉低 移植时需修改
void DS1302_CS_L()
{DS1302_CS = 0;
}//---存储顺序是秒分时日月周年---//
uint8_t gDS1302_TIME[7] = {0};//---DS1302写入时分秒的地址命令---//
//---秒分时日月周年-------//
code uint8_t gWRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};/*******************************************************************************
Num2BCD
数字转BCD码(两位数)
*******************************************************************************/
#define Num2BCD(value) (((value/10)<<4)|(value%10))/*******************************************************************************
* 函 数 名       : reversed
* 函数功能		 : 倒序一个字节
*******************************************************************************/
uint8_t reversed(uint8_t raw)
{uint8_t i, value = 0;for(i = 0; i < 8; i++){value <<= 1;value |= (raw & 0x01);raw >>= 1;}return value;
}/*******************************************************************************
* 函 数 名       : ds1302_write_byte
* 函数功能		 : DS1302写单字节
* 输    入       : addr:地址/命令dat:数据
* 输    出    	 : 无
*******************************************************************************/
void ds1302_write_byte(uint8_t addr,uint8_t dat)
{	addr = reversed(addr);dat = reversed(dat);DS1302_CS_L();DS1302_CS_H();SOFT_SPI_RW_MODE1(addr);SOFT_SPI_RW_MODE1(dat);DS1302_CS_L();
}/*******************************************************************************
* 函 数 名       : ds1302_read_byte
* 函数功能		 : DS1302读单字节
* 输    入       : addr:地址/命令
* 输    出    	 : 读取的数据
*******************************************************************************/
uint8_t ds1302_read_byte(uint8_t addr)
{uint8_t temp  = 0;addr = reversed(addr);DS1302_CS_H();	SOFT_SPI_RW_MODE1(addr);temp = SOFT_SPI_RW_MODE0(0xff);DS1302_CS_L();return reversed(temp);	
}/*******************************************************************************
* 函 数 名       : ds1302_init
* 函数功能		 : DS1302初始化时间
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void ds1302_init(uint8_t YY, uint8_t MM, uint8_t DD, uint8_t hh, uint8_t mm, uint8_t ss, uint8_t ww)
{uint8_t i;ds1302_write_byte(0x8e, 0x00);gDS1302_TIME[0] = Num2BCD(ss);gDS1302_TIME[1] = Num2BCD(mm);gDS1302_TIME[2] = Num2BCD(hh);gDS1302_TIME[3] = Num2BCD(DD);gDS1302_TIME[4] = Num2BCD(MM);gDS1302_TIME[5] = Num2BCD(ww);gDS1302_TIME[6] = Num2BCD(YY);for(i = 0; i < 7; i++){ds1302_write_byte(gWRITE_RTC_ADDR[i], gDS1302_TIME[i]);	}ds1302_write_byte(0x8e, 0x80);	
}/*******************************************************************************
* 函 数 名       : ds1302_read_time
* 函数功能		 : DS1302读取时间
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void ds1302_read_time(void)
{uint8_t i;for(i = 0; i < 7; i++){gDS1302_TIME[i] = ds1302_read_byte(gWRITE_RTC_ADDR[i] | 0x01);	}	
}

DS1302.h

#ifndef DS1302_H_
#define DS1302_H_#include "stdint.h"#define Second()	((int16_t)(gDS1302_TIME[0]&0x0f)+((gDS1302_TIME[0]&0x70)>>4)*10)
#define Minute()	((int16_t)(gDS1302_TIME[1]&0x0f)+((gDS1302_TIME[1]&0x70)>>4)*10)
#define Hour()		((int16_t)(gDS1302_TIME[2]&0x0f)+((gDS1302_TIME[2]&0x30)>>4)*10)
#define Date()		((int16_t)(gDS1302_TIME[3]&0x0f)+((gDS1302_TIME[3]&0x30)>>4)*10)
#define Month()		((int16_t)(gDS1302_TIME[4]&0x0f)+((gDS1302_TIME[4]&0x10)>>4)*10)
#define Year()		((int16_t)(gDS1302_TIME[6]&0x0f)+((gDS1302_TIME[6]&0xF0)>>4)*10)
#define Week()		((int16_t)(gDS1302_TIME[5]&0x0f))extern uint8_t gDS1302_TIME[];void ds1302_write_byte(uint8_t addr,uint8_t dat);
uint8_t ds1302_read_byte(uint8_t addr);
void ds1302_init(uint8_t YY, uint8_t MM, uint8_t DD, uint8_t hh, uint8_t mm, uint8_t ss, uint8_t ww);
void ds1302_read_time(void);#endif

测试程序

main.c

#include <STC89C5xRC.H>
#include "intrins.h"
#include "stdint.h"
#include "DS1302.h"
#include "USART.h"void Delay1ms()		//@22.1184MHz
{unsigned char i, j;_nop_();i = 4;j = 146;do{while (--j);} while (--i);
}void Delay_ms(int i)
{while(i--)Delay1ms();
}void main(void)
{ds1302_init(21, 12, 3, 22, 42, 28, 5);	//配置为21年12月03日22时42分28秒 星期5USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 22118400, 115200, DOUBLE_BAUD_ENABLE, USART_TIMER_1);while(1){	Delay_ms(1000);ds1302_read_time();printf("%d年%d月%d日%d时%d分%d秒", Year(), Month(), Date(), Hour(), Minute(), Second());printf(" 星期%d\r\n", Week());}
}

实验现象

打开串口,可见如下数据:
在这里插入图片描述
此程序也可在Proteus中正常仿真:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【格局视野】三色需求与工作层次

三色需求 人们的社会经济生活本身就是一个互相交换&#xff0c;价值传递的循环&#xff0c;但这个循环有一个核心&#xff0c;这个核心就是社会大众的需求&#xff0c;也可以称为市场需求&#xff0c;围绕这个需求产生了层级递进的需求关系。 第一个层次是蓝色需求 是最基础的社…

关于linux-Centos 7下mysql 5.7.9的rpm包的安装方式

环境介绍>>>>>>>>>>>>>>>>>> 操作系统&#xff1a;Centos 7.1 mysql数据库版本&#xff1a;mysql5.7.9 mysql官方网站&#xff1a;http://www.mysql.com 原文地址&#xff1a;http://www.cnblogs.com/5201351/p/4912614…

【51单片机快速入门指南】5.2:SPI读取 12位ADC XPT2046 芯片

目录硬知识ADC 简介分辨率转换误差转换速率ADC 转换原理逐次逼近型 ADC双积分型 ADCXPT2046 芯片介绍参考电压内部参考电压外部参考电压输入工作模式单端工作模式差分工作模式温度测量电池电压测量压力测量数字接口笔中断输出转换周期16 时钟周期转换数字时序15 时钟周期转换数…

flask中 app.run(host='0.0.0.0', port=5000, debug=False) 不能用外网ip访问的解决办法

pycharm 2018开启debug模式和修改host&#xff1a; 在Pycharm 2018中&#xff0c;如果想要开启debug模式和更改端口号&#xff0c;则需要编辑项目配置。直接在app.run中更改是无效的。示例图如下&#xff1a; 将 app.run() 改成 app.run(debugFalse) 保存文件&#xff0c…

开发第一个spring boot应用

为什么80%的码农都做不了架构师&#xff1f;>>> 我们来用spring boot开发一个简单的“hello world”web应用&#xff0c;使用maven构建。开始之前&#xff0c;先检查你的java与maven的版本&#xff0c;看是否是spring boot1.3支持的版本&#xff1a; $ java -versi…

机器学习中规则化和模型选择知识

1 问题 模型选择问题&#xff1a;对于一个学习问题&#xff0c;可以有多种模型选择。比如要拟合一组样本点&#xff0c;可以使用线性回归&#xff0c;也可以用多项式回归。那么使用哪种模型好呢&#xff08;能够在偏差和方差之间达到平衡最优&#xff09;&#xff1f; 还有一类…

【51单片机快速入门指南】5.3:SPI控制晶联讯JLX12864G_08602 LCD屏幕

目录示例程序JLX12864G_08602.cJLX12864G_08602.hJLX12864G_08602_Font.cJLX12864G_08602_Font.h测试程序main.c效果STC12LE5A60S2 12MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 示例程序 stdint.h见【51单片机快速入门指南】1&#xff1a;基础知…

Android二维码之创建

由于微信的推出二维码走进了我们的生活&#xff0c;并且越来越多的人们正在发挥着自己的想象力去使用它&#xff0c;来方便我们的生活&#xff0c;我曾经听说过一个笑话&#xff0c;当我们死后&#xff0c;墓碑上不再有墓志铭&#xff0c;而会出现一个记录你一生信息的二维码&a…

如何开展软件架构之概念架构

如何开展软件架构之概念架构 到目前为止&#xff0c;我们已经完成了需求的分析过程&#xff0c;总结来说&#xff0c;主要的步聚是 一&#xff09;需求结构化&#xff0c; 二&#xff09;分析约束影响 三&#xff09;重点关注质量需求。 那么接下来的阶段则是系统的概念架构了&…

【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真

目录硬知识显示特性接口定义操作时序写操作时序读操作时序寄存器忙标志位BF地址计数器&#xff08;AC&#xff09;显示数据寄存器&#xff08;DDRAM&#xff09;CGROMCGRAM指令清屏指令光标归位指令进入模式设置指令显示开关控制指令设定显示屏或光标移动方向指令功能设定指令设…

在MAC OS 下配置python + Flask ,并支持pyCharm编辑器

https://www.cnblogs.com/lgphp/p/3841098.html 在MAC OS 下配置python Flask ,并支持pyCharm编辑器 flask是一个micro framework &#xff0c;伸缩性很强。可以部署到openshift 的PAAS里。这个框架上手非常快。喜欢的可以试试。 若实在MAC里&#xff0c;python已经默认安装了…

MySql简介及概念

关系型数据库系统&#xff1a;建立在关系模型上的数据库系统。 关系模型:当将日常生活中的实体&#xff08;学生&#xff09;&#xff0c;和实体的属性&#xff08;学生的学号&#xff0c;姓名&#xff09;保存数据中时&#xff0c;该如何处理该实体结构。1、数据结构可以规定&…

【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)

目录硬知识LCD12864简介主控芯片ST7920的功能是&#xff1a;驱动芯片ST7921的功能是&#xff1a;引脚功能时序并行通信串行通信指令存储结构操作取模软件的配置示例程序st7920.cst7920.h测试程序显示图片图片1实验现象图片2实验现象显示字符英文实验现象中文实验现象Proteus的仿…

【51单片机快速入门指南】仿真实例:幅值可调、频率可调的函数发生器(方波、三角波、正弦波)(1~10kHz)

目录效果设计思路STC89C52 Windows 10 20H2 Proteus 8 Frofessional v8.9 SP2 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 51函数发生器&#xff0c;附工程源码和Proteus仿真文件 效果 0 ~ 5V &#xff0c;50Hz的正弦波&#xff1a; 1 ~ 4V&…

VisualSvn Server介绍

1 、VisualSvn Server VisualSvn Server是免费的&#xff0c;而VisualSvn是收费的。VisualSvn是Svn的客户端&#xff0c;和Visual Studio集成在一起&#xff0c;但是不免费&#xff0c;使用AnkhSvn&#xff08;VS2008插件&#xff09;来代替VisualSvn。使用 VisualSvn Server是…

【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

目录硬知识DS18B20介绍时序初始化时序写时序读时序命令ROM 操作命令ROM 搜索举例存贮器操作命令示例程序DS18B20.cDS18B20.h测试程序定时器中断服务函数单传感器时ID的获取 main.c单传感器读取温度和读取特定ID传感器的温度多路传感器读取普中51-单核-A2 STC89C52 Keil uVisio…

SQL多行转多列

--★转换结果如上图 1、首先创建表&#xff1a; CREATE TABLE [成绩表]( [编号] [int]IDENTITY(1,1) NOT NULL, [姓名] [varchar](50)NULL, [语文] [numeric](5, 2)NULL, [数学] [numeric](5, 2)NULL, [英语] [numeric](5, 2)NULL ) ON [PRIMARY] 2、插入测试数据 INSERT INTO …

C#通过FFmpeg获得视频文件参数

C#通过FFmpeg获得视频参数 FFmpeg简介 FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video&#xff08;录制、转换 、音/视频&#xff0c;并可将其转换为音/视频流的完整的&#xff0c;跨平台的j解决方案&#xff09;.FFmpeg的开发…

【51单片机快速入门指南】6.3.1:使用1-WIRE搜索算法搜索单总线上所有DS18B20的ID(基于二叉树)

目录源码OWSearch.c测试程序实验现象Proteus仿真实机测试普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 移植自1-WIRE搜索算法 串口部分见【51单片机快速入门指南】3.3&#xff1a;USART 串口通信 DS18B20驱动程序见【5…

卡拉丁发布第四代车用空调滤清器

5月15日&#xff0c;卡拉丁“全澄行动”第四代车用空调滤清器产品发布会在京举行&#xff0c;据悉&#xff0c;该车用空调滤清器PM2.5过滤效率可高达99%。经国家权威检测机构广东省微生物分析检测中心检测&#xff0c;卡拉丁第四代车用空调滤清器对大肠杆菌、金***葡萄球菌抗菌…