使用51单片机和DS1302时钟芯片做一个简易的电子时钟

news/2024/4/27 0:04:14/文章来源:https://blog.csdn.net/qq_45172832/article/details/129136428

简易的电子时钟实验

    • 一、前言
    • 二、DS1302模块介绍
    • 三、驱动DS1302的代码
      • 3.1 初始化DS1302时钟芯片
      • 3.2 读取DS1302时钟芯片的时间
      • 3.3 设置DS1302时钟芯片的时间
      • 3.4 读取DS1302时钟芯片的RAM
      • 四、读取DS1302时钟芯片的RAM
      • 4.1 发送读取RAM的命令
      • 4.2 读取RAM的内容
      • 4.3 读取部分单独代码实现(注重逻辑)
      • 五、整体代码实现
    • 六、显示效果

一、前言

今天给大家推荐一个51单片机小实验,带你使用51单片机做一款简易的电子时钟,其中计时模块采用DS1302硬件模块,显示采用LCD显示屏,具体怎么实现开来一起看看吧!

二、DS1302模块介绍

DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟和31字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟、日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年自动补偿等多种功能。时钟操作可通过 AM/PM 指示,DS1302 与单片机之间能简单地采用同步串行的方式进行通信,简易三线SPI通信模式:

  • RES 复位
  • I/O 数据线
  • SCLK 串行时钟

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如MSP430单片机系列处理器。

DS1302时钟芯片的工作原理如下:

  • DS1302芯片内部有一组定时器和寄存器,通过这些寄存器可以实现时钟的读写操作。
  • DS1302通过三根引脚与外部设备连接,分别是RST、DAT和CLK。RST引脚用于复位
  • DS1302,DAT引脚用于数据传输,CLK引脚用于时钟信号。
  • DS1302芯片使用BCD码表示时间信息,即用4位二进制数表示一个十进制数。例如,分的BCD码为00H到59H。

三、驱动DS1302的代码

以下是使用51单片机驱动DS1302时钟芯片的代码,具体实现步骤如下:

3.1 初始化DS1302时钟芯片

void DS1302Init() {// 初始化DS1302时钟芯片DS1302WriteByte(0x8E, 0x00);// 关闭写保护DS1302WriteByte(0x90, 0x00);
}

3.2 读取DS1302时钟芯片的时间

void DS1302ReadTime(unsigned char *p) {// 读取DS1302时钟芯片的时间unsigned char i;DS1302WriteByte(0xBF, 0x00);for (i = 0; i < 7; i++) {p[i] = DS1302ReadByte();}
}

3.3 设置DS1302时钟芯片的时间

void DS1302WriteTime(unsigned char *p) {// 设置DS1302时钟芯片的时间unsigned char i;DS1302WriteByte(0xBE, 0x00);for (i = 0; i < 7; i++) {DS1302WriteByte(p[i], 0x00);}
}

3.4 读取DS1302时钟芯片的RAM

// 从DS1302读取一个字节的数据
void DS1302ReadByte(uchar *dat) {uchar i;for (i = 0; i < 8; i++) {SCLK = 0;_nop_();*dat |= IO << i;SCLK = 1;_nop_();}
}

四、读取DS1302时钟芯片的RAM

DS1302时钟芯片有31个字节的RAM空间,可以用来存储一些数据。在实际应用中,我们可能需要读取这些存储的数据。读取DS1302的RAM和读取寄存器类似,也需要先向DS1302发送读取RAM的命令,然后再读取RAM的内容。

读取DS1302的RAM需要使用到DS1302的另一个引脚——CE(片选使能)引脚,该引脚在读写DS1302的RAM时需要保持为低电平。读取RAM的过程如下:

4.1 发送读取RAM的命令

向DS1302写入读取RAM的命令:0x61。DS1302会自动切换到RAM读取模式,准备将RAM中的数据传输给单片机。

DS1302Write(0x61); // 发送读取RAM命令

4.2 读取RAM的内容

