演示视频
设计内容
(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实时时钟芯片)
[2.1.2 LCD12864字符显示模块](#2.1.2 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的接口与通信)
[3.2 LCD12864的显示控制](#3.2 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的简易定时闹钟系统。通过对硬件和软件的设计与实现,实现了时间显示、时间设置、闹钟设置和闹钟控制等功能。通过调试与测试验证了系统的功能和性能,设计满足预期要求。该系统设计简单、成本低廉,适合用于嵌入式系统学习和小型应用项目。
系统源码仿真演示视频等资料下载链接
单片机项目大合集链接: