【51单片机仿真】基于51单片机设计的钟表定时闹钟系统仿真&源码&设计文档&演示视频——完整资料下载

演示视频

设计内容

(1)使用 DS1302 结合字符型 LCD12864 显示器设计一个简易的定时闹钟 LCD 时钟。程序执行后 LCD 显示"00:00:00"

(2)K1---设置现在的时间,年闪烁,再按 K1 键月闪烁,依次日,星期,时,分, 秒。

(3)K2---正常显示时间模式下按下 K2 键显示闹钟设置的时间,再按 K1 键依次 年,月,日,时,分,秒闪烁。

(4)K3---在设置现在时间或闹铃时间模式下,K3 负责增加功能,例如日闪烁时, 每按一次 K3 键日期加 1,加到 31 再从 1 开始。

(5)K4---在正常时间显示模式下,K4 为闹铃 ON/OFF 的状态切换,设置为 ON 时 连续三次发出"哗"的一声,并在屏幕上显示闹铃图案,设置为 OFF 发出"哗" 的一声,闹铃图案消失。在设置时间或闹铃模式下按下 K4 键设置完成,恢复 到正常显示时间模式。闹铃时间到时,发出一阵声响,按下本键可以停止声响。

摘要

在现代生活中,时钟和闹钟是必不可少的工具。本文介绍了一种基于DS1302实时时钟芯片和LCD12864显示模块的简易定时闹钟设计。通过对DS1302的时间读取和LCD12864的字符显示技术,结合按键控制,本文实现了一种可以显示时间、设置时间、设置闹钟并控制闹钟开关的系统。本文详细阐述了系统的硬件设计、软件设计以及具体的实现过程,并通过调试与测试验证了系统的功能。此设计不仅适用于个人学习和项目开发,也为嵌入式系统应用提供了重要的参考。

目录

摘要