发送读取RAM命令后,就可以读取RAM中的数据了。读取RAM的数据需要先读取DS1302的数据引脚(IO引脚)上的高电平脉冲,然后再读取8个位的数据。具体的读取过程可以使用DS1302ReadByte函数实现,该函数会读取一个字节的数据。

for (i = 0; i < 31; i++) {DS1302ReadByte(&byte); // 读取一个字节的数据ram[i] = byte; // 存储到数组中
}

读取完RAM后,我们可以将其存储到一个数组中,方便后续的使用。

4.3 读取部分单独代码实现(注重逻辑)

#include <reg51.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned intsbit SCLK = P2^0;
sbit IO = P2^1;
sbit CE = P2^2;uchar ds1302_read_ram(uchar address)
{uchar i, dat;CE = 0;_nop_();SCLK = 0;_nop_();CE = 1;_nop_();IO = 0; // 写指令SCLK = 0;_nop_();SCLK = 1;_nop_();IO = address | 0xc0; // 选择地址并读取 RAMfor (i = 0; i < 8; i++) {SCLK = 0;_nop_();SCLK = 1;_nop_();}IO = 0; // 接收数据for (i = 0; i < 8; i++) {dat >>= 1;if (IO) dat |= 0x80;SCLK = 0;_nop_();SCLK = 1;_nop_();}CE = 0;return dat;
}

在上述代码中,ds1302_read_ram 函数接收一个参数 address,用于指定要读取的 RAM 地址,返回一个字节表示该地址处的 RAM 数据。

该函数的具体实现过程如下:

  • 置 CE 为低电平,并延迟一段时间。
  • 置 SCLK 为低电平,并延迟一段时间。
  • 置 CE 为高电平,并延迟一段时间。
  • 置 IO 为低电平,表示写指令。
  • 置 SCLK 为低电平,并延迟一段时间。
  • 置 SCLK 为高电平,并延迟一段时间。
  • 置 IO 为 address | 0xc0,即选择地址并读取 RAM。
  • 依次进行 8 次时钟上升沿,在每个上升沿时读取数据位。
  • 置 CE 为低电平。
  • 返回读取到的数据。

需要注意的是,读取 RAM 数据时需要将地址的最高位(即 bit7)置为 1,以表示要读取 RAM。另外,在读取数据位时需要依次进行 8 次时钟上升沿,且每次读取时需要先右移数据,再将新数据左移并或上读到的数据位。

五、整体代码实现

下面是使用51单片机和DS1302时钟芯片实现的简易电子时钟的代码实现。代码中包含了DS1302的初始化、时钟读取、RAM读写等基本功能。

#include <reg52.h>
#include "LCD1602.h"
#include "DS1302.h"#define uchar unsigned char
#define uint unsigned intsbit beep=P3^6;     //定义蜂鸣器接口void main()
{uchar year, month, day, hour, minute, second;  //年月日时分秒uchar str_data[11], str_time[11];              //用于存放LCD上显示的日期和时间LCD_Init();  //初始化LCD显示屏DS1302_Init();  //初始化DS1302时钟芯片//将时间初始化为2023年2月21日0时0分0秒DS1302_Write(0x8e,0);   //关闭写保护DS1302_Write(0x80,0x23);   //年份DS1302_Write(0x82,0x02);   //月份DS1302_Write(0x84,0x21);   //日期DS1302_Write(0x86,0x00);   //时钟DS1302_Write(0x88,0x00);   //分钟DS1302_Write(0x8a,0x00);   //秒钟DS1302_Write(0x8e,0x80);   //开启写保护while(1){//读取DS1302时钟芯片中的年月日时分秒year = DS1302_Read(0x80);month = DS1302_Read(0x82);day = DS1302_Read(0x84);hour = DS1302_Read(0x86);minute = DS1302_Read(0x88);second = DS1302_Read(0x8a);//将年月日时分秒转换成字符串sprintf(str_data, "Data: 20%02x-%02x-%02x", year, month, day);sprintf(str_time, "Time: %02x:%02x:%02x", hour, minute, second);//在LCD上显示日期和时间LCD_Write_String(0,0,str_data);LCD_Write_String(0,1,str_time);Delay_Ms(1000);  //延时1秒}
}

