一、引言
在嵌入式开发学习中,数字闹钟系统是一个经典的综合实践项目,既能巩固 STM32 微控制器、实时时钟(RTC)、外设交互等知识点,又能通过仿真工具快速验证设计合理性。本文将详细分享基于 STM32F103C6 的数字闹钟系统在 Proteus 中的仿真设计过程,包括系统架构、模块实现、仿真效果及核心代码解析,适合嵌入式初学者参考学习。
二、设计需求
1. 功能需求
基于 STM32 的数字闹钟系统需实现以下核心功能:
- 实时显示:通过 LCD 屏幕显示日期(年 / 月 / 日)、时间(时 / 分 / 秒)及星期;
- 交互控制:通过按键修改系统时间和设置闹钟;
- 报警提示:到达设定闹钟时间时,蜂鸣器发声 + LED 闪烁报警;
- 时间精度:依赖 RTC 芯片(DS1302)实现掉电仍能保持计时。
2. 仿真要求(Proteus)
- 需在 Proteus 中搭建完整电路,包括 STM32 主控、LCD 显示、时钟模块、按键、报警电路;
- 仿真过程中需验证时间显示、按键设置、闹钟触发等全流程功能;
- 确保各模块引脚连接正确,时序逻辑无冲突(如 RTC 晶振频率 32.768kHz)。
三、系统总体设计
系统以 STM32F103C6 为核心,配合 5 大功能模块实现数字闹钟功能,整体架构如下:
STM32F103C6(主控) ←→ 时钟模块(DS1302) // 提供实时时间
←→ 显示模块(LM016L) // 显示时间信息
←→ 按键模块(4个按键) // 时间/闹钟设置
←→ 报警模块(蜂鸣器+LED)// 闹钟提示
各模块在 Proteus 中的设计细节如下:
3.1 主控模块(STM32F103C6)
- 核心功能:处理时间数据、驱动外设、响应按键中断;
- Proteus 配置:选择 STM32F103C6 芯片,配置外部晶振(8MHz)和 RTC 相关引脚(连接 DS1302 的 SCLK、I/O、RST);
- 引脚分配:PA0~PA3 连接按键,PB 端口连接 LCD1602 的 8 位数据总线,PC13 控制报警 LED。
3.2 显示模块(LM016L LCD)
- 功能:显示日期(如 2024-09-26)、时间(如 17:08:20)及设置界面;
- Proteus 设计:
- 采用 16x2 字符型 LCD(LM016L),通过 8 位并行接口与 STM32 的 PB0~PB7 连接;
- 控制引脚 RS(PB8)、RW(PB9)、E(PB10)用于指令 / 数据切换和读写控制;
- 外接电位器调节 V0 引脚电压,优化显示对比度。
- 仿真效果:通电后自动显示当前时间,设置模式下通过 “>” 符号指示可修改项(如年份、小时)。
3.3 时钟模块(DS1302)
- 功能:提供高精度实时时钟,掉电后通过 3V 电池保持计时;
- Proteus 设计:
- 选用 DS1302 芯片,外接 32.768kHz 晶振(X1)保证时间精度;
- 电池(BAT1)接 VCC2 引脚,主电源接 VCC1,确保断电不丢数据;
- 通过串行接口(SCLK、I/O、RST)与 STM32 的 PA1~PA3 通信,实现时间读写。
3.4 按键与报警模块
- 按键模块:
- 4 个独立按键(设置时间、设置加、设置减、设置闹钟),通过 PA0~PA3 连接 STM32;
- Proteus 中需添加下拉电阻(10kΩ),配合软件去抖(延迟 10ms)避免误触发。
- 报警模块:
- 由蜂鸣器(BUZ1)、PNP 三极管(8550)和红色 LED(D1)组成;
- STM32 通过 PB12 输出高电平时,三极管导通,蜂鸣器发声 + LED 点亮,实现声光报警。
3.5 电路设计:
四、Proteus 仿真实现
1. 实时时间显示仿真
- 启动 Proteus 仿真后,系统自动初始化 DS1302,LCD 显示当前日期(如 2024-09-26 Wed)和时间(如 15:08:54);
- 时间每秒自动刷新,星期随日期联动更新(通过代码中
RTC_Get_Week
函数计算)。
2. 时间设置仿真
- 按下 “设置时间” 键,LCD 进入设置界面,“>” 符号默认指向年份;
- 再次按下 “设置时间” 键,“>” 依次切换到月份、日、时、分;
- 通过 “设置加 / 减” 键调整对应数值(如年份从 2024 增至 2025),调整完成后再次按 “设置时间” 键保存退出。
3. 闹钟功能仿真
- 按下 “设置闹钟” 键,LCD 显示 “Set Alarm” 界面,“>” 默认指向小时;
- 调整完成后,当系统时间与闹钟时间(如 17:50)匹配时,蜂鸣器发声 + LED 闪烁,按下 “设置减” 键可关闭报警。
五、核心代码解析
以下为仿真中关键功能的代码片段(基于 STM32 标准库):
c
/***********************************************
***********************************************/
#include "delay.h"
#include "LCD1602.h"
#include "key.h"
#include "led.h"
#include "ds1302.h"
#include "stdio.h"
#include "stdlib.h"
extern _Bool flag_timer; //定时时间到标志位
int main(void)
{
_Bool Alarm = 0;
unsigned char key_value = 0; //按键返回值
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
Lcd1602_Init(); //液晶1602初始化
LED_Init();
KEY_Init(); //初始化端口
DS1302_Init(); //DS1302初始化
KEY_Init();
while(1)
{
DS1302_ReadTime(); //读取DS1302
delay_ms(60);
key_value = KEY_Scan(0); //按键单击
switch(key_value)
{
case 1:
KEY_Set();
break;
case 2:
BEEP = 1; //取消报警
break;
case 4:
KEY_Set_Alarm(); //设置闹钟
break;
}
DS1302_Time(); //显示时钟
if(Timer_info.hou == Ahour&&Timer_info.min ==Amin ) //到达闹钟时间
{
if(Timer_info.sec==0) //秒钟为0
{
if(Alarm==0)
{
Alarm = 1;
BEEP = 0; //开报警
}
}
}
else
{
if(Alarm==1)
{
Alarm = 0;
BEEP = 1; //关报警
}
}
}
}
另外附赠设计报告如下:
六、总结与展望
本设计通过 Proteus 完成了基于 STM32 的数字闹钟系统仿真,实现了时间显示、设置、闹钟等核心功能,验证了硬件电路与软件逻辑的合理性。后续可扩展温度显示(添加 DS18B20)或蓝牙同步功能,进一步提升实用性。对于嵌入式学习者,该项目是理解 “硬件 + 软件” 协同设计的绝佳案例,建议结合 Proteus 仿真逐步调试代码,加深对 STM32 外设的理解。
如果需要完整仿真工程文件或代码,可留言获取~