[1. 引言](#1. 引言)

[2. 系统设计原理](#2. 系统设计原理)

[2.1 硬件设计](#2.1 硬件设计)

[2.1.1 DS1302实时时钟芯片](#2.1.1 DS1302实时时钟芯片)

DS1302的引脚功能

DS1302的连接方式

DS1302的基本操作

[2.1.2 LCD12864字符显示模块](#2.1.2 LCD12864字符显示模块)

LCD12864的引脚功能

LCD12864的连接方式

LCD12864的基本操作

[2.1.3 按键模块](#2.1.3 按键模块)

按键连接方式

按键功能描述

[2.1.4 蜂鸣器模块](#2.1.4 蜂鸣器模块)

蜂鸣器连接方式

蜂鸣器工作原理

[2.1.5 电源管理](#2.1.5 电源管理)

[2.2 软件设计](#2.2 软件设计)

[2.2.1 系统初始化](#2.2.1 系统初始化)

[2.2.2 时间读取与显示](#2.2.2 时间读取与显示)

[2.2.3 时间设置功能](#2.2.3 时间设置功能)

[2.2.4 闹钟设置功能](#2.2.4 闹钟设置功能)

[2.2.5 闹钟开关控制](#2.2.5 闹钟开关控制)

[2.2.6 按键处理及消抖](#2.2.6 按键处理及消抖)

[3. 关键技术实现](#3. 关键技术实现)

[3.1 DS1302的接口与通信](#3.1 DS1302的接口与通信)

DS1302通信过程

[3.2 LCD12864的显示控制](#3.2 LCD12864的显示控制)

LCD12864初始化

LCD12864字符显示

[3.3 按键多功能实现](#3.3 按键多功能实现)

按键功能切换

[3.4 闹钟响铃与停止](#3.4 闹钟响铃与停止)

[4. 系统调试与测试](#4. 系统调试与测试)

[4.1 硬件电路调试](#4.1 硬件电路调试)

[4.2 软件功能测试](#4.2 软件功能测试)

[4.3 综合性能验证](#4.3 综合性能验证)

[5. 结论](#5. 结论)

系统源码仿真演示视频等资料下载链接


1. 引言

随着嵌入式技术的快速发展,越来越多的电子设备被应用于日常生活中。时钟和闹钟是人们生活中必不可少的工具,它们帮助人们合理安排时间,提高生活和工作的效率。虽然市场上已有多种形式的时钟和闹钟,但为了更好地理解嵌入式系统的设计原理和实现方法,设计并实现一个简易的定时闹钟具有重要的实践意义。

本文设计了一种基于DS1302实时时钟芯片和LCD12864显示模块的简易定时闹钟系统。DS1302芯片是一种低功耗的实时时钟芯片,能够提供年、月、日、时、分、秒的时间信息,并支持电池备份功能。LCD12864是一个常用的字符显示模块,具有良好的显示效果和较低的功耗。通过使用这些模块,结合按键控制,实现了一种功能丰富、使用便捷的定时闹钟系统。

本文的设计不仅适用于个人学习和项目开发,还可以为嵌入式系统的应用提供有益的参考。

2. 系统设计原理

2.1 硬件设计

硬件设计是实现系统功能的基础。本设计的硬件部分包括DS1302实时时钟芯片、LCD12864显示模块、按键模块、蜂鸣器模块和电源管理模块。以下是各个模块的详细介绍。

2.1.1 DS1302实时时钟芯片

DS1302是美国达拉斯半导体公司推出的一款低功耗实时时钟芯片,广泛应用于各种需要计时功能的设备中。其主要特点包括:

  • 低功耗:工作电流小于1µA,非常适合电池供电设备。
  • 电池备份:支持外接电池,在掉电情况下仍能维持计时。
  • 串行接口:采用简单的三线串行接口,便于与单片机连接。
  • 支持BCD码:时间数据以BCD码格式存储,便于处理和显示。
  • 计时功能:支持年、月、日、星期、时、分、秒的计时。
DS1302的引脚功能
  • VCC1/VCC2:主电源和备用电源引脚。
  • GND:接地。
  • RST:复位信号输入,用于启动和结束数据传输。
  • SCLK:串行时钟信号输入,控制数据传输速度。
  • DSIO:串行数据输入/输出,用于传输时间和控制信息。
DS1302的连接方式

DS1302与单片机之间通过三根线连接:RST、SCLK和DSIO。如下图所示:

单片机端口   DS1302引脚
-----------  ---------
P1.0        -> RST
P1.1        -> SCLK
P1.2        -> DSIO
DS1302的基本操作
  • 读取时间:通过发送读命令,从DS1302的寄存器中读取当前时间信息。
  • 设置时间:通过发送写命令,将新的时间信息写入DS1302的寄存器中。
  • 启动/停止时钟:通过控制寄存器中的特定位,启动或停止时钟的计时功能。

2.1.2 LCD12864字符显示模块

LCD12864是一个128x64分辨率的液晶显示模块,支持字符和简单图形的显示。其特点包括:

  • 高分辨率:支持128x64像素的显示,适合显示多行字符和简单图形。
  • 低功耗:在显示状态下功耗较低,适合电池供电的设备。
  • 多种接口:支持并行和串行接口,便于与各种微控制器连接。
  • 灵活显示:支持多种显示模式和字符字体,可根据需要进行配置。
LCD12864的引脚功能
  • VCC/GND:电源和接地引脚。
  • RS:寄存器选择引脚,控制命令或数据输入。
  • RW:读/写选择引脚,控制数据读入或写出。
  • E:使能信号引脚,控制数据传输时序。
  • DB0-DB7:数据总线引脚,用于数据传输。
LCD12864的连接方式

LCD12864通过8位并行数据总线与单片机连接,具体连接如下:

单片机端口   LCD12864引脚
-----------  ----------
P2.0-P2.7   -> DB0-DB7
P3.0        -> RS
P3.1        -> RW
P3.2        -> E
LCD12864的基本操作
  • 初始化:配置显示模式、光标位置、字符大小等。
  • 显示字符:通过指定地址和数据,显示字符信息。
  • 清屏:清除屏幕上的所有显示内容。
  • 设定光标:设置光标位置,便于字符的显示和更新。

2.1.3 按键模块

按键模块用于接收用户输入,实现对时间和闹钟的设置。设计中使用四个按键:

  • K1:时间设置/切换键。
  • K2:闹钟设置/切换键。
  • K3:增加功能键。
  • K4:闹钟开关/确认键。
按键连接方式

按键通过电阻阵列连接到单片机I/O口,实现对按键状态的检测。具体连接如下:

单片机端口   按键
-----------  -----
P0.0        -> K1
P0.1        -> K2
P0.2        -> K3
P0.3        -> K4
按键功能描述
  • K1按键:在正常显示模式下,按下K1进入时间设置模式,切换需要设置的时间部分。
  • K2按键:在正常显示模式下,按下K2进入闹钟设置模式,切换需要设置的闹钟部分。
  • K3按键:在设置模式下,按下K3增加选定时间部分的数值。
  • K4按键:在正常显示模式下,按下K4切换闹钟开关状态。在设置模式下,按下K4确认设置并返回正常模式。

2.1.4 蜂鸣器模块

蜂鸣器用于闹钟响铃提示,提醒用户设定的闹钟时间已到。

蜂鸣器连接方式

蜂鸣器通过三极管驱动,连接到单片机的I/O口。具体连接如下:

单片机端口   蜂鸣器
-----------  -----
P0.4        -> BUZ1
蜂鸣器工作原理
  • 响铃控制:单片机通过输出高低电平,控制三极管导通与否,从而控制蜂鸣器响铃。
  • 停止响铃:按下K4按键,单片机停止输出控制信号,关闭蜂鸣器。

2.1.5 电源管理

系统需要稳定的电源供应以确保正常工作。

  • 电源输入:系统可以使用5V直流电源输入。
  • 稳压模块:使用LM7805稳压芯片,将输入电压稳定在5V。
  • 电池备份:DS1302支持电池备份功能,在主电源掉电时仍能维持时间计时。

2.2 软件设计

软件设计是实现系统功能的核心。本文采用C语言进行编程,利用单片机的I/O端口实现对DS1302、LCD12864和按键的控制。软件设计包括系统初始化、时间读取与显示、时间设置、闹钟设置、按键处理及消抖等模块。

2.2.1 系统初始化

系统初始化包括对DS1302、LCD12864和I/O端口的配置。通过初始化,设置系统的初始状态和参数,确保各模块正常工作。

void SystemInit()
{
    // 初始化DS1302
    Ds1302Init();
    
    // 初始化LCD12864
    LCDInit();

    // 初始化按键
    KeyInit();
}

2.2.2 时间读取与显示

通过DS1302的读命令,获取当前的时间信息,并在LCD12864上显示。

void DisplayTime()
{
    uchar time[7];
    Ds1302ReadTime(time); // 读取当前时间

    // 将时间转换为字符串
    char buffer[20];
    sprintf(buffer, "%02x:%02x:%02x", time[2], time[1], time[0]);

    // 在LCD12864上显示时间
    LCDSetCursor(0, 0);
    LCDPrint(buffer);
}

2.2.3 时间设置功能

通过按键K1进入时间设置模式,用户可依次设置年、月、日、时、分、秒。

void SetTime()
{
    uchar time[7];
    Ds1302ReadTime(time); // 读取当前时间

    uchar position = 0; // 设定位置
    while (1)
    {
        DisplayTime(); // 显示当前时间
        if (KeyScan(K1)) // 按下K1键,切换位置
        {
            position = (position + 1) % 6;
        }
        if (KeyScan(K3)) // 按下K3键,增加数值
        {
            time[position]++;
        }
        if (KeyScan(K4)) // 按下K4键,确认设置
        {
            Ds1302SetTime(time);
            break;
        }
    }
}

2.2.4 闹钟设置功能

通过按键K2进入闹钟设置模式,用户可设置闹钟的时间。

void SetAlarm()
{
    uchar alarm[3]; // 闹钟时间:时、分、秒
    uchar position = 0;
    while (1)
    {
        DisplayAlarm(alarm); // 显示当前闹钟时间
        if (KeyScan(K1)) // 按下K1键,切换位置
        {
            position = (position + 1) % 3;
        }
        if (KeyScan(K3)) // 按下K3键,增加数值
        {
            alarm[position]++;
        }
        if (KeyScan(K4)) // 按下K4键,确认设置
        {
            SetAlarmTime(alarm);
            break;
        }
    }
}

2.2.5 闹钟开关控制

在正常显示模式下,通过按键K4实现闹钟开关的控制。

void ToggleAlarm()
{
    static uchar alarmOn = 0;
    if (KeyScan(K4)) // 按下K4键,切换闹钟状态
    {
        alarmOn = !alarmOn;
        if (alarmOn)
        {
            LCDShowAlarmIcon();
        }
        else
        {
            LCDHideAlarmIcon();
        }
    }
}

2.2.6 按键处理及消抖

按键输入存在抖动现象,需要进行消抖处理以保证输入的准确性。

uchar KeyScan(uchar key)
{
    static uchar keyState = 0;
    if (KEY_PORT & key) // 检测按键状态
    {
        if (keyState == 0)
        {
            Delay(10); // 消抖延时
            if (KEY_PORT & key)
            {
                keyState = 1;
                return 1;
            }
        }
    }
    else
    {
        keyState = 0;
    }
    return 0;
}

3. 关键技术实现

3.1 DS1302的接口与通信

DS1302的通信通过三线接口实现,分别是RST、SCLK和DSIO。通信过程中,主设备通过RST启动数据传输,SCLK提供时钟信号,DSIO用于传输数据。DS1302内部寄存器以BCD码格式存储时间数据,用户可以通过读写寄存器来实现时间的设置和读取。

DS1302通信过程
  • 启动传输:将RST置高电平,开始数据传输。

  • 发送命令:通过SCLK的上升沿,逐位发送命令字节。

  • 数据传输:根据命令字节的类型,读写时间数据。

  • 结束传输:将RST置低电平,结束数据传输。

    void Ds1302Write(uchar addr, uchar dat)
    {
    uchar i;
    RST = 0;
    nop();
    SCLK = 0;
    nop();
    RST = 1;
    nop();

      // 发送地址
      for (i = 0; i < 8; i++)
      {
          DSIO = addr & 0x01;
          addr >>= 1;
          SCLK = 1;
          _nop_();
          SCLK = 0;
          _nop_();
      }
    
      // 发送数据
      for (i = 0; i < 8; i++)
      {
          DSIO = dat & 0x01;
          dat >>= 1;
          SCLK = 1;
          _nop_();
          SCLK = 0;
          _nop_();
      }
    
      RST = 0;
      _nop_();
    

    }

    uchar Ds1302Read(uchar addr)
    {
    uchar i, dat = 0;
    RST = 0;
    nop();
    SCLK = 0;
    nop();
    RST = 1;
    nop();

      // 发送地址
      for (i = 0; i < 8; i++)
      {
          DSIO = addr & 0x01;
          addr >>= 1;
          SCLK = 1;
          _nop_();
          SCLK = 0;
          _nop_();
      }
    
      // 读取数据
      for (i = 0; i < 8; i++)
      {
          dat >>= 1;
          if (DSIO)
              dat |= 0x80;
          SCLK = 1;
          _nop_();
          SCLK = 0;
          _nop_();
      }
    
      RST = 0;
      _nop_();
      return dat;
    

    }

3.2 LCD12864的显示控制

LCD12864的控制通过并行数据总线实现。单片机通过RS、RW和E引脚控制LCD12864的命令和数据传输。

LCD12864初始化

在使用LCD12864之前,需对其进行初始化,包括设置显示模式、清屏和设置光标位置等。

void LCDInit()
{
    LCDWriteCmd(0x30); // 基本指令集
    Delay(5);
    LCDWriteCmd(0x0C); // 显示开
    Delay(5);
    LCDWriteCmd(0x01); // 清屏
    Delay(5);
    LCDWriteCmd(0x06); // 光标右移
    Delay(5);
}

void LCDWriteCmd(uchar cmd)
{
    RS = 0; // 命令模式
    RW = 0; // 写模式
    LCD_DATA = cmd;
    E = 1;
    _nop_();
    E = 0;
    Delay(2);
}

void LCDWriteData(uchar data)
{
    RS = 1; // 数据模式
    RW = 0; // 写模式
    LCD_DATA = data;
    E = 1;
    _nop_();
    E = 0;
    Delay(2);
}
LCD12864字符显示

通过LCD12864的显示指令,可以在屏幕上显示字符信息。

void LCDPrint(char *str)
{
    while (*str)
    {
        LCDWriteData(*str++);
    }
}

void LCDSetCursor(uchar x, uchar y)
{
    uchar addr;
    switch (y)
    {
    case 0:
        addr = 0x80 + x;
        break;
    case 1:
        addr = 0x90 + x;
        break;
    case 2:
        addr = 0x88 + x;
        break;
    case 3:
        addr = 0x98 + x;
        break;
    default:
        return;
    }
    LCDWriteCmd(addr);
}

3.3 按键多功能实现

通过检测按键的状态变化,实现不同的功能。在不同的操作模式下,按键有不同的功能。

按键功能切换
  • 正常显示模式:K1进入时间设置,K2进入闹钟设置,K4切换闹钟开关。

  • 时间设置模式:K1切换设定位置,K3增加数值,K4确认设置。

  • 闹钟设置模式:K1切换设定位置,K3增加数值,K4确认设置。

    void KeyProcess()
    {
    if (KeyScan(K1))
    {
    if (mode == NORMAL)
    {
    mode = SET_TIME;
    }
    else if (mode == SET_TIME)
    {
    position = (position + 1) % 6;
    }
    else if (mode == SET_ALARM)
    {
    position = (position + 1) % 3;
    }
    }
    if (KeyScan(K2))
    {
    if (mode == NORMAL)
    {
    mode = SET_ALARM;
    }
    }
    if (KeyScan(K3))
    {
    if (mode == SET_TIME || mode == SET_ALARM)
    {
    IncreaseValue(position);
    }
    }
    if (KeyScan(K4))
    {
    if (mode == NORMAL)
    {
    ToggleAlarm();
    }
    else if (mode == SET_TIME || mode == SET_ALARM)
    {
    mode = NORMAL;
    }
    }
    }

3.4 闹钟响铃与停止

当系统检测到当前时间与设定的闹钟时间一致时,控制蜂鸣器响铃。用户可以通过按下按键K4停止响铃。

void CheckAlarm()
{
    if (alarmOn && IsAlarmTime())
    {
        BuzzerOn();
    }
}

uchar IsAlarmTime()
{
    uchar time[3];
    Ds1302ReadTime(time);
    return (time[2] == alarm[0] && time[1] == alarm[1] && time[0] == alarm[2]);
}

void BuzzerOn()
{
    BUZ1 = 1;
}

void BuzzerOff()
{
    BUZ1 = 0;
}

4. 系统调试与测试

系统的调试与测试是确保设计成功的关键步骤。在硬件和软件设计完成后,需要对系统进行全面的调试和测试,以验证其功能和性能。

4.1 硬件电路调试

硬件电路调试包括对DS1302、LCD12864、按键和蜂鸣器模块的连接和功能测试。

  • DS1302调试:确保时钟芯片正确计时,在掉电情况下计时不丢失。
  • LCD12864调试:确保字符显示正常,清屏和光标设置功能正常。
  • 按键调试:确保按键输入准确,消抖处理有效。
  • 蜂鸣器调试:确保蜂鸣器能够正常响铃和停止。

4.2 软件功能测试

软件功能测试包括对系统各个功能模块的验证。

  • 时间读取与显示测试:确保显示的时间与实际时间一致。
  • 时间设置测试:确保能够正确设置年、月、日、时、分、秒。
  • 闹钟设置测试:确保能够正确设置闹钟时间。
  • 闹钟开关测试:确保闹钟能够正常开关。
  • 闹钟响铃测试:确保闹钟时间到时能够响铃,并能够通过按键停止响铃。

4.3 综合性能验证

对系统进行长时间的运行测试,验证系统的稳定性和可靠性。在不同的环境下运行,检查系统的性能,确保其能够满足设计要求。

5. 结论

本文设计了一种基于DS1302和LCD12864的简易定时闹钟系统。通过对硬件和软件的设计与实现,实现了时间显示、时间设置、闹钟设置和闹钟控制等功能。通过调试与测试验证了系统的功能和性能,设计满足预期要求。该系统设计简单、成本低廉,适合用于嵌入式系统学习和小型应用项目。

系统源码仿真演示视频等资料下载链接

基于51单片机设计的钟表定时闹钟系统仿真/源码/设计文档/演示视频(毕设/课设/竞赛/实训/项目开发)资源-CSDN文库https://download.csdn.net/download/m0_61712829/89615005

单片机项目大合集链接:

https://www.kdocs.cn/l/cmrxCxJN05YN

相关推荐
合宙Luat3 小时前
合宙LuatOS开发板Core_Air780EP使用说明
单片机·嵌入式硬件·物联网·硬件工程·lua
手打猪大屁4 小时前
STM32——串口通信(发送/接收数据与中断函数应用)
经验分享·笔记·stm32·单片机·嵌入式硬件
yyqzjw5 小时前
【STM32】cubemx配置GPIO
stm32·单片机·嵌入式硬件
嵌入式大圣8 小时前
单片机工程师:创新与挑战之路
单片机·嵌入式硬件
TNT_JQR8 小时前
蓝桥杯嵌入式国三备赛经验分享
经验分享·嵌入式硬件·蓝桥杯
好家伙VCC9 小时前
一些面试和找工作的技巧-新资要的低并不会给你加分薪资要的高不会成为公司拒绝你的核心理由
单片机·嵌入式硬件·学习·面试·职场和发展·鲁棒优化
爱学电子的刻刻帝11 小时前
STM32智能家居语音系统
stm32·单片机·智能家居·语音控制
TeYiToKu12 小时前
笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel
linux·c语言·汇编·笔记·单片机·嵌入式硬件
&AtTiTuDe;15 小时前
ADC 简介(STM32F407)
stm32·单片机·嵌入式硬件
just a little bit!16 小时前
STM32内部闪存FLASH(内部ROM)、IAP
stm32·单片机·嵌入式硬件