六、显示效果

在这里插入图片描述

👇点击下方公众号卡片获取资料👇

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

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

相关文章

[飞桨paddle]1. conda安装paddle环境.模型转换,pytorch->paddlepaddle

“一生费城七六人”1. conda装paddle环境1.1 验证是否装好2. x2paddle2.1 介绍2.2 安装3 模型转换3.1 pt -> onnx3.2 onnx > .pdparams3.2.1 会出现的错误情况3-1. 第一种情况3-2. 第二种情况4. 查看结果问题阐述&#xff1a;将yoloV5项目移至paddle框架下执行时&#xf…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索&#xff0c;即时零售已经逐步走向成熟&#xff0c;并开始向三四线城市以及乡镇城市渗透。 过去一年&#xff0c;京东、美团、阿里争先布局即时零售市场&#xff0c;完善即时配送网络、培养用户消费习惯&#xff0c;即时零售订单迎来了骤增。2022年下半年&#…

C/C++每日一练(20230222)

目录 1. 部分复制字符串(★) 2. 按字典顺序排列问题(★★) 3. 地下城游戏(★★★) 附录 动态规划 1. 部分复制字符串 将字符串2小写字母复制到字符串1&#xff1a;编写程序,输入字符串s2,将其中所有小写字母复制到字符串数组strl中。例如&#xff1a;aal1bb22cc33de4AA55…

Java实现多线程有几种方式(满分回答)

目录JDK8 创建的线程的两种方式orcle文档解释方式一&#xff1a;继承Thread类方式二&#xff1a;实现Runnable接口同时用两种的情况其他间接创建方式Callable接口线程池JDK8 创建的线程的两种方式 orcle文档解释 orcle文档&#xff1a;https://docs.oracle.com/javase/8/docs…

九龙证券|银行资本管理办法迎“大修” 信用风险权重法调整优化

1年期AAA中债商业银行同业存单到期收益率 日前迎来“大修”的商业银行本钱办理方法&#xff0c;在债券商场激起“涟漪”——债券商场一改此前平静态势&#xff0c;连续两日跌落。 2月21日&#xff0c;10年期国债收益率较上星期五上行2.9个基点&#xff0c;至2.919%&#xff1b…

Redis学习【10】之Redis主从集群(1)

文章目录一 Redis主从集群搭建1 伪集群搭建与配置1.1.1 分级管理1.1.2 容灾冷处理1.2 主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程1.3 哨兵机制实现1.3.1 哨兵机制简介1.3.2 Redis 高可用集群搭建1.3.3 Redis 高可用集群的启动1.3.4 Sentinel 优化配置1.4 哨兵机制原…

Spring中自定义Session管理,Spring Session源码解析

系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 目录 系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 1、session是什么&#xff1f; 1>session在哪里&#xff1f; 2>服务器怎么知道每次说话的是…

H5盲盒抽奖系统源码

盲盒抽奖系统4.0&#xff0c;带推广二维码防洪炮灰功能和教程。 支持微信无限回调登录 标价就是源码价格&#xff0c;vuetp5框架编写&#xff0c;H5网页&#xff0c;前后端分离 此源码为正规开发&#xff0c;正版产品已申请软著。 开源无加密无授权&#xff0c;可以二开使用…

霍尔元件的应用

霍尔传感器有3个pin&#xff0c;分别是 正极 负极和输出pin。 输出pin接电阻和发光二极管。电阻起限流作用。 电源接5.5v直流电。当拿一个磁铁的N极靠近霍尔元件时&#xff0c;二极管越来越亮。当拿S极靠近霍尔元件时&#xff0c;二极管越来越暗。 N极磁场强度定义为正的磁场强…

算法刷题日志——移除元素,双指针

