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

这篇具有很好参考价值的文章主要介绍了使用51单片机和DS1302时钟芯片做一个简易的电子时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

今天给大家推荐一个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 int

sbit 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; // 选择地址并读取 RAM
    for (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 int

sbit 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秒
    }
}

六、显示效果

使用51单片机和DS1302时钟芯片做一个简易的电子时钟文章来源地址https://www.toymoban.com/news/detail-515314.html

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

到了这里,关于使用51单片机和DS1302时钟芯片做一个简易的电子时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机(十)DS1302实时时钟

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月03日
    浏览(53)
  • 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:以下是本篇文章正文内容,下面案例可供参考 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作

    2024年02月02日
    浏览(70)
  • 蓝桥杯单片机比赛学习:12、DS1302时钟基本原理与使用方法

    DS1302是 DALLAS 公司推出的时钟芯片,内含一个实时时钟/日历和 31字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。 但是在我们比赛中一般只需要写/读时钟。 DS1302可以采

    2024年02月02日
    浏览(49)
  • 【单片机】13-实时时钟DS1302

    (rtc for real time clock) (1)时间点和时间段的概念区分 (2)单片机为什么需要时间点【一定的时间点干什么事情】 (3)RTC如何存在于系统中(单片机内部集成 or 单片机外部扩展【DS1302】) 1.数据手册 DS1302中文数据手册 - 豆丁网 2. SPI数字接口 访问 SPI通信协议【DS1302也使用

    2024年02月07日
    浏览(47)
  • 单片机第一季:零基础11——实时时钟DS1302

    目录 1,DS1302 时钟芯片介绍  2,BCD码介绍  3,涉及到的寄存器  3.1,控制寄存器 3.2,日历/时钟寄存器  3.3,DS1302 的读写时序  4,相关代码  这一章我们来学习DS1302 时钟芯片,该芯片是3 线SPI 接口,所以需要使用51单片机的3 个IO 口模拟SPI 时序与DS1302 时钟芯片通信,将时钟

    2024年02月16日
    浏览(60)
  • 时钟芯片DS1302时序分析、读写代码解析

    引脚名称 功能 X1、X2 外接32.768kHz 晶振,用于内部计时 SCLK 和主控通信的时钟线 I/O 数据输入输出引脚 CE 使能引脚 VCC1 接电池供电,保证主板掉电时间能继续走 VCC2 主板的电源供电 (1)DS1302芯片的通信接口是SPI协议接口,只有一根数据线,所以是半双工通信; (2)SPI协议可参考博

    2024年02月06日
    浏览(54)
  • 【Arduino30】DS1302时钟芯片模拟值实验

    DS1302芯片:1片 32.768kHz晶振:1个 面包板:1个 杜邦线:若干 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。 DS1302常用于以下场景: 电子时钟和钟表: DS1302可以通过

    2024年02月09日
    浏览(52)
  • 51单片机数字时钟

    我们学单片机,一般都会写数字时钟编程。它能帮助我们: a. 能够系统性地总结掌握的知识,将单元模块知识有机的结合在一起。 b. 能够充分协调好硬件与软件之间的相互结合,合理设计硬件电路。 c. 掌握单片机 C 语言判断语句、分支语句以及子程序调用等编程知识。

    2024年02月11日
    浏览(45)
  • STC单片机DS1307+ssd1306 oled时钟显示

    📌相关篇《STC单片机DS1302+ssd1306 oled时钟显示》 📍《STC单片机对DS1307读写操作》 ✨效果演示: 🌿实验对象:STC12C5A60S2 🌿屏幕型号:I2C ssd1306 0.96“ oled 🌿晶振频率:11.059MHz 🌿串口波特率:9600 📜串口打印读取信息: 🛠引脚说明 ✨由于屏幕接口ssd1306 0.96“ oled和DS1307的接

    2023年04月09日
    浏览(52)
  • 51单片机实时时钟显示

    51单片机+DS1302+DS18B20+LCD12864 用的IIC通信,写的一个ds3231时钟模块的程序,可更改时间,下面是.h文件里面的部分代码 #ifndef __ds3231_h #define _ ds3231_h #include reg51.h #define uchar unsigned char #define uint unsigned int extern uchar day2,Htemp2,Mtemp2,Stemp2; //星期,时分秒 extern ucharYtemp2,Mtemp2,Dtemp2,Ttem

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包