文章目录删除有序数组中的重复项[删除有序数组中的重复项 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/)移除元素[283. 移动零](https://leetcode.cn/problems/move-zeroes/description/)[844. 比较含退格的字符串](https://leetcode.cn/problem…

Docker之路(3.docker底层原理、和虚拟机VM对比区别)

1.docker run 流程图 2. docker 底层原理 2.1 docker 是怎么工作的&#xff1f; Docker 是一个 Client-Server 结构的系统&#xff0c;Docker的守护进程运行在主机上&#xff0c; 通过Socket从客户端访问&#xff01; DockerServer接收到Docker-Client的指令&#xff0c;就会执…

【Java】Spring的创建和使用

Spring的创建和使用 Spring就是一个包含众多工具方法的IOC容器。既然是容器&#xff0c;那么就具备两个最主要的功能&#xff1a; 将对象存储到容器中从容器中将对象取出来 在Java语言当中对象也叫作Bean。 1. 创建Spring项目 创建一个普通maven项目添加Spring框架支持(spri…

Spring Boot自动装配的原理

Spring Boot自动装配的原理自动装配的实现EnableAutoConfigurationAutoConfigurationImportSelectorSpring Boot中的自动装配&#xff0c;它是Starter的基础&#xff0c;也是Spring Boot的核心。那么什么叫自动装配呢&#xff1f;或者说什么叫装配呢&#xff1f; 简单来说&…

金三银四丨黑蛋老师带你剖析-安全开发岗

作者丨黑蛋在之前呢&#xff0c;我们聊了二进制这块的病毒岗位&#xff0c;漏洞岗位&#xff0c;逆向岗位以及CTF这块的岗位。今天我们就来聊一聊安全开发类的工作岗位。首先网络安全方向中安全开发岗位都有哪些&#xff0c;安全开发主要指安全研发工程师或安全开发工程师&…

电子技术——负反馈特性

电子技术——负反馈特性 本节我们进一步深入介绍负反馈特性。 增益脱敏性 假设 β\betaβ 是一个常数。考虑下面的微分方程&#xff1a; dAfdA(1Aβ)2dA_f \frac{dA}{(1 A\beta)^2} dAf​(1Aβ)2dA​ 将上式除以 AfA1AβA_f \frac{A}{1A\beta}Af​1AβA​ 得到&#xff1…

php+vue加油站会员服务系统 java微信小程序

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 3.2网站性能需求分析 10 3.3网站功能分析 10 3.4系统…

秒懂算法 | 子集树模型——0-1背包问题的回溯算法及动态规划改进

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W。一种物品要么全部装入背包,要么全部不装入背包,不允许部分装入。装入背包的物品的总重量不超过背包的容量。问应如何选择装入背包的物品,使得装入背包中的物品总价值最大? 01、问题分析——解空间及搜索…

JAVA并发集合之ConcurrentHashMap

ConcurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。Hashmap在多线程并发的情况下&#xff0c;是线程不安全的&#xff0c;容易出现死循环、死锁等问题&#xff0c;JDK8后不会出现死锁问题&#xff0c;但依然存在多线程的系列问题&#xff0c;如&#xff1a;数…

关于虚拟数字人你想知道的都在这里

2022年底&#xff0c;微软旗下的人工智能实验室Open AI发布的对话式大型语言模型ChatGPT聊天机器人一夜蹿红&#xff0c;5天用户量超百万&#xff0c;在各大中外媒体平台掀起了一阵热潮。也带火了人工智能相关产业&#xff0c;AI虚拟数字人就是其中之一&#xff0c;一个随着元宇…

【电商】红冲与单价调整

产品及系统的规划与设计过程中始终会考虑实际生产环境中的异常场景&#xff0c;这样会增加系统复杂度&#xff0c;虽然有时可以通过简化流程来降低出现异常的概率&#xff0c;但很多时候都是无法避开的&#xff1b;本篇就简单梳理下红冲单与价格调整单方面的内容&#xff0c